{"version":3,"file":"Stakeholders.stories.jsx","sourceRoot":"","sources":["../../../src/work/Stakeholders/Stakeholders.stories.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { action } from '@storybook/addon-actions';\nimport type { Meta, StoryFn } from '@storybook/react';\n\nimport { Banner, createStringMatcher, type BannerHandleValue } from '@pega/cosmos-react-core';\nimport { Stakeholders } from '@pega/cosmos-react-work';\nimport type { StakeholdersProps, Stakeholder } from '@pega/cosmos-react-work';\n\nimport {\n  AddAndEditForm,\n  mockNetworkReq,\n  mockRoles,\n  useMockStakeholders\n} from './Stakeholders.mocks';\n\nexport default {\n  title: 'Work/Stakeholders',\n  component: Stakeholders\n} as Meta;\n\ninterface StakeHoldersStoryProps {\n  hideAddNew?: boolean;\n  formErrorBanner?: boolean;\n}\n\nexport const StakeHoldersDemo: StoryFn<StakeHoldersStoryProps> = (args: StakeHoldersStoryProps) => {\n  const [loading, setLoading] = useState(true);\n  const [mode, setMode] = useState<undefined | 'add' | 'viewAll'>();\n  const [editing, setEditing] = useState<Stakeholder['id'] | null>(null);\n  const [formLoading, setFormLoading] = useState(false);\n  const [viewAllLoading, setViewAllLoading] = useState(false);\n  const [viewAllSearchValue, setViewAllSearchValue] = useState('');\n  const [banners, setBanners] = useState<StakeholdersProps['form']['banners']>(null);\n  const bannerHandleRef = useRef<BannerHandleValue>(null);\n  const [hasServerError, setHasServerError] = useState(false);\n\n  // Grab some mock data...\n  const [mockStakeholders, setMockStakeholders] = useMockStakeholders(() => {\n    setLoading(false);\n  });\n\n  const [editData, setEditData] = useState<\n    StakeholdersProps['form']['rendererProps'] | undefined\n  >();\n\n  // Merges built-in available actions with stakeholder objects.\n  const addActions = useCallback(\n    (items: Stakeholder[]) => {\n      return items.map(({ role, data, ...stakeholder }) => {\n        return {\n          ...stakeholder,\n          onEdit: () => {\n            setFormLoading(true);\n            setEditing(stakeholder.id);\n            setEditData(mockStakeholders.find(ms => ms.id === stakeholder.id)?.data);\n            mockNetworkReq().then(() => setFormLoading(false));\n          },\n          onRemove: () => {\n            setMockStakeholders(cur => cur.filter(({ id }) => id !== stakeholder.id));\n          }\n        };\n      });\n    },\n    [mockStakeholders]\n  );\n\n  const form: StakeholdersProps['form'] = useMemo(() => {\n    return {\n      // Set this to true when fetching view metadata for the form or during submit validation.\n      loading: formLoading,\n      // Represents \"available\" roles for a stakeholder. Set to undefined when choosing not to present them as options.\n      roles: mode === 'add' ? mockRoles : undefined,\n      // Represents the current role of a stakeholder if they have one. When undefined the first role in the roles array with be selected in the UI.\n      currentRole: editing ? mockStakeholders.find(({ id }) => id === editing)?.role : undefined,\n      /**\n       * A function that will be invoked by React's createElement. If only a simple function is needed then an inline arrow is ok.\n       * If local state(hooks) is desired best to define a stable component definition outside of the parent component's function body.\n       */\n      renderer: AddAndEditForm,\n      rendererProps: editData,\n      banners,\n      onSubmit: ({ selectedRoleName, closeForm }) => {\n        setFormLoading(true);\n        action(`The selected role is: ${selectedRoleName}`);\n        // Create or update the stakeholder resource.\n        const req = mockNetworkReq(args.formErrorBanner);\n        req\n          .then(() => {\n            closeForm();\n          })\n          .catch(() => {\n            setBanners(\n              <Banner\n                variant='urgent'\n                messages={['500: Unexpected error']}\n                handle={bannerHandleRef}\n              />\n            );\n            setHasServerError(true);\n          })\n          .finally(() => {\n            setFormLoading(false);\n          });\n      },\n      onDismiss: ({ closeForm }) => {\n        closeForm();\n      },\n      onAfterClose: () => {\n        // Clean up loading state when the form is closed.\n        setFormLoading(false);\n        setEditing(null);\n        setEditData(undefined);\n        setMode(undefined);\n        setBanners(null);\n        setHasServerError(true);\n      }\n    };\n  }, [mode, formLoading, mockRoles, editing, editData, banners]);\n\n  const viewAll: StakeholdersProps['viewAll'] = useMemo(() => {\n    let viewAllItems = mockStakeholders;\n\n    // When the user has entered a search value we can filter the array or api request.\n    if (viewAllSearchValue) {\n      // For client side searches cosmos offers utils such as createStringMatcher for creating RegExp with params.\n      const filterRegex = createStringMatcher(viewAllSearchValue, 'boundary');\n      // Asserting as string since, in this demo, primary is a string. But type is a non nullable ReactNode.\n      viewAllItems = mockStakeholders.filter(({ primary }) => filterRegex.test(primary as string));\n    }\n\n    return {\n      // Set this to true when fetching data for the view all modal.\n      loading: viewAllLoading,\n      // Even when loading is true this must be an array, empty or not.\n      items: addActions(viewAllItems),\n      // The search string will be handed back as the arg, pass a state setter and filter off of that.\n      onSearch: setViewAllSearchValue,\n      onAfterClose: () => {\n        // Clean up loading state when the modal is closed.\n        if (viewAllLoading) setViewAllLoading(false);\n        setViewAllSearchValue('');\n      }\n    };\n  }, [viewAllLoading, mockStakeholders, viewAllSearchValue, addActions]);\n\n  useEffect(() => {\n    // Orchestrate based on mode state if needed.\n  }, [mode]);\n\n  useEffect(() => {\n    // Orchestrate based on editing state if needed.\n  }, [editing]);\n\n  useEffect(() => {\n    if (hasServerError) {\n      // Wait for banner to be rendered before calling focus.\n      bannerHandleRef.current?.focus();\n    }\n  }, [hasServerError]);\n\n  return (\n    <Stakeholders\n      loading={loading}\n      items={useMemo(\n        () => addActions(mockStakeholders.slice(0, 3)),\n        [addActions, mockStakeholders]\n      )}\n      count={loading ? undefined : mockStakeholders.length}\n      onAddNew={\n        args.hideAddNew\n          ? undefined\n          : () => {\n              setMode('add');\n              setFormLoading(true);\n              mockNetworkReq().then(() => setFormLoading(false));\n            }\n      }\n      form={form}\n      onViewAll={() => {\n        setMode('viewAll');\n        setViewAllLoading(true);\n        mockNetworkReq().then(() => setViewAllLoading(false));\n      }}\n      viewAll={viewAll}\n    />\n  );\n};\n\nStakeHoldersDemo.args = {\n  hideAddNew: false,\n  formErrorBanner: false\n};\n\nStakeHoldersDemo.argTypes = {\n  hideAddNew: { control: { type: 'boolean' } },\n  formErrorBanner: { control: { type: 'boolean' } }\n};\n"]}