2021-05-14 08:15:15 +00:00
import { Typography } from "@material-ui/core" ;
2020-05-14 09:30:32 +00:00
import CompanyAddressInput from "@saleor/components/CompanyAddressInput" ;
2019-06-19 14:40:52 +00:00
import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton" ;
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" ;
2021-07-21 08:59:52 +00:00
import Savebar from "@saleor/components/Savebar" ;
2020-07-07 10:14:12 +00:00
import { ShopErrorFragment } from "@saleor/fragments/types/ShopErrorFragment" ;
2019-12-06 13:56:16 +00:00
import useAddressValidation from "@saleor/hooks/useAddressValidation" ;
2020-11-02 13:26:02 +00:00
import { SubmitPromise } from "@saleor/hooks/useForm" ;
2019-08-09 11:14:35 +00:00
import useStateFromProps from "@saleor/hooks/useStateFromProps" ;
2019-08-26 21:39:21 +00:00
import { commonMessages , sectionNames } from "@saleor/intl" ;
2021-07-21 08:59:52 +00:00
import { Backlink } from "@saleor/macaw-ui" ;
import { 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" ;
2020-05-14 09:30:32 +00:00
import React from "react" ;
import { FormattedMessage , useIntl } from "react-intl" ;
2019-06-19 14:40:52 +00:00
import { maybe } from "../../../misc" ;
import { SiteSettings_shop } from "../../types/SiteSettings" ;
import SiteSettingsDetails from "../SiteSettingsDetails/SiteSettingsDetails" ;
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 ;
domain : string ;
name : string ;
}
export interface SiteSettingsPageProps {
disabled : boolean ;
2020-03-17 18:49:01 +00:00
errors : ShopErrorFragment [ ] ;
2019-06-19 14:40:52 +00:00
shop : SiteSettings_shop ;
saveButtonBarState : ConfirmButtonTransitionState ;
onBack : ( ) = > void ;
2020-11-02 13:26:02 +00:00
onSubmit : ( data : SiteSettingsPageFormData ) = > SubmitPromise ;
2019-06-19 14:40:52 +00:00
}
2019-12-06 13:56:16 +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" ,
2019-10-28 16:16:49 +00:00
margin : theme.spacing ( 1 , 0 )
2019-10-21 10:13:23 +00:00
}
} ) ,
{
name : "SiteSettingsPage"
}
) ;
const SiteSettingsPage : React.FC < SiteSettingsPageProps > = props = > {
const {
disabled ,
errors ,
saveButtonBarState ,
shop ,
onBack ,
onSubmit
} = props ;
const classes = useStyles ( props ) ;
2019-08-26 21:39:21 +00:00
const intl = useIntl ( ) ;
2019-08-09 11:14:35 +00:00
const [ displayCountry , setDisplayCountry ] = useStateFromProps (
maybe ( ( ) = > shop . companyAddress . country . code , "" )
) ;
2019-12-06 13:56:16 +00:00
const {
errors : validationErrors ,
submit : handleSubmitWithAddress
2020-10-22 11:33:29 +00:00
} = useAddressValidation ( onSubmit ) ;
2019-12-06 13:56:16 +00:00
2019-10-21 14:14:28 +00:00
const initialFormAddress : SiteSettingsPageAddressFormData = {
2019-08-09 11:14:35 +00:00
city : maybe ( ( ) = > shop . companyAddress . city , "" ) ,
companyName : maybe ( ( ) = > shop . companyAddress . companyName , "" ) ,
country : maybe ( ( ) = > shop . companyAddress . country . code , "" ) ,
countryArea : maybe ( ( ) = > shop . companyAddress . countryArea , "" ) ,
phone : maybe ( ( ) = > shop . companyAddress . phone , "" ) ,
postalCode : maybe ( ( ) = > shop . companyAddress . postalCode , "" ) ,
streetAddress1 : maybe ( ( ) = > shop . companyAddress . streetAddress1 , "" ) ,
streetAddress2 : maybe ( ( ) = > shop . companyAddress . streetAddress2 , "" )
2019-06-19 14:40:52 +00:00
} ;
2019-10-21 14:14:28 +00:00
const initialForm : SiteSettingsPageFormData = {
. . . initialFormAddress ,
description : maybe ( ( ) = > shop . description , "" ) ,
domain : maybe ( ( ) = > shop . domain . host , "" ) ,
name : maybe ( ( ) = > shop . name , "" )
} ;
2019-08-09 11:14:35 +00:00
2019-06-19 14:40:52 +00:00
return (
< Form
initial = { initialForm }
2019-12-06 13:56:16 +00:00
onSubmit = { data = > {
const submitFunc = areAddressInputFieldsModified ( data )
? handleSubmitWithAddress
: onSubmit ;
2020-10-22 11:33:29 +00:00
return submitFunc ( data ) ;
2019-12-06 13:56:16 +00:00
} }
2019-06-19 14:40:52 +00:00
confirmLeave
>
2020-02-24 14:14:48 +00:00
{ ( { change , data , hasChanged , submit } ) = > {
2020-03-17 18:49:01 +00:00
const countryChoices = mapCountriesToChoices ( shop ? . countries || [ ] ) ;
2019-08-09 11:14:35 +00:00
const handleCountryChange = createSingleAutocompleteSelectHandler (
change ,
setDisplayCountry ,
countryChoices
) ;
return (
< Container >
2021-07-21 08:59:52 +00:00
< Backlink onClick = { onBack } >
2019-08-26 21:39:21 +00:00
{ intl . formatMessage ( sectionNames . configuration ) }
2021-07-21 08:59:52 +00:00
< / Backlink >
2019-08-09 11:14:35 +00:00
< PageHeader
2019-08-26 21:39:21 +00:00
title = { intl . formatMessage ( commonMessages . generalInformations ) }
2019-06-19 14:40:52 +00:00
/ >
2019-08-09 11:14:35 +00:00
< Grid variant = "inverted" >
2019-10-21 10:13:23 +00:00
< div >
< Typography >
{ intl . formatMessage ( sectionNames . siteSettings ) }
< / Typography >
2019-10-28 16:16:49 +00:00
< Typography variant = "body2" >
2019-10-21 10:13:23 +00:00
< FormattedMessage defaultMessage = "These are general information about your store. They define what is the URL of your store and what is shown in browsers taskbar." / >
< / Typography >
< / div >
2019-08-09 11:14:35 +00:00
< SiteSettingsDetails
data = { data }
2020-03-17 18:49:01 +00:00
errors = { errors }
2019-08-09 11:14:35 +00:00
disabled = { disabled }
onChange = { change }
/ >
2019-10-21 10:13:23 +00:00
< Hr className = { classes . hr } / >
< div >
< Typography >
< FormattedMessage
defaultMessage = "Company Information"
description = "section header"
/ >
< / Typography >
2019-10-28 16:16:49 +00:00
< Typography variant = "body2" >
2019-10-21 10:13:23 +00:00
< FormattedMessage defaultMessage = "This adress will be used to generate invoices and calculate shipping rates." / >
< FormattedMessage defaultMessage = "Email adress you provide here will be used as a contact adress for your customers." / >
< / Typography >
< / div >
2020-01-30 13:17:29 +00:00
< CompanyAddressInput
2019-08-09 11:14:35 +00:00
data = { data }
displayCountry = { displayCountry }
countries = { countryChoices }
2020-03-17 18:49:01 +00:00
errors = { [ . . . errors , . . . validationErrors ] }
2019-08-09 11:14:35 +00:00
disabled = { disabled }
2020-01-30 13:17:29 +00:00
header = { intl . formatMessage ( {
defaultMessage : "Store Information" ,
description : "section header"
} ) }
2019-08-09 11:14:35 +00:00
onChange = { change }
onCountryChange = { handleCountryChange }
/ >
< / Grid >
2021-07-21 08:59:52 +00:00
< Savebar
2019-08-09 11:14:35 +00:00
state = { saveButtonBarState }
disabled = { disabled || ! hasChanged }
onCancel = { onBack }
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 ;