[Sheets] [Pt. 3] Get new sheet working with ScrollableInner (#5561)

This commit is contained in:
Hailey
2024-10-02 14:58:12 -07:00
committed by GitHub
parent a2e8f3cbc4
commit 5b08aad014
3 changed files with 42 additions and 73 deletions
+1
View File
@@ -68,6 +68,7 @@
"@fortawesome/free-regular-svg-icons": "^6.1.1", "@fortawesome/free-regular-svg-icons": "^6.1.1",
"@fortawesome/free-solid-svg-icons": "^6.1.1", "@fortawesome/free-solid-svg-icons": "^6.1.1",
"@fortawesome/react-native-fontawesome": "^0.3.2", "@fortawesome/react-native-fontawesome": "^0.3.2",
"@haileyok/bluesky-bottom-sheet": "^0.1.1-alpha.7",
"@haileyok/bluesky-video": "0.1.10", "@haileyok/bluesky-video": "0.1.10",
"@lingui/react": "^4.5.0", "@lingui/react": "^4.5.0",
"@mattermost/react-native-paste-input": "^0.7.1", "@mattermost/react-native-paste-input": "^0.7.1",
+37 -69
View File
@@ -1,18 +1,18 @@
import React, {useImperativeHandle} from 'react' import React, {useImperativeHandle} from 'react'
import {Dimensions, Keyboard, StyleProp, View, ViewStyle} from 'react-native' import {StyleProp, View, ViewStyle} from 'react-native'
import {useSafeAreaInsets} from 'react-native-safe-area-context' import {useSafeAreaInsets} from 'react-native-safe-area-context'
import BottomSheet, { import {
BottomSheetFlatList, BottomSheetFlatList,
BottomSheetFlatListMethods, BottomSheetFlatListMethods,
BottomSheetScrollView,
BottomSheetScrollViewMethods,
BottomSheetTextInput, BottomSheetTextInput,
BottomSheetView, BottomSheetView,
} from '@discord/bottom-sheet/src' } from '@discord/bottom-sheet/src'
import {BottomSheetFlatListProps} from '@discord/bottom-sheet/src/components/bottomSheetScrollable/types' import {BottomSheetFlatListProps} from '@discord/bottom-sheet/src/components/bottomSheetScrollable/types'
import {BlueskyBottomSheetView} from '@haileyok/bluesky-bottom-sheet'
import {logger} from '#/logger' import {logger} from '#/logger'
import {useDialogStateControlContext} from '#/state/dialogs' import {useDialogStateControlContext} from '#/state/dialogs'
import {ScrollView} from '#/view/com/util/Views'
import {atoms as a, flatten, useTheme} from '#/alf' import {atoms as a, flatten, useTheme} from '#/alf'
import {Context} from '#/components/Dialog/context' import {Context} from '#/components/Dialog/context'
import { import {
@@ -37,12 +37,11 @@ export function Outer({
testID, testID,
}: React.PropsWithChildren<DialogOuterProps>) { }: React.PropsWithChildren<DialogOuterProps>) {
const t = useTheme() const t = useTheme()
const sheet = React.useRef<BottomSheet>(null) const ref = React.useRef<BlueskyBottomSheetView>(null)
const insets = useSafeAreaInsets() const insets = useSafeAreaInsets()
const closeCallbacks = React.useRef<(() => void)[]>([]) const closeCallbacks = React.useRef<(() => void)[]>([])
const {setDialogIsOpen} = useDialogStateControlContext() const {setDialogIsOpen} = useDialogStateControlContext()
// @TODO DIALOG REFACTOR - can i get rid of this? seems pointless tbh // @TODO DIALOG REFACTOR - can i get rid of this? seems pointless tbh
const [isOpen, setIsOpen] = React.useState(false)
const callQueuedCallbacks = React.useCallback(() => { const callQueuedCallbacks = React.useCallback(() => {
for (const cb of closeCallbacks.current) { for (const cb of closeCallbacks.current) {
@@ -59,18 +58,16 @@ export function Outer({
const open = React.useCallback<DialogControlProps['open']>(() => { const open = React.useCallback<DialogControlProps['open']>(() => {
// Run any leftover callbacks that might have been queued up before calling `.open()` // Run any leftover callbacks that might have been queued up before calling `.open()`
callQueuedCallbacks() callQueuedCallbacks()
setIsOpen(true)
setDialogIsOpen(control.id, true) setDialogIsOpen(control.id, true)
// sheet.current?.open() // @TODO DIALOG REFACTOR ref.current?.present()
}, [setDialogIsOpen, control.id, callQueuedCallbacks]) }, [setDialogIsOpen, control.id, callQueuedCallbacks])
// This is the function that we call when we want to dismiss the dialog. // This is the function that we call when we want to dismiss the dialog.
const close = React.useCallback<DialogControlProps['close']>(cb => { const close = React.useCallback<DialogControlProps['close']>(cb => {
setIsOpen(false)
if (typeof cb === 'function') { if (typeof cb === 'function') {
closeCallbacks.current.push(cb) closeCallbacks.current.push(cb)
} }
// sheet.current?.close() // @TODO DIALOG REFACTOR ref.current?.dismiss()
}, []) }, [])
// This is the actual thing we are doing once we "confirm" the dialog. We want the dialog's close animation to // This is the actual thing we are doing once we "confirm" the dialog. We want the dialog's close animation to
@@ -102,39 +99,25 @@ export function Outer({
const context = React.useMemo(() => ({close}), [close]) const context = React.useMemo(() => ({close}), [close])
return ( return (
isOpen && ( <Portal>
<Portal> <Context.Provider value={context}>
<View <BlueskyBottomSheetView
// iOS // handleIndicatorStyle={{backgroundColor: t.palette.primary_500}} // @TODO DIALOG REFACTOR need to add this to lib!*/
accessibilityViewIsModal ref={ref}
style={[a.absolute, a.inset_0]} topInset={30}
testID={testID} bottomInset={insets.bottom}
onTouchMove={() => Keyboard.dismiss()}> onStateChange={e => {
<BottomSheet if (e.nativeEvent.state === 'closed') {
topInset={insets.top} onCloseAnimationComplete()
bottomInset={insets.bottom} }
ref={sheet} }}
// handleIndicatorStyle={{backgroundColor: t.palette.primary_500}} // @TODO DIALOG REFACTOR need to add this to lib! cornerRadius={20}>
onClose={onCloseAnimationComplete}> <View testID={testID} style={[t.atoms.bg]}>
<Context.Provider value={context}> {children}
<View </View>
style={[ </BlueskyBottomSheetView>
a.absolute, </Context.Provider>
a.inset_0, </Portal>
t.atoms.bg,
{
borderTopLeftRadius: 40,
borderTopRightRadius: 40,
height: Dimensions.get('window').height * 2,
},
]}
/>
{children}
</Context.Provider>
</BottomSheet>
</View>
</Portal>
)
) )
} }
@@ -158,32 +141,17 @@ export function Inner({children, style}: DialogInnerProps) {
) )
} }
export const ScrollableInner = React.forwardRef< export const ScrollableInner = React.forwardRef<ScrollView, DialogInnerProps>(
BottomSheetScrollViewMethods, function ScrollableInner({children, style}, ref) {
DialogInnerProps const insets = useSafeAreaInsets()
>(function ScrollableInner({children, style}, ref) { return (
const insets = useSafeAreaInsets() <ScrollView style={[a.px_xl, style]} ref={ref}>
return ( {children}
<BottomSheetScrollView <View style={{height: insets.bottom + a.pt_5xl.paddingTop}} />
keyboardShouldPersistTaps="handled" </ScrollView>
style={[ )
a.flex_1, // main diff is this },
a.p_xl, )
a.h_full,
{
paddingTop: 40,
borderTopLeftRadius: 40,
borderTopRightRadius: 40,
},
style,
]}
contentContainerStyle={a.pb_4xl}
ref={ref}>
{children}
<View style={{height: insets.bottom + a.pt_5xl.paddingTop}} />
</BottomSheetScrollView>
)
})
export const InnerFlatList = React.forwardRef< export const InnerFlatList = React.forwardRef<
BottomSheetFlatListMethods, BottomSheetFlatListMethods,
+4 -4
View File
@@ -4120,10 +4120,10 @@
resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861"
integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==
"@haileyok/bluesky-bottom-sheet@^0.1.1-alpha.4": "@haileyok/bluesky-bottom-sheet@^0.1.1-alpha.7":
version "0.1.1-alpha.4" version "0.1.1-alpha.7"
resolved "https://registry.yarnpkg.com/@haileyok/bluesky-bottom-sheet/-/bluesky-bottom-sheet-0.1.1-alpha.4.tgz#19717e57e63d70e79b8bd86984903c448deb83bc" resolved "https://registry.yarnpkg.com/@haileyok/bluesky-bottom-sheet/-/bluesky-bottom-sheet-0.1.1-alpha.7.tgz#a5845cd2ac386b78716db5940b65b3e78b392042"
integrity sha512-bEZRbErsI6OJCgmFolbr9Ta5LxNvyaltzRPFOVtwsykIwL8tqNJeNlmfxP8EdJa5lSu2kK1MauQcygmCIouzwg== integrity sha512-Ps2nsNmfjqUmP/LPAM94/2dWZerwZEjnvSUfi/ipFNHlNp/McIYIObxDaPJaZ0ZLxUcRXxdhmC3UonK25sJKSw==
"@haileyok/bluesky-video@0.1.10": "@haileyok/bluesky-video@0.1.10":
version "0.1.10" version "0.1.10"