saleor-dashboard/src/translations/views/TranslationsCollections.tsx

129 lines
4 KiB
TypeScript
Raw Normal View History

2019-06-19 14:40:52 +00:00
import { stringify as stringifyQs } from "qs";
2019-08-09 10:26:22 +00:00
import React from "react";
import { useIntl } from "react-intl";
2019-06-19 14:40:52 +00:00
import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier";
import useShop from "@saleor/hooks/useShop";
import { commonMessages } from "@saleor/intl";
2019-12-06 17:11:46 +00:00
import { maybe } from "../../misc";
2019-06-19 14:40:52 +00:00
import { LanguageCodeEnum, TranslationInput } from "../../types/globalTypes";
import TranslationsCollectionsPage, {
fieldNames
} from "../components/TranslationsCollectionsPage";
import { TypedUpdateCollectionTranslations } from "../mutations";
import { TypedCollectionTranslationDetails } from "../queries";
import { UpdateCollectionTranslations } from "../types/UpdateCollectionTranslations";
import {
languageEntitiesUrl,
languageEntityUrl,
TranslatableEntities
} from "../urls";
export interface TranslationsCollectionsQueryParams {
activeField: string;
}
export interface TranslationsCollectionsProps {
id: string;
languageCode: LanguageCodeEnum;
params: TranslationsCollectionsQueryParams;
}
const TranslationsCollections: React.FC<TranslationsCollectionsProps> = ({
id,
languageCode,
params
}) => {
const navigate = useNavigator();
const notify = useNotifier();
const shop = useShop();
const intl = useIntl();
2019-06-19 14:40:52 +00:00
const onEdit = (field: string) =>
navigate(
"?" +
stringifyQs({
activeField: field
}),
true
);
const onUpdate = (data: UpdateCollectionTranslations) => {
if (data.collectionTranslate.errors.length === 0) {
notify({
text: intl.formatMessage(commonMessages.savedChanges)
2019-06-19 14:40:52 +00:00
});
navigate("?", true);
}
};
const onDiscard = () => {
navigate("?", true);
};
return (
<TypedCollectionTranslationDetails
variables={{ id, language: languageCode }}
>
{collectionTranslations => (
<TypedUpdateCollectionTranslations onCompleted={onUpdate}>
{(updateTranslations, updateTranslationsOpts) => {
const handleSubmit = (field: string, data: string) => {
const input: TranslationInput = {};
if (field === fieldNames.descriptionJson) {
input.descriptionJson = 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;
}
updateTranslations({
variables: {
id,
input,
language: languageCode
}
});
};
return (
<TranslationsCollectionsPage
activeField={params.activeField}
disabled={
collectionTranslations.loading ||
updateTranslationsOpts.loading
}
languageCode={languageCode}
languages={maybe(() => shop.languages, [])}
2019-12-06 17:11:46 +00:00
saveButtonState={updateTranslationsOpts.state}
2019-06-19 14:40:52 +00:00
onEdit={onEdit}
onDiscard={onDiscard}
onBack={() =>
navigate(
2019-09-12 12:43:37 +00:00
languageEntitiesUrl(languageCode, {
tab: TranslatableEntities.collections
})
2019-06-19 14:40:52 +00:00
)
}
onLanguageChange={lang =>
navigate(
languageEntityUrl(
lang,
TranslatableEntities.collections,
id
)
)
}
onSubmit={handleSubmit}
collection={maybe(() => collectionTranslations.data.collection)}
/>
);
}}
</TypedUpdateCollectionTranslations>
)}
</TypedCollectionTranslationDetails>
);
};
TranslationsCollections.displayName = "TranslationsCollections";
export default TranslationsCollections;