diff options
Diffstat (limited to 'src/components/Dialog')
-rw-r--r-- | src/components/Dialog/index.tsx | 44 | ||||
-rw-r--r-- | src/components/Dialog/index.web.tsx | 9 | ||||
-rw-r--r-- | src/components/Dialog/shared.tsx | 61 | ||||
-rw-r--r-- | src/components/Dialog/types.ts | 6 |
4 files changed, 103 insertions, 17 deletions
diff --git a/src/components/Dialog/index.tsx b/src/components/Dialog/index.tsx index 93acad438..46c072ce4 100644 --- a/src/components/Dialog/index.tsx +++ b/src/components/Dialog/index.tsx @@ -40,6 +40,7 @@ import { import {BottomSheetNativeComponent} from '../../../modules/bottom-sheet/src/BottomSheetNativeComponent' export {useDialogContext, useDialogControl} from '#/components/Dialog/context' +export * from '#/components/Dialog/shared' export * from '#/components/Dialog/types' export * from '#/components/Dialog/utils' // @ts-ignore @@ -169,25 +170,31 @@ export function Outer({ ) } -export function Inner({children, style}: DialogInnerProps) { +export function Inner({children, style, header}: DialogInnerProps) { const insets = useSafeAreaInsets() return ( - <View - style={[ - a.pt_2xl, - a.px_xl, - { - paddingBottom: insets.bottom + insets.top, - }, - style, - ]}> - {children} - </View> + <> + {header} + <View + style={[ + a.pt_2xl, + a.px_xl, + { + paddingBottom: insets.bottom + insets.top, + }, + style, + ]}> + {children} + </View> + </> ) } export const ScrollableInner = React.forwardRef<ScrollView, DialogInnerProps>( - function ScrollableInner({children, style, ...props}, ref) { + function ScrollableInner( + {children, style, contentContainerStyle, header, ...props}, + ref, + ) { const {nativeSnapPoint, disableDrag, setDisableDrag} = useDialogContext() const insets = useSafeAreaInsets() const {setEnabled} = useKeyboardController() @@ -232,14 +239,21 @@ export const ScrollableInner = React.forwardRef<ScrollView, DialogInnerProps>( return ( <KeyboardAwareScrollView style={[style]} - contentContainerStyle={[a.pt_2xl, a.px_xl, {paddingBottom}]} + contentContainerStyle={[ + a.pt_2xl, + a.px_xl, + {paddingBottom}, + contentContainerStyle, + ]} ref={ref} {...props} bounces={nativeSnapPoint === BottomSheetSnapPoint.Full} bottomOffset={30} scrollEventThrottle={50} onScroll={isAndroid ? onScroll : undefined} - keyboardShouldPersistTaps="handled"> + keyboardShouldPersistTaps="handled" + stickyHeaderIndices={header ? [0] : undefined}> + {header} {children} </KeyboardAwareScrollView> ) diff --git a/src/components/Dialog/index.web.tsx b/src/components/Dialog/index.web.tsx index 1a20311d3..43cb95b03 100644 --- a/src/components/Dialog/index.web.tsx +++ b/src/components/Dialog/index.web.tsx @@ -28,6 +28,7 @@ import {TimesLarge_Stroke2_Corner0_Rounded as X} from '#/components/icons/Times' import {Portal} from '#/components/Portal' export {useDialogContext, useDialogControl} from '#/components/Dialog/context' +export * from '#/components/Dialog/shared' export * from '#/components/Dialog/types' export * from '#/components/Dialog/utils' export {Input} from '#/components/forms/TextField' @@ -154,6 +155,8 @@ export function Inner({ label, accessibilityLabelledBy, accessibilityDescribedBy, + header, + contentContainerStyle, }: DialogInnerProps) { const t = useTheme() const {close} = React.useContext(Context) @@ -178,7 +181,6 @@ export function Inner({ a.rounded_md, a.w_full, a.border, - gtMobile ? a.p_2xl : a.p_xl, t.atoms.bg, { maxWidth: 600, @@ -194,7 +196,10 @@ export function Inner({ onFocusOutside={preventDefault} onDismiss={close} style={{display: 'flex', flexDirection: 'column'}}> - {children} + {header} + <View style={[gtMobile ? a.p_2xl : a.p_xl, contentContainerStyle]}> + {children} + </View> </DismissableLayer> </Animated.View> </FocusScope> diff --git a/src/components/Dialog/shared.tsx b/src/components/Dialog/shared.tsx new file mode 100644 index 000000000..6f9bc2678 --- /dev/null +++ b/src/components/Dialog/shared.tsx @@ -0,0 +1,61 @@ +import React from 'react' +import {StyleProp, TextStyle, View, ViewStyle} from 'react-native' + +import {atoms as a, useTheme, web} from '#/alf' +import {Text} from '#/components/Typography' + +export function Header({ + renderLeft, + renderRight, + children, + style, +}: { + renderLeft?: () => React.ReactNode + renderRight?: () => React.ReactNode + children?: React.ReactNode + style?: StyleProp<ViewStyle> +}) { + const t = useTheme() + return ( + <View + style={[ + a.relative, + a.w_full, + a.py_sm, + a.flex_row, + a.justify_center, + a.align_center, + {minHeight: 50}, + a.border_b, + t.atoms.border_contrast_medium, + t.atoms.bg, + web([ + {borderRadiusTopLeft: a.rounded_md.borderRadius}, + {borderRadiusTopRight: a.rounded_md.borderRadius}, + ]), + style, + ]}> + {renderLeft && ( + <View style={[a.absolute, {left: 6}]}>{renderLeft()}</View> + )} + {children} + {renderRight && ( + <View style={[a.absolute, {right: 6}]}>{renderRight()}</View> + )} + </View> + ) +} + +export function HeaderText({ + children, + style, +}: { + children?: React.ReactNode + style?: StyleProp<TextStyle> +}) { + return ( + <Text style={[a.text_lg, a.text_center, a.font_bold, style]}> + {children} + </Text> + ) +} diff --git a/src/components/Dialog/types.ts b/src/components/Dialog/types.ts index b1388a817..526784baa 100644 --- a/src/components/Dialog/types.ts +++ b/src/components/Dialog/types.ts @@ -4,6 +4,8 @@ import type { GestureResponderEvent, ScrollViewProps, } from 'react-native' +import {ViewStyle} from 'react-native' +import {StyleProp} from 'react-native' import {ViewStyleProp} from '#/alf' import {BottomSheetViewProps} from '../../../modules/bottom-sheet' @@ -69,10 +71,14 @@ export type DialogInnerProps = accessibilityLabelledBy: A11yProps['aria-labelledby'] accessibilityDescribedBy: string keyboardDismissMode?: ScrollViewProps['keyboardDismissMode'] + contentContainerStyle?: StyleProp<ViewStyle> + header?: React.ReactNode }> | DialogInnerPropsBase<{ label: string accessibilityLabelledBy?: undefined accessibilityDescribedBy?: undefined keyboardDismissMode?: ScrollViewProps['keyboardDismissMode'] + contentContainerStyle?: StyleProp<ViewStyle> + header?: React.ReactNode }> |