diff --git a/apps/docs/pages/docs/v2/Components/modal.en-US.mdx b/apps/docs/pages/docs/v2/Components/modal.en-US.mdx new file mode 100644 index 00000000..349fd427 --- /dev/null +++ b/apps/docs/pages/docs/v2/Components/modal.en-US.mdx @@ -0,0 +1,63 @@ +--- +searchable: true +--- + +import { CodeEditor } from '@components/code-editor'; +import PropsTable from "@components/docs/props-table"; + +# Modal + +Component to render a modal imported from `react-native-modal` + +https://github.com/react-native-modal/react-native-modal + +## Import + +```js +import { Modal } from "@ficus-ui/native"; +``` + +## Usage + + { + const { isOpen, onOpen, onClose } = useDisclosure(); + return ( + + + + + + + + ); +} +render()`} noInline /> + +## Props + +Extends every `Box` and `Modal` from React Native props. + +### `visible` + \ No newline at end of file diff --git a/apps/examples/app/components-v2/Modal.tsx b/apps/examples/app/components-v2/Modal.tsx new file mode 100644 index 00000000..aa6a7ae4 --- /dev/null +++ b/apps/examples/app/components-v2/Modal.tsx @@ -0,0 +1,46 @@ +import { + Modal, + SafeAreaBox, + Text, +} from "@ficus-ui/native"; +import ExampleSection from '@/src/ExampleSection'; +import { Button, Icon, useDisclosure } from "react-native-ficus-ui"; + +const ModalComponent = () => { + const { isOpen, onOpen, onClose } = useDisclosure(); + return ( + + + Modal + + + + + + + + + + ); +}; + +export default ModalComponent; diff --git a/apps/examples/app/items-v2.ts b/apps/examples/app/items-v2.ts index f249e11f..56249359 100644 --- a/apps/examples/app/items-v2.ts +++ b/apps/examples/app/items-v2.ts @@ -19,6 +19,7 @@ import IconComponent from '@/app/components-v2/Icon'; import ListComponent from '@/app/components-v2/List'; import SectionListComponent from '@/app/components-v2/SectionList'; import FlashListComponent from '@/app/components-v2/FlashList'; +import ModalComponent from '@/app/components-v2/Modal'; type ExampleComponentType = { onScreenName: string; @@ -47,4 +48,5 @@ export const components: ExampleComponentType[] = [ { navigationPath: 'List', onScreenName: 'List', component: ListComponent }, { navigationPath: 'SectionList', onScreenName: 'SectionList', component: SectionListComponent }, { navigationPath: 'FlashList', onScreenName: 'FlashList', component: FlashListComponent }, + { navigationPath: 'Modal', onScreenName: 'Modal', component: ModalComponent }, ]; diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts index 806360b4..2f3243c9 100644 --- a/packages/components/src/index.ts +++ b/packages/components/src/index.ts @@ -16,5 +16,6 @@ export * from './icon'; export * from './list'; export * from './section-list'; export * from './flash-list'; +export * from './modal'; export { ThemeProvider } from '@ficus-ui/theme'; diff --git a/packages/components/src/modal/index.tsx b/packages/components/src/modal/index.tsx new file mode 100644 index 00000000..8d39be07 --- /dev/null +++ b/packages/components/src/modal/index.tsx @@ -0,0 +1,7 @@ +import { ModalProps } from 'react-native'; + +import { type NativeFicusProps, ficus } from '../system'; + +export interface ModalProp extends NativeFicusProps<'Modal'>, ModalProps {} + +export const Modal = ficus('Modal'); diff --git a/packages/components/src/modal/modal.spec.tsx b/packages/components/src/modal/modal.spec.tsx new file mode 100644 index 00000000..5d4dcc22 --- /dev/null +++ b/packages/components/src/modal/modal.spec.tsx @@ -0,0 +1,30 @@ +import { renderWithTheme as render } from '@test-utils'; + +import { Modal } from '.'; +import { Box } from '../box'; + +jest.mock('react-native-toast-message', () => 'Toast'); + +describe('Modal component', () => { + it('is visible when the visible prop is true', () => { + const { getByTestId } = render( + + + + ); + const modalComponent = getByTestId('modal'); + + expect(modalComponent.props.visible).toBe(true); + }); + + it('renders children correctly', () => { + const { getByTestId } = render( + + + + ); + + const modalContent = getByTestId('modal-content'); + expect(modalContent).toBeTruthy(); + }); +}); diff --git a/packages/components/src/system/base-elements.ts b/packages/components/src/system/base-elements.ts index 781ffda1..389adb04 100644 --- a/packages/components/src/system/base-elements.ts +++ b/packages/components/src/system/base-elements.ts @@ -4,6 +4,7 @@ import { ActivityIndicator as RNActivityIndicator, FlatList as RNFlatList, Image as RNImage, + Modal as RNModal, Pressable as RNPressable, SafeAreaView as RNSafeAreaView, ScrollView as RNScrollView, @@ -33,6 +34,7 @@ export const baseRNElements = { Flatlist: RNFlatList, SectionList: RNSectionList, FlashList: ShopifyFlashList, + Modal: RNModal, } as const; export type BaseRNElements = keyof typeof baseRNElements;