PageSourceSearch

https://pharmaserve.com/wp-content/themes/pharmaserve/pharmacywire…?ver=5.8.1.redirect-cart.ov20260724d

js pharmaserve.com collected 2026-09-26 14:29:51 UTC 4,974 bytes, 172 lines download raw bytes

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.