From d0cc9c878c57fbdbc516c3c17b0659c622f0e56b Mon Sep 17 00:00:00 2001 From: Saliou Diallo Date: Mon, 29 Jan 2024 06:08:35 -0500 Subject: [PATCH 01/15] Add invalid state handling --- .../data-entry/AccessAndSaleTriggerLegacy.tsx | 2 +- .../data-entry/ContextualMenu.module.css | 6 + .../components/data-entry/ContextualMenu.tsx | 31 ++- .../upload-page/fields/AccessAndSaleField.tsx | 139 +----------- .../fields/AccessAndSaleMenuFields.tsx | 153 +++++++++++++ .../fields/StemsAndDownloadsField.tsx | 203 +++++++++++------- .../fields/StemsAndDownloadsMenuFields.tsx | 146 +++++++------ 7 files changed, 398 insertions(+), 282 deletions(-) create mode 100644 packages/web/src/pages/upload-page/fields/AccessAndSaleMenuFields.tsx diff --git a/packages/web/src/components/data-entry/AccessAndSaleTriggerLegacy.tsx b/packages/web/src/components/data-entry/AccessAndSaleTriggerLegacy.tsx index 9d71bd446cd..7e001fe9b82 100644 --- a/packages/web/src/components/data-entry/AccessAndSaleTriggerLegacy.tsx +++ b/packages/web/src/components/data-entry/AccessAndSaleTriggerLegacy.tsx @@ -35,7 +35,6 @@ import { STREAM_AVAILABILITY_TYPE, AccessAndSaleFormSchema, AccessAndSaleFormValues, - AccessAndSaleMenuFields, FIELD_VISIBILITY, IS_STREAM_GATED, IS_UNLISTED, @@ -45,6 +44,7 @@ import { SPECIAL_ACCESS_TYPE, getCombinedDefaultGatedConditionValues } from 'pages/upload-page/fields/AccessAndSaleField' +import { AccessAndSaleMenuFields } from 'pages/upload-page/fields/AccessAndSaleMenuFields' import { SpecialAccessType } from 'pages/upload-page/fields/stream-availability/SpecialAccessFields' import styles from './AccessAndSaleTriggerLegacy.module.css' diff --git a/packages/web/src/components/data-entry/ContextualMenu.module.css b/packages/web/src/components/data-entry/ContextualMenu.module.css index bca250ff2da..28f7faac579 100644 --- a/packages/web/src/components/data-entry/ContextualMenu.module.css +++ b/packages/web/src/components/data-entry/ContextualMenu.module.css @@ -45,3 +45,9 @@ border: 1px solid var(---border-strong); background: var(--neutral-light-8); } + +.footer { + display: flex; + flex-direction: column; + align-items: center; +} diff --git a/packages/web/src/components/data-entry/ContextualMenu.tsx b/packages/web/src/components/data-entry/ContextualMenu.tsx index e8139a011c3..689949dfee7 100644 --- a/packages/web/src/components/data-entry/ContextualMenu.tsx +++ b/packages/web/src/components/data-entry/ContextualMenu.tsx @@ -1,5 +1,7 @@ -import { ReactNode, ReactElement, useCallback } from 'react' +import { ReactNode, ReactElement, useCallback, useMemo } from 'react' +import { Nullable } from '@audius/common' +import { Box, Text as HarmonyText } from '@audius/harmony' import { Button, ButtonType, @@ -15,6 +17,7 @@ import { Form, Formik, FormikConfig, + FormikErrors, FormikHelpers, FormikValues, useFormikContext @@ -38,17 +41,25 @@ type MenuFormProps = { label: string icon: ReactNode menuFields: ReactNode + displayMenuErrorMessage?: (errors: FormikErrors) => Nullable } const MenuForm = (props: MenuFormProps) => { - const { isOpen, onClose, label, icon, menuFields } = props - const { resetForm } = useFormikContext() + const { isOpen, onClose, label, icon, menuFields, displayMenuErrorMessage } = + props + const { resetForm, errors } = useFormikContext() const handleCancel = useCallback(() => { resetForm() onClose() }, [resetForm, onClose]) + const errorMessage = useMemo(() => { + if (errors && displayMenuErrorMessage) { + return displayMenuErrorMessage(errors) + } + }, [displayMenuErrorMessage, errors]) + return ( @@ -57,7 +68,14 @@ const MenuForm = (props: MenuFormProps) => {
{menuFields}
- + + {errorMessage ? ( + + + {errorMessage} + + + ) : null}