import { Meta, StoryObj } from '@storybook/react-webpack5'; import { useState } from 'react'; import AvatarView from '../avatarView'; import Body from '../body'; import Button from '../button'; import { ProfileType, Typography } from '../common'; import Logo from '../logo'; import OverlayHeader from '../overlayHeader'; import { lorem10 } from '../test-utils'; import Display from '../display'; import Sticky from '../sticky'; import FlowNavigation, { FlowNavigationProps } from './FlowNavigation'; interface CustomControls { showCloseButton: boolean; showMobileBackButton: boolean; avatarURL?: string; profileType?: ProfileType; } export type StoryArgs = FlowNavigationProps & CustomControls; type Story = StoryObj; const meta: Meta = { component: FlowNavigation, title: 'Navigation/FlowNavigation', argTypes: { showCloseButton: { control: 'boolean', defaultValue: true }, showMobileBackButton: { control: 'boolean', defaultValue: true }, done: { control: 'boolean', defaultValue: false }, avatarURL: { control: 'text', defaultValue: '../tapestry-01.png' }, profileType: { control: 'radio', options: [ProfileType.PERSONAL, ProfileType.BUSINESS], defaultValue: ProfileType.PERSONAL, }, }, parameters: { docs: { source: { type: 'code' }, }, }, }; export default meta; type FlowNavArgs = { showCloseButton: boolean; showMobileBackButton: boolean; done: boolean; avatarURL?: string; profileType?: ProfileType; [key: string]: unknown; }; export const Variants: Story = { args: { profileType: ProfileType.PERSONAL, showCloseButton: true, showMobileBackButton: true, done: false, avatarURL: '../tapestry-01.png', }, render: (args) => { const [activeStep, setActiveStep] = useState(2); const [closed, setClosed] = useState(false); if (closed) return <>; return ( <> : null} logo={} activeStep={activeStep} done={args.done} steps={[ { label: 'Amount', hoverLabel: 100 GBP, onClick: () => setActiveStep(0), }, { label: 'You', hoverLabel: <>Elena Durante - elenadurante@test.com, onClick: () => setActiveStep(1), }, { label: 'Recipient', hoverLabel: 'Daniele Tomboro', onClick: () => setActiveStep(2) }, { label: 'Review', hoverLabel: 'Antonio Dozortevo', onClick: () => setActiveStep(3) }, { label: 'Pay', hoverLabel: 'Enrico Gusso II', onClick: () => setActiveStep(4), }, ]} onClose={args.showCloseButton ? () => setClosed(true) : undefined} onGoBack={ args.showMobileBackButton ? () => setActiveStep(activeStep > 0 ? activeStep - 1 : 0) : undefined } />
100 GBP
0.2351 ETH ), onClick: () => setActiveStep(0), }, { label: 'You', hoverLabel: ( <>
Elena Durante
elenadurante@test.com ), onClick: () => setActiveStep(1), }, { label: 'Recipient', hoverLabel: 'Daniele Tomboro', onClick: () => setActiveStep(2) }, { label: 'Review', hoverLabel: 'Antonio Dozortevo', onClick: () => setActiveStep(3) }, { label: 'Pay', hoverLabel: 'Enrico Gusso II', onClick: () => setActiveStep(4), }, ]} onClose={args.showCloseButton ? () => setClosed(true) : undefined} onGoBack={ args.showMobileBackButton ? () => setActiveStep(activeStep - 1 > 0 ? activeStep - 1 : 0) : undefined } /> } activeStep={activeStep} steps={[ { label: 'Amount', hoverLabel: ( <>
100 GBP
0.2351 ETH ), onClick: () => setActiveStep(0), }, { label: 'You', hoverLabel: ( <>
Elena Durante
elenadurante@test.com ), onClick: () => setActiveStep(1), }, { label: 'Recipient', hoverLabel: 'Daniele Tomboro', onClick: () => setActiveStep(2) }, { label: 'Review', hoverLabel: 'Antonio Dozortevo', onClick: () => setActiveStep(3) }, { label: 'Pay', hoverLabel: 'Enrico Gusso II', onClick: () => setActiveStep(4), }, ]} onClose={args.showCloseButton ? () => setClosed(true) : undefined} onGoBack={ args.showMobileBackButton ? () => setActiveStep(activeStep - 1 > 0 ? activeStep - 1 : 0) : undefined } /> {/* Instance of always `done` FlowNav for visual testing */} } activeStep={activeStep} steps={[ { label: 'Recipient', hoverLabel: 'Daniele Tomboro', onClick: () => setActiveStep(0) }, { label: 'Review', hoverLabel: 'Antonio Dozortevo', onClick: () => setActiveStep(1) }, { label: 'Pay', hoverLabel: 'Enrico Gusso', onClick: () => setActiveStep(2) }, ]} onClose={args.showCloseButton ? () => setClosed(true) : undefined} onGoBack={ args.showMobileBackButton ? () => setActiveStep(activeStep - 1 > 0 ? activeStep - 1 : 0) : undefined } /> Content to test that the flow nav is centred ); }, }; export const SendFlow: Story = { args: { profileType: ProfileType.PERSONAL, showCloseButton: true, showMobileBackButton: true, done: false, avatarURL: '../tapestry-01.png', }, render: (args) => { const [activeStep, setActiveStep] = useState(2); const steps = [ { label: 'Recipient', onClick: handleStepClick(0), }, { label: 'Amount', hoverLabel: ( <> You send 100 GBP
You get 99.39 GBP{' '} ), ...(activeStep > 1 && { onClick: handleStepClick(1) }), }, { label: 'Review', ...(activeStep > 2 && { onClick: handleStepClick(2) }), }, { label: 'Pay', ...(activeStep > 3 && { onClick: handleStepClick(3) }), }, ]; function handleStepClick(step: number) { return () => { setActiveStep(step); }; } return ( <> } logo={} activeStep={activeStep} steps={steps} onClose={() => alert('close & move away')} onGoBack={() => setActiveStep(activeStep > 0 ? activeStep - 1 : 0)} /> {steps[activeStep].label} Step
{lorem10}
); }, }; export const WithOverlayHeaderComparison: Story = { args: { profileType: ProfileType.PERSONAL, showCloseButton: true, showMobileBackButton: true, done: false, avatarURL: '../tapestry-01.png', }, render: (args) => { const [activeStep, setActiveStep] = useState(4); const [closed, setClosed] = useState(false); if (closed) return <>; return ( <>
: null} activeStep={activeStep} done={args.done} steps={[]} onClose={args.showCloseButton ? () => setClosed(true) : undefined} onGoBack={ args.showMobileBackButton ? () => setActiveStep(activeStep > 0 ? activeStep - 1 : 0) : undefined } />
: null} onClose={args.showCloseButton ? () => setClosed(true) : undefined} />
); }, };