diff --git a/.changeset/friendly-dolphins-jump.md b/.changeset/friendly-dolphins-jump.md new file mode 100644 index 00000000..a03f1702 --- /dev/null +++ b/.changeset/friendly-dolphins-jump.md @@ -0,0 +1,6 @@ +--- +'storybook-pages': minor +'@smile/haring-react': minor +--- + +Create Stepper page diff --git a/packages/haring-react/src/Form/AddressAutocompleteFields/AddressAutocompleteFields.tsx b/packages/haring-react/src/Form/AddressAutocompleteFields/AddressAutocompleteFields.tsx index 5a8ae545..aca684bc 100644 --- a/packages/haring-react/src/Form/AddressAutocompleteFields/AddressAutocompleteFields.tsx +++ b/packages/haring-react/src/Form/AddressAutocompleteFields/AddressAutocompleteFields.tsx @@ -7,7 +7,7 @@ import type { import type { TextInputProps } from '@mantine/core'; import type { ElementType, ReactElement } from 'react'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { AddressFields } from '../AddressFields/AddressFields'; import { FetchAutocompleteField } from '../FetchAutocompleteField/FetchAutocompleteField'; @@ -57,7 +57,9 @@ export function AddressAutocompleteFields( setAllFieldsValues(values); onFieldsValuesChange?.(values); } - + useEffect(() => { + setAllFieldsValues(addressFieldsProps ?? {}); + }, [addressFieldsProps]); return (
) => { + onChange: (e: React.ChangeEvent) => { onChangeHandle('postCode', e.target.value); }, value: value?.postCode, diff --git a/packages/haring-react/src/index.tsx b/packages/haring-react/src/index.tsx index 8f63bf3c..72ea1b7f 100644 --- a/packages/haring-react/src/index.tsx +++ b/packages/haring-react/src/index.tsx @@ -4,6 +4,14 @@ // component exports export type { IFullNameFieldsProps } from './Form/FullNameFields/FullNameFields'; export { FullNameFields } from './Form/FullNameFields/FullNameFields'; +export type { IAddressAutocompleteFieldsProps } from './Form/AddressAutocompleteFields/AddressAutocompleteFields'; +export { AddressAutocompleteFields } from './Form/AddressAutocompleteFields/AddressAutocompleteFields'; +export type { IFetchAutocompleteFieldProps } from './Form/FetchAutocompleteField/FetchAutocompleteField'; +export { FetchAutocompleteField } from './Form/FetchAutocompleteField/FetchAutocompleteField'; +export type { IAddressAutocompleteFieldProps } from './Form/AddressGouvAutocompleteField/AddressGouvAutocompleteField'; +export { AddressGouvAutocompleteField } from './Form/AddressGouvAutocompleteField/AddressGouvAutocompleteField'; +export type { IAddressFieldsProps } from './Form/AddressFields/AddressFields'; +export { AddressFields } from './Form/AddressFields/AddressFields'; export type { IIconCardProps } from './Components/IconCard/IconCard'; export { IconCard } from './Components/IconCard/IconCard'; export type { IDataBadgeProps } from './Components/DataBadge/DataBadge'; diff --git a/packages/storybook-pages/src/Pages/StepperPage/Code.mdx b/packages/storybook-pages/src/Pages/StepperPage/Code.mdx new file mode 100644 index 00000000..ab1d2819 --- /dev/null +++ b/packages/storybook-pages/src/Pages/StepperPage/Code.mdx @@ -0,0 +1,13 @@ +import { Meta, Source } from '@storybook/blocks'; + +import * as StepperPageStory from './StepperPage.stories'; + +import StepperPage from './StepperPage?raw'; + + + +# Code + +Code of StepperPage page + + diff --git a/packages/storybook-pages/src/Pages/StepperPage/StepperPage.mock.tsx b/packages/storybook-pages/src/Pages/StepperPage/StepperPage.mock.tsx new file mode 100644 index 00000000..c5da8806 --- /dev/null +++ b/packages/storybook-pages/src/Pages/StepperPage/StepperPage.mock.tsx @@ -0,0 +1,7 @@ +export const texts = { + steps: { + step1: 'Step 1: ', + step2: 'Step 2: ', + step3: 'Completed, click back button to get to previous step', + }, +}; diff --git a/packages/storybook-pages/src/Pages/StepperPage/StepperPage.stories.tsx b/packages/storybook-pages/src/Pages/StepperPage/StepperPage.stories.tsx new file mode 100644 index 00000000..d501b457 --- /dev/null +++ b/packages/storybook-pages/src/Pages/StepperPage/StepperPage.stories.tsx @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from '@storybook/react'; + +import { StepperPage as Cmp } from './StepperPage'; + +const meta = { + component: Cmp, + parameters: { + layout: 'fullscreen', + }, + title: '3-custom/Pages/StepperPage', +} satisfies Meta; + +export default meta; +type IStory = StoryObj; + +export const StepperPage: IStory = { + args: {}, +}; diff --git a/packages/storybook-pages/src/Pages/StepperPage/StepperPage.tsx b/packages/storybook-pages/src/Pages/StepperPage/StepperPage.tsx new file mode 100644 index 00000000..bbbb67c5 --- /dev/null +++ b/packages/storybook-pages/src/Pages/StepperPage/StepperPage.tsx @@ -0,0 +1,134 @@ +'use client'; +import type { IAddressFieldsValues } from '@smile/haring-react/src/Form/AddressFields/AddressFields'; +import type { IValue } from '@smile/haring-react/src/Form/FetchAutocompleteField/FetchAutocompleteField'; +import type { ReactElement } from 'react'; + +import { Button, Flex, Group, Stepper } from '@mantine/core'; +import { useForm } from '@mantine/form'; +import { + AddressAutocompleteFields, + FoldableColumnLayout, + FullNameFields, + SidebarMenu, +} from '@smile/haring-react'; +import { useState } from 'react'; + +import { menuMock } from '../BrowsingPage/BrowsingPage.mock'; + +import { texts } from './StepperPage.mock'; + +export interface IAddressGouvData { + properties: { + city?: string; + housenumber?: string; + label: string; + postcode?: string; + street?: string; + }; +} + +async function getDataAddressGouvRequest( + value: string, +): Promise[]> { + const response = await fetch( + `https://api-adresse.data.gouv.fr/search/?q=${encodeURIComponent( + value, + )}&autocomplete=1`, + ); + const data: { features: IAddressGouvData[] } = await response.json(); + const result = data.features.map((element) => { + return { label: element.properties.label, value: element }; + }); + + return result; +} + +export function StepperPage(): ReactElement { + const [active, setActive] = useState(0); + + const form = useForm({ + initialValues: { + address: { + city: '', + country: '', + number: '', + postCode: '', + street: '', + }, + fullName: { + firstName: '', + lastName: '', + }, + }, + }); + + const nextStep = (): void => { + if (!form.validate().hasErrors) { + setActive((current) => (current < 3 ? current + 1 : current)); + } + }; + + const prevStep = (): void => { + setActive((current) => (current > 0 ? current - 1 : current)); + }; + + function onOptionSubmitMock( + value: IValue, + ): IAddressFieldsValues { + const address = value.value.properties; + const newAddress = { + city: address.city ?? '', + country: 'France', + number: address.housenumber ?? '', + postCode: address.postcode ?? '', + street: address.street ?? '', + }; + form.setFieldValue('address', newAddress); + return newAddress; + } + + return ( + + + + } + > + + + {texts.steps.step1} + + + + {texts.steps.step2} + { + form.setFieldValue('address', { + city: values.city ?? '', + country: values.country ?? form.values.address.country, + number: values.number ?? '', + postCode: values.postCode ?? '', + street: values.street ?? '', + }); + }} + onOptionSubmit={onOptionSubmitMock} + /> + + {texts.steps.step3} + + + + {active !== 0 && ( + + )} + {active !== 2 && } + + + ); +}