saleor-dashboard/src/siteSettings/components/SiteSettingsPage/SiteSettingsPage.tsx

199 lines
6.6 KiB
TypeScript
Raw Normal View History

import { createCountryHandler } from "@saleor/components/AddressEdit/createCountryHandler";
import { Backlink } from "@saleor/components/Backlink";
import CompanyAddressInput from "@saleor/components/CompanyAddressInput";
2019-06-19 14:40:52 +00:00
import Container from "@saleor/components/Container";
import Form from "@saleor/components/Form";
import Grid from "@saleor/components/Grid";
2019-10-21 10:13:23 +00:00
import Hr from "@saleor/components/Hr";
2019-06-19 14:40:52 +00:00
import PageHeader from "@saleor/components/PageHeader";
import PageSectionHeader from "@saleor/components/PageSectionHeader";
Use MacawUI (#1229) * Replace withStyleswith useStyles (#1100) * Replace withStyleswith useStyles * Update messages * Use rem as a spacing unit (#1101) * Use rems as spacing units * Fix visual bugs * Update stories * Use macaw-ui as theme provider (#1108) * Use macaw ui as a theme provider * Add react-dom to aliases * Fix jest module resolution * Update useTheme hook usage * Fix test wrapper * Use macaw from git repo * Fix CI * Update stories * Fix aliasing * Extract savebar to macaw ui (#1146) * wip * Use savebar from macaw * Use confirm button from macaw * Improve file structure * Use sidebar context from macaw * Update macaw * Update macaw version * Remove savebar from storybook * Update stories * Use alerts and notifications from macaw (#1166) * Use alerts from macaw * Add notifications from macaw * Update stories * Pin macaw version * Encapsulate limit reached in one component * Remove unused imports * Use backlinks from macaw (#1183) * Use backlink from macaw * Update macaw version * Use macaw sidebar (#1148) * Use sidebar from macaw * Use shipped logo * Use lowercase * Update stories * Use user chip from macaw (#1191) * Use user chip from macaw * Use dedicated components for menu items * Simplify code * Bump version and fix types (#1210) * Rename onBack to onClick * Rename UserChip to UserChipMenu * Rename IMenuItem to SidebarMenuItem * Update macaw version * Fix tables after changes in macaw (#1220) * Update macaw version * Update changelog * Update stories * Fix after rebase * Update to macaw 0.2.0 * Lint files * Update macaw to 0.2.2
2021-07-21 08:59:52 +00:00
import Savebar from "@saleor/components/Savebar";
import { configurationMenuUrl } from "@saleor/configuration";
Use graphql-codegen (#1874) * Use generated hooks in apps * Remove unused files * Use proper types in apps * Use generated hooks in attributes * Use generated hooks in auth module * Use generated hooks in categories * Use generated hooks in channels * Use generated types in collections * Remove legacy types from background tasks * Use generated hooks in customers * Use generated hooks in discounts * Use generated hook in file upload * Use generated types in gift cards * Use generated types in home * Use generated hooks in navigation * Use generated hooks in orders * Use generated hooks in pages * Use generated hooks in page types * Use generated hooks in permission groups * Use generated hooks in plugins * Use generated hooks in products * Use fragment to mark product variants * Improve code a bit * Use generated hooks in page types * Use generated types in searches * Use generated hooks in shipping * Use generated hooks in site settings * Use generated hooks in staff members * Use generated hooks in taxes * Place all gql generated files in one directory * Use generated hooks in translations * Use global types from new generated module * Use generated hooks in warehouses * Use generated hooks in webhooks * Use generated fragment types * Unclutter types * Remove hoc components * Split hooks and types * Fetch introspection file * Delete obsolete schema file * Fix rebase artifacts * Fix autoreplace * Fix auth provider tests * Fix urls * Remove leftover types * Fix rebase artifacts
2022-03-09 08:56:55 +00:00
import { ShopErrorFragment, SiteSettingsQuery } from "@saleor/graphql";
import useAddressValidation from "@saleor/hooks/useAddressValidation";
import { SubmitPromise } from "@saleor/hooks/useForm";
import useNavigator from "@saleor/hooks/useNavigator";
2019-08-09 11:14:35 +00:00
import useStateFromProps from "@saleor/hooks/useStateFromProps";
import { commonMessages, sectionNames } from "@saleor/intl";
import { ConfirmButtonTransitionState, makeStyles } from "@saleor/macaw-ui";
2019-08-09 11:14:35 +00:00
import createSingleAutocompleteSelectHandler from "@saleor/utils/handlers/singleAutocompleteSelectChangeHandler";
import { mapCountriesToChoices } from "@saleor/utils/maps";
import React from "react";
import { useIntl } from "react-intl";
import SiteCheckoutSettingsCard from "../SiteCheckoutSettingsCard";
import { messages } from "./messages";
2019-06-19 14:40:52 +00:00
2019-08-09 11:14:35 +00:00
export interface SiteSettingsPageAddressFormData {
city: string;
companyName: string;
country: string;
countryArea: string;
phone: string;
postalCode: string;
streetAddress1: string;
streetAddress2: string;
}
export interface SiteSettingsPageFormData
2021-03-29 09:24:47 +00:00
extends SiteSettingsPageAddressFormData {
2019-06-19 14:40:52 +00:00
description: string;
reserveStockDurationAnonymousUser: number;
reserveStockDurationAuthenticatedUser: number;
limitQuantityPerCheckout: number;
2019-06-19 14:40:52 +00:00
}
export interface SiteSettingsPageProps {
disabled: boolean;
errors: ShopErrorFragment[];
shop?: SiteSettingsQuery["shop"];
2019-06-19 14:40:52 +00:00
saveButtonBarState: ConfirmButtonTransitionState;
onSubmit: (data: SiteSettingsPageFormData) => SubmitPromise;
2019-06-19 14:40:52 +00:00
}
export function areAddressInputFieldsModified(
data: SiteSettingsPageAddressFormData,
): boolean {
return ([
"city",
"country",
"countryArea",
"phone",
"postalCode",
"streetAddress1",
"streetAddress2",
] as Array<keyof SiteSettingsPageAddressFormData>)
.map(key => data[key])
.some(field => field !== "");
}
2019-10-21 10:13:23 +00:00
const useStyles = makeStyles(
2019-10-28 16:16:49 +00:00
theme => ({
2019-10-21 10:13:23 +00:00
hr: {
gridColumnEnd: "span 2",
margin: theme.spacing(1, 0),
},
2019-10-21 10:13:23 +00:00
}),
{
name: "SiteSettingsPage",
},
2019-10-21 10:13:23 +00:00
);
const SiteSettingsPage: React.FC<SiteSettingsPageProps> = props => {
const { disabled, errors, saveButtonBarState, shop, onSubmit } = props;
2019-10-21 10:13:23 +00:00
const classes = useStyles(props);
const intl = useIntl();
const navigate = useNavigator();
2019-08-09 11:14:35 +00:00
const [displayCountry, setDisplayCountry] = useStateFromProps(
shop?.companyAddress?.country.country || "",
2019-08-09 11:14:35 +00:00
);
const {
errors: validationErrors,
submit: handleSubmitWithAddress,
2020-10-22 11:33:29 +00:00
} = useAddressValidation(onSubmit);
2019-10-21 14:14:28 +00:00
const initialFormAddress: SiteSettingsPageAddressFormData = {
city: shop?.companyAddress?.city || "",
companyName: shop?.companyAddress?.companyName || "",
country: shop?.companyAddress?.country.code || "",
countryArea: shop?.companyAddress?.countryArea || "",
phone: shop?.companyAddress?.phone || "",
postalCode: shop?.companyAddress?.postalCode || "",
streetAddress1: shop?.companyAddress?.streetAddress1 || "",
streetAddress2: shop?.companyAddress?.streetAddress2 || "",
2019-06-19 14:40:52 +00:00
};
2019-10-21 14:14:28 +00:00
const initialForm: SiteSettingsPageFormData = {
...initialFormAddress,
description: shop?.description || "",
reserveStockDurationAnonymousUser:
shop?.reserveStockDurationAnonymousUser ?? 0,
reserveStockDurationAuthenticatedUser:
shop?.reserveStockDurationAuthenticatedUser ?? 0,
limitQuantityPerCheckout: shop?.limitQuantityPerCheckout ?? 0,
2019-10-21 14:14:28 +00:00
};
2019-08-09 11:14:35 +00:00
2019-06-19 14:40:52 +00:00
return (
<Form
initial={initialForm}
onSubmit={data => {
const submitFunc = areAddressInputFieldsModified(data)
? handleSubmitWithAddress
: onSubmit;
2020-10-22 11:33:29 +00:00
return submitFunc(data);
}}
2019-06-19 14:40:52 +00:00
confirmLeave
disabled={disabled}
2019-06-19 14:40:52 +00:00
>
{({ change, data, set, isSaveDisabled, submit }) => {
const countryChoices = mapCountriesToChoices(shop?.countries || []);
const countrySelect = createSingleAutocompleteSelectHandler(
2019-08-09 11:14:35 +00:00
change,
setDisplayCountry,
countryChoices,
2019-08-09 11:14:35 +00:00
);
const handleCountrySelect = createCountryHandler(countrySelect, set);
2019-08-09 11:14:35 +00:00
return (
<Container>
<Backlink href={configurationMenuUrl}>
{intl.formatMessage(sectionNames.configuration)}
Use MacawUI (#1229) * Replace withStyleswith useStyles (#1100) * Replace withStyleswith useStyles * Update messages * Use rem as a spacing unit (#1101) * Use rems as spacing units * Fix visual bugs * Update stories * Use macaw-ui as theme provider (#1108) * Use macaw ui as a theme provider * Add react-dom to aliases * Fix jest module resolution * Update useTheme hook usage * Fix test wrapper * Use macaw from git repo * Fix CI * Update stories * Fix aliasing * Extract savebar to macaw ui (#1146) * wip * Use savebar from macaw * Use confirm button from macaw * Improve file structure * Use sidebar context from macaw * Update macaw * Update macaw version * Remove savebar from storybook * Update stories * Use alerts and notifications from macaw (#1166) * Use alerts from macaw * Add notifications from macaw * Update stories * Pin macaw version * Encapsulate limit reached in one component * Remove unused imports * Use backlinks from macaw (#1183) * Use backlink from macaw * Update macaw version * Use macaw sidebar (#1148) * Use sidebar from macaw * Use shipped logo * Use lowercase * Update stories * Use user chip from macaw (#1191) * Use user chip from macaw * Use dedicated components for menu items * Simplify code * Bump version and fix types (#1210) * Rename onBack to onClick * Rename UserChip to UserChipMenu * Rename IMenuItem to SidebarMenuItem * Update macaw version * Fix tables after changes in macaw (#1220) * Update macaw version * Update changelog * Update stories * Fix after rebase * Update to macaw 0.2.0 * Lint files * Update macaw to 0.2.2
2021-07-21 08:59:52 +00:00
</Backlink>
2019-08-09 11:14:35 +00:00
<PageHeader
title={intl.formatMessage(commonMessages.generalInformations)}
Feature - Gift Cards (#1366) * Add deletion to gift cards (#1298) * Add gift cards section to menu and add empty list component * Update messages * Change styling of app wide page header to match design * Add gift cards list table wip * Update prop name for status chip component to make it more consistent with other components * Replace old trash icon with new one * Add Size type based on action dialog sizes to be used app wide * Add delete icon button * Add new sizes option to status chip component * Add / update gift cards list components * Add bulk actions type * Work on gift cards list WIP * Small refactor * Fix styling of gift cards table * Remove temp files * Remove unnecessary type * Add gift cards section to menu and add empty list component * Update schema and types * Add link to gift card update page to gift cards list and add route to gift cards index * Extract order page title with status chip into a separate generic component and use it in order page title * wip * Update money component * Add gift card details card balance section * Refactor gift card details * Add vertical spacer component * Update schema and types * Add gift card tag input component along with necessary queries * Add gift card tag input to gift card update page * Add gift card update details card expiry section WIP * Add time period select field WIP * Post rebase refactor * Add time period select field to gift card update view * Update schema, types and gift cards query * Add getFullName util function and replace existing manual usages * Add text with select field component * Add gift card update info card and refactor * Fixes after review * Fix import * Add displaying order link in gift card update * Refactor * Connect gift card list to api * refactor * Add gift card create dialog * Fix gift card list styles, change location for gift card list query, minor refactor * Fix menu structure data for gift cards * Add channel currencies type to shop * Refactor text with select field * Add gift card expiry select component * Add gift card error type and fragment * Update global types * Add default prop to getFormErrors function * Move gift card details provider to providers dir * Update global utils with mapSingleValueNodeToChoice function * Update gift card tag input * Move and refactor time period field * Update schema * move format money function to other money ulities * Update gift card urls * Add content or skeleton component * Add gift card create util for extracting expiry settings input data * Remove content or skeleton component and move displaying logic to existing skeleton * Move displaying logic of gift card create dialog to list * Refactor * Add hooks for gift card bulk actions and gift card list to be used instead of context directly * Fix types for text with select field + add parsing for number typed field * Add initial currency to gift card create form * Fix gift card create dialog closing animation * Add gift card update info card * Refactor gift card update details card * Add gift card balance dialog * Move gift card update form providers to providers dir * Connect gift card update page to api, add necessary contexts etc. * Refactor * Refactor * Add hooks to use instead of gift card contexts directly * Fix types * Fix text field target name missing in passed event in text with select field * Add minimal value option to text with select field, add to gift card inputs * Fix gift card update balance dialog not changing hasChanged prop after submit * Refactor * Add enable / disable section to gift card update * Refactor * Refactor * Fix update balance dialog crashing the app when enetered wrong amount * Fix gift card list table header styles * Refactor * Add metadata to gift card update * Update messages ids * Refactor * Refactor * Refactor * Refactor * Update schema and types, add gift card delete and bulk delete mutations * Fix url change after gift card delete * Refactor * Update messages * Change gift card list providers order * Refactor/fix after merge * Add gift card resend mutation and update types * Add use dialog form reset hook and make update balance dialog use it, to fix it displaying form errors after modal close and open * Add gift card resend code dialog * Add button to open gift card resend code dialog * Update messages * Add gift card list bulk enable disable section * Add refetching gift card list query after bulk activate / deactivate, refactor * Refactor * Refactor * Update messages * Update schema * Change gift card update expiry settings * Refactor * Add gift card settings view (#1300) * Add gift card settings view * Refactor * Create gift card sttings expiry select * Update test snapshots * Update schema * Update gift card settings page title * Refactor to match rest of the gift cards flow (#1308) Co-authored-by: Magdalena Markusik <magdalena.markusik@mirumee.com> * Refactor * Refactor * Set common error codes in string union Co-authored-by: Magdalena Markusik <magdalena.markusik@mirumee.com> * Add gift card kind to product type (#1307) * Add gift card kind to product type * Fix radio label alignment * Update test snapshots * Refactor * Set default kind in product type create * Change styling of activate / deactivate button in gift card update * Add week option to time period select field * Update messages * Change labels and update messages * Add auto fulfill non shippable gift cards to order settings * Fix fixture * Update messages * Update snapshots * Refactor * Update types * Add gift card used in order money amount in order payment section * Remove unnecessary schema changes * Change types * Update fixtures and messages * Refactor * Add top card to gift card list (#1327) * Add top card to gift card list * Update no gift card products notification messages * Use alert instead of notification * Update prodduct and product type counts * Return null if none of the conditions pass * Update messages * Fix unused product type deletion * Update types * Update imports * Update messages * Update test snapshots * Change gift card dialog expiry settings * Update form of create gift card dialog * Add activation option to create gift card dialog * Update event handling * Update test snapshots * Use date context provider for moment time * Update types * Refactor * Update messages * Update snapshots * Add channel picker to gift card create modal * Fix styling * Add channel picker to gift card resend code dialog * Update schema and types * Refactor * Update messages * Refactor * Update messages and snapshots * Fix order gift card money amount (#1371) * Update messages and snapshots * Fix order gift card money in payment card when multiple gift cards used * Fix missing order id check in gift card events in order gift card money used util * Fix channel selection in gift card create dialog * Fix order number not showing in gift card update view * Add gift card settings to gift card create dialog (#1372) * Fix gift cards number inputs to accept floats * Fix order number showing as null in gift card update info card * Fix channel slug adding in gift card create dialog * Fix gift card list header top card links to display correctly * Remove unused imports Co-authored-by: Dawid Tarasiuk <tarasiukdawid@gmail.com>
2021-09-14 13:57:02 +00:00
underline={true}
2019-06-19 14:40:52 +00:00
/>
2019-08-09 11:14:35 +00:00
<Grid variant="inverted">
<PageSectionHeader
title={intl.formatMessage(messages.sectionCheckoutTitle)}
description={intl.formatMessage(
messages.sectionCheckoutDescription,
)}
/>
<SiteCheckoutSettingsCard
data={data}
errors={errors}
disabled={disabled}
onChange={change}
/>
<Hr className={classes.hr} />
<PageSectionHeader
title={intl.formatMessage(messages.sectionCompanyTitle)}
description={intl.formatMessage(
messages.sectionCompanyDescription,
)}
/>
2020-01-30 13:17:29 +00:00
<CompanyAddressInput
2019-08-09 11:14:35 +00:00
data={data}
displayCountry={displayCountry}
countries={countryChoices}
errors={[...errors, ...validationErrors]}
2019-08-09 11:14:35 +00:00
disabled={disabled}
2020-01-30 13:17:29 +00:00
header={intl.formatMessage({
id: "+jCDvp",
2020-01-30 13:17:29 +00:00
defaultMessage: "Store Information",
description: "section header",
2020-01-30 13:17:29 +00:00
})}
2019-08-09 11:14:35 +00:00
onChange={change}
onCountryChange={handleCountrySelect}
2019-08-09 11:14:35 +00:00
/>
</Grid>
Use MacawUI (#1229) * Replace withStyleswith useStyles (#1100) * Replace withStyleswith useStyles * Update messages * Use rem as a spacing unit (#1101) * Use rems as spacing units * Fix visual bugs * Update stories * Use macaw-ui as theme provider (#1108) * Use macaw ui as a theme provider * Add react-dom to aliases * Fix jest module resolution * Update useTheme hook usage * Fix test wrapper * Use macaw from git repo * Fix CI * Update stories * Fix aliasing * Extract savebar to macaw ui (#1146) * wip * Use savebar from macaw * Use confirm button from macaw * Improve file structure * Use sidebar context from macaw * Update macaw * Update macaw version * Remove savebar from storybook * Update stories * Use alerts and notifications from macaw (#1166) * Use alerts from macaw * Add notifications from macaw * Update stories * Pin macaw version * Encapsulate limit reached in one component * Remove unused imports * Use backlinks from macaw (#1183) * Use backlink from macaw * Update macaw version * Use macaw sidebar (#1148) * Use sidebar from macaw * Use shipped logo * Use lowercase * Update stories * Use user chip from macaw (#1191) * Use user chip from macaw * Use dedicated components for menu items * Simplify code * Bump version and fix types (#1210) * Rename onBack to onClick * Rename UserChip to UserChipMenu * Rename IMenuItem to SidebarMenuItem * Update macaw version * Fix tables after changes in macaw (#1220) * Update macaw version * Update changelog * Update stories * Fix after rebase * Update to macaw 0.2.0 * Lint files * Update macaw to 0.2.2
2021-07-21 08:59:52 +00:00
<Savebar
2019-08-09 11:14:35 +00:00
state={saveButtonBarState}
disabled={!!isSaveDisabled}
onCancel={() => navigate(configurationMenuUrl)}
Use MacawUI (#1229) * Replace withStyleswith useStyles (#1100) * Replace withStyleswith useStyles * Update messages * Use rem as a spacing unit (#1101) * Use rems as spacing units * Fix visual bugs * Update stories * Use macaw-ui as theme provider (#1108) * Use macaw ui as a theme provider * Add react-dom to aliases * Fix jest module resolution * Update useTheme hook usage * Fix test wrapper * Use macaw from git repo * Fix CI * Update stories * Fix aliasing * Extract savebar to macaw ui (#1146) * wip * Use savebar from macaw * Use confirm button from macaw * Improve file structure * Use sidebar context from macaw * Update macaw * Update macaw version * Remove savebar from storybook * Update stories * Use alerts and notifications from macaw (#1166) * Use alerts from macaw * Add notifications from macaw * Update stories * Pin macaw version * Encapsulate limit reached in one component * Remove unused imports * Use backlinks from macaw (#1183) * Use backlink from macaw * Update macaw version * Use macaw sidebar (#1148) * Use sidebar from macaw * Use shipped logo * Use lowercase * Update stories * Use user chip from macaw (#1191) * Use user chip from macaw * Use dedicated components for menu items * Simplify code * Bump version and fix types (#1210) * Rename onBack to onClick * Rename UserChip to UserChipMenu * Rename IMenuItem to SidebarMenuItem * Update macaw version * Fix tables after changes in macaw (#1220) * Update macaw version * Update changelog * Update stories * Fix after rebase * Update to macaw 0.2.0 * Lint files * Update macaw to 0.2.2
2021-07-21 08:59:52 +00:00
onSubmit={submit}
2019-06-19 14:40:52 +00:00
/>
2019-08-09 11:14:35 +00:00
</Container>
);
}}
2019-06-19 14:40:52 +00:00
</Form>
);
};
2019-10-21 10:13:23 +00:00
2019-06-19 14:40:52 +00:00
SiteSettingsPage.displayName = "SiteSettingsPage";
export default SiteSettingsPage;