From cca344a3d1cdca3d4e63806a9bd5f7867f8961d4 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 9 Oct 2024 21:30:42 +0300 Subject: Allow nested sheets without boilerplate (#5660) Co-authored-by: Hailey --- src/App.native.tsx | 19 +- src/components/Dialog/index.tsx | 31 +- src/components/dialogs/GifSelect.tsx | 4 - src/components/dialogs/MutedWords.tsx | 528 ++++++++++----------- .../dialogs/PostInteractionSettingsDialog.tsx | 9 +- src/state/dialogs/index.tsx | 4 +- src/view/com/composer/Composer.tsx | 20 +- src/view/com/composer/GifAltText.tsx | 9 +- src/view/com/composer/photos/Gallery.tsx | 13 +- .../com/composer/photos/ImageAltTextDialog.tsx | 6 +- src/view/com/composer/photos/SelectGifBtn.tsx | 5 +- src/view/com/composer/threadgate/ThreadgateBtn.tsx | 5 - src/view/com/composer/videos/SubtitleDialog.tsx | 4 +- src/view/screens/Storybook/Dialogs.tsx | 66 ++- src/view/shell/index.tsx | 2 + 15 files changed, 311 insertions(+), 414 deletions(-) (limited to 'src') diff --git a/src/App.native.tsx b/src/App.native.tsx index 96b493af4..0b9f112ee 100644 --- a/src/App.native.tsx +++ b/src/App.native.tsx @@ -68,6 +68,7 @@ import {useStarterPackEntry} from '#/components/hooks/useStarterPackEntry' import {Provider as IntentDialogProvider} from '#/components/intents/IntentDialogs' import {Provider as PortalProvider} from '#/components/Portal' import {Splash} from '#/Splash' +import {BottomSheetProvider} from '../modules/bottom-sheet' import {BackgroundNotificationPreferencesProvider} from '../modules/expo-background-notification-handler/src/BackgroundNotificationHandlerProvider' SplashScreen.preventAutoHideAsync() @@ -197,14 +198,16 @@ function App() { - - - - - - - + + + + + + + + + diff --git a/src/components/Dialog/index.tsx b/src/components/Dialog/index.tsx index 49b5e10b2..6d859aeb0 100644 --- a/src/components/Dialog/index.tsx +++ b/src/components/Dialog/index.tsx @@ -31,12 +31,12 @@ import { DialogOuterProps, } from '#/components/Dialog/types' import {createInput} from '#/components/forms/TextField' -import {Portal as DefaultPortal} from '#/components/Portal' import {BottomSheet, BottomSheetSnapPoint} from '../../../modules/bottom-sheet' import { BottomSheetSnapPointChangeEvent, BottomSheetStateChangeEvent, } from '../../../modules/bottom-sheet/src/BottomSheet.types' +import {BottomSheetNativeComponent} from '../../../modules/bottom-sheet/src/BottomSheetNativeComponent' export {useDialogContext, useDialogControl} from '#/components/Dialog/context' export * from '#/components/Dialog/types' @@ -50,10 +50,9 @@ export function Outer({ onClose, nativeOptions, testID, - Portal = DefaultPortal, }: React.PropsWithChildren) { const t = useTheme() - const ref = React.useRef(null) + const ref = React.useRef(null) const closeCallbacks = React.useRef<(() => void)[]>([]) const {setDialogIsOpen, setFullyExpandedCount} = useDialogStateControlContext() @@ -154,20 +153,18 @@ export function Outer({ ) return ( - - - - {children} - - - + + + {children} + + ) } diff --git a/src/components/dialogs/GifSelect.tsx b/src/components/dialogs/GifSelect.tsx index c0ed202da..765e9415d 100644 --- a/src/components/dialogs/GifSelect.tsx +++ b/src/components/dialogs/GifSelect.tsx @@ -30,18 +30,15 @@ import {useThrottledValue} from '#/components/hooks/useThrottledValue' import {ArrowLeft_Stroke2_Corner0_Rounded as Arrow} from '#/components/icons/Arrow' import {MagnifyingGlass2_Stroke2_Corner0_Rounded as Search} from '#/components/icons/MagnifyingGlass2' import {ListFooter, ListMaybePlaceholder} from '#/components/Lists' -import {PortalComponent} from '#/components/Portal' export function GifSelectDialog({ controlRef, onClose, onSelectGif: onSelectGifProp, - Portal, }: { controlRef: React.RefObject<{open: () => void}> onClose: () => void onSelectGif: (gif: Gif) => void - Portal?: PortalComponent }) { const control = Dialog.useDialogControl() @@ -65,7 +62,6 @@ export function GifSelectDialog({ - - - - Add muted words and tags - - - - Posts can be muted based on their text, their tags, or both. We - recommend avoiding common words that appear in many posts, since - it can result in no posts being shown. - - - - - { - if (error) { - setError('') - } - setField(value) - }} - onSubmitEditing={submit} - /> - + + + + Add muted words and tags + + + + Posts can be muted based on their text, their tags, or both. We + recommend avoiding common words that appear in many posts, since it + can result in no posts being shown. + + + + + { + if (error) { + setError('') + } + setField(value) + }} + onSubmitEditing={submit} + /> + - - - - Duration: - + + + + Duration: + + - - - - - - - Forever - - - - - - - - - - - 24 hours - - - - - + + + + + + Forever + + + + - - - - - - - 7 days - - - - - - - - - - - 30 days - - - - - + + + + + + 24 hours + + + + - - - - Mute in: - - - - Text & tags + 7 days - - Tags only + 30 days - - + + - - - Options: - + + + Mute in: + + + + label={_(msg`Mute this word in post text and tags`)} + name="content" + style={[a.flex_1]}> - + - Exclude users you follow + Text & tags + - - - + + + + + + Tags only + + + + + + - {error && ( - - - {error} - - - )} - - - - - + - Your muted words + Options: + + + + + + Exclude users you follow + + + + + - {isPreferencesLoading ? ( - - ) : preferencesError || !preferences ? ( - - - - We're sorry, but we weren't able to load your muted words at - this time. Please try again. - - - - ) : preferences.moderationPrefs.mutedWords.length ? ( - [...preferences.moderationPrefs.mutedWords] - .reverse() - .map((word, i) => ( - - )) - ) : ( - + + + + {error && ( + + - - You haven't muted any words or tags yet - - - )} - + {error} + + + )} + + + - {isNative && } + + + Your muted words + + + {isPreferencesLoading ? ( + + ) : preferencesError || !preferences ? ( + + + + We're sorry, but we weren't able to load your muted words at + this time. Please try again. + + + + ) : preferences.moderationPrefs.mutedWords.length ? ( + [...preferences.moderationPrefs.mutedWords] + .reverse() + .map((word, i) => ( + + )) + ) : ( + + + You haven't muted any words or tags yet + + + )} - - + {isNative && } + - - + + ) } @@ -482,7 +437,6 @@ function MutedWordRow({ onConfirm={remove} confirmButtonCta={_(msg`Remove`)} confirmButtonColor="negative" - Portal={Portal.Portal} /> + {isLoading ? ( - + + + ) : ( ) { return openDialogs.current.size > 0 } else { - BottomSheet.dismissAll() + BottomSheetNativeComponent.dismissAll() return false } }, []) diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 8cc8fba0d..49a498cce 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -107,9 +107,9 @@ import {Button, ButtonIcon, ButtonText} from '#/components/Button' import {CircleInfo_Stroke2_Corner0_Rounded as CircleInfo} from '#/components/icons/CircleInfo' import {EmojiArc_Stroke2_Corner0_Rounded as EmojiSmile} from '#/components/icons/Emoji' import {TimesLarge_Stroke2_Corner0_Rounded as X} from '#/components/icons/Times' -import {createPortalGroup} from '#/components/Portal' import * as Prompt from '#/components/Prompt' import {Text as NewText} from '#/components/Typography' +import {BottomSheetPortalProvider} from '../../../../modules/bottom-sheet' import { composerReducer, createComposerState, @@ -117,8 +117,6 @@ import { } from './state/composer' import {NO_VIDEO, NoVideoState, processVideo, VideoState} from './state/video' -const Portal = createPortalGroup() - type CancelRef = { onPressCancel: () => void } @@ -522,7 +520,7 @@ export const ComposePost = ({ const keyboardVerticalOffset = useKeyboardVerticalOffset() return ( - + - + {extGif && ( @@ -684,7 +678,6 @@ export const ComposePost = ({ gif={extGif} altText={extGifAlt ?? ''} onSubmit={handleChangeGifAltText} - Portal={Portal.Portal} /> )} @@ -744,7 +737,6 @@ export const ComposePost = ({ }, }) }} - Portal={Portal.Portal} /> )} @@ -782,7 +774,6 @@ export const ComposePost = ({ }) }} style={bottomBarAnimatedStyle} - Portal={Portal.Portal} /> )} {!isMobile ? ( - + diff --git a/src/view/screens/Storybook/Dialogs.tsx b/src/view/screens/Storybook/Dialogs.tsx index e6fcef555..343d7f07b 100644 --- a/src/view/screens/Storybook/Dialogs.tsx +++ b/src/view/screens/Storybook/Dialogs.tsx @@ -8,13 +8,10 @@ import {atoms as a} from '#/alf' import {Button, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import * as Menu from '#/components/Menu' -import {createPortalGroup} from '#/components/Portal' import * as Prompt from '#/components/Prompt' import {H3, P, Text} from '#/components/Typography' import {PlatformInfo} from '../../../../modules/expo-bluesky-swiss-army' -const Portal = createPortalGroup() - export function Dialogs() { const scrollable = Dialog.useDialogControl() const basic = Dialog.useDialogControl() @@ -201,41 +198,34 @@ export function Dialogs() { - - -

Dialog with Menu

- - - {({props}) => ( - - )} - - - - console.log('item 1')}> - Item 1 - - console.log('item 2')}> - Item 2 - - - - -
- -
+ +

Dialog with Menu

+ + + {({props}) => ( + + )} + + + + console.log('item 1')}> + Item 1 + + console.log('item 2')}> + Item 2 + + + + +
diff --git a/src/view/shell/index.tsx b/src/view/shell/index.tsx index 8bc3de24d..9f7569beb 100644 --- a/src/view/shell/index.tsx +++ b/src/view/shell/index.tsx @@ -34,6 +34,7 @@ import {ErrorBoundary} from '#/view/com/util/ErrorBoundary' import {MutedWordsDialog} from '#/components/dialogs/MutedWords' import {SigninDialog} from '#/components/dialogs/Signin' import {Outlet as PortalOutlet} from '#/components/Portal' +import {BottomSheetOutlet} from '../../../modules/bottom-sheet' import {updateActiveViewAsync} from '../../../modules/expo-bluesky-swiss-army/src/VisibilityView' import {RoutesContainer, TabsNavigator} from '../../Navigation' import {Composer} from './Composer' @@ -119,6 +120,7 @@ function ShellInner() { + ) } -- cgit 1.4.1