@utilitywarehouse/hearth-react-native 0.30.4-testid-fix-2 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/.turbo/turbo-build.log +4 -5
  2. package/.turbo/turbo-lint.log +62 -70
  3. package/CHANGELOG.md +155 -0
  4. package/build/components/Badge/Badge.js +2 -2
  5. package/build/components/Badge/Badge.props.d.ts +1 -0
  6. package/build/components/Badge/BadgeText.d.ts +1 -1
  7. package/build/components/Badge/BadgeText.js +2 -2
  8. package/build/components/Container/Container.props.d.ts +2 -2
  9. package/build/components/ExpandableCard/ExpandableCard.d.ts +1 -1
  10. package/build/components/ExpandableCard/ExpandableCard.js +13 -2
  11. package/build/components/ExpandableCard/ExpandableCard.props.d.ts +43 -23
  12. package/build/components/ExpandableCard/ExpandableCardText.js +1 -1
  13. package/build/components/ExpandableCard/ExpandableCardTrigger.d.ts +3 -3
  14. package/build/components/ExpandableCard/ExpandableCardTrigger.props.d.ts +31 -6
  15. package/build/components/ExpandableCard/ExpandableCardTriggerRoot.d.ts +1 -1
  16. package/build/components/ExpandableCard/ExpandableCardTriggerRoot.js +13 -2
  17. package/build/components/Flex/Flex.props.d.ts +2 -2
  18. package/build/components/FormField/FormField.d.ts +5 -5
  19. package/build/components/FormField/FormField.js +3 -2
  20. package/build/components/Modal/Modal.d.ts +1 -1
  21. package/build/components/Modal/Modal.js +33 -39
  22. package/build/components/Modal/Modal.props.d.ts +8 -3
  23. package/build/components/Modal/Modal.shared.types.d.ts +19 -4
  24. package/build/components/Modal/Modal.web.d.ts +1 -1
  25. package/build/components/Modal/Modal.web.js +6 -3
  26. package/build/components/NavModal/NavModal.d.ts +1 -1
  27. package/build/components/NavModal/NavModal.js +10 -7
  28. package/build/components/NavModal/NavModal.props.d.ts +4 -3
  29. package/build/components/Textarea/Textarea.d.ts +1 -1
  30. package/build/components/Textarea/Textarea.js +64 -5
  31. package/build/components/Textarea/Textarea.props.d.ts +10 -0
  32. package/build/components/Textarea/TextareaRoot.js +4 -1
  33. package/docs/changelog.mdx +21 -0
  34. package/package.json +4 -4
  35. package/src/components/Badge/Badge.props.ts +1 -0
  36. package/src/components/Badge/Badge.tsx +6 -1
  37. package/src/components/Badge/BadgeText.tsx +8 -2
  38. package/src/components/Container/Container.props.ts +10 -1
  39. package/src/components/ExpandableCard/ExpandableCard.docs.mdx +89 -37
  40. package/src/components/ExpandableCard/ExpandableCard.props.ts +51 -27
  41. package/src/components/ExpandableCard/ExpandableCard.stories.tsx +67 -17
  42. package/src/components/ExpandableCard/ExpandableCard.tsx +15 -7
  43. package/src/components/ExpandableCard/ExpandableCardText.tsx +1 -1
  44. package/src/components/ExpandableCard/ExpandableCardTrigger.props.ts +37 -7
  45. package/src/components/ExpandableCard/ExpandableCardTriggerRoot.tsx +36 -2
  46. package/src/components/Flex/Flex.props.ts +16 -2
  47. package/src/components/FormField/FormField.tsx +2 -1
  48. package/src/components/List/List.stories.tsx +35 -0
  49. package/src/components/Modal/Modal.docs.mdx +52 -1
  50. package/src/components/Modal/Modal.props.ts +21 -6
  51. package/src/components/Modal/Modal.shared.types.ts +23 -4
  52. package/src/components/Modal/Modal.stories.tsx +165 -1
  53. package/src/components/Modal/Modal.tsx +101 -81
  54. package/src/components/Modal/Modal.web.tsx +29 -23
  55. package/src/components/NavModal/NavModal.docs.mdx +29 -0
  56. package/src/components/NavModal/NavModal.props.ts +11 -3
  57. package/src/components/NavModal/NavModal.stories.tsx +29 -0
  58. package/src/components/NavModal/NavModal.tsx +39 -33
  59. package/src/components/Textarea/Textarea.docs.mdx +33 -1
  60. package/src/components/Textarea/Textarea.props.ts +11 -2
  61. package/src/components/Textarea/Textarea.stories.tsx +21 -1
  62. package/src/components/Textarea/Textarea.tsx +107 -3
  63. package/src/components/Textarea/TextareaRoot.tsx +6 -2
  64. package/build/components/DatePicker/TimePicker.d.ts +0 -3
  65. package/build/components/DatePicker/TimePicker.js +0 -84
  66. package/build/components/DatePicker/time-picker/animated-math.d.ts +0 -4
  67. package/build/components/DatePicker/time-picker/animated-math.js +0 -19
  68. package/build/components/DatePicker/time-picker/period-native.d.ts +0 -6
  69. package/build/components/DatePicker/time-picker/period-native.js +0 -17
  70. package/build/components/DatePicker/time-picker/period-picker.d.ts +0 -6
  71. package/build/components/DatePicker/time-picker/period-picker.js +0 -10
  72. package/build/components/DatePicker/time-picker/period-web.d.ts +0 -6
  73. package/build/components/DatePicker/time-picker/period-web.js +0 -21
  74. package/build/components/DatePicker/time-picker/wheel-native.d.ts +0 -8
  75. package/build/components/DatePicker/time-picker/wheel-native.js +0 -19
  76. package/build/components/DatePicker/time-picker/wheel-picker/index.d.ts +0 -2
  77. package/build/components/DatePicker/time-picker/wheel-picker/index.js +0 -2
  78. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker-item.d.ts +0 -16
  79. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker-item.js +0 -97
  80. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.d.ts +0 -21
  81. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.js +0 -88
  82. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.style.d.ts +0 -23
  83. package/build/components/DatePicker/time-picker/wheel-picker/wheel-picker.style.js +0 -21
  84. package/build/components/DatePicker/time-picker/wheel-web.d.ts +0 -8
  85. package/build/components/DatePicker/time-picker/wheel-web.js +0 -146
  86. package/build/components/DatePicker/time-picker/wheel.d.ts +0 -8
  87. package/build/components/DatePicker/time-picker/wheel.js +0 -10
  88. package/build/components/SafeAreaView/SafeAreaView.d.ts +0 -5
  89. package/build/components/SafeAreaView/SafeAreaView.js +0 -117
  90. package/build/components/SafeAreaView/SafeAreaView.props.d.ts +0 -17
  91. package/build/components/SafeAreaView/SafeAreaView.props.js +0 -1
  92. package/build/components/SafeAreaView/index.d.ts +0 -2
  93. package/build/components/SafeAreaView/index.js +0 -1
@@ -1,7 +1,21 @@
1
1
  import type { FlexAlignType, ViewProps, ViewStyle } from 'react-native';
2
- import { FlexLayoutProps, GapProps, SpacingValues } from '../../types';
2
+ import {
3
+ DisplayProps,
4
+ FlexLayoutProps,
5
+ GapProps,
6
+ MarginProps,
7
+ PaddingProps,
8
+ SpacingValues,
9
+ } from '../../types';
3
10
 
4
- interface FlexProps extends ViewProps, FlexLayoutProps, GapProps {
11
+ interface FlexProps
12
+ extends
13
+ ViewProps,
14
+ MarginProps,
15
+ PaddingProps,
16
+ FlexLayoutProps,
17
+ GapProps,
18
+ Omit<DisplayProps, 'direction'> {
5
19
  direction?: ViewStyle['flexDirection'];
6
20
  align?: FlexAlignType;
7
21
  justify?: ViewStyle['justifyContent'];
@@ -1,6 +1,7 @@
1
1
  import { createFormControl } from '@gluestack-ui/form-control';
2
2
  import { useMemo, useState } from 'react';
3
3
  import { View } from 'react-native';
4
+ import { BodyText } from '../BodyText';
4
5
  import { HelperIcon, HelperText } from '../Helper';
5
6
  import { FormFieldContext } from './FormField.context';
6
7
  import FormFieldProps from './FormField.props';
@@ -94,7 +95,7 @@ const FormField = ({
94
95
  accessibilityElementsHidden={shouldHandleAccessibility}
95
96
  >
96
97
  {label}
97
- {!required ? ` (Optional)` : ''}
98
+ {!required ? <BodyText weight="regular"> (Optional)</BodyText> : ''}
98
99
  </FormFieldLabelText>
99
100
  )}
100
101
  {!!helperText && (
@@ -10,6 +10,7 @@ import {
10
10
  UserMediumIcon,
11
11
  } from '@utilitywarehouse/hearth-react-native-icons';
12
12
  import { useState } from 'react';
13
+ import { FlatList } from 'react-native';
13
14
  import { List, ListAction, ListItem, ListItemIcon, ListItemTrailingIcon } from '.';
14
15
  import { VariantTitle } from '../../../docs/components';
15
16
  import { Badge } from '../Badge';
@@ -398,6 +399,40 @@ export const Loading: Story = {
398
399
  ),
399
400
  };
400
401
 
402
+ export const WithFlatList: Story = {
403
+ parameters: {
404
+ controls: { include: [] },
405
+ },
406
+ render: () => {
407
+ const listData = Array.from({ length: 200 }).map((_, index) => ({
408
+ id: index.toString(),
409
+ heading: `List Item ${index + 1}`,
410
+ helperText: `Supporting Text ${index + 1}`,
411
+ }));
412
+
413
+ return (
414
+ <List
415
+ container="subtleWhite"
416
+ heading="FlatList Example"
417
+ helperText="This list is rendered using FlatList for performance"
418
+ >
419
+ <FlatList
420
+ data={listData}
421
+ keyExtractor={item => item.id}
422
+ renderItem={({ item }) => (
423
+ <ListItem
424
+ heading={item.heading}
425
+ helperText={item.helperText}
426
+ leadingContent={<ListItemIcon as={SettingsMediumIcon} />}
427
+ onPress={() => console.log(`${item.heading} pressed`)}
428
+ />
429
+ )}
430
+ />
431
+ </List>
432
+ );
433
+ },
434
+ };
435
+
401
436
  export const KitchenSink: Story = {
402
437
  parameters: {
403
438
  controls: { include: [] },
@@ -1,5 +1,5 @@
1
1
  import { Canvas, Controls, Meta, Story } from '@storybook/addon-docs/blocks';
2
- import { BodyText, BottomSheetModal, Box, Button, Center, Heading, Modal } from '../../';
2
+ import { BodyText, BottomSheetModal, Box, Button, Center, Flex, Heading, Modal } from '../../';
3
3
  import StorybookLink from '../../../../../shared/storybook/StorybookLink';
4
4
  import { BackToTopButton, UsageWrap, ViewFigmaButton } from '../../../docs/components';
5
5
  import * as Stories from './Modal.stories';
@@ -28,6 +28,7 @@ If you need a modal layout inside a React Navigation modal screen, use <Storyboo
28
28
  - [Modal with Image](#modal-with-image)
29
29
  - [Fullscreen Modal](#fullscreen-modal)
30
30
  - [Modal with Custom Content](#modal-with-custom-content)
31
+ - [Sticky Custom Footer](#sticky-custom-footer)
31
32
  - [Loading State](#loading-state)
32
33
  - [Without Close Button](#without-close-button)
33
34
  - [Single Action Modal](#single-action-modal)
@@ -107,9 +108,13 @@ The Modal component extends the `BottomSheetModal` component and accepts all of
107
108
  | `children` | `ReactNode` | Custom content to display in the modal body | - |
108
109
  | `primaryButtonProps` | `Omit<ButtonWithoutChildrenProps, 'children'>` | Additional props to pass to the primary button (colorScheme defaults to 'highlight', variant to 'solid') | - |
109
110
  | `secondaryButtonProps` | `Omit<ButtonWithoutChildrenProps, 'children'>` | Additional props to pass to the secondary button (colorScheme defaults to 'functional', variant to 'outline') | - |
111
+ | `footer` | `ReactNode` | Custom footer content that replaces the built-in action buttons | - |
112
+ | `footerStyle` | `StyleProp<ViewStyle>` | Styles applied to the footer container, useful for sticky footer shadows or custom spacing | - |
110
113
  | `closeButtonProps` | `Omit<UnstyledIconButtonProps, 'children'>` | Additional props to pass to the close button | - |
111
114
  | `fullscreen` | `boolean` | Whether the modal should take up the full screen height | `false` |
112
115
 
116
+ When `footer` is provided, the primary and secondary button props are not available. Build your footer actions directly inside the custom footer content instead.
117
+
113
118
  \* use this to detect if the modal has been opened or closed, index 0 indicates open state and -1 indicates closed state
114
119
 
115
120
  ### `ModalImage` Props
@@ -371,6 +376,52 @@ const CustomContentModal = () => {
371
376
  };
372
377
  ```
373
378
 
379
+ ### Sticky Custom Footer
380
+
381
+ Replace the built-in buttons with a custom sticky footer when you need custom layouts or button arrangements:
382
+
383
+ <Canvas of={Stories.StickyCustomFooter} />
384
+
385
+ ```tsx
386
+ const StickyCustomFooterModal = () => {
387
+ const modalRef = useRef<BottomSheetModal>(null);
388
+
389
+ return (
390
+ <>
391
+ <Button onPress={() => modalRef.current?.present()}>Show Custom Footer Modal</Button>
392
+
393
+ <Modal
394
+ ref={modalRef}
395
+ heading="Update billing details"
396
+ description="Use a custom sticky footer when you need horizontal actions or extra decoration."
397
+ footer={
398
+ <Flex direction="row" spacing="md" pt="250">
399
+ <Button
400
+ variant="outline"
401
+ colorScheme="functional"
402
+ onPress={() => modalRef.current?.dismiss()}
403
+ style={{ flex: 1 }}
404
+ >
405
+ Cancel
406
+ </Button>
407
+ <Button onPress={() => modalRef.current?.dismiss()} style={{ flex: 1 }}>
408
+ Save changes
409
+ </Button>
410
+ </Flex>
411
+ }
412
+ footerStyle={{
413
+ boxShadow: '0px -6px 12px rgba(16, 24, 40, 0.12)',
414
+ }}
415
+ >
416
+ <Box gap="200">
417
+ <BodyText>Review the changes before saving.</BodyText>
418
+ </Box>
419
+ </Modal>
420
+ </>
421
+ );
422
+ };
423
+ ```
424
+
374
425
  ### Loading State
375
426
 
376
427
  Show a loading spinner while processing:
@@ -1,10 +1,25 @@
1
1
  import { BottomSheetProps } from '../BottomSheet';
2
- import { ModalCommonProps } from './Modal.shared.types';
2
+ import {
3
+ ModalButtonFooterProps,
4
+ ModalCommonBaseProps,
5
+ ModalCustomFooterProps,
6
+ } from './Modal.shared.types';
3
7
 
4
- interface ModalProps extends Omit<BottomSheetProps, 'children'>, ModalCommonProps {
5
- fullscreen?: boolean;
6
- closeOnPrimaryButtonPress?: boolean;
7
- closeOnSecondaryButtonPress?: boolean;
8
- }
8
+ type ModalBaseProps = Omit<BottomSheetProps, 'children'> &
9
+ ModalCommonBaseProps & {
10
+ fullscreen?: boolean;
11
+ };
12
+
13
+ type ModalProps =
14
+ | (ModalBaseProps &
15
+ ModalButtonFooterProps & {
16
+ closeOnPrimaryButtonPress?: boolean;
17
+ closeOnSecondaryButtonPress?: boolean;
18
+ })
19
+ | (ModalBaseProps &
20
+ ModalCustomFooterProps & {
21
+ closeOnPrimaryButtonPress?: never;
22
+ closeOnSecondaryButtonPress?: never;
23
+ });
9
24
 
10
25
  export default ModalProps;
@@ -1,9 +1,9 @@
1
1
  import { ReactNode } from 'react';
2
- import { ViewProps } from 'react-native';
2
+ import { StyleProp, ViewProps, ViewStyle } from 'react-native';
3
3
  import { ButtonWithoutChildrenProps } from '../Button/Button.props';
4
4
  import { UnstyledIconButtonProps } from '../UnstyledIconButton';
5
5
 
6
- export interface ModalCommonProps {
6
+ export interface ModalCommonBaseProps {
7
7
  loading?: boolean;
8
8
  image?: ReactNode;
9
9
  showCloseButton?: boolean;
@@ -13,12 +13,31 @@ export interface ModalCommonProps {
13
13
  description?: string;
14
14
  stickyFooter?: boolean;
15
15
  children?: ViewProps['children'];
16
+ onPressCloseButton?: () => void;
17
+ closeButtonProps?: Omit<UnstyledIconButtonProps, 'children'>;
18
+ }
19
+
20
+ export interface ModalButtonFooterProps {
16
21
  onPressPrimaryButton?: () => void;
17
22
  primaryButtonText?: string;
18
23
  onPressSecondaryButton?: () => void;
19
24
  secondaryButtonText?: string;
20
- onPressCloseButton?: () => void;
21
25
  primaryButtonProps?: Omit<ButtonWithoutChildrenProps, 'children'>;
22
26
  secondaryButtonProps?: Omit<ButtonWithoutChildrenProps, 'children'>;
23
- closeButtonProps?: Omit<UnstyledIconButtonProps, 'children'>;
27
+ footer?: never;
28
+ footerStyle?: StyleProp<ViewStyle>;
29
+ }
30
+
31
+ export interface ModalCustomFooterProps {
32
+ footer: ReactNode;
33
+ footerStyle?: StyleProp<ViewStyle>;
34
+ onPressPrimaryButton?: never;
35
+ primaryButtonText?: never;
36
+ onPressSecondaryButton?: never;
37
+ secondaryButtonText?: never;
38
+ primaryButtonProps?: never;
39
+ secondaryButtonProps?: never;
24
40
  }
41
+
42
+ export type ModalCommonProps = ModalCommonBaseProps &
43
+ (ModalButtonFooterProps | ModalCustomFooterProps);
@@ -5,9 +5,10 @@ import { Modal, ModalImage } from '.';
5
5
  import pigs from '../../../docs/assets/pigs.png';
6
6
  import { ViewWrap } from '../../../docs/components';
7
7
  import { BodyText } from '../BodyText';
8
- import { BottomSheetModal } from '../BottomSheet';
8
+ import { BottomSheetModal, BottomSheetModalProvider } from '../BottomSheet';
9
9
  import { Box } from '../Box';
10
10
  import { Button } from '../Button';
11
+ import { Flex } from '../Flex';
11
12
 
12
13
  const meta = {
13
14
  title: 'Stories / Modal',
@@ -164,6 +165,56 @@ export const WithCustomContent = () => {
164
165
  );
165
166
  };
166
167
 
168
+ export const StickyCustomFooter = () => {
169
+ const modalRef = useRef<BottomSheetModal>(null);
170
+
171
+ const openModal = () => {
172
+ modalRef.current?.present();
173
+ };
174
+
175
+ const closeModal = () => {
176
+ modalRef.current?.dismiss();
177
+ };
178
+
179
+ return (
180
+ <View style={Platform.OS === 'web' ? { width: 400, height: 400 } : {}}>
181
+ <ViewWrap>
182
+ <Button onPress={openModal}>Open Modal</Button>
183
+
184
+ <Modal
185
+ ref={modalRef}
186
+ heading="Update billing details"
187
+ description="Review the changes below, then save or discard them using a custom sticky footer."
188
+ onPressCloseButton={closeModal}
189
+ footer={
190
+ <Flex direction="row" spacing="md" pt="250">
191
+ <Button
192
+ variant="outline"
193
+ colorScheme="functional"
194
+ onPress={closeModal}
195
+ style={{ flex: 1 }}
196
+ >
197
+ Cancel
198
+ </Button>
199
+ <Button onPress={closeModal} style={{ flex: 1 }}>
200
+ Save changes
201
+ </Button>
202
+ </Flex>
203
+ }
204
+ footerStyle={{
205
+ boxShadow: '0px -6px 12px rgba(16, 24, 40, 0.12)',
206
+ }}
207
+ >
208
+ <Box gap="200">
209
+ <BodyText>Billing address: 14 Park Street, Bristol</BodyText>
210
+ <BodyText>Preferred payment day: 15th of each month</BodyText>
211
+ </Box>
212
+ </Modal>
213
+ </ViewWrap>
214
+ </View>
215
+ );
216
+ };
217
+
167
218
  export const Loading = () => {
168
219
  const modalRef = useRef<BottomSheetModal>(null);
169
220
 
@@ -239,3 +290,116 @@ export const FullscreenModal: Story = {
239
290
  );
240
291
  },
241
292
  };
293
+
294
+ export const NoStickyFooter: Story = {
295
+ render: () => {
296
+ const modalRef = useRef<BottomSheetModal>(null);
297
+
298
+ const openModal = () => {
299
+ modalRef.current?.present();
300
+ };
301
+
302
+ const closeModal = () => {
303
+ modalRef.current?.dismiss();
304
+ };
305
+
306
+ return (
307
+ <View style={Platform.OS === 'web' ? { width: 400, height: 400 } : {}}>
308
+ <ViewWrap>
309
+ <Button onPress={openModal}>Open Modal</Button>
310
+
311
+ <Modal
312
+ ref={modalRef}
313
+ heading="Modal Heading"
314
+ description="This is a modal description without a sticky footer."
315
+ onPressCloseButton={closeModal}
316
+ primaryButtonText="Primary"
317
+ onPressPrimaryButton={closeModal}
318
+ secondaryButtonText="Cancel"
319
+ onPressSecondaryButton={closeModal}
320
+ stickyFooter={false}
321
+ >
322
+ <Box gap="200">
323
+ <BodyText>This is a modal with content.</BodyText>
324
+ <BodyText>You can swipe it up and down to close.</BodyText>
325
+ </Box>
326
+ </Modal>
327
+ </ViewWrap>
328
+ </View>
329
+ );
330
+ },
331
+ };
332
+
333
+ export const NoFooter: Story = {
334
+ render: () => {
335
+ const modalRef = useRef<BottomSheetModal>(null);
336
+
337
+ const openModal = () => {
338
+ modalRef.current?.present();
339
+ };
340
+
341
+ const closeModal = () => {
342
+ modalRef.current?.dismiss();
343
+ };
344
+
345
+ return (
346
+ <View style={Platform.OS === 'web' ? { width: 400, height: 400 } : {}}>
347
+ <ViewWrap>
348
+ <Button onPress={openModal}>Open Modal</Button>
349
+
350
+ <Modal
351
+ ref={modalRef}
352
+ heading="Modal Heading"
353
+ description="This is a modal description without a footer."
354
+ onPressCloseButton={closeModal}
355
+ >
356
+ <Box gap="200">
357
+ <BodyText>This is a modal with content.</BodyText>
358
+ <BodyText>You can swipe it up and down to close.</BodyText>
359
+ </Box>
360
+ </Modal>
361
+ </ViewWrap>
362
+ </View>
363
+ );
364
+ },
365
+ };
366
+
367
+ export const NoSafeArea: Story = {
368
+ render: () => {
369
+ const modalRef = useRef<BottomSheetModal>(null);
370
+
371
+ const openModal = () => {
372
+ modalRef.current?.present();
373
+ };
374
+
375
+ const closeModal = () => {
376
+ modalRef.current?.dismiss();
377
+ };
378
+
379
+ return (
380
+ <BottomSheetModalProvider useSafeAreaInsets={false}>
381
+ <View style={Platform.OS === 'web' ? { width: 400, height: 400 } : {}}>
382
+ <ViewWrap>
383
+ <Button onPress={openModal}>Open Modal</Button>
384
+
385
+ <Modal
386
+ ref={modalRef}
387
+ heading="Modal Heading"
388
+ description="This is a modal description without safe area insets."
389
+ onPressCloseButton={closeModal}
390
+ primaryButtonText="Primary"
391
+ onPressPrimaryButton={closeModal}
392
+ secondaryButtonText="Cancel"
393
+ onPressSecondaryButton={closeModal}
394
+ >
395
+ <Box gap="200">
396
+ <BodyText>This is a modal with content.</BodyText>
397
+ <BodyText>You can swipe it up and down to close.</BodyText>
398
+ </Box>
399
+ </Modal>
400
+ </ViewWrap>
401
+ </View>
402
+ </BottomSheetModalProvider>
403
+ );
404
+ },
405
+ };