|
@@ -21,7 +21,7 @@ import Select from "@/components/theme/ui/Select";
|
|
|
import PhoneNumberInput from "@/components/theme/ui/PhoneNumberInput/PhoneNumberInput";
|
|
import PhoneNumberInput from "@/components/theme/ui/PhoneNumberInput/PhoneNumberInput";
|
|
|
import { LoadingSpinner } from "@components/common/LoadingSpinner";
|
|
import { LoadingSpinner } from "@components/common/LoadingSpinner";
|
|
|
import {LyDropDown} from "@/components/theme/ui/LyDropDown";
|
|
import {LyDropDown} from "@/components/theme/ui/LyDropDown";
|
|
|
-
|
|
|
|
|
|
|
+import MyAddressListTrigger from "./MyAddressListTrigger";
|
|
|
|
|
|
|
|
|
|
|
|
|
export default function ShippingAddressCheckout({
|
|
export default function ShippingAddressCheckout({
|
|
@@ -128,25 +128,70 @@ export default function ShippingAddressCheckout({
|
|
|
|
|
|
|
|
},[selectedCountryCode,hasUserSelectedPhoneCode,getValues,setValue]);
|
|
},[selectedCountryCode,hasUserSelectedPhoneCode,getValues,setValue]);
|
|
|
|
|
|
|
|
- const showMyAddressList = () => {
|
|
|
|
|
- setShowDropDown(true);
|
|
|
|
|
|
|
+ /** 这个函数既要控制表单的显示隐藏还要控制地址列表的显示隐藏
|
|
|
|
|
+ * 游客状态没有地址列表:
|
|
|
|
|
+ * 如果noAddress=true,购物车没有地址信息,不执行任何逻辑
|
|
|
|
|
+ * 如果noAddress=false,购物车里有地址信息,控制地址列表的显示隐藏,地址列表里有+New选项
|
|
|
|
|
+ *
|
|
|
|
|
+ * 登录状态:
|
|
|
|
|
+ * 如果有地址列表,控制地址列表的显示隐藏,地址列表里有+New选项
|
|
|
|
|
+ * 如果没有地址列表:
|
|
|
|
|
+ * 如果noAddress=true, 购物车里没有地址信息,不执行任何逻辑
|
|
|
|
|
+ * 如果noAddress=false, 购物车里有地址信息,控制地址列表的显示隐藏,地址列表里有+New选项
|
|
|
|
|
+ *
|
|
|
|
|
+ */
|
|
|
|
|
+ const myAddressListToggle = () => {
|
|
|
|
|
+ if(isGuest) { // 游客
|
|
|
|
|
+ if(!noAddress) { // 有地址
|
|
|
|
|
+ setShowDropDown(!showDropDown);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else { // 登录用户
|
|
|
|
|
+ if(customerAddressList.length > 0) {
|
|
|
|
|
+ setShowDropDown(!showDropDown);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if(!noAddress) {
|
|
|
|
|
+ setShowDropDown(!showDropDown);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
};
|
|
};
|
|
|
const closeMyaddressList = useCallback(() => {
|
|
const closeMyaddressList = useCallback(() => {
|
|
|
setShowDropDown(false);
|
|
setShowDropDown(false);
|
|
|
},[]);
|
|
},[]);
|
|
|
// 从地址列表选择地址
|
|
// 从地址列表选择地址
|
|
|
- const selectAddress = (param: CustomerAddressItem | 'edit') => {
|
|
|
|
|
- if(param === 'edit') {
|
|
|
|
|
|
|
+ const selectAddress = (param: CustomerAddressItem | 'new') => {
|
|
|
|
|
+ if(param === 'new') {
|
|
|
|
|
+ setValue('shippingFirstName','');
|
|
|
|
|
+ setValue('shippingLastName','');
|
|
|
|
|
+ setValue('shippingAddress','');
|
|
|
|
|
+ setValue('shippingCountry','US');
|
|
|
|
|
+ setValue('shippingState','');
|
|
|
|
|
+ setValue('shippingPostcode','');
|
|
|
|
|
+ setValue('shippingCity','');
|
|
|
|
|
+ setValue('shippingPhoneNumber','');
|
|
|
if(!showFormField) onShowFormFieldChange(true);
|
|
if(!showFormField) onShowFormFieldChange(true);
|
|
|
} else {
|
|
} else {
|
|
|
|
|
+ // 用户地址中,state字段有的是全称,有的是缩写,如何处理
|
|
|
|
|
+ // 对于有州列表的,拿state字段遍历州列表,分别对比全称和缩写,有一项相等,则填入缩写;如果没有找到匹配的,让用户自己选填
|
|
|
|
|
+ // 这就牵涉到一个问题,用户从地址列表中选地址的时候,还要显示出来表单,防止出现state字段校验不通过的情况;
|
|
|
|
|
+ if(statesOptions.length) {
|
|
|
|
|
+ const paramState = statesOptions.find((state) => {
|
|
|
|
|
+ return state.label === param.state || state.value === param.state;
|
|
|
|
|
+ });
|
|
|
|
|
+ if(paramState) {
|
|
|
|
|
+ setValue('shippingState',paramState.value);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ setValue('shippingState',param.state);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
setValue('shippingFirstName',param.firstName);
|
|
setValue('shippingFirstName',param.firstName);
|
|
|
setValue('shippingLastName',param.lastName);
|
|
setValue('shippingLastName',param.lastName);
|
|
|
setValue('shippingAddress',param.address);
|
|
setValue('shippingAddress',param.address);
|
|
|
setValue('shippingCountry',param.country);
|
|
setValue('shippingCountry',param.country);
|
|
|
- setValue('shippingState',param.state);
|
|
|
|
|
setValue('shippingPostcode',param.postcode);
|
|
setValue('shippingPostcode',param.postcode);
|
|
|
setValue('shippingCity',param.city);
|
|
setValue('shippingCity',param.city);
|
|
|
setValue('shippingPhoneNumber',param.phone);
|
|
setValue('shippingPhoneNumber',param.phone);
|
|
|
|
|
+ if(!showFormField) onShowFormFieldChange(true);
|
|
|
}
|
|
}
|
|
|
closeMyaddressList();
|
|
closeMyaddressList();
|
|
|
};
|
|
};
|
|
@@ -171,53 +216,31 @@ export default function ShippingAddressCheckout({
|
|
|
return (<>
|
|
return (<>
|
|
|
|
|
|
|
|
<div className="w-full">
|
|
<div className="w-full">
|
|
|
- {noAddress ?
|
|
|
|
|
- <div onClick={showMyAddressList}
|
|
|
|
|
- className="box-border w-full h-9 justify-between flex items-center px-4 relative bg-[url(/image/address-bg.webp)] bg-position-[0_-70%] bg-size-[100%_auto]"
|
|
|
|
|
- >
|
|
|
|
|
- <span className="text-ly-12">+New Shipping Address</span>
|
|
|
|
|
- {!isGuest &&
|
|
|
|
|
- <button className="flex-none" title="change address" type="button">
|
|
|
|
|
- <svg className="w-4 h-4" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="16" y="0" width="16" height="16" transform="rotate(90 16 0)" fill="#FFFFFF" fillOpacity="0"></rect><path stroke="rgba(0, 0, 0, 1)" strokeWidth="1.5" strokeLinejoin="round" strokeLinecap="square" d="M11.7295 6.32028L7.62964 10.4201L3.52978 6.32028"></path></svg>
|
|
|
|
|
- </button>
|
|
|
|
|
- }
|
|
|
|
|
- </div>
|
|
|
|
|
- :
|
|
|
|
|
- <div onClick={showMyAddressList}
|
|
|
|
|
- className="w-full box-border px-3.75 bg-[url(/image/address-bg.webp)] bg-position-[0_-84%] bg-size-[100%_auto]"
|
|
|
|
|
- >
|
|
|
|
|
- <div className="border-b-1 flex h-11.25 items-center justify-between">
|
|
|
|
|
- <p className="text-ly-13 font-medium">
|
|
|
|
|
- {firstName} {lastName}
|
|
|
|
|
- <span className="border-r border-ly-gray h-3.5 mx-2"></span>
|
|
|
|
|
- {phoneNumber}
|
|
|
|
|
- </p>
|
|
|
|
|
- {!isGuest &&
|
|
|
|
|
- <svg className="w-4 h-4" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="16" y="0" width="16" height="16" transform="rotate(90 16 0)" fill="#FFFFFF" fillOpacity="0"></rect><path stroke="rgba(0, 0, 0, 1)" strokeWidth="1.5" strokeLinejoin="round" strokeLinecap="square" d="M11.7295 6.32028L7.62964 10.4201L3.52978 6.32028"></path></svg>
|
|
|
|
|
- }
|
|
|
|
|
- </div>
|
|
|
|
|
- <div className="flex items-center h-10">
|
|
|
|
|
- <svg className="w-4 h-4" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24" fill="none">
|
|
|
|
|
- <path stroke="rgba(0, 0, 0, 1)" strokeWidth="1.5" strokeLinejoin="round" strokeLinecap="round" d="M6.01652 15.917C4.48522 16.3764 3.53809 17.0111 3.53809 17.712C3.53809 19.1141 7.32661 20.2507 12 20.2507C16.6734 20.2507 20.4619 19.1141 20.4619 17.712C20.4619 17.0111 19.5148 16.3764 17.9835 15.917"></path>
|
|
|
|
|
- <path d="M12.0002 16.8657C12.0002 16.8657 17.5005 13.271 17.5005 9.11522C17.5005 6.15182 15.0379 3.74951 12.0002 3.74951C8.96254 3.74951 6.5 6.15182 6.5 9.11522C6.5 13.271 12.0002 16.8657 12.0002 16.8657Z" stroke="rgba(0, 0, 0, 1)" strokeWidth="1.5" strokeLinejoin="round" ></path>
|
|
|
|
|
- <path d="M11.9983 11.3653C13.1666 11.3653 14.1138 10.4181 14.1138 9.24979C14.1138 8.08144 13.1666 7.13428 11.9983 7.13428C10.83 7.13428 9.88281 8.08144 9.88281 9.24979C9.88281 10.4181 10.83 11.3653 11.9983 11.3653Z" stroke="rgba(0, 0, 0, 1)" strokeWidth="1.5" strokeLinejoin="round" ></path>
|
|
|
|
|
- </svg>
|
|
|
|
|
- <span className="text-ly-12 ml-2.5">
|
|
|
|
|
- {streetAddress},
|
|
|
|
|
- {city},
|
|
|
|
|
- {stateProvince},
|
|
|
|
|
- {postCode},
|
|
|
|
|
- {selectedCountryCode}
|
|
|
|
|
- </span>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
- }
|
|
|
|
|
|
|
+
|
|
|
<LyDropDown
|
|
<LyDropDown
|
|
|
showDropDown={showDropDown}
|
|
showDropDown={showDropDown}
|
|
|
onClose={closeMyaddressList}
|
|
onClose={closeMyaddressList}
|
|
|
|
|
+ trigger={
|
|
|
|
|
+ <MyAddressListTrigger
|
|
|
|
|
+ noAddress={noAddress}
|
|
|
|
|
+ isGuest={isGuest}
|
|
|
|
|
+ hasAddressList={customerAddressList.length > 0}
|
|
|
|
|
+ addressInfo={{
|
|
|
|
|
+ firstName,
|
|
|
|
|
+ lastName,
|
|
|
|
|
+ phoneNumber,
|
|
|
|
|
+ streetAddress,
|
|
|
|
|
+ city,
|
|
|
|
|
+ stateProvince,
|
|
|
|
|
+ postCode,
|
|
|
|
|
+ countryCode: selectedCountryCode
|
|
|
|
|
+ }}
|
|
|
|
|
+ clickTrigger={myAddressListToggle}
|
|
|
|
|
+ />
|
|
|
|
|
+ }
|
|
|
>
|
|
>
|
|
|
- <div className="w-full p-3 text-ly-13 font-medium" key={'edit'} onClick={() => {selectAddress('edit')}}>
|
|
|
|
|
- Edit Address
|
|
|
|
|
|
|
+ <div className="w-full p-3 text-ly-13 font-medium" key={'new'} onClick={() => {selectAddress('new')}}>
|
|
|
|
|
+ + New Shipping Address
|
|
|
</div>
|
|
</div>
|
|
|
{customerAddressList.map((item) => {
|
|
{customerAddressList.map((item) => {
|
|
|
return (
|
|
return (
|
|
@@ -245,15 +268,11 @@ export default function ShippingAddressCheckout({
|
|
|
Select a shipping address from your address book or enter a new address.
|
|
Select a shipping address from your address book or enter a new address.
|
|
|
</p>
|
|
</p>
|
|
|
{/**
|
|
{/**
|
|
|
- * 登录用户: noAddres=false and showFormField = false 时 隐藏; noAddres=true 显示
|
|
|
|
|
- * 游客: noAddres=false and showFormField = false 时 隐藏; noAddres=true 显示
|
|
|
|
|
|
|
+ * 登录用户: noAddres=false(有地址) and showFormField = false 时 隐藏; noAddres=true 显示
|
|
|
|
|
+ * 游客: noAddres=false(有地址) and showFormField = false 时 隐藏; noAddres=true 显示
|
|
|
*/}
|
|
*/}
|
|
|
- <div className={clsx("box-border w-full", {
|
|
|
|
|
- "hidden": !showFormField && !noAddress
|
|
|
|
|
- })}>
|
|
|
|
|
- <div className={clsx("w-full",{
|
|
|
|
|
- "hidden": !isGuest
|
|
|
|
|
- })}>
|
|
|
|
|
|
|
+ <div className={clsx("box-border w-full", !showFormField && !noAddress ? "hidden" : "block")}>
|
|
|
|
|
+ <div className={clsx("w-full",isGuest ? "block" : "hidden")}>
|
|
|
<label className="text-ly-12 block mb-4 font-semibold">
|
|
<label className="text-ly-12 block mb-4 font-semibold">
|
|
|
Email *
|
|
Email *
|
|
|
</label>
|
|
</label>
|