Merge pull request #215 from mirumee/ref/translations
Improve code consistency
This commit is contained in:
commit
12dcda2012
5 changed files with 156 additions and 196 deletions
157
src/misc.ts
157
src/misc.ts
|
@ -1,8 +1,8 @@
|
|||
import moment from "moment-timezone";
|
||||
import { MutationFunction, MutationResult } from "react-apollo";
|
||||
import { defineMessages, IntlShape } from "react-intl";
|
||||
import urlJoin from "url-join";
|
||||
|
||||
import { defineMessages, IntlShape } from "react-intl";
|
||||
import { ConfirmButtonTransitionState } from "./components/ConfirmButton/ConfirmButton";
|
||||
import { APP_MOUNT_URI } from "./config";
|
||||
import { AddressType } from "./customers/types";
|
||||
|
@ -10,8 +10,7 @@ import { PartialMutationProviderOutput, UserError } from "./types";
|
|||
import {
|
||||
AuthorizationKeyType,
|
||||
OrderStatus,
|
||||
PaymentChargeStatusEnum,
|
||||
TaxRateType
|
||||
PaymentChargeStatusEnum
|
||||
} from "./types/globalTypes";
|
||||
|
||||
export type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<
|
||||
|
@ -181,158 +180,6 @@ export const transformAddressToForm = (data: AddressType) => ({
|
|||
streetAddress2: maybe(() => data.streetAddress2, "")
|
||||
});
|
||||
|
||||
const taxRatesMessages = defineMessages({
|
||||
accommodation: {
|
||||
defaultMessage: "Accommodation",
|
||||
description: "tax rate"
|
||||
},
|
||||
admissionToCulturalEvents: {
|
||||
defaultMessage: "Admission to cultural events",
|
||||
description: "tax rate"
|
||||
},
|
||||
admissionToEntertainmentEvents: {
|
||||
defaultMessage: "Admission to entertainment events",
|
||||
description: "tax rate"
|
||||
},
|
||||
admissionToSportingEvents: {
|
||||
defaultMessage: "Admission to sporting events",
|
||||
description: "tax rate"
|
||||
},
|
||||
advertising: {
|
||||
defaultMessage: "Advertising",
|
||||
description: "tax rate"
|
||||
},
|
||||
agriculturalSupplies: {
|
||||
defaultMessage: "Agricultural supplies",
|
||||
description: "tax rate"
|
||||
},
|
||||
babyFoodstuffs: {
|
||||
defaultMessage: "Baby foodstuffs",
|
||||
description: "tax rate"
|
||||
},
|
||||
bikes: {
|
||||
defaultMessage: "Bikes",
|
||||
description: "tax rate"
|
||||
},
|
||||
books: {
|
||||
defaultMessage: "Books",
|
||||
description: "tax rate"
|
||||
},
|
||||
childrensClothing: {
|
||||
defaultMessage: "Children's clothing",
|
||||
description: "tax rate"
|
||||
},
|
||||
domesticFuel: {
|
||||
defaultMessage: "Domestic fuel",
|
||||
description: "tax rate"
|
||||
},
|
||||
domesticServices: {
|
||||
defaultMessage: "Domestic services",
|
||||
description: "tax rate"
|
||||
},
|
||||
ebooks: {
|
||||
defaultMessage: "E-books",
|
||||
description: "tax rate"
|
||||
},
|
||||
foodstuffs: {
|
||||
defaultMessage: "Foodstuffs",
|
||||
description: "tax rate"
|
||||
},
|
||||
hotels: {
|
||||
defaultMessage: "Hotels",
|
||||
description: "tax rate"
|
||||
},
|
||||
medical: {
|
||||
defaultMessage: "Medical",
|
||||
description: "tax rate"
|
||||
},
|
||||
newspapers: {
|
||||
defaultMessage: "Newspapers",
|
||||
description: "tax rate"
|
||||
},
|
||||
passengerTransport: {
|
||||
defaultMessage: "Passenger transport",
|
||||
description: "tax rate"
|
||||
},
|
||||
pharmaceuticals: {
|
||||
defaultMessage: "Pharmaceuticals",
|
||||
description: "tax rate"
|
||||
},
|
||||
propertyRenovations: {
|
||||
defaultMessage: "Property renovations",
|
||||
description: "tax rate"
|
||||
},
|
||||
restaurants: {
|
||||
defaultMessage: "Restaurants",
|
||||
description: "tax rate"
|
||||
},
|
||||
socialHousing: {
|
||||
defaultMessage: "Social housing",
|
||||
description: "tax rate"
|
||||
},
|
||||
standard: {
|
||||
defaultMessage: "Standard",
|
||||
description: "tax rate"
|
||||
},
|
||||
water: {
|
||||
defaultMessage: "Water",
|
||||
description: "tax rate"
|
||||
}
|
||||
});
|
||||
|
||||
export const translatedTaxRates = (intl: IntlShape) => ({
|
||||
[TaxRateType.ACCOMMODATION]: intl.formatMessage(
|
||||
taxRatesMessages.accommodation
|
||||
),
|
||||
[TaxRateType.ADMISSION_TO_CULTURAL_EVENTS]: intl.formatMessage(
|
||||
taxRatesMessages.admissionToCulturalEvents
|
||||
),
|
||||
[TaxRateType.ADMISSION_TO_ENTERTAINMENT_EVENTS]: intl.formatMessage(
|
||||
taxRatesMessages.admissionToEntertainmentEvents
|
||||
),
|
||||
[TaxRateType.ADMISSION_TO_SPORTING_EVENTS]: intl.formatMessage(
|
||||
taxRatesMessages.admissionToSportingEvents
|
||||
),
|
||||
[TaxRateType.ADVERTISING]: intl.formatMessage(taxRatesMessages.advertising),
|
||||
[TaxRateType.AGRICULTURAL_SUPPLIES]: intl.formatMessage(
|
||||
taxRatesMessages.agriculturalSupplies
|
||||
),
|
||||
[TaxRateType.BABY_FOODSTUFFS]: intl.formatMessage(
|
||||
taxRatesMessages.babyFoodstuffs
|
||||
),
|
||||
[TaxRateType.BIKES]: intl.formatMessage(taxRatesMessages.bikes),
|
||||
[TaxRateType.BOOKS]: intl.formatMessage(taxRatesMessages.books),
|
||||
[TaxRateType.CHILDRENS_CLOTHING]: intl.formatMessage(
|
||||
taxRatesMessages.childrensClothing
|
||||
),
|
||||
[TaxRateType.DOMESTIC_FUEL]: intl.formatMessage(
|
||||
taxRatesMessages.domesticFuel
|
||||
),
|
||||
[TaxRateType.DOMESTIC_SERVICES]: intl.formatMessage(
|
||||
taxRatesMessages.domesticServices
|
||||
),
|
||||
[TaxRateType.E_BOOKS]: intl.formatMessage(taxRatesMessages.ebooks),
|
||||
[TaxRateType.FOODSTUFFS]: intl.formatMessage(taxRatesMessages.foodstuffs),
|
||||
[TaxRateType.HOTELS]: intl.formatMessage(taxRatesMessages.hotels),
|
||||
[TaxRateType.MEDICAL]: intl.formatMessage(taxRatesMessages.medical),
|
||||
[TaxRateType.NEWSPAPERS]: intl.formatMessage(taxRatesMessages.newspapers),
|
||||
[TaxRateType.PASSENGER_TRANSPORT]: intl.formatMessage(
|
||||
taxRatesMessages.passengerTransport
|
||||
),
|
||||
[TaxRateType.PHARMACEUTICALS]: intl.formatMessage(
|
||||
taxRatesMessages.pharmaceuticals
|
||||
),
|
||||
[TaxRateType.PROPERTY_RENOVATIONS]: intl.formatMessage(
|
||||
taxRatesMessages.propertyRenovations
|
||||
),
|
||||
[TaxRateType.RESTAURANTS]: intl.formatMessage(taxRatesMessages.restaurants),
|
||||
[TaxRateType.SOCIAL_HOUSING]: intl.formatMessage(
|
||||
taxRatesMessages.socialHousing
|
||||
),
|
||||
[TaxRateType.STANDARD]: intl.formatMessage(taxRatesMessages.standard),
|
||||
[TaxRateType.WATER]: intl.formatMessage(taxRatesMessages.water)
|
||||
});
|
||||
|
||||
export const authorizationKeyTypes = {
|
||||
[AuthorizationKeyType.FACEBOOK]: "Facebook",
|
||||
[AuthorizationKeyType.GOOGLE_OAUTH2]: "Google OAuth2"
|
||||
|
|
|
@ -5,12 +5,13 @@ import { FormattedMessage, IntlShape, useIntl } from "react-intl";
|
|||
import ActionDialog from "@saleor/components/ActionDialog";
|
||||
import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton";
|
||||
|
||||
export type OrderDraftFinalizeWarning =
|
||||
| "no-shipping"
|
||||
| "no-billing"
|
||||
| "no-user"
|
||||
| "no-shipping-method"
|
||||
| "unnecessary-shipping-method";
|
||||
export enum OrderDraftFinalizeWarning {
|
||||
NO_SHIPPING,
|
||||
NO_BILLING,
|
||||
NO_USER,
|
||||
NO_SHIPPING_METHOD,
|
||||
UNNECESSARY_SHIPPING_METHOD
|
||||
}
|
||||
|
||||
export interface OrderDraftFinalizeDialogProps {
|
||||
confirmButtonState: ConfirmButtonTransitionState;
|
||||
|
@ -21,30 +22,29 @@ export interface OrderDraftFinalizeDialogProps {
|
|||
onConfirm: () => void;
|
||||
}
|
||||
|
||||
const warningToText = (warning: OrderDraftFinalizeWarning, intl: IntlShape) => {
|
||||
switch (warning) {
|
||||
case "no-shipping":
|
||||
return intl.formatMessage({
|
||||
defaultMessage: "No shipping address"
|
||||
});
|
||||
case "no-billing":
|
||||
return intl.formatMessage({
|
||||
defaultMessage: "No billing address"
|
||||
});
|
||||
case "no-user":
|
||||
return intl.formatMessage({
|
||||
defaultMessage: "No user information"
|
||||
});
|
||||
case "no-shipping-method":
|
||||
return intl.formatMessage({
|
||||
defaultMessage: "Some products require shipping, but no method provided"
|
||||
});
|
||||
case "unnecessary-shipping-method":
|
||||
return intl.formatMessage({
|
||||
function translateWarnings(
|
||||
intl: IntlShape
|
||||
): Record<OrderDraftFinalizeWarning, string> {
|
||||
return {
|
||||
[OrderDraftFinalizeWarning.NO_BILLING]: intl.formatMessage({
|
||||
defaultMessage: "No billing address"
|
||||
}),
|
||||
[OrderDraftFinalizeWarning.NO_SHIPPING]: intl.formatMessage({
|
||||
defaultMessage: "No shipping address"
|
||||
}),
|
||||
[OrderDraftFinalizeWarning.NO_SHIPPING_METHOD]: intl.formatMessage({
|
||||
defaultMessage: "Some products require shipping, but no method provided"
|
||||
}),
|
||||
[OrderDraftFinalizeWarning.NO_USER]: intl.formatMessage({
|
||||
defaultMessage: "No user information"
|
||||
}),
|
||||
[OrderDraftFinalizeWarning.UNNECESSARY_SHIPPING_METHOD]: intl.formatMessage(
|
||||
{
|
||||
defaultMessage: "Shipping method provided, but no product requires it"
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
const OrderDraftFinalizeDialog: React.StatelessComponent<
|
||||
OrderDraftFinalizeDialogProps
|
||||
|
@ -57,6 +57,7 @@ const OrderDraftFinalizeDialog: React.StatelessComponent<
|
|||
orderNumber
|
||||
}) => {
|
||||
const intl = useIntl();
|
||||
const translatedWarnings = translateWarnings(intl);
|
||||
|
||||
return (
|
||||
<ActionDialog
|
||||
|
@ -89,7 +90,7 @@ const OrderDraftFinalizeDialog: React.StatelessComponent<
|
|||
</p>
|
||||
<ul>
|
||||
{warnings.map(warning => (
|
||||
<li key={warning}>{warningToText(warning, intl)}</li>
|
||||
<li key={warning}>{translatedWarnings[warning]}</li>
|
||||
))}
|
||||
</ul>
|
||||
</>
|
||||
|
|
|
@ -38,13 +38,13 @@ import { OrderDetailsMessages } from "./OrderDetailsMessages";
|
|||
const orderDraftFinalizeWarnings = (order: OrderDetails_order) => {
|
||||
const warnings = [] as OrderDraftFinalizeWarning[];
|
||||
if (!(order && order.shippingAddress)) {
|
||||
warnings.push("no-shipping");
|
||||
warnings.push(OrderDraftFinalizeWarning.NO_SHIPPING);
|
||||
}
|
||||
if (!(order && order.billingAddress)) {
|
||||
warnings.push("no-billing");
|
||||
warnings.push(OrderDraftFinalizeWarning.NO_BILLING);
|
||||
}
|
||||
if (!(order && (order.user || order.userEmail))) {
|
||||
warnings.push("no-user");
|
||||
warnings.push(OrderDraftFinalizeWarning.NO_USER);
|
||||
}
|
||||
if (
|
||||
order &&
|
||||
|
@ -52,7 +52,7 @@ const orderDraftFinalizeWarnings = (order: OrderDetails_order) => {
|
|||
order.lines.filter(line => line.isShippingRequired).length > 0 &&
|
||||
order.shippingMethod === null
|
||||
) {
|
||||
warnings.push("no-shipping-method");
|
||||
warnings.push(OrderDraftFinalizeWarning.NO_SHIPPING_METHOD);
|
||||
}
|
||||
if (
|
||||
order &&
|
||||
|
@ -60,7 +60,7 @@ const orderDraftFinalizeWarnings = (order: OrderDetails_order) => {
|
|||
order.lines.filter(line => line.isShippingRequired).length === 0 &&
|
||||
order.shippingMethod !== null
|
||||
) {
|
||||
warnings.push("unnecessary-shipping-method");
|
||||
warnings.push(OrderDraftFinalizeWarning.UNNECESSARY_SHIPPING_METHOD);
|
||||
}
|
||||
return warnings;
|
||||
};
|
||||
|
|
|
@ -2,7 +2,8 @@ import { storiesOf } from "@storybook/react";
|
|||
import React from "react";
|
||||
|
||||
import OrderDraftFinalize, {
|
||||
OrderDraftFinalizeDialogProps
|
||||
OrderDraftFinalizeDialogProps,
|
||||
OrderDraftFinalizeWarning
|
||||
} from "../../../orders/components/OrderDraftFinalizeDialog";
|
||||
import Decorator from "../../Decorator";
|
||||
|
||||
|
@ -21,6 +22,11 @@ storiesOf("Orders / OrderDraftFinalizeDialog", module)
|
|||
.add("with warnings", () => (
|
||||
<OrderDraftFinalize
|
||||
{...props}
|
||||
warnings={["no-shipping-method", "no-shipping", "no-billing", "no-user"]}
|
||||
warnings={[
|
||||
OrderDraftFinalizeWarning.NO_SHIPPING_METHOD,
|
||||
OrderDraftFinalizeWarning.NO_SHIPPING,
|
||||
OrderDraftFinalizeWarning.NO_BILLING,
|
||||
OrderDraftFinalizeWarning.NO_USER
|
||||
]}
|
||||
/>
|
||||
));
|
||||
|
|
|
@ -6,7 +6,7 @@ import TableCell from "@material-ui/core/TableCell";
|
|||
import TableHead from "@material-ui/core/TableHead";
|
||||
import TableRow from "@material-ui/core/TableRow";
|
||||
import React from "react";
|
||||
import { FormattedMessage, useIntl } from "react-intl";
|
||||
import { FormattedMessage, IntlShape, useIntl } from "react-intl";
|
||||
|
||||
import AppHeader from "@saleor/components/AppHeader";
|
||||
import { Container } from "@saleor/components/Container";
|
||||
|
@ -14,7 +14,8 @@ import Grid from "@saleor/components/Grid";
|
|||
import PageHeader from "@saleor/components/PageHeader";
|
||||
import Skeleton from "@saleor/components/Skeleton";
|
||||
import { sectionNames } from "@saleor/intl";
|
||||
import { maybe, renderCollection, translatedTaxRates } from "../../../misc";
|
||||
import { TaxRateType } from "@saleor/types/globalTypes";
|
||||
import { maybe, renderCollection } from "../../../misc";
|
||||
import { CountryList_shop_countries_vat_reducedRates } from "../../types/CountryList";
|
||||
|
||||
const styles = createStyles({
|
||||
|
@ -23,6 +24,111 @@ const styles = createStyles({
|
|||
}
|
||||
});
|
||||
|
||||
function translateTaxRates(intl: IntlShape): Record<TaxRateType, string> {
|
||||
return {
|
||||
[TaxRateType.ACCOMMODATION]: intl.formatMessage({
|
||||
defaultMessage: "Accommodation",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.ADMISSION_TO_CULTURAL_EVENTS]: intl.formatMessage({
|
||||
defaultMessage: "Admission to cultural events",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.ADMISSION_TO_ENTERTAINMENT_EVENTS]: intl.formatMessage({
|
||||
defaultMessage: "Admission to entertainment events",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.ADMISSION_TO_SPORTING_EVENTS]: intl.formatMessage({
|
||||
defaultMessage: "Admission to sporting events",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.ADVERTISING]: intl.formatMessage({
|
||||
defaultMessage: "Advertising",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.AGRICULTURAL_SUPPLIES]: intl.formatMessage({
|
||||
defaultMessage: "Agricultural supplies",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.BABY_FOODSTUFFS]: intl.formatMessage({
|
||||
defaultMessage: "Baby foodstuffs",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.BIKES]: intl.formatMessage({
|
||||
defaultMessage: "Bikes",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.BOOKS]: intl.formatMessage({
|
||||
defaultMessage: "Books",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.CHILDRENS_CLOTHING]: intl.formatMessage({
|
||||
defaultMessage: "Children's clothing",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.DOMESTIC_FUEL]: intl.formatMessage({
|
||||
defaultMessage: "Domestic fuel",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.DOMESTIC_SERVICES]: intl.formatMessage({
|
||||
defaultMessage: "Domestic services",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.E_BOOKS]: intl.formatMessage({
|
||||
defaultMessage: "E-books",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.FOODSTUFFS]: intl.formatMessage({
|
||||
defaultMessage: "Foodstuffs",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.HOTELS]: intl.formatMessage({
|
||||
defaultMessage: "Hotels",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.MEDICAL]: intl.formatMessage({
|
||||
defaultMessage: "Medical",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.NEWSPAPERS]: intl.formatMessage({
|
||||
defaultMessage: "Newspapers",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.PASSENGER_TRANSPORT]: intl.formatMessage({
|
||||
defaultMessage: "Passenger transport",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.PHARMACEUTICALS]: intl.formatMessage({
|
||||
defaultMessage: "Pharmaceuticals",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.PROPERTY_RENOVATIONS]: intl.formatMessage({
|
||||
defaultMessage: "Property renovations",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.RESTAURANTS]: intl.formatMessage({
|
||||
defaultMessage: "Restaurants",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.SOCIAL_HOUSING]: intl.formatMessage({
|
||||
defaultMessage: "Social housing",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.STANDARD]: intl.formatMessage({
|
||||
defaultMessage: "Standard",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.WATER]: intl.formatMessage({
|
||||
defaultMessage: "Water",
|
||||
description: "tax rate"
|
||||
}),
|
||||
[TaxRateType.WINE]: intl.formatMessage({
|
||||
defaultMessage: "Wine",
|
||||
description: "tax rate"
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
export interface CountryTaxesPageProps {
|
||||
countryName: string;
|
||||
taxCategories: CountryList_shop_countries_vat_reducedRates[];
|
||||
|
@ -37,8 +143,8 @@ const CountryTaxesPage = withStyles(styles, { name: "CountryTaxesPage" })(
|
|||
onBack
|
||||
}: CountryTaxesPageProps & WithStyles<typeof styles>) => {
|
||||
const intl = useIntl();
|
||||
const translatedTaxRates = translateTaxRates(intl);
|
||||
|
||||
const taxRates = translatedTaxRates(intl);
|
||||
return (
|
||||
<Container>
|
||||
<AppHeader onBack={onBack}>
|
||||
|
@ -82,7 +188,7 @@ const CountryTaxesPage = withStyles(styles, { name: "CountryTaxesPage" })(
|
|||
>
|
||||
<TableCell>
|
||||
{maybe<React.ReactNode>(
|
||||
() => taxRates[taxCategory.rateType],
|
||||
() => translatedTaxRates[taxCategory.rateType],
|
||||
<Skeleton />
|
||||
)}
|
||||
</TableCell>
|
||||
|
|
Loading…
Reference in a new issue