1import { ref, computed, onMounted, nextTick, watch, watchEffect, toRaw, unref } from "vue" 2import { usePwUserStore } from "pw-user-store" 3import { usePwCartStore, storeToRefs } from "pw-cart-store" 4import { PwAddressManager } from "pw-user-addressmanager" 5import { PwUpdateAddress } from "pw-user-updateaddress" 6 7/** 8 * Deep-clone a plain address-like object for local component state. 9 * Unwraps Vue refs/reactive proxies; falls back to JSON when structuredClone fails. 10 */ 11function clonePlainObject(value) { 12 const raw = toRaw(unref(value)) 13 if (raw === null || raw === undefined) { 14 return {} 15 } 16 if (typeof raw !== 'object') { 17 return raw 18 } 19 try { 20 return structuredClone(raw) 21 } catch { 22 return JSON.parse(JSON.stringify(raw)) 23 } 24} 25 26/** PharmaServe ships to US patients â never use Canada for shipping method lookup. */ 27function normalizeShippingCountry(country) { 28 const code = String(country || '').trim().toUpperCase() 29 if (!code || code === 'CAN' || code === 'CA' || code === 'CANADA') { 30 return 'USA' 31 } 32 return code === 'US' ? 'USA' : (country || 'USA') 33} 34 35function isCanadaCountry(country) { 36 const code = String(country || '').trim().toUpperCase() 37 return code === 'CAN' || code === 'CA' || code === 'CANADA' 38} 39 40const components = { 41 PwAddressManager, 42 PwUpdateAddress, 43} 44 45export const PwDeliveryAddress = { 46 components, 47 template: "#pwDeliveryAddress", 48 expose: ["showDeliveryAddressRefDialog"], 49 setup(props, context) { 50 const pwCartStore = usePwCartStore() 51 const pwUserStore = usePwUserStore() 52 const { selectedDeliveryAddressRef } = storeToRefs(pwCartStore) 53 const { address } = storeToRefs(pwUserStore) 54 const isUserStoreLoaded = computed(() => pwUserStore.isLoaded) 55 const deliveryAddress = ref({}) 56 const deliveryAddressViewRef = ref(null) 57 const shippingAddresses = computed(() => pwUserStore.getShippingAddress) 58 const editAddressID = ref(null) 59 const errorMessage = ref("") 60 const inDialog = ref(false) 61 const isLoaded = ref(false) 62 const addressManagerRef = ref(null) 63 const deliveryAddressDialogRef = ref(null) 64 const shippingUsesUsaNotice = ref(false) 65 const deliveryDialogOpenLabel = computed(() => { 66 return deliveryAddress.value?.address1 ? "Change" : "Add Address" 67 }) 68 69 // on mount check if in dialog 70 onMounted(() => { 71 nextTick().then(() => { 72 inDialog.value = 73 deliveryAddressViewRef.value && 74 deliveryAddressViewRef.value.closest("dialog") 75 ? true 76 : false 77 }) 78 }) 79 80 const applyDeliveryAddressFromRef = (addressRef) => { 81 const normalizedRef = parseInt(addressRef, 10) 82 const refId = Number.isNaN(normalizedRef) ? 0 : normalizedRef 83 deliveryAddress.value = clonePlainObject(pwUserStore.getAddressByRef(refId)) 84 shippingUsesUsaNotice.value = isCanadaCountry(deliveryAddress.value?.country) 85 86 // Address not ready yet â do not refresh shipping (ref=0 returns empty methods). 87 if (refId <= 0) { 88 return 89 } 90 91 pwireApp.dispatchPwireEvent("pwire:cart:shippingAddress:updated", { 92 shippingAddressRef: refId, 93 shippingCountry: normalizeShippingCountry(deliveryAddress.value?.country), 94 shippingRegion: deliveryAddress.value?.region, 95 }) 96 } 97 98 watchEffect(() => { 99 if (!isUserStoreLoaded.value) { 100 return 101 } 102 applyDeliveryAddressFromRef(selectedDeliveryAddressRef.value) 103 isLoaded.value = true 104 }) 105 106 watch( 107 () => selectedDeliveryAddressRef.value, 108 (newVal) => { 109 if (!isUserStoreLoaded.value) { 110 return 111 } 112 try { 113 applyDeliveryAddressFromRef(newVal) 114 isLoaded.value = true 115 } catch (error) { 116 console.error("Error updating delivery address:", error) 117 errorMessage.value = "Failed to update delivery address" 118 } 119 } 120 ) 121 122 // Uses the same dialog as editDeliveryAddress 123 const addDeliveryAddress = (ev) => { 124 editAddressID.value = null // New address 125 const editDeliveryDialog = 126 deliveryAddressViewRef.value.querySelector(".edit-address-dialog") 127 editDeliveryDialog.showModal() 128 } 129 130 const triggerAddShippingAddress = () => { 131 addressManagerRef.value?.addShippingAddress() 132 } 133 134 const openDeliveryAddressDialog = () => { 135 const deliveryAddressDialog = deliveryAddressDialogRef.value 136 if (deliveryAddressDialog) { 137 deliveryAddressDialog.showModal() // Corrected method call 138 } 139 return false 140 } 141 142 const closeDeliveryAddressDialog = (ev) => { 143 const deliveryAddressDialog = deliveryAddressDialogRef.value 144 if (deliveryAddressDialog) { 145 deliveryAddressDialog.close() 146 } 147 return false 148 } 149 150 // Expose to template and other options API hooks 151 return { 152 address, 153 addressManagerRef, 154 errorMessage, 155 deliveryAddress, 156 shippingAddresses, 157 selectedDeliveryAddressRef, 158 deliveryAddressViewRef, 159 deliveryAddressDialogRef, 160 deliveryDialogOpenLabel, 161 closeDeliveryAddressDialog, 162 openDeliveryAddressDialog, 163 editAddressID, 164 pwUserStore, 165 addDeliveryAddress, 166 inDialog, 167 isLoaded, 168 triggerAddShippingAddress, 169 shippingUsesUsaNotice, 170 } 171 }, 172}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.