2024-07-01 12:58:19 -04:00
|
|
|
import React, { forwardRef, useImperativeHandle, useRef, ReactElement, ComponentType } from 'react';
|
2024-07-02 10:41:17 -04:00
|
|
|
import { SheetSize, SizeInfo, TrueSheet, TrueSheetProps } from '@lodev09/react-native-true-sheet';
|
2024-07-01 12:58:19 -04:00
|
|
|
import { StyleSheet, View } from 'react-native';
|
2024-05-20 10:54:13 +01:00
|
|
|
|
2024-06-30 13:17:55 -04:00
|
|
|
interface BottomModalProps extends TrueSheetProps {
|
2024-02-10 00:35:24 -04:00
|
|
|
children?: React.ReactNode;
|
2024-06-30 13:17:55 -04:00
|
|
|
onClose?: () => void;
|
|
|
|
name?: string;
|
|
|
|
isGrabberVisible?: boolean;
|
2024-06-30 18:27:37 -04:00
|
|
|
sizes?: SheetSize[] | undefined;
|
2024-07-01 12:58:19 -04:00
|
|
|
footer?: ReactElement | ComponentType<any>;
|
|
|
|
footerDefaultMargins?: boolean | number;
|
2024-07-02 10:41:17 -04:00
|
|
|
onPresent?: () => void;
|
|
|
|
onSizeChange?: (size: SizeInfo) => void;
|
2024-02-10 00:35:24 -04:00
|
|
|
}
|
|
|
|
|
2024-06-30 13:17:55 -04:00
|
|
|
export interface BottomModalHandle {
|
|
|
|
present: () => Promise<void>;
|
|
|
|
dismiss: () => Promise<void>;
|
|
|
|
}
|
|
|
|
|
|
|
|
const BottomModal = forwardRef<BottomModalHandle, BottomModalProps>(
|
2024-07-01 12:58:19 -04:00
|
|
|
(
|
|
|
|
{ name, onClose, onPresent, onSizeChange, isGrabberVisible = true, sizes = ['auto'], footer, footerDefaultMargins, children, ...props },
|
|
|
|
ref,
|
|
|
|
) => {
|
2024-06-30 13:17:55 -04:00
|
|
|
const trueSheetRef = useRef<TrueSheet>(null);
|
2024-02-10 00:35:24 -04:00
|
|
|
|
2024-06-30 13:17:55 -04:00
|
|
|
useImperativeHandle(ref, () => ({
|
|
|
|
present: async () => {
|
|
|
|
if (trueSheetRef.current?.present) {
|
|
|
|
await trueSheetRef.current.present();
|
|
|
|
} else {
|
|
|
|
return Promise.resolve();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
dismiss: async () => {
|
|
|
|
if (trueSheetRef.current?.dismiss) {
|
|
|
|
await trueSheetRef.current.dismiss();
|
|
|
|
} else {
|
|
|
|
return Promise.resolve();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
}));
|
|
|
|
|
2024-07-02 23:25:15 -04:00
|
|
|
const styles = StyleSheet.create({
|
2024-07-02 10:41:17 -04:00
|
|
|
footerContainer: {
|
|
|
|
alignItems: 'center',
|
|
|
|
justifyContent: 'center',
|
|
|
|
},
|
2024-07-01 12:58:19 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
let FooterComponent: ReactElement | ComponentType<any> | undefined;
|
|
|
|
if (footer) {
|
|
|
|
if (React.isValidElement(footer)) {
|
2024-07-02 23:25:15 -04:00
|
|
|
FooterComponent = footerDefaultMargins ? <View style={styles.footerContainer}>{footer}</View> : footer;
|
2024-07-01 12:58:19 -04:00
|
|
|
} else {
|
|
|
|
FooterComponent = footer;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-06-30 13:17:55 -04:00
|
|
|
return (
|
|
|
|
<TrueSheet
|
|
|
|
name={name ?? 'BottomModal'}
|
|
|
|
ref={trueSheetRef}
|
|
|
|
cornerRadius={24}
|
2024-06-30 18:27:37 -04:00
|
|
|
sizes={sizes}
|
2024-06-30 13:17:55 -04:00
|
|
|
onDismiss={onClose}
|
|
|
|
onPresent={onPresent}
|
|
|
|
onSizeChange={onSizeChange}
|
|
|
|
grabber={isGrabberVisible}
|
2024-07-01 12:58:19 -04:00
|
|
|
FooterComponent={FooterComponent}
|
2024-06-30 13:17:55 -04:00
|
|
|
{...props}
|
2024-07-02 10:41:17 -04:00
|
|
|
blurTint="regular"
|
2024-06-30 13:17:55 -04:00
|
|
|
>
|
|
|
|
{children}
|
|
|
|
</TrueSheet>
|
|
|
|
);
|
|
|
|
},
|
|
|
|
);
|
2020-11-17 11:43:38 +03:00
|
|
|
|
|
|
|
export default BottomModal;
|