diff --git a/packages/harmony/src/components/button/FilterButton/FilterButton.tsx b/packages/harmony/src/components/button/FilterButton/FilterButton.tsx index 22aa73acaa1..9ff5166fec7 100644 --- a/packages/harmony/src/components/button/FilterButton/FilterButton.tsx +++ b/packages/harmony/src/components/button/FilterButton/FilterButton.tsx @@ -16,6 +16,7 @@ export const FilterButton = forwardRef( label, options, onSelect, + isDisabled, variant = 'fillContainer', size = 'default', iconRight = IconCaretDown, @@ -172,6 +173,7 @@ export const FilterButton = forwardRef( ? IconCloseAlt : iconRight } + disabled={isDisabled} aria-haspopup='listbox' aria-expanded={isOpen} > diff --git a/packages/harmony/src/components/button/FilterButton/types.ts b/packages/harmony/src/components/button/FilterButton/types.ts index fd2c5b306de..41f41a3220b 100644 --- a/packages/harmony/src/components/button/FilterButton/types.ts +++ b/packages/harmony/src/components/button/FilterButton/types.ts @@ -65,6 +65,11 @@ export type FilterButtonProps = { */ onSelect?: (label: string) => void + /** + * Whether interaction is disabled + */ + isDisabled?: boolean + /** * Popup anchor origin * @default { horizontal: 'center', vertical: 'bottom' } diff --git a/packages/web/src/components/data-entry/AccessAndSaleTriggerLegacy.tsx b/packages/web/src/components/data-entry/AccessAndSaleTriggerLegacy.tsx index 9d71bd446cd..9207173f64d 100644 --- a/packages/web/src/components/data-entry/AccessAndSaleTriggerLegacy.tsx +++ b/packages/web/src/components/data-entry/AccessAndSaleTriggerLegacy.tsx @@ -31,21 +31,21 @@ import { useSelector } from 'react-redux' import { toFormikValidationSchema } from 'zod-formik-adapter' import { defaultFieldVisibility } from 'pages/track-page/utils' +import { AccessAndSaleFormSchema } from 'pages/upload-page/fields/AccessAndSaleField' +import { AccessAndSaleMenuFields } from 'pages/upload-page/fields/AccessAndSaleMenuFields' +import { getCombinedDefaultGatedConditionValues } from 'pages/upload-page/fields/helpers' import { - STREAM_AVAILABILITY_TYPE, - AccessAndSaleFormSchema, AccessAndSaleFormValues, - AccessAndSaleMenuFields, FIELD_VISIBILITY, IS_STREAM_GATED, IS_UNLISTED, - STREAM_CONDITIONS, PREVIEW, PRICE_HUMANIZED, SPECIAL_ACCESS_TYPE, - getCombinedDefaultGatedConditionValues -} from 'pages/upload-page/fields/AccessAndSaleField' -import { SpecialAccessType } from 'pages/upload-page/fields/stream-availability/SpecialAccessFields' + STREAM_AVAILABILITY_TYPE, + STREAM_CONDITIONS, + SpecialAccessType +} from 'pages/upload-page/fields/types' import styles from './AccessAndSaleTriggerLegacy.module.css' import { ContextualMenu } from './ContextualMenu' 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..df6e9b87cca 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, useEffect } 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 @@ -32,23 +35,51 @@ const messages = { save: 'Save' } +export enum MenuFormCallbackStatus { + OPEN_ACCESS_AND_SALE = 'OPEN_ACCESS_AND_SALE' +} + type MenuFormProps = { isOpen: boolean onClose: () => void label: string icon: ReactNode menuFields: ReactNode + closeMenuCallback?: (data?: any) => void + displayMenuErrorMessage?: (errors: FormikErrors) => Nullable } const MenuForm = (props: MenuFormProps) => { - const { isOpen, onClose, label, icon, menuFields } = props - const { resetForm } = useFormikContext() + const { + isOpen, + onClose, + label, + icon, + menuFields, + closeMenuCallback, + displayMenuErrorMessage + } = props + const { resetForm, errors, initialStatus, status, setStatus } = + useFormikContext() const handleCancel = useCallback(() => { resetForm() onClose() }, [resetForm, onClose]) + const errorMessage = useMemo(() => { + if (errors && displayMenuErrorMessage) { + return displayMenuErrorMessage(errors) + } + }, [displayMenuErrorMessage, errors]) + + useEffect(() => { + if (!isOpen) { + closeMenuCallback?.(status) + setStatus(initialStatus) + } + }, [isOpen, closeMenuCallback, status, setStatus, initialStatus]) + return ( @@ -57,7 +88,14 @@ const MenuForm = (props: MenuFormProps) => {
{menuFields}
- + + {errorMessage ? ( + + + {errorMessage} + + + ) : null}