saleor-apps-redis_apl/apps/taxes/src/modules/providers-configuration/ui/configuration.tsx

106 lines
3.7 KiB
TypeScript
Raw Normal View History

import { FormControlLabel, Grid, Radio, RadioGroup, Typography } from "@material-ui/core";
import { makeStyles } from "@saleor/macaw-ui";
import React from "react";
import { AvataxConfiguration } from "../../avatax/ui/avatax-configuration";
feat: finalize order process (#355) * feat: :sparkles: add dummy order-created * refactor: :fire: unused private-providers-configuration-service * feat: :sparkles: add dummy order-fulfilled * refactor: :truck: move provider-config * refactor: :truck: crudSettingsConfigurator -> crudSettingsManager * refactor: :recycle: [tax-provider].ts -> [tax-provider]-webhook.service.ts * feat: :sparkles: add dummy createOrder * refactor: :recycle: distinguish between salesOrder and salesInvoice in avatax * refactor: :truck: [provider]-calculate.ts to [provider]-transform.ts * refactor: :truck: ResponseTaxPayload to tax-provider-webhook.ts * refactor: :truck: ResponseTaxPayload -> CalculateTaxesResponse * refactor: :recycle: webhooks with active-tax-provider.service.ts * feat: :sparkles: add skeleton orderCreate functionality * refactor: :recycle: [provider]-transform.ts -> [provider]-[webhook]-transform.ts * feat: :sparkles: add order-fulfilled with avatax call * refactor: :recycle: move getActiveTaxProvider to active-tax-provider * refactor: :label: export types for [provider]-client function args * refactor: :truck: UpdateAppMetadata -> UpdateMetadata * feat: :sparkles: fulfill order with id from metadata * build: :arrow_up: upgrade avatax * feat: :sparkles: commit transaction on fulfill in avatax * fix: :bug: return of webhooks to ensure valid retry behavior * refactor: :truck: [provider]-[webhook]-transform -> [provider]-[webhook]-map * refactor: :label: export types of avatax-calculate-taxes mapPayload * refactor: :recycle: extract address-map to separate function * refactor: :recycle: remove schema.ts * refactor: :recycle: move addressSchema to channels-config.ts * feat: :sparkles: add tests & placeholder tests for avatax & taxjar maps * refactor: :recycle: throw error if no metadata * refactor: :recycle: change EXTERNAL_ID_KEY to PROVIDER_ORDER_ID_KEY add comments * refactor: :recycle: comments -> it.todo in tests * refactor: :bulb: add comment about shipping_item_code * refactor: :white_check_mark: add todo items for tests * refactor: :recycle: remove export and add sumLines to taxJarOrderCreated * refactor: :recycle: address-map with avatarAddressFactory * docs: :bulb: add comment about MOCKED_SALEOR_PAYLOAD * refactor: :recycle: remove export of mapLines and add to avataxCalculateTaxes * style: :art: add newline-after-var warn to eslint-config-saleor * style: :art: autofix newline-after-var in taxes * test: :white_check_mark: restructure tests according to new naming in address-map * refactor: :recycle: add shippingItemCode to avataxCalculateTaxes wrapper object * refactor: :truck: payloadProps -> payloadArgs * refactor: :recycle: add Maps suffix to map wrapper objects * refactor: :recycle: remove data: null from ActiveTaxProviderResult * refactor: :recycle: maintain the object hierarchy in tests * refactor: :recycle: refactor webhook responses with WebhookResponseFactory * build: :arrow_up: vitest * test: :white_check_mark: add tests for get-app-config-test * test: :white_check_mark: add tests for getActiveTaxProvider * refactor: :recycle: use address fragment for taxBase and order * refactor: :recycle: rename WebhookResponseFactory -> WebhookResponse * style: :construction_worker: add multiline-comment-style * fix: :bug: dummy test in get-app-config.test.ts * refactor: :recycle: rename AddressFragment -> Address * refactor: :recycle: use debug instead of error in webhook-response noRetry * refactor: :recycle: refactor as variables in mutation * build: :construction_worker: add changeset * refactor: :recycle: split changesets in two * build: :arrow_up: vite * build: :arrow_up: vite && vitest in all apps
2023-04-17 11:58:21 +00:00
import { providerConfig, TaxProviderName } from "../../taxes/provider-config";
import { TaxJarConfiguration } from "../../taxjar/ui/taxjar-configuration";
import { useInstanceId } from "../../taxes/tax-context";
import { trpcClient } from "../../trpc/trpc-client";
import { AppPaper } from "../../ui/app-paper";
import { ProviderIcon } from "./provider-icon";
const providersConfigurationComponent: Record<TaxProviderName, React.ComponentType> = {
taxjar: TaxJarConfiguration,
avatax: AvataxConfiguration,
};
const useStyles = makeStyles((theme) => ({
radioLabel: {
width: "100%",
padding: theme.spacing(1),
border: `1px solid ${theme.palette.divider}`,
"&:hover": {
backgroundColor:
theme.palette.type === "dark" ? theme.palette.primary.dark : theme.palette.grey[50],
},
},
gridItem: {
display: "flex",
justifyContent: "center",
},
radioLabelActive: {
backgroundColor:
theme.palette.type === "dark" ? theme.palette.primary.dark : theme.palette.grey[50],
},
iconWithLabel: {
display: "flex",
alignItems: "center",
flexDirection: "column",
gap: theme.spacing(1),
},
}));
export const Configuration = () => {
const [provider, setProvider] = React.useState<TaxProviderName>("taxjar");
const { instanceId } = useInstanceId();
const { data: providersConfigurationData } = trpcClient.providersConfiguration.getAll.useQuery();
const styles = useStyles();
React.useEffect(() => {
const instance = providersConfigurationData?.find((instance) => instance.id === instanceId);
feat: finalize order process (#355) * feat: :sparkles: add dummy order-created * refactor: :fire: unused private-providers-configuration-service * feat: :sparkles: add dummy order-fulfilled * refactor: :truck: move provider-config * refactor: :truck: crudSettingsConfigurator -> crudSettingsManager * refactor: :recycle: [tax-provider].ts -> [tax-provider]-webhook.service.ts * feat: :sparkles: add dummy createOrder * refactor: :recycle: distinguish between salesOrder and salesInvoice in avatax * refactor: :truck: [provider]-calculate.ts to [provider]-transform.ts * refactor: :truck: ResponseTaxPayload to tax-provider-webhook.ts * refactor: :truck: ResponseTaxPayload -> CalculateTaxesResponse * refactor: :recycle: webhooks with active-tax-provider.service.ts * feat: :sparkles: add skeleton orderCreate functionality * refactor: :recycle: [provider]-transform.ts -> [provider]-[webhook]-transform.ts * feat: :sparkles: add order-fulfilled with avatax call * refactor: :recycle: move getActiveTaxProvider to active-tax-provider * refactor: :label: export types for [provider]-client function args * refactor: :truck: UpdateAppMetadata -> UpdateMetadata * feat: :sparkles: fulfill order with id from metadata * build: :arrow_up: upgrade avatax * feat: :sparkles: commit transaction on fulfill in avatax * fix: :bug: return of webhooks to ensure valid retry behavior * refactor: :truck: [provider]-[webhook]-transform -> [provider]-[webhook]-map * refactor: :label: export types of avatax-calculate-taxes mapPayload * refactor: :recycle: extract address-map to separate function * refactor: :recycle: remove schema.ts * refactor: :recycle: move addressSchema to channels-config.ts * feat: :sparkles: add tests & placeholder tests for avatax & taxjar maps * refactor: :recycle: throw error if no metadata * refactor: :recycle: change EXTERNAL_ID_KEY to PROVIDER_ORDER_ID_KEY add comments * refactor: :recycle: comments -> it.todo in tests * refactor: :bulb: add comment about shipping_item_code * refactor: :white_check_mark: add todo items for tests * refactor: :recycle: remove export and add sumLines to taxJarOrderCreated * refactor: :recycle: address-map with avatarAddressFactory * docs: :bulb: add comment about MOCKED_SALEOR_PAYLOAD * refactor: :recycle: remove export of mapLines and add to avataxCalculateTaxes * style: :art: add newline-after-var warn to eslint-config-saleor * style: :art: autofix newline-after-var in taxes * test: :white_check_mark: restructure tests according to new naming in address-map * refactor: :recycle: add shippingItemCode to avataxCalculateTaxes wrapper object * refactor: :truck: payloadProps -> payloadArgs * refactor: :recycle: add Maps suffix to map wrapper objects * refactor: :recycle: remove data: null from ActiveTaxProviderResult * refactor: :recycle: maintain the object hierarchy in tests * refactor: :recycle: refactor webhook responses with WebhookResponseFactory * build: :arrow_up: vitest * test: :white_check_mark: add tests for get-app-config-test * test: :white_check_mark: add tests for getActiveTaxProvider * refactor: :recycle: use address fragment for taxBase and order * refactor: :recycle: rename WebhookResponseFactory -> WebhookResponse * style: :construction_worker: add multiline-comment-style * fix: :bug: dummy test in get-app-config.test.ts * refactor: :recycle: rename AddressFragment -> Address * refactor: :recycle: use debug instead of error in webhook-response noRetry * refactor: :recycle: refactor as variables in mutation * build: :construction_worker: add changeset * refactor: :recycle: split changesets in two * build: :arrow_up: vite * build: :arrow_up: vite && vitest in all apps
2023-04-17 11:58:21 +00:00
setProvider(instance?.provider ?? "taxjar");
}, [instanceId, providersConfigurationData]);
const SelectedConfigurationForm = React.useMemo(
() => (provider ? providersConfigurationComponent[provider] : () => null),
[provider]
);
return (
<AppPaper>
{!instanceId && (
<Grid container spacing={2}>
<Grid item xs={12}>
<div className={styles.gridItem}>
<Typography component="h3" variant="h3">
Please select one of the providers:
</Typography>
</div>
</Grid>
<Grid item xs={12}>
<RadioGroup
value={provider ?? ""}
onChange={(e) => setProvider(e.target.value as TaxProviderName)}
>
<Grid container justifyContent="center">
{Object.entries(providerConfig).map(([name, config]) => (
<Grid className={styles.gridItem} item xs={6} key={name}>
<FormControlLabel
className={
provider === name
? `${styles.radioLabelActive} ${styles.radioLabel}`
: styles.radioLabel
}
control={<Radio style={{ display: "none" }} name="provider" value={name} />}
label={
<div className={styles.iconWithLabel}>
<ProviderIcon size={"xlarge"} provider={name as TaxProviderName} />
<Typography variant="body1">{config.label}</Typography>
</div>
}
labelPlacement="top"
aria-label={config.label}
/>
</Grid>
))}
</Grid>
</RadioGroup>
</Grid>
</Grid>
)}
<SelectedConfigurationForm />
</AppPaper>
);
};