From 828e2072090ccfea027c4b7411a799fb0d891902 Mon Sep 17 00:00:00 2001 From: Magdalena Markusik Date: Thu, 24 Sep 2020 14:11:30 +0200 Subject: [PATCH] add error handling to seo form --- .../CategoryCreatePage/CategoryCreatePage.tsx | 1 + .../CollectionCreatePage.tsx | 1 + src/components/SeoForm/SeoForm.tsx | 81 ++++++++++++++++--- .../PageDetailsPage/PageDetailsPage.tsx | 6 +- .../ProductCreatePage/ProductCreatePage.tsx | 1 + .../ProductUpdatePage/ProductUpdatePage.tsx | 1 + 6 files changed, 79 insertions(+), 12 deletions(-) diff --git a/src/categories/components/CategoryCreatePage/CategoryCreatePage.tsx b/src/categories/components/CategoryCreatePage/CategoryCreatePage.tsx index 4659a8340..ed71cf471 100644 --- a/src/categories/components/CategoryCreatePage/CategoryCreatePage.tsx +++ b/src/categories/components/CategoryCreatePage/CategoryCreatePage.tsx @@ -79,6 +79,7 @@ export const CategoryCreatePage: React.FC = ({ /> = ({ /> ({ addressBar: { @@ -66,8 +86,10 @@ interface SeoFormProps { description?: string; descriptionPlaceholder: string; disabled?: boolean; + errors?: ProductErrorFragment[] | PageErrorFragment[]; loading?: boolean; helperText?: string; + isCreating?: boolean; title: string; slug: string; slugPlaceholder?: string; @@ -81,7 +103,9 @@ const SeoForm: React.FC = props => { description, descriptionPlaceholder, disabled, + errors, helperText, + isCreating = false, loading, title, slug, @@ -96,6 +120,43 @@ const SeoForm: React.FC = props => { const toggleExpansion = () => setExpansionStatus(!expanded); const shouldDisplayHelperText = helperText && !expanded; + const getFilteredErrors = () => + (errors as Error[])?.filter(({ field }) => + Object.keys(SeoField).includes(field) + ) || []; + + const getError = (fieldName: SeoField) => + getFilteredErrors().find(({ field }) => fieldName === field); + + const isError = (fieldName: SeoField) => !!getError(fieldName); + + const getSlugHelperText = () => { + const error = isError(SeoField.slug); + + if (isCreating && !error) { + return intl.formatMessage({ + defaultMessage: DEFAULT_INPUT_MESSAGE + }); + } + + if (error) { + return getSlugErrorHelperText(); + } + + return ""; + }; + + const getSlugErrorHelperText = () => { + const error = getError(SeoField.slug); + const { __typename: type } = error; + + return type === "ProductError" + ? getProductErrorMessage(error as ProductErrorFragment, intl) + : getPageErrorMessage(error as PageErrorFragment, intl); + }; + + // .replace(/[^\x00-\x7F]/g, "") + return ( = props => { {expanded && (
@@ -142,10 +204,7 @@ const SeoForm: React.FC = props => { )}
} - helperText={intl.formatMessage({ - defaultMessage: - "If empty, the preview shows what will be autogenerated." - })} + helperText={getSlugHelperText()} value={slug?.slice(0, 69)} disabled={loading || disabled} placeholder={slug || slugify(slugPlaceholder, { lower: true })} @@ -154,7 +213,8 @@ const SeoForm: React.FC = props => { />
@@ -175,8 +235,7 @@ const SeoForm: React.FC = props => {
} helperText={intl.formatMessage({ - defaultMessage: - "If empty, the preview shows what will be autogenerated." + defaultMessage: DEFAULT_INPUT_MESSAGE })} value={title?.slice(0, 69)} disabled={loading || disabled} @@ -186,7 +245,8 @@ const SeoForm: React.FC = props => { />
@@ -207,8 +267,7 @@ const SeoForm: React.FC = props => {
} helperText={intl.formatMessage({ - defaultMessage: - "If empty, the preview shows what will be autogenerated." + defaultMessage: DEFAULT_INPUT_MESSAGE })} value={description?.slice(0, 299)} onChange={onChange} diff --git a/src/pages/components/PageDetailsPage/PageDetailsPage.tsx b/src/pages/components/PageDetailsPage/PageDetailsPage.tsx index 95f0bfb43..10696254d 100644 --- a/src/pages/components/PageDetailsPage/PageDetailsPage.tsx +++ b/src/pages/components/PageDetailsPage/PageDetailsPage.tsx @@ -38,6 +38,7 @@ export interface PageDetailsPageProps { disabled: boolean; errors: PageErrorFragment[]; page: PageDetails_page; + isCreating?: boolean; saveButtonBarState: ConfirmButtonTransitionState; onBack: () => void; onRemove: () => void; @@ -55,6 +56,7 @@ const PageDetailsPage: React.FC = ({ }) => { const intl = useIntl(); const localizeDate = useDateLocalize(); + const pageExists = page === null; const initialForm: FormData = { content: maybe( @@ -77,7 +79,7 @@ const PageDetailsPage: React.FC = ({ = ({ /> = ({ )} = ({ )}