react-native-true-sheet/example/shared/src/components/sheets/PromptSheet.tsx
Jovanni Lo 4606a1bee9
refactor: reorganize examples with shared package (#306)
* 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
2025-12-12 03:08:20 +08:00

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';