diff --git a/src/categories/views/CategoryCreate.tsx b/src/categories/views/CategoryCreate.tsx index a0f271eb2..a21e29a87 100644 --- a/src/categories/views/CategoryCreate.tsx +++ b/src/categories/views/CategoryCreate.tsx @@ -1,6 +1,7 @@ import { WindowTitle } from "@saleor/components/WindowTitle"; import useNavigator from "@saleor/hooks/useNavigator"; import useNotifier from "@saleor/hooks/useNotifier"; +import { getParsedDataForJsonStringField } from "@saleor/translations/utils"; import createMetadataCreateHandler from "@saleor/utils/handlers/metadataCreateHandler"; import { useMetadataUpdate, @@ -48,7 +49,7 @@ export const CategoryCreateView: React.FC = ({ const result = await createCategory({ variables: { input: { - description: JSON.stringify(formData.description), + description: getParsedDataForJsonStringField(formData.description), name: formData.name, seo: { description: formData.seoDescription, diff --git a/src/categories/views/CategoryDetails.tsx b/src/categories/views/CategoryDetails.tsx index e97265d89..b6ddb47a2 100644 --- a/src/categories/views/CategoryDetails.tsx +++ b/src/categories/views/CategoryDetails.tsx @@ -13,6 +13,7 @@ import usePaginator, { createPaginationState } from "@saleor/hooks/usePaginator"; import { commonMessages } from "@saleor/intl"; +import { getParsedDataForJsonStringField } from "@saleor/translations/utils"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; import createMetadataUpdateHandler from "@saleor/utils/handlers/metadataUpdateHandler"; import { mapNodeToChoice } from "@saleor/utils/maps"; @@ -188,7 +189,7 @@ export const CategoryDetails: React.FC = ({ id, input: { backgroundImageAlt: formData.backgroundImageAlt, - description: JSON.stringify(formData.description), + description: getParsedDataForJsonStringField(formData.description), name: formData.name, seo: { description: formData.seoDescription, diff --git a/src/collections/views/CollectionCreate.tsx b/src/collections/views/CollectionCreate.tsx index 9995af199..df484059b 100644 --- a/src/collections/views/CollectionCreate.tsx +++ b/src/collections/views/CollectionCreate.tsx @@ -7,6 +7,7 @@ import useChannels from "@saleor/hooks/useChannels"; import useNavigator from "@saleor/hooks/useNavigator"; import useNotifier from "@saleor/hooks/useNotifier"; import { commonMessages } from "@saleor/intl"; +import { getParsedDataForJsonStringField } from "@saleor/translations/utils"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; import createMetadataCreateHandler from "@saleor/utils/handlers/metadataCreateHandler"; import { @@ -102,7 +103,7 @@ export const CollectionCreate: React.FC = ({ input: { backgroundImage: formData.backgroundImage.value, backgroundImageAlt: formData.backgroundImageAlt, - description: JSON.stringify(formData.description), + description: getParsedDataForJsonStringField(formData.description), name: formData.name, seo: { description: formData.seoDescription, diff --git a/src/collections/views/CollectionDetails.tsx b/src/collections/views/CollectionDetails.tsx index 7e661ea52..8c145a16a 100644 --- a/src/collections/views/CollectionDetails.tsx +++ b/src/collections/views/CollectionDetails.tsx @@ -21,6 +21,7 @@ import usePaginator, { } from "@saleor/hooks/usePaginator"; import { commonMessages } from "@saleor/intl"; import useProductSearch from "@saleor/searches/useProductSearch"; +import { getParsedDataForJsonStringField } from "@saleor/translations/utils"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; import createMetadataUpdateHandler from "@saleor/utils/handlers/metadataUpdateHandler"; import { @@ -198,7 +199,7 @@ export const CollectionDetails: React.FC = ({ const handleUpdate = async (formData: CollectionUpdateData) => { const input: CollectionInput = { backgroundImageAlt: formData.backgroundImageAlt, - description: JSON.stringify(formData.description), + description: getParsedDataForJsonStringField(formData.description), name: formData.name, seo: { description: formData.seoDescription, diff --git a/src/pages/components/PageDetailsPage/form.tsx b/src/pages/components/PageDetailsPage/form.tsx index e1c21856f..cfbe1c0fa 100644 --- a/src/pages/components/PageDetailsPage/form.tsx +++ b/src/pages/components/PageDetailsPage/form.tsx @@ -122,7 +122,7 @@ function usePageForm( title: page?.title || "" }); const [content, changeContent] = useRichText({ - initial: pageExists ? page?.content : null, + initial: page?.content, triggerChange }); diff --git a/src/pages/views/PageCreate.tsx b/src/pages/views/PageCreate.tsx index 5289ddc4a..b3b2f6fb6 100644 --- a/src/pages/views/PageCreate.tsx +++ b/src/pages/views/PageCreate.tsx @@ -12,6 +12,7 @@ import useNotifier from "@saleor/hooks/useNotifier"; import usePageSearch from "@saleor/searches/usePageSearch"; import usePageTypeSearch from "@saleor/searches/usePageTypeSearch"; import useProductSearch from "@saleor/searches/useProductSearch"; +import { getParsedDataForJsonStringField } from "@saleor/translations/utils"; import createMetadataCreateHandler from "@saleor/utils/handlers/metadataCreateHandler"; import { useMetadataUpdate, @@ -128,7 +129,7 @@ export const PageCreate: React.FC = ({ params }) => { attributes: formData.attributes, updatedFileAttributes }), - content: JSON.stringify(formData.content), + content: getParsedDataForJsonStringField(formData.content), isPublished: formData.isPublished, pageType: formData.pageType, publicationDate: formData.publicationDate, diff --git a/src/pages/views/PageDetails.tsx b/src/pages/views/PageDetails.tsx index 32d2eb608..04febb570 100644 --- a/src/pages/views/PageDetails.tsx +++ b/src/pages/views/PageDetails.tsx @@ -53,7 +53,7 @@ const createPageInput = ( attributes: data.attributes, updatedFileAttributes }), - content: JSON.stringify(data.content), + content: !!data.content?.blocks.length ? JSON.stringify(data.content) : null, isPublished: data.isPublished, publicationDate: data.publicationDate, seo: { diff --git a/src/products/views/ProductCreate/handlers.ts b/src/products/views/ProductCreate/handlers.ts index 4cbe4b801..0798775f5 100644 --- a/src/products/views/ProductCreate/handlers.ts +++ b/src/products/views/ProductCreate/handlers.ts @@ -37,6 +37,7 @@ import { } from "@saleor/products/types/VariantCreate"; import { getAvailabilityVariables } from "@saleor/products/utils/handlers"; import { SearchProductTypes_search_edges_node } from "@saleor/searches/types/SearchProductTypes"; +import { getParsedDataForJsonStringField } from "@saleor/translations/utils"; import { MutationFetchResult } from "react-apollo"; const getChannelsVariables = (productId: string, channels: ChannelData[]) => ({ @@ -108,7 +109,7 @@ export function createHandler( category: formData.category, chargeTaxes: formData.chargeTaxes, collections: formData.collections, - description: JSON.stringify(formData.description), + description: getParsedDataForJsonStringField(formData.description), name: formData.name, productType: formData.productType?.id, rating: formData.rating, diff --git a/src/products/views/ProductUpdate/handlers.ts b/src/products/views/ProductUpdate/handlers.ts index 47b36da63..566c32837 100644 --- a/src/products/views/ProductUpdate/handlers.ts +++ b/src/products/views/ProductUpdate/handlers.ts @@ -185,7 +185,9 @@ export function createUpdateHandler( category: data.category, chargeTaxes: data.chargeTaxes, collections: data.collections, - description: JSON.stringify(data.description), + description: !!data.description?.blocks?.length + ? JSON.stringify(data.description) + : null, name: data.name, rating: data.rating, seo: { diff --git a/src/translations/components/TranslationsCategoriesPage/TranslationsCategoriesPage.tsx b/src/translations/components/TranslationsCategoriesPage/TranslationsCategoriesPage.tsx index 66a529d52..9135a71cc 100644 --- a/src/translations/components/TranslationsCategoriesPage/TranslationsCategoriesPage.tsx +++ b/src/translations/components/TranslationsCategoriesPage/TranslationsCategoriesPage.tsx @@ -5,7 +5,10 @@ import LanguageSwitch from "@saleor/components/LanguageSwitch"; import PageHeader from "@saleor/components/PageHeader"; import { CategoryTranslationFragment } from "@saleor/fragments/types/CategoryTranslationFragment"; import { commonMessages, sectionNames } from "@saleor/intl"; -import { TranslationsEntitiesPageProps } from "@saleor/translations/types"; +import { + TranslationInputFieldName, + TranslationsEntitiesPageProps +} from "@saleor/translations/types"; import React from "react"; import { useIntl } from "react-intl"; @@ -17,13 +20,6 @@ export interface TranslationsCategoriesPageProps data: CategoryTranslationFragment; } -export const fieldNames = { - description: "description", - name: "name", - seoDescription: "seoDescription", - seoTitle: "seoTitle" -}; - const TranslationsCategoriesPage: React.FC = ({ activeField, disabled, @@ -72,14 +68,14 @@ const TranslationsCategoriesPage: React.FC = ({ displayName: intl.formatMessage({ defaultMessage: "Category Name" }), - name: fieldNames.name, + name: TranslationInputFieldName.name, translation: data?.translation?.name || null, type: "short" as "short", value: data?.category?.name }, { displayName: intl.formatMessage(commonMessages.description), - name: fieldNames.description, + name: TranslationInputFieldName.description, translation: data?.translation?.description || null, type: "rich" as "rich", value: data?.category?.description @@ -103,7 +99,7 @@ const TranslationsCategoriesPage: React.FC = ({ displayName: intl.formatMessage({ defaultMessage: "Search Engine Title" }), - name: fieldNames.seoTitle, + name: TranslationInputFieldName.seoTitle, translation: data?.translation?.seoTitle || null, type: "short" as "short", value: data?.category?.seoTitle @@ -112,7 +108,7 @@ const TranslationsCategoriesPage: React.FC = ({ displayName: intl.formatMessage({ defaultMessage: "Search Engine Description" }), - name: fieldNames.seoDescription, + name: TranslationInputFieldName.seoDescription, translation: data?.translation?.seoDescription || null, type: "long" as "long", value: data?.category?.seoDescription diff --git a/src/translations/components/TranslationsCollectionsPage/TranslationsCollectionsPage.tsx b/src/translations/components/TranslationsCollectionsPage/TranslationsCollectionsPage.tsx index ef3c962a6..371db37b3 100644 --- a/src/translations/components/TranslationsCollectionsPage/TranslationsCollectionsPage.tsx +++ b/src/translations/components/TranslationsCollectionsPage/TranslationsCollectionsPage.tsx @@ -5,7 +5,10 @@ import LanguageSwitch from "@saleor/components/LanguageSwitch"; import PageHeader from "@saleor/components/PageHeader"; import { CollectionTranslationFragment } from "@saleor/fragments/types/CollectionTranslationFragment"; import { commonMessages, sectionNames } from "@saleor/intl"; -import { TranslationsEntitiesPageProps } from "@saleor/translations/types"; +import { + TranslationInputFieldName, + TranslationsEntitiesPageProps +} from "@saleor/translations/types"; import React from "react"; import { useIntl } from "react-intl"; @@ -17,13 +20,6 @@ export interface TranslationsCollectionsPageProps data: CollectionTranslationFragment; } -export const fieldNames = { - description: "description", - name: "name", - seoDescription: "seoDescription", - seoTitle: "seoTitle" -}; - const TranslationsCollectionsPage: React.FC = ({ activeField, disabled, @@ -73,14 +69,14 @@ const TranslationsCollectionsPage: React.FC = displayName: intl.formatMessage({ defaultMessage: "Collection Name" }), - name: fieldNames.name, + name: TranslationInputFieldName.name, translation: data?.translation?.name || null, type: "short" as "short", value: data?.collection?.name }, { displayName: intl.formatMessage(commonMessages.description), - name: fieldNames.description, + name: TranslationInputFieldName.description, translation: data?.translation?.description || null, type: "rich" as "rich", value: data?.collection?.description @@ -104,7 +100,7 @@ const TranslationsCollectionsPage: React.FC = displayName: intl.formatMessage({ defaultMessage: "Search Engine Title" }), - name: fieldNames.seoTitle, + name: TranslationInputFieldName.seoTitle, translation: data?.translation?.seoTitle || null, type: "short" as "short", value: data?.collection?.seoTitle @@ -113,7 +109,7 @@ const TranslationsCollectionsPage: React.FC = displayName: intl.formatMessage({ defaultMessage: "Search Engine Description" }), - name: fieldNames.seoDescription, + name: TranslationInputFieldName.seoDescription, translation: data?.translation?.seoDescription || null, type: "long" as "long", value: data?.collection?.seoDescription diff --git a/src/translations/components/TranslationsPagesPage/TranslationsPagesPage.tsx b/src/translations/components/TranslationsPagesPage/TranslationsPagesPage.tsx index 2c8661cf8..01b79924e 100644 --- a/src/translations/components/TranslationsPagesPage/TranslationsPagesPage.tsx +++ b/src/translations/components/TranslationsPagesPage/TranslationsPagesPage.tsx @@ -5,7 +5,10 @@ import LanguageSwitch from "@saleor/components/LanguageSwitch"; import PageHeader from "@saleor/components/PageHeader"; import { PageTranslationFragment } from "@saleor/fragments/types/PageTranslationFragment"; import { commonMessages, sectionNames } from "@saleor/intl"; -import { TranslationsEntitiesPageProps } from "@saleor/translations/types"; +import { + PageTranslationInputFieldName, + TranslationsEntitiesPageProps +} from "@saleor/translations/types"; import React from "react"; import { useIntl } from "react-intl"; @@ -17,13 +20,6 @@ export interface TranslationsPagesPageProps data: PageTranslationFragment; } -export const fieldNames = { - content: "content", - seoDescription: "seoDescription", - seoTitle: "seoTitle", - title: "title" -}; - const TranslationsPagesPage: React.FC = ({ activeField, disabled, @@ -72,7 +68,7 @@ const TranslationsPagesPage: React.FC = ({ displayName: intl.formatMessage({ defaultMessage: "Page Title" }), - name: fieldNames.title, + name: PageTranslationInputFieldName.title, translation: data?.translation?.title || null, type: "short" as "short", value: data?.page?.title @@ -82,7 +78,7 @@ const TranslationsPagesPage: React.FC = ({ defaultMessage: "Content", description: "page content" }), - name: fieldNames.content, + name: PageTranslationInputFieldName.content, translation: data?.translation?.content || null, type: "rich" as "rich", value: data?.page?.content @@ -106,7 +102,7 @@ const TranslationsPagesPage: React.FC = ({ displayName: intl.formatMessage({ defaultMessage: "Search Engine Title" }), - name: fieldNames.seoTitle, + name: PageTranslationInputFieldName.seoTitle, translation: data?.translation?.seoTitle || null, type: "short" as "short", value: data?.page?.seoTitle @@ -115,7 +111,7 @@ const TranslationsPagesPage: React.FC = ({ displayName: intl.formatMessage({ defaultMessage: "Search Engine Description" }), - name: fieldNames.seoDescription, + name: PageTranslationInputFieldName.seoDescription, translation: data?.translation?.seoDescription || null, type: "long" as "long", value: data?.page?.seoDescription diff --git a/src/translations/components/TranslationsProductsPage/TranslationsProductsPage.tsx b/src/translations/components/TranslationsProductsPage/TranslationsProductsPage.tsx index 93e2d850c..b0b9c039a 100644 --- a/src/translations/components/TranslationsProductsPage/TranslationsProductsPage.tsx +++ b/src/translations/components/TranslationsProductsPage/TranslationsProductsPage.tsx @@ -5,7 +5,10 @@ import LanguageSwitch from "@saleor/components/LanguageSwitch"; import PageHeader from "@saleor/components/PageHeader"; import { ProductTranslationFragment } from "@saleor/fragments/types/ProductTranslationFragment"; import { commonMessages, sectionNames } from "@saleor/intl"; -import { TranslationsEntitiesPageProps } from "@saleor/translations/types"; +import { + TranslationInputFieldName, + TranslationsEntitiesPageProps +} from "@saleor/translations/types"; import React from "react"; import { useIntl } from "react-intl"; @@ -17,13 +20,6 @@ export interface TranslationsProductsPageProps data: ProductTranslationFragment; } -export const fieldNames = { - description: "description", - name: "name", - seoDescription: "seoDescription", - seoTitle: "seoTitle" -}; - const TranslationsProductsPage: React.FC = ({ activeField, disabled, @@ -73,7 +69,7 @@ const TranslationsProductsPage: React.FC = ({ displayName: intl.formatMessage({ defaultMessage: "Product Name" }), - name: fieldNames.name, + name: TranslationInputFieldName.name, translation: data?.translation?.name || null, type: "short" as "short", value: data?.product?.name @@ -82,7 +78,7 @@ const TranslationsProductsPage: React.FC = ({ displayName: intl.formatMessage({ defaultMessage: "Description" }), - name: fieldNames.description, + name: TranslationInputFieldName.description, translation: data?.translation?.description || null, type: "rich" as "rich", value: data?.product?.description @@ -106,7 +102,7 @@ const TranslationsProductsPage: React.FC = ({ displayName: intl.formatMessage({ defaultMessage: "Search Engine Title" }), - name: fieldNames.seoTitle, + name: TranslationInputFieldName.seoTitle, translation: data?.translation?.seoTitle || null, type: "short" as "short", value: data?.product?.seoTitle @@ -115,7 +111,7 @@ const TranslationsProductsPage: React.FC = ({ displayName: intl.formatMessage({ defaultMessage: "Search Engine Description" }), - name: fieldNames.seoDescription, + name: TranslationInputFieldName.seoDescription, translation: data?.translation?.seoDescription || null, type: "long" as "long", value: data?.product?.seoDescription diff --git a/src/translations/mutations.ts b/src/translations/mutations.ts index 20fcd85bb..3a65e570d 100644 --- a/src/translations/mutations.ts +++ b/src/translations/mutations.ts @@ -107,6 +107,7 @@ const updateCategoryTranslations = gql` } } `; + export const TypedUpdateCategoryTranslations = TypedMutation< UpdateCategoryTranslations, UpdateCategoryTranslationsVariables @@ -143,6 +144,7 @@ const updateCollectionTranslations = gql` } } `; + export const TypedUpdateCollectionTranslations = TypedMutation< UpdateCollectionTranslations, UpdateCollectionTranslationsVariables diff --git a/src/translations/types.ts b/src/translations/types.ts index 335268725..3b7aa3a6e 100644 --- a/src/translations/types.ts +++ b/src/translations/types.ts @@ -14,3 +14,17 @@ export interface TranslationsEntitiesPageProps { onLanguageChange: (lang: string) => void; onSubmit: (field: string, data: string | OutputData) => void; } + +export enum TranslationInputFieldName { + description = "description", + name = "name", + seoDescription = "seoDescription", + seoTitle = "seoTitle" +} + +export enum PageTranslationInputFieldName { + content = "content", + title = "title", + seoDescription = "seoDescription", + seoTitle = "seoTitle" +} diff --git a/src/translations/utils.ts b/src/translations/utils.ts new file mode 100644 index 000000000..d13ad2025 --- /dev/null +++ b/src/translations/utils.ts @@ -0,0 +1,24 @@ +import { OutputData } from "@editorjs/editorjs"; +import { TranslationInput } from "@saleor/types/globalTypes"; + +import { TranslationInputFieldName } from "./types"; + +export const getParsedTranslationInputData = ({ + fieldName, + data +}: { + fieldName: keyof TranslationInput; + data: string | OutputData; +}): Record => { + if (fieldName === TranslationInputFieldName.description) { + return { + description: getParsedDataForJsonStringField(data as OutputData) + }; + } + + return { [fieldName]: data as string }; +}; + +export const getParsedDataForJsonStringField = ( + data: OutputData +): string | null => (!!data.blocks?.length ? JSON.stringify(data) : null); diff --git a/src/translations/views/TranslationsCategories.tsx b/src/translations/views/TranslationsCategories.tsx index 2aa9260ff..c29fe6e12 100644 --- a/src/translations/views/TranslationsCategories.tsx +++ b/src/translations/views/TranslationsCategories.tsx @@ -1,3 +1,4 @@ +import { OutputData } from "@editorjs/editorjs"; import useNavigator from "@saleor/hooks/useNavigator"; import useNotifier from "@saleor/hooks/useNotifier"; import useShop from "@saleor/hooks/useShop"; @@ -6,18 +7,18 @@ import { stringify as stringifyQs } from "qs"; import React from "react"; import { useIntl } from "react-intl"; -import { LanguageCodeEnum, TranslationInput } from "../../types/globalTypes"; -import TranslationsCategoriesPage, { - fieldNames -} from "../components/TranslationsCategoriesPage"; +import { LanguageCodeEnum } from "../../types/globalTypes"; +import TranslationsCategoriesPage from "../components/TranslationsCategoriesPage"; import { TypedUpdateCategoryTranslations } from "../mutations"; import { useCategoryTranslationDetails } from "../queries"; +import { TranslationInputFieldName } from "../types"; import { UpdateCategoryTranslations } from "../types/UpdateCategoryTranslations"; import { languageEntitiesUrl, languageEntityUrl, TranslatableEntities } from "../urls"; +import { getParsedTranslationInputData } from "../utils"; export interface TranslationsCategoriesQueryParams { activeField: string; @@ -67,25 +68,19 @@ const TranslationsCategories: React.FC = ({ return ( {(updateTranslations, updateTranslationsOpts) => { - const handleSubmit = (field: string, data: string) => { - const input: TranslationInput = {}; - if (field === fieldNames.description) { - input.description = JSON.stringify(data); - } else if (field === fieldNames.name) { - input.name = data; - } else if (field === fieldNames.seoDescription) { - input.seoDescription = data; - } else if (field === fieldNames.seoTitle) { - input.seoTitle = data; - } + const handleSubmit = ( + fieldName: TranslationInputFieldName, + data: string | OutputData + ) => { updateTranslations({ variables: { id, - input, + input: getParsedTranslationInputData({ data, fieldName }), language: languageCode } }); }; + const translation = categoryTranslations?.data?.translation; return ( diff --git a/src/translations/views/TranslationsCollections.tsx b/src/translations/views/TranslationsCollections.tsx index 747e5bc7e..efce16ca1 100644 --- a/src/translations/views/TranslationsCollections.tsx +++ b/src/translations/views/TranslationsCollections.tsx @@ -7,18 +7,18 @@ import React from "react"; import { useIntl } from "react-intl"; import { maybe } from "../../misc"; -import { LanguageCodeEnum, TranslationInput } from "../../types/globalTypes"; -import TranslationsCollectionsPage, { - fieldNames -} from "../components/TranslationsCollectionsPage"; +import { LanguageCodeEnum } from "../../types/globalTypes"; +import TranslationsCollectionsPage from "../components/TranslationsCollectionsPage"; import { TypedUpdateCollectionTranslations } from "../mutations"; import { useCollectionTranslationDetails } from "../queries"; +import { TranslationInputFieldName } from "../types"; import { UpdateCollectionTranslations } from "../types/UpdateCollectionTranslations"; import { languageEntitiesUrl, languageEntityUrl, TranslatableEntities } from "../urls"; +import { getParsedTranslationInputData } from "../utils"; export interface TranslationsCollectionsQueryParams { activeField: string; @@ -69,21 +69,14 @@ const TranslationsCollections: React.FC = ({ return ( {(updateTranslations, updateTranslationsOpts) => { - const handleSubmit = (field: string, data: string) => { - const input: TranslationInput = {}; - if (field === fieldNames.description) { - input.description = JSON.stringify(data); - } else if (field === fieldNames.name) { - input.name = data; - } else if (field === fieldNames.seoDescription) { - input.seoDescription = data; - } else if (field === fieldNames.seoTitle) { - input.seoTitle = data; - } + const handleSubmit = ( + fieldName: TranslationInputFieldName, + data: string + ) => { updateTranslations({ variables: { id, - input, + input: getParsedTranslationInputData({ data, fieldName }), language: languageCode } }); diff --git a/src/translations/views/TranslationsPages.tsx b/src/translations/views/TranslationsPages.tsx index 8b7e735db..1d2e43f49 100644 --- a/src/translations/views/TranslationsPages.tsx +++ b/src/translations/views/TranslationsPages.tsx @@ -6,21 +6,18 @@ import { stringify as stringifyQs } from "qs"; import React from "react"; import { useIntl } from "react-intl"; -import { - LanguageCodeEnum, - PageTranslationInput -} from "../../types/globalTypes"; -import TranslationsPagesPage, { - fieldNames -} from "../components/TranslationsPagesPage"; +import { LanguageCodeEnum } from "../../types/globalTypes"; +import TranslationsPagesPage from "../components/TranslationsPagesPage"; import { TypedUpdatePageTranslations } from "../mutations"; import { usePageTranslationDetails } from "../queries"; +import { TranslationInputFieldName } from "../types"; import { UpdatePageTranslations } from "../types/UpdatePageTranslations"; import { languageEntitiesUrl, languageEntityUrl, TranslatableEntities } from "../urls"; +import { getParsedTranslationInputData } from "../utils"; export interface TranslationsPagesQueryParams { activeField: string; @@ -70,21 +67,14 @@ const TranslationsPages: React.FC = ({ return ( {(updateTranslations, updateTranslationsOpts) => { - const handleSubmit = (field: string, data: string) => { - const input: PageTranslationInput = {}; - if (field === fieldNames.content) { - input.content = JSON.stringify(data); - } else if (field === fieldNames.title) { - input.title = data; - } else if (field === fieldNames.seoDescription) { - input.seoDescription = data; - } else if (field === fieldNames.seoTitle) { - input.seoTitle = data; - } + const handleSubmit = ( + fieldName: TranslationInputFieldName, + data: string + ) => { updateTranslations({ variables: { id, - input, + input: getParsedTranslationInputData({ data, fieldName }), language: languageCode } }); diff --git a/src/translations/views/TranslationsProducts.tsx b/src/translations/views/TranslationsProducts.tsx index aede683aa..984ee4a92 100644 --- a/src/translations/views/TranslationsProducts.tsx +++ b/src/translations/views/TranslationsProducts.tsx @@ -7,18 +7,18 @@ import React from "react"; import { useIntl } from "react-intl"; import { maybe } from "../../misc"; -import { LanguageCodeEnum, TranslationInput } from "../../types/globalTypes"; -import TranslationsProductsPage, { - fieldNames -} from "../components/TranslationsProductsPage"; +import { LanguageCodeEnum } from "../../types/globalTypes"; +import TranslationsProductsPage from "../components/TranslationsProductsPage"; import { TypedUpdateProductTranslations } from "../mutations"; import { useProductTranslationDetails } from "../queries"; +import { TranslationInputFieldName } from "../types"; import { UpdateProductTranslations } from "../types/UpdateProductTranslations"; import { languageEntitiesUrl, languageEntityUrl, TranslatableEntities } from "../urls"; +import { getParsedTranslationInputData } from "../utils"; export interface TranslationsProductsQueryParams { activeField: string; @@ -68,21 +68,14 @@ const TranslationsProducts: React.FC = ({ return ( {(updateTranslations, updateTranslationsOpts) => { - const handleSubmit = (field: string, data: string) => { - const input: TranslationInput = {}; - if (field === fieldNames.description) { - input.description = JSON.stringify(data); - } else if (field === fieldNames.name) { - input.name = data; - } else if (field === fieldNames.seoDescription) { - input.seoDescription = data; - } else if (field === fieldNames.seoTitle) { - input.seoTitle = data; - } + const handleSubmit = ( + fieldName: TranslationInputFieldName, + data: string + ) => { updateTranslations({ variables: { id, - input, + input: getParsedTranslationInputData({ data, fieldName }), language: languageCode } }); diff --git a/src/utils/richText/useRichText.ts b/src/utils/richText/useRichText.ts index 652e88bc4..d05ae08ca 100644 --- a/src/utils/richText/useRichText.ts +++ b/src/utils/richText/useRichText.ts @@ -6,18 +6,21 @@ function useRichText(opts: { initial: string | null; triggerChange: () => void; }): [MutableRefObject, RichTextEditorChange] { - const data = useRef( - opts.initial === null ? { blocks: [] } : undefined - ); + const data = useRef(); const [, setLoaded] = useState(false); + useEffect(() => { - if (opts.initial !== null) { - try { - data.current = JSON.parse(opts.initial); - setLoaded(true); - } catch { - data.current = undefined; - } + if (opts.initial === null) { + data.current = { blocks: [] }; + setLoaded(true); + return; + } + + try { + data.current = JSON.parse(opts.initial); + setLoaded(true); + } catch { + data.current = undefined; } }, [opts.initial]);