Skip to content

Commit f45ad5d

Browse files
committed
feat: improve order with shipping country code lock
1 parent a915a98 commit f45ad5d

11 files changed

Lines changed: 174 additions & 75 deletions

File tree

components/composite/StepCustomer/AddressInputGroup/index.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
AddressStateSelectName,
1111
BaseInputType,
1212
} from "@commercelayer/react-components"
13-
import { useContext, useEffect, useState } from "react"
13+
import { ChangeEvent, useContext, useEffect, useState } from "react"
1414
import { useTranslation } from "react-i18next"
1515
import styled from "styled-components"
1616
import tw from "twin.macro"
@@ -25,13 +25,15 @@ interface Props {
2525
fieldName: AddressInputName | AddressCountrySelectName | "email"
2626
resource: ResourceErrorType
2727
value?: string
28+
openShippingAddress?: () => void
2829
}
2930

3031
export const AddressInputGroup: React.FC<Props> = ({
3132
fieldName,
3233
resource,
3334
type,
3435
value,
36+
openShippingAddress,
3537
}) => {
3638
const { t } = useTranslation()
3739

@@ -86,6 +88,23 @@ export const AddressInputGroup: React.FC<Props> = ({
8688
setValueStatus(value || "")
8789
}, [value])
8890

91+
console.log(fieldName, isCountry, isState)
92+
93+
const handleChange = (event: ChangeEvent<HTMLSelectElement>) => {
94+
if (isCountry && fieldName === "billing_address_country_code") {
95+
const countryCode = event.target.value
96+
if (
97+
!!countryCode &&
98+
!!shippingCountryCodeLock &&
99+
shippingCountryCodeLock !== countryCode &&
100+
openShippingAddress
101+
) {
102+
console.log("Apri shipping form")
103+
openShippingAddress()
104+
}
105+
}
106+
}
107+
89108
function renderInput() {
90109
if (isCountry) {
91110
return (
@@ -99,6 +118,7 @@ export const AddressInputGroup: React.FC<Props> = ({
99118
label: t(`addressForm.${fieldName}_placeholder`),
100119
value: "",
101120
}}
121+
onChange={handleChange}
102122
value={
103123
shippingCountryCodeLock &&
104124
fieldName === "shipping_address_country_code"

components/composite/StepCustomer/BillingAddressFormNew/index.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ import { AppContext } from "components/data/AppProvider"
88

99
interface Props {
1010
billingAddress: Address | undefined
11+
openShippingAddress: () => void
1112
}
1213

1314
export const BillingAddressFormNew: React.FC<Props> = ({
1415
billingAddress,
16+
openShippingAddress,
1517
}: Props) => {
1618
const appCtx = useContext(AppContext)
1719

@@ -60,6 +62,7 @@ export const BillingAddressFormNew: React.FC<Props> = ({
6062
fieldName="billing_address_country_code"
6163
resource="billing_address"
6264
type="text"
65+
openShippingAddress={openShippingAddress}
6366
value={billingAddress?.country_code || ""}
6467
/>
6568
</Grid>

components/composite/StepCustomer/CheckoutAddresses.tsx

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,23 @@ export const CheckoutAddresses: React.FC<Props> = ({
4848
!hasSameAddresses
4949
)
5050

51-
const handleToggleDifferentAddress = () => [
52-
setShipToDifferentAddress(!shipToDifferentAddress),
53-
setShippingAddressFill(undefined),
54-
]
51+
const handleToggleDifferentAddress = () => {
52+
return [
53+
setShipToDifferentAddress(!shipToDifferentAddress),
54+
setShippingAddressFill(undefined),
55+
]
56+
}
5557

5658
useEffect(() => {
57-
if (shipToDifferentAddress) {
59+
if (shipToDifferentAddress && hasSameAddresses) {
5860
setShippingAddressFill(undefined)
5961
}
6062
}, [shipToDifferentAddress])
6163

64+
const openShippingAddress = () => {
65+
setShipToDifferentAddress(true)
66+
}
67+
6268
return (
6369
<Fragment>
6470
<AddressSectionEmail emailAddress={emailAddress} />
@@ -70,7 +76,10 @@ export const CheckoutAddresses: React.FC<Props> = ({
7076
</div>
7177
<BillingAddressForm autoComplete="on" errorClassName="hasError">
7278
<div className="mt-4">
73-
<BillingAddressFormNew billingAddress={billingAddress} />
79+
<BillingAddressFormNew
80+
billingAddress={billingAddress}
81+
openShippingAddress={openShippingAddress}
82+
/>
7483
</div>
7584
</BillingAddressForm>
7685
{isShipmentRequired && (

components/composite/StepCustomer/CheckoutCustomerAddresses.tsx

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ interface Props {
3636
hasCustomerAddresses: boolean
3737
emailAddress: string | undefined
3838
isLocalLoader: boolean
39+
shippingCountryCodeLock: string | undefined
3940
handleSave: () => void
4041
}
4142

@@ -51,6 +52,7 @@ export const CheckoutCustomerAddresses: React.FC<Props> = ({
5152
hasCustomerAddresses,
5253
emailAddress,
5354
isLocalLoader,
55+
shippingCountryCodeLock,
5456
handleSave,
5557
}: Props) => {
5658
const { t } = useTranslation()
@@ -81,7 +83,10 @@ export const CheckoutCustomerAddresses: React.FC<Props> = ({
8183

8284
useEffect(() => {
8385
if (shipToDifferentAddress && !hasCustomerAddresses) {
84-
setShippingAddressFill(undefined)
86+
// If billing and shipping are equivalent, show form but reset it
87+
if (hasSameAddresses) {
88+
setShippingAddressFill(undefined)
89+
}
8590
setShowShippingAddressForm(true)
8691
setMountShippingAddressForm(true)
8792
}
@@ -136,6 +141,23 @@ export const CheckoutCustomerAddresses: React.FC<Props> = ({
136141
setShipToDifferentAddress(!shipToDifferentAddress)
137142
}
138143

144+
const openShippingAddress = () => {
145+
setShipToDifferentAddress(true)
146+
}
147+
148+
const onSelect = (address: Address) => {
149+
if (
150+
!!shippingCountryCodeLock &&
151+
address.country_code !== shippingCountryCodeLock
152+
) {
153+
setShipToDifferentAddress(true)
154+
}
155+
localStorage.setItem(
156+
"_save_billing_address_to_customer_address_book",
157+
"false"
158+
)
159+
}
160+
139161
return (
140162
<Fragment>
141163
<AddressSectionEmail readonly emailAddress={emailAddress as string} />
@@ -156,12 +178,7 @@ export const CheckoutCustomerAddresses: React.FC<Props> = ({
156178
<CustomerAddressCard
157179
addressType="billing"
158180
deselect={showBillingAddressForm}
159-
onSelect={() =>
160-
localStorage.setItem(
161-
"_save_billing_address_to_customer_address_book",
162-
"false"
163-
)
164-
}
181+
onSelect={onSelect}
165182
/>
166183
</BillingAddressContainer>
167184
</GridContainer>
@@ -192,6 +209,7 @@ export const CheckoutCustomerAddresses: React.FC<Props> = ({
192209
<>
193210
<BillingAddressFormNew
194211
billingAddress={billingAddressFill}
212+
openShippingAddress={openShippingAddress}
195213
/>
196214
<AddressFormBottom
197215
addressType="billing"

components/composite/StepCustomer/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ export const StepCustomer: React.FC<Props> = () => {
7777
isUsingNewBillingAddress,
7878
isUsingNewShippingAddress,
7979
hasCustomerAddresses,
80+
shippingCountryCodeLock,
8081
refetchOrder,
8182
} = appCtx
8283

@@ -132,6 +133,7 @@ export const StepCustomer: React.FC<Props> = () => {
132133
isUsingNewBillingAddress={isUsingNewBillingAddress}
133134
hasSameAddresses={hasSameAddresses}
134135
isLocalLoader={isLocalLoader}
136+
shippingCountryCodeLock={shippingCountryCodeLock}
135137
handleSave={handleSave}
136138
/>
137139
)}

components/ui/CustomerAddressCard/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ interface AddressCardProps {
55
addressType: "shipping" | "billing"
66
addresses?: AddressCollection[]
77
deselect: boolean
8-
onSelect?: () => void
8+
onSelect?: (address: AddressCollection) => void
99
}
1010

1111
export const CustomerAddressCard: React.FC<AddressCardProps> = ({

cypress/integration/customer-address.spec.ts

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ describe("Checkout customer address", () => {
390390
})
391391
})
392392

393-
context("initial order with differend address", () => {
393+
context("initial order with different address", () => {
394394
before(function () {
395395
cy.getTokenCustomer({
396396
username: email,
@@ -1030,7 +1030,7 @@ describe("Checkout customer address", () => {
10301030
})
10311031
})
10321032

1033-
context("initial order empty with country lock", () => {
1033+
context.only("initial order empty with country lock", () => {
10341034
let requires_billing_info = false
10351035
const emailTemp = faker.internet.email().toLocaleLowerCase()
10361036
const passwordTemp = faker.internet.password()
@@ -1125,6 +1125,16 @@ describe("Checkout customer address", () => {
11251125
})
11261126

11271127
it("select first address and save", () => {
1128+
cy.dataCy("customer-billing-address").should(
1129+
"contain.text",
1130+
`${euAddress.firstName} ${euAddress.lastName}`
1131+
)
1132+
1133+
cy.dataCy("customer-billing-address").should(
1134+
"contain.text",
1135+
`${euAddress2.firstName} ${euAddress2.lastName}`
1136+
)
1137+
11281138
cy.dataCy("customer-billing-address")
11291139
.contains("p", euAddress.firstName)
11301140
.click()
@@ -1154,12 +1164,12 @@ describe("Checkout customer address", () => {
11541164
cy.wait("@deliveryLeadTimes")
11551165
})
11561166

1157-
it("select second address and save is disabled", () => {
1167+
it("select second address and ship to different address should be enabled", () => {
11581168
cy.dataCy("step_customer")
11591169
.click()
11601170
.should("have.attr", "data-status", "true")
11611171

1162-
cy.wait(1500)
1172+
cy.dataCy("shipping-address").should("not.be.visible")
11631173

11641174
cy.dataCy("customer-billing-address")
11651175
.contains("p", euAddress2.firstName)
@@ -1168,8 +1178,19 @@ describe("Checkout customer address", () => {
11681178
cy.wait("@updateAddress", {
11691179
timeout: 100000,
11701180
})
1181+
cy.wait(1500)
1182+
cy.dataCy("shipping-address").should("be.visible")
1183+
cy.dataCy("shipping-address").should("contain", "Indirizzo di spedizione")
1184+
cy.dataCy("customer-shipping-address").should(
1185+
"contain",
1186+
`${euAddress.firstName} ${euAddress.lastName}`
1187+
)
1188+
cy.dataCy("customer-shipping-address").should(
1189+
"not.contain",
1190+
`${euAddress2.firstName} ${euAddress2.lastName}`
1191+
)
11711192

1172-
cy.dataCy("save-addresses-button").should("be.disabled")
1193+
cy.dataCy("save-addresses-button").should("be.enabled")
11731194
})
11741195

11751196
it("check billing information", () => {
@@ -1182,7 +1203,7 @@ describe("Checkout customer address", () => {
11821203
cy.wait("@deliveryLeadTimes")
11831204
})
11841205

1185-
it("add custom billing address and save is disabled", function () {
1206+
it("add custom billing address and save is enabled", function () {
11861207
cy.dataCy("step_customer")
11871208
.click()
11881209
.should("have.attr", "data-status", "true")
@@ -1197,7 +1218,10 @@ describe("Checkout customer address", () => {
11971218
requiresBillingInfo: requires_billing_info,
11981219
})
11991220

1200-
cy.dataCy("save-addresses-button").should("be.disabled")
1221+
cy.dataCy("customer-shipping-address").should("contain", "GE (IT)")
1222+
cy.dataCy("customer-shipping-address").should("not.contain", "RE (FR)")
1223+
1224+
cy.dataCy("save-addresses-button").should("be.enabled")
12011225
})
12021226

12031227
it("change billing address country code and save", () => {

cypress/integration/guest-address.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ describe("Checkout guest address", () => {
179179
})
180180
})
181181

182-
context("initial order with differend address", () => {
182+
context("initial order with different address", () => {
183183
before(function () {
184184
cy.createOrder("draft", {
185185
languageCode: "en",

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@
4444
]
4545
},
4646
"dependencies": {
47-
"@commercelayer/react-components": "^3.0.1",
48-
"@commercelayer/sdk": "2.3.14",
47+
"@commercelayer/react-components": "^3.2.2",
4948
"@fortawesome/fontawesome-svg-core": "^1.2.36",
5049
"@fortawesome/free-solid-svg-icons": "^5.15.4",
5150
"@fortawesome/react-fontawesome": "^0.1.16",
@@ -77,7 +76,7 @@
7776
"@semantic-release/release-notes-generator": "^10.0.3",
7877
"@tailwindcss/forms": "^0.4.0",
7978
"@tailwindcss/line-clamp": "^0.3.1",
80-
"@types/node": "^17.0.12",
79+
"@types/node": "^17.0.13",
8180
"@types/react": "^17.0.38",
8281
"@types/react-gtm-module": "^2.0.1",
8382
"@types/styled-components": "^5.1.21",

pages/api/settings.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ export default async (req: NextApiRequest, res: NextApiResponse) => {
115115
})
116116
} else if (order.status === "placed") {
117117
order = await cl.orders.retrieve(orderId)
118+
} else {
119+
return invalidateCheckout()
118120
}
119121
} catch (e) {
120122
console.log("error on retrieving or refreshing order:")

0 commit comments

Comments
 (0)