* feat(expo-example): update to match example app structure - Add promise-based present/dismiss to TrueSheet.web.tsx - Remove tabs navigation, use stack-based routing - Add screens: Map, Standard, Modal, Test - Add shared components and sheet components - Add utils (constants, times, random) - Add react-native-maps dependency * feat(expo-example): add Map component and SheetStack with withLayoutContext - Add platform-specific Map component (native MapView, web View fallback) - Add sheet-stack route using expo-router's withLayoutContext - Integrate createTrueSheetNavigator with expo-router file-based routing * refactor: create shared example-shared package for common components - Create @truesheet/example-shared workspace package - Move common components (Button, Header, Footer, etc.) to shared - Move sheet components (BasicSheet, PromptSheet, etc.) to shared - Move utils (constants, times, random) to shared - Update example and expo-example to re-export from shared * chore: reorganize examples into examples/ folder - Move example/ to examples/bare/ - Move expo-example/ to examples/expo/ - Move example-shared/ to examples/shared/ - Update workspace paths in root package.json - Rename packages to @truesheet/bare-example, @truesheet/expo-example - Update script names (example -> bare, expo) * chore: update config paths for examples folder reorganization * chore: rename examples to example and update package names to @example/* * chore: move screen components to shared package - Add MapScreen, ModalScreen, StandardScreen, TestScreen to shared - Make screens navigation-agnostic with callback props - Add MapComponent prop to MapScreen for platform-specific map - Create Map component in bare example - Update expo and bare examples to use shared screens * chore: import screens directly from @example/shared/screens * chore: import components and utils directly from @example/shared * chore: remove unused sheets index files * chore: move Map component to shared package * chore: remove unused constants folder from expo example * chore: remove unused ReanimatedExample component * chore: update scripts for new example folder structure * chore: exclude example folder from jest test paths * chore: add expo prebuild step to clean script * fix: update config paths for new example folder structure * chore: categorize steps in clean script * fix: use workspace:* for example dependencies - Change @lodev09/react-native-true-sheet from * to workspace:* in bare and expo examples - Fixes duplicate view registration error caused by npm version being installed alongside workspace - Silence clean.sh script output while preserving error visibility
84 lines
2.2 KiB
TypeScript
84 lines
2.2 KiB
TypeScript
import { forwardRef, useRef, type Ref, useImperativeHandle, useState } from 'react';
|
|
import { StyleSheet } from 'react-native';
|
|
import { TrueSheet, type TrueSheetProps } from '@lodev09/react-native-true-sheet';
|
|
|
|
import { DARK, DARK_BLUE, FOOTER_HEIGHT, GAP, SPACING } from '../../utils';
|
|
import { DemoContent } from '../DemoContent';
|
|
import { Input } from '../Input';
|
|
import { Button } from '../Button';
|
|
import { Footer } from '../Footer';
|
|
|
|
interface PromptSheetProps extends TrueSheetProps {}
|
|
|
|
export const PromptSheet = forwardRef((props: PromptSheetProps, ref: Ref<TrueSheet>) => {
|
|
const sheetRef = useRef<TrueSheet>(null);
|
|
|
|
const [isSubmitted, setIsSubmitted] = useState(false);
|
|
|
|
const handleDismiss = () => {
|
|
setIsSubmitted(false);
|
|
console.log('Sheet prompt dismissed!');
|
|
};
|
|
|
|
const dismiss = async () => {
|
|
await sheetRef.current?.dismiss();
|
|
console.log('Sheet prompt dismiss asynced');
|
|
};
|
|
|
|
const submit = async () => {
|
|
setIsSubmitted(true);
|
|
};
|
|
|
|
useImperativeHandle<TrueSheet | null, TrueSheet | null>(ref, () => sheetRef.current);
|
|
|
|
return (
|
|
<TrueSheet
|
|
ref={sheetRef}
|
|
dismissible={false}
|
|
grabber={false}
|
|
name="prompt-sheet"
|
|
detents={['auto']}
|
|
style={styles.content}
|
|
blurTint="dark"
|
|
backgroundColor={DARK}
|
|
onDidDismiss={handleDismiss}
|
|
onDidPresent={(e) =>
|
|
console.log(
|
|
`Sheet prompt presented at index: ${e.nativeEvent.index}, position: ${e.nativeEvent.position}`
|
|
)
|
|
}
|
|
onDetentChange={(e) =>
|
|
console.log(
|
|
`Detent changed to index:`,
|
|
e.nativeEvent.index,
|
|
'position:',
|
|
e.nativeEvent.position
|
|
)
|
|
}
|
|
onBackPress={() => {
|
|
console.log('Back button pressed!');
|
|
sheetRef.current?.dismiss();
|
|
}}
|
|
footer={<Footer />}
|
|
{...props}
|
|
>
|
|
<DemoContent color={DARK_BLUE} />
|
|
<Input />
|
|
{isSubmitted && <Input />}
|
|
<Button text="Submit" onPress={submit} />
|
|
<Button text="Dismiss" onPress={dismiss} />
|
|
</TrueSheet>
|
|
);
|
|
});
|
|
|
|
const styles = StyleSheet.create({
|
|
content: {
|
|
padding: SPACING,
|
|
paddingTop: SPACING * 2,
|
|
paddingBottom: FOOTER_HEIGHT + SPACING,
|
|
gap: GAP,
|
|
},
|
|
});
|
|
|
|
PromptSheet.displayName = 'PromptSheet';
|