flowrix 1.0.1-beta.12 → 1.0.1-beta.120
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/module.d.mts +1 -6
- package/dist/module.json +1 -1
- package/dist/module.mjs +170 -30
- package/dist/runtime/composables/Blog/useBlogIndex.d.ts +2 -5
- package/dist/runtime/composables/Blog/useBlogSingle.js +2 -4
- package/dist/runtime/composables/Brand/brand.js +2 -0
- package/dist/runtime/composables/Cart/useCart.d.ts +40 -0
- package/dist/runtime/composables/Cart/useCart.js +10 -0
- package/dist/runtime/composables/Cart/useCartComponent.d.ts +1 -0
- package/dist/runtime/composables/Cart/useCartComponent.js +11 -0
- package/dist/runtime/composables/Cart/useCartDetail.d.ts +15 -5
- package/dist/runtime/composables/Cart/useCartDetail.js +3 -0
- package/dist/runtime/composables/Category/useCategoryIndex.d.ts +25 -32
- package/dist/runtime/composables/Category/useCategoryIndex.js +56 -44
- package/dist/runtime/composables/Checkout/PaymentMethods/useDirectDeposit.js +8 -0
- package/dist/runtime/composables/Checkout/PaymentMethods/useEway.js +16 -6
- package/dist/runtime/composables/Checkout/PaymentMethods/useFlowrixpay.d.ts +40 -1
- package/dist/runtime/composables/Checkout/PaymentMethods/useFlowrixpay.js +10 -2
- package/dist/runtime/composables/Checkout/PaymentMethods/useOpayo.d.ts +40 -1
- package/dist/runtime/composables/Checkout/PaymentMethods/useOpayo.js +10 -2
- package/dist/runtime/composables/Checkout/PaymentMethods/usePaymentMethods.js +3 -14
- package/dist/runtime/composables/Checkout/PaymentMethods/usePaypal.js +8 -0
- package/dist/runtime/composables/Checkout/PaymentMethods/useStripe.d.ts +2 -2
- package/dist/runtime/composables/Checkout/PaymentMethods/useStripe.js +8 -0
- package/dist/runtime/composables/Checkout/PaymentMethods/useZippay.js +8 -0
- package/dist/runtime/composables/Checkout/useCheckout.d.ts +85 -73
- package/dist/runtime/composables/Checkout/useCheckout.js +84 -53
- package/dist/runtime/composables/Checkout/useCheckoutBillingAddress.d.ts +43 -0
- package/dist/runtime/composables/Checkout/useCheckoutBillingAddress.js +84 -0
- package/dist/runtime/composables/Checkout/useCheckoutShippingAddress.d.ts +55 -0
- package/dist/runtime/composables/Checkout/useCheckoutShippingAddress.js +196 -0
- package/dist/runtime/composables/Checkout/useCreateAccount.d.ts +7 -7
- package/dist/runtime/composables/Checkout/useCreateAccount.js +3 -1
- package/dist/runtime/composables/Checkout/useDeliveryMethod.d.ts +2 -2
- package/dist/runtime/composables/Checkout/useDeliveryMethod.js +18 -11
- package/dist/runtime/composables/Customer/useBillingAddress.d.ts +112 -0
- package/dist/runtime/composables/Customer/useBillingAddress.js +93 -0
- package/dist/runtime/composables/Customer/useLogin.d.ts +9 -0
- package/dist/runtime/composables/Customer/useLogin.js +34 -0
- package/dist/runtime/composables/Customer/useOrders.d.ts +29 -0
- package/dist/runtime/composables/Customer/useOrders.js +56 -0
- package/dist/runtime/composables/Customer/usePasswordReset.d.ts +26 -0
- package/dist/runtime/composables/Customer/usePasswordReset.js +258 -0
- package/dist/runtime/composables/Customer/useProfile.d.ts +75 -0
- package/dist/runtime/composables/Customer/useProfile.js +106 -0
- package/dist/runtime/composables/Customer/useQuotations.d.ts +32 -0
- package/dist/runtime/composables/Customer/useQuotations.js +40 -0
- package/dist/runtime/composables/Customer/useRegister.d.ts +121 -13
- package/dist/runtime/composables/Customer/useRegister.js +310 -35
- package/dist/runtime/composables/Customer/useShippingAddress.d.ts +121 -0
- package/dist/runtime/composables/Customer/useShippingAddress.js +145 -0
- package/dist/runtime/composables/Customer/useUpdatePassword.d.ts +21 -0
- package/dist/runtime/composables/Customer/useUpdatePassword.js +130 -0
- package/dist/runtime/composables/Customer/useUserCards.d.ts +22 -0
- package/dist/runtime/composables/Customer/useUserCards.js +65 -0
- package/dist/runtime/composables/{useWishlists.d.ts → Customer/useWishlists.d.ts} +6 -19
- package/dist/runtime/composables/{useWishlists.js → Customer/useWishlists.js} +21 -29
- package/dist/runtime/composables/Extras/useCountry.d.ts +11 -6
- package/dist/runtime/composables/Extras/useCountry.js +5 -4
- package/dist/runtime/composables/Header/useHeader.d.ts +6 -20
- package/dist/runtime/composables/Header/useHeader.js +3 -2
- package/dist/runtime/composables/Product/CustomProduct/useCustomeScript.js +4 -5
- package/dist/runtime/composables/Product/CustomProduct/useSteps.d.ts +1 -1
- package/dist/runtime/composables/Product/useProductComponent.js +110 -0
- package/dist/runtime/composables/Product/useProductSlug.d.ts +8 -1
- package/dist/runtime/composables/Product/useQuickView.d.ts +8 -0
- package/dist/runtime/composables/Product/useQuickView.js +27 -0
- package/dist/runtime/composables/Product/useService.d.ts +1 -1
- package/dist/runtime/composables/Product/useService.js +0 -3
- package/dist/runtime/composables/Samples/useSamples.js +1 -1
- package/dist/runtime/composables/SideBar/Filters/useFilters.d.ts +2 -2
- package/dist/runtime/composables/SideBar/Filters/useSorting.d.ts +2 -2
- package/dist/runtime/composables/index.d.ts +18 -12
- package/dist/runtime/composables/index.js +18 -12
- package/dist/runtime/composables/useAddresses.js +6 -6
- package/dist/runtime/composables/useApp.d.ts +1 -0
- package/dist/runtime/composables/useApp.js +85 -0
- package/dist/runtime/composables/useCards.js +2 -2
- package/dist/runtime/composables/useDataLayer.js +1 -1
- package/dist/runtime/composables/useDotDigital.d.ts +3 -0
- package/dist/runtime/composables/useDotDigital.js +122 -0
- package/dist/runtime/composables/useLocation.d.ts +2 -12
- package/dist/runtime/composables/useMetaLayer.js +11 -11
- package/dist/runtime/composables/useQuotationCheckout.d.ts +78 -0
- package/dist/runtime/composables/useQuotationCheckout.js +137 -0
- package/dist/runtime/composables/useSubscriptions.d.ts +17 -10
- package/dist/runtime/composables/useSubscriptions.js +68 -33
- package/dist/runtime/composables/useTikTokDatalayer.js +7 -7
- package/dist/runtime/composables/useWebforms.d.ts +38 -9
- package/dist/runtime/composables/useWebforms.js +93 -60
- package/dist/runtime/middleware/flowrix.d.ts +5 -4
- package/dist/runtime/middleware/flowrix.js +40 -21
- package/dist/runtime/pages/404.d.vue.ts +3 -0
- package/dist/runtime/pages/404.vue +6 -0
- package/dist/runtime/pages/404.vue.d.ts +3 -0
- package/dist/runtime/pages/flowrix-default.d.vue.ts +3 -0
- package/dist/runtime/pages/flowrix-default.vue +43 -0
- package/dist/runtime/pages/flowrix-default.vue.d.ts +3 -0
- package/dist/runtime/plugin.d.ts +1 -1
- package/dist/runtime/plugins/router.d.ts +2 -0
- package/dist/runtime/plugins/router.js +11 -0
- package/dist/runtime/server/api/albums.d.ts +1 -0
- package/dist/runtime/server/api/albums.js +35 -7
- package/dist/runtime/server/api/auth/forgot.js +1 -2
- package/dist/runtime/server/api/auth/login.d.ts +7 -0
- package/dist/runtime/server/api/auth/login.js +4 -16
- package/dist/runtime/server/api/auth/logout.js +1 -2
- package/dist/runtime/server/api/auth/register.js +1 -2
- package/dist/runtime/server/api/auth/session.get.js +1 -3
- package/dist/runtime/server/api/auth/user/reset-password.js +1 -2
- package/dist/runtime/server/api/auth/user/session.js +1 -2
- package/dist/runtime/server/api/auth/user/verify-token.js +1 -2
- package/dist/runtime/server/api/banners.js +20 -15
- package/dist/runtime/server/api/brand/[...slug].js +55 -0
- package/dist/runtime/server/api/brand/index.d.ts +3 -0
- package/dist/runtime/server/api/brand/index.js +46 -0
- package/dist/runtime/server/api/cache/[...slug].delete.d.ts +4 -1
- package/dist/runtime/server/api/cache/[...slug].delete.js +4 -7
- package/dist/runtime/server/api/cache/clean.get.d.ts +5 -0
- package/dist/runtime/server/api/cache/clean.get.js +4 -7
- package/dist/runtime/server/api/cart/[slug]/add.d.ts +1 -1
- package/dist/runtime/server/api/cart/[slug]/add.js +11 -11
- package/dist/runtime/server/api/cart/[slug]/update.d.ts +1 -1
- package/dist/runtime/server/api/cart/[slug]/update.js +11 -11
- package/dist/runtime/server/api/{v2/[...slug].d.ts → cart/related.d.ts} +0 -1
- package/dist/runtime/server/api/cart/related.js +21 -0
- package/dist/runtime/server/api/cart/remove.d.ts +1 -1
- package/dist/runtime/server/api/cart/remove.js +10 -10
- package/dist/runtime/server/api/cart/service/[slug]/add.d.ts +1 -1
- package/dist/runtime/server/api/cart/service/[slug]/add.js +12 -12
- package/dist/runtime/server/api/catalog/brands.d.ts +3 -0
- package/dist/runtime/server/api/catalog/brands.js +52 -0
- package/dist/runtime/server/api/catalog/categories.js +28 -19
- package/dist/runtime/server/api/catalog/categoriesall.d.ts +3 -0
- package/dist/runtime/server/api/catalog/categoriesall.js +52 -0
- package/dist/runtime/server/api/catalog/featured.js +28 -17
- package/dist/runtime/server/api/catalog/posts.d.ts +3 -0
- package/dist/runtime/server/api/catalog/posts.js +52 -0
- package/dist/runtime/server/api/catalog/samples.js +28 -19
- package/dist/runtime/server/api/catalog/search.js +28 -19
- package/dist/runtime/server/api/category/[...slug].js +30 -20
- package/dist/runtime/server/api/check-404.d.ts +4 -0
- package/dist/runtime/server/api/check-404.js +8 -0
- package/dist/runtime/server/api/checkout/applyCoupon.d.ts +1 -1
- package/dist/runtime/server/api/checkout/applyCoupon.js +13 -13
- package/dist/runtime/server/api/checkout/configs.d.ts +1 -1
- package/dist/runtime/server/api/checkout/configs.js +11 -11
- package/dist/runtime/server/api/checkout/countries.d.ts +1 -1
- package/dist/runtime/server/api/checkout/countries.js +5 -9
- package/dist/runtime/server/api/checkout/paymentmethod.d.ts +1 -1
- package/dist/runtime/server/api/checkout/paymentmethod.js +16 -11
- package/dist/runtime/server/api/{blog/blog.d.ts → checkout/quotation/[slug].d.ts} +0 -1
- package/dist/runtime/server/api/checkout/quotation/[slug].js +20 -0
- package/dist/runtime/server/api/checkout/quotation/guest/[slug].d.ts +2 -0
- package/dist/runtime/server/api/checkout/quotation/guest/[slug].js +35 -0
- package/dist/runtime/server/api/checkout/quotation/guest/customer.d.ts +2 -0
- package/dist/runtime/server/api/checkout/quotation/guest/customer.js +20 -0
- package/dist/runtime/server/api/checkout/quotation/submit/[slug].d.ts +2 -0
- package/dist/runtime/server/api/checkout/quotation/submit/[slug].js +22 -0
- package/dist/runtime/server/api/checkvariables.d.ts +3 -0
- package/dist/runtime/server/api/checkvariables.js +35 -0
- package/dist/runtime/server/api/cmspost/[...slug].js +54 -0
- package/dist/runtime/server/api/cmspost/all.d.ts +3 -0
- package/dist/runtime/server/api/cmspost/all.js +52 -0
- package/dist/runtime/server/api/company/profile.d.ts +1 -1
- package/dist/runtime/server/api/company/profile.js +12 -7
- package/dist/runtime/server/api/contact-center/webforms/[id]/details.d.ts +1 -1
- package/dist/runtime/server/api/contact-center/webforms/[id]/details.js +50 -15
- package/dist/runtime/server/api/contact-center/webforms/create.d.ts +1 -1
- package/dist/runtime/server/api/contact-center/webforms/create.js +13 -9
- package/dist/runtime/server/api/countries.d.ts +2 -0
- package/dist/runtime/server/api/countries.js +44 -0
- package/dist/runtime/server/api/customer/address/add.js +1 -2
- package/dist/runtime/server/api/customer/address/delete.js +2 -3
- package/dist/runtime/server/api/customer/address/setshipping.js +1 -2
- package/dist/runtime/server/api/customer/address/update.js +1 -2
- package/dist/runtime/server/api/customer/cards/delete.js +2 -3
- package/dist/runtime/server/api/customer/cards/get.js +2 -3
- package/dist/runtime/server/api/customer/change-password.js +2 -3
- package/dist/runtime/server/api/customer/checkout.js +1 -2
- package/dist/runtime/server/api/customer/orders.js +2 -3
- package/dist/runtime/server/api/customer/profile/update.js +1 -2
- package/dist/runtime/server/api/customer/quotations.js +2 -3
- package/dist/runtime/server/api/customer/search.js +1 -2
- package/dist/runtime/server/api/customer/tax-invoice.js +1 -2
- package/dist/runtime/server/api/customer/wishlist/add.js +1 -2
- package/dist/runtime/server/api/customer/wishlist/createWishList.js +1 -2
- package/dist/runtime/server/api/customer/wishlist/deleteFromWishList.js +1 -2
- package/dist/runtime/server/api/customer/wishlist/deleteWishList.js +1 -2
- package/dist/runtime/server/api/customer/wishlist/get.js +2 -3
- package/dist/runtime/server/api/customer/wishlist/getWishListItems.js +1 -2
- package/dist/runtime/server/api/customer/wishlist/updateWishList.js +2 -3
- package/dist/runtime/server/api/featured.d.ts +3 -0
- package/dist/runtime/server/api/featured.js +52 -0
- package/dist/runtime/server/api/generate/robots.get.d.ts +2 -0
- package/dist/runtime/server/api/generate/robots.get.js +20 -0
- package/dist/runtime/server/api/generate/sitemap.get.d.ts +2 -0
- package/dist/runtime/server/api/generate/sitemap.get.js +32 -0
- package/dist/runtime/server/api/location.d.ts +1 -1
- package/dist/runtime/server/api/location.js +24 -12
- package/dist/runtime/server/api/nav/[id]/links.d.ts +1 -0
- package/dist/runtime/server/api/nav/[id]/links.js +46 -10
- package/dist/runtime/server/api/page/[...slug].js +54 -0
- package/dist/runtime/server/api/product/[...slug].js +28 -13
- package/dist/runtime/server/api/quickview/[slug].d.ts +2 -0
- package/dist/runtime/server/api/quickview/[slug].js +21 -0
- package/dist/runtime/server/api/reviews.d.ts +2 -0
- package/dist/runtime/server/api/reviews.js +23 -0
- package/dist/runtime/server/api/samples.d.ts +3 -0
- package/dist/runtime/server/api/samples.js +53 -0
- package/dist/runtime/server/api/search.d.ts +3 -0
- package/dist/runtime/server/api/search.js +53 -0
- package/dist/runtime/server/api/service/[slug].js +22 -16
- package/dist/runtime/server/api/service/availability.d.ts +1 -1
- package/dist/runtime/server/api/service/availability.js +14 -12
- package/dist/runtime/server/api/service/getall.d.ts +3 -0
- package/dist/runtime/server/api/service/getall.js +57 -0
- package/dist/runtime/server/api/shop.d.ts +3 -0
- package/dist/runtime/server/api/shop.js +53 -0
- package/dist/runtime/server/api/subscribe.d.ts +1 -1
- package/dist/runtime/server/api/subscribe.js +23 -14
- package/dist/runtime/server/api/v2/[...slug].get.d.ts +2 -0
- package/dist/runtime/server/api/v2/[...slug].get.js +32 -0
- package/dist/runtime/server/api/webform.d.ts +3 -0
- package/dist/runtime/server/api/webform.js +54 -0
- package/dist/runtime/server/tsconfig.json +3 -3
- package/dist/runtime/stores/Cart.d.ts +12 -0
- package/dist/runtime/stores/Cart.js +62 -17
- package/dist/runtime/stores/Checkout.d.ts +9 -15
- package/dist/runtime/stores/Checkout.js +24 -40
- package/dist/runtime/stores/Search.d.ts +1 -1
- package/dist/runtime/stores/Services.js +2 -2
- package/dist/runtime/stores/auth.d.ts +8 -11
- package/dist/runtime/stores/auth.js +385 -8
- package/dist/runtime/stores/countries.d.ts +1 -3
- package/dist/runtime/stores/countries.js +4 -8
- package/dist/runtime/stores/product/README.md +6 -6
- package/dist/runtime/stores/product/slug.d.ts +1 -17
- package/dist/runtime/stores/webforms.d.ts +24 -9
- package/dist/runtime/stores/webforms.js +105 -5
- package/dist/runtime/stores/wishlists.d.ts +114 -7
- package/dist/runtime/stores/wishlists.js +209 -15
- package/dist/runtime/utils/api.js +7 -13
- package/dist/runtime/utils/htmlCache.d.ts +2 -2
- package/dist/runtime/utils/htmlCache.js +23 -13
- package/dist/types.d.mts +6 -2
- package/package.json +15 -5
- package/dist/runtime/composables/Checkout/useBillingAddress.d.ts +0 -19
- package/dist/runtime/composables/Checkout/useBillingAddress.js +0 -82
- package/dist/runtime/composables/Checkout/useShippingAddress.d.ts +0 -9
- package/dist/runtime/composables/Checkout/useShippingAddress.js +0 -121
- package/dist/runtime/composables/useAuth.d.ts +0 -45
- package/dist/runtime/composables/useAuth.js +0 -180
- package/dist/runtime/composables/useCountries.d.ts +0 -12
- package/dist/runtime/composables/useCountries.js +0 -50
- package/dist/runtime/composables/useOrders.d.ts +0 -21
- package/dist/runtime/composables/useOrders.js +0 -82
- package/dist/runtime/composables/useQuotations.d.ts +0 -14
- package/dist/runtime/composables/useQuotations.js +0 -50
- package/dist/runtime/server/api/blog/[slug].js +0 -51
- package/dist/runtime/server/api/blog/blog.js +0 -17
- package/dist/runtime/server/api/brand/[slug].js +0 -58
- package/dist/runtime/server/api/page/[slug].js +0 -51
- package/dist/runtime/server/api/v2/[...slug].js +0 -9
- /package/dist/runtime/server/api/brand/{[slug].d.ts → [...slug].d.ts} +0 -0
- /package/dist/runtime/server/api/{blog/[slug].d.ts → cmspost/[...slug].d.ts} +0 -0
- /package/dist/runtime/server/api/page/{[slug].d.ts → [...slug].d.ts} +0 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { ref } from "vue";
|
|
2
|
+
import { useAuthStore } from "../../stores/auth.js";
|
|
3
|
+
export function useUpdatePassword() {
|
|
4
|
+
const authStore = useAuthStore();
|
|
5
|
+
const loading = ref(false);
|
|
6
|
+
const errorMessage = ref("");
|
|
7
|
+
const successMessage = ref("");
|
|
8
|
+
const form = ref({
|
|
9
|
+
currentPassword: "",
|
|
10
|
+
newPassword: "",
|
|
11
|
+
confirmPassword: ""
|
|
12
|
+
});
|
|
13
|
+
const clearMessages = () => {
|
|
14
|
+
errorMessage.value = "";
|
|
15
|
+
successMessage.value = "";
|
|
16
|
+
};
|
|
17
|
+
const resetForm = () => {
|
|
18
|
+
form.value = {
|
|
19
|
+
currentPassword: "",
|
|
20
|
+
newPassword: "",
|
|
21
|
+
confirmPassword: ""
|
|
22
|
+
};
|
|
23
|
+
clearMessages();
|
|
24
|
+
};
|
|
25
|
+
const formatApiError = (message) => {
|
|
26
|
+
if (typeof message === "string") {
|
|
27
|
+
return message;
|
|
28
|
+
}
|
|
29
|
+
if (typeof message === "object" && message !== null) {
|
|
30
|
+
const errors = [];
|
|
31
|
+
Object.entries(message).forEach(([field, fieldErrors]) => {
|
|
32
|
+
const fieldName = field.replace(/_/g, " ").replace(/\b\w/g, (l) => l.toUpperCase());
|
|
33
|
+
if (Array.isArray(fieldErrors)) {
|
|
34
|
+
fieldErrors.forEach((error) => {
|
|
35
|
+
errors.push(`${fieldName}: ${error}`);
|
|
36
|
+
});
|
|
37
|
+
} else {
|
|
38
|
+
errors.push(`${fieldName}: ${fieldErrors}`);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return errors.join("\n");
|
|
42
|
+
}
|
|
43
|
+
return "An error occurred";
|
|
44
|
+
};
|
|
45
|
+
const validateForm = () => {
|
|
46
|
+
clearMessages();
|
|
47
|
+
if (!form.value.currentPassword?.trim()) {
|
|
48
|
+
errorMessage.value = "Current password is required!";
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
if (!form.value.newPassword?.trim()) {
|
|
52
|
+
errorMessage.value = "New password is required!";
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (!form.value.confirmPassword?.trim()) {
|
|
56
|
+
errorMessage.value = "Please confirm your new password!";
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (form.value.newPassword !== form.value.confirmPassword) {
|
|
60
|
+
errorMessage.value = "New password and confirm password do not match!";
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
if (form.value.newPassword.length < 6) {
|
|
64
|
+
errorMessage.value = "New password must be at least 6 characters long!";
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
if (form.value.currentPassword === form.value.newPassword) {
|
|
68
|
+
errorMessage.value = "New password must be different from current password!";
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
};
|
|
73
|
+
const updatePassword = async () => {
|
|
74
|
+
if (!validateForm()) {
|
|
75
|
+
console.log("Validation failed:", errorMessage.value);
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
loading.value = true;
|
|
79
|
+
clearMessages();
|
|
80
|
+
try {
|
|
81
|
+
const requestBody = {
|
|
82
|
+
current_password: form.value.currentPassword.trim(),
|
|
83
|
+
password: form.value.newPassword.trim(),
|
|
84
|
+
password_confirmation: form.value.confirmPassword.trim()
|
|
85
|
+
};
|
|
86
|
+
const response = await authStore.changePassword(requestBody);
|
|
87
|
+
if (!response) {
|
|
88
|
+
console.log("No response received");
|
|
89
|
+
errorMessage.value = "No response received from server. Please try again.";
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
if (response.status === "Success") {
|
|
93
|
+
successMessage.value = response.message || "Password updated successfully!";
|
|
94
|
+
setTimeout(() => {
|
|
95
|
+
resetForm();
|
|
96
|
+
}, 7e3);
|
|
97
|
+
setTimeout(() => {
|
|
98
|
+
successMessage.value = "";
|
|
99
|
+
}, 2e3);
|
|
100
|
+
return true;
|
|
101
|
+
} else if (response.status === "Error") {
|
|
102
|
+
console.log("Error response:", response.message);
|
|
103
|
+
errorMessage.value = formatApiError(response.message);
|
|
104
|
+
return false;
|
|
105
|
+
} else {
|
|
106
|
+
console.log("Unexpected response format:", response);
|
|
107
|
+
errorMessage.value = "Unexpected response from server. Please try again.";
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
} catch (err) {
|
|
111
|
+
console.error("Caught error:", err);
|
|
112
|
+
errorMessage.value = "An unexpected error occurred. Please try again.";
|
|
113
|
+
return false;
|
|
114
|
+
} finally {
|
|
115
|
+
loading.value = false;
|
|
116
|
+
console.log("Final state - Error:", errorMessage.value, "Success:", successMessage.value);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
return {
|
|
120
|
+
// State
|
|
121
|
+
form,
|
|
122
|
+
loading,
|
|
123
|
+
errorMessage,
|
|
124
|
+
successMessage,
|
|
125
|
+
// Methods
|
|
126
|
+
updatePassword,
|
|
127
|
+
clearMessages,
|
|
128
|
+
resetForm
|
|
129
|
+
};
|
|
130
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface Card {
|
|
2
|
+
id: string;
|
|
3
|
+
holder_name: string;
|
|
4
|
+
last_four_digits: string;
|
|
5
|
+
[key: string]: any;
|
|
6
|
+
}
|
|
7
|
+
export declare function useUserCards(): {
|
|
8
|
+
cards: import("vue").ComputedRef<{
|
|
9
|
+
[x: string]: any;
|
|
10
|
+
id: string;
|
|
11
|
+
holder_name: string;
|
|
12
|
+
last_four_digits: string;
|
|
13
|
+
}[]>;
|
|
14
|
+
loading: import("vue").Ref<boolean, boolean>;
|
|
15
|
+
deletingCardId: import("vue").Ref<string | null, string | null>;
|
|
16
|
+
errorMessage: import("vue").Ref<string, string>;
|
|
17
|
+
successMessage: import("vue").Ref<string, string>;
|
|
18
|
+
hasCards: import("vue").ComputedRef<boolean>;
|
|
19
|
+
fetchCards: () => Promise<void>;
|
|
20
|
+
deleteCard: (cardId: string) => Promise<boolean>;
|
|
21
|
+
clearMessages: () => void;
|
|
22
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { ref, computed } from "vue";
|
|
2
|
+
import { useAuthStore } from "../../stores/auth.js";
|
|
3
|
+
export function useUserCards() {
|
|
4
|
+
const authStore = useAuthStore();
|
|
5
|
+
const cards = ref([]);
|
|
6
|
+
const loading = ref(false);
|
|
7
|
+
const deletingCardId = ref(null);
|
|
8
|
+
const errorMessage = ref("");
|
|
9
|
+
const successMessage = ref("");
|
|
10
|
+
const cardsData = computed(() => cards.value || []);
|
|
11
|
+
const hasCards = computed(() => cards.value && cards.value.length > 0);
|
|
12
|
+
const clearMessages = () => {
|
|
13
|
+
errorMessage.value = "";
|
|
14
|
+
successMessage.value = "";
|
|
15
|
+
};
|
|
16
|
+
const fetchCards = async () => {
|
|
17
|
+
loading.value = true;
|
|
18
|
+
clearMessages();
|
|
19
|
+
try {
|
|
20
|
+
const cardsData2 = await authStore.fetchUserCards();
|
|
21
|
+
cards.value = Array.isArray(cardsData2) ? cardsData2 : [];
|
|
22
|
+
} catch (error) {
|
|
23
|
+
console.error("Failed to fetch cards:", error);
|
|
24
|
+
cards.value = [];
|
|
25
|
+
errorMessage.value = "Failed to load cards. Please try again.";
|
|
26
|
+
} finally {
|
|
27
|
+
loading.value = false;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const deleteCard = async (cardId) => {
|
|
31
|
+
deletingCardId.value = cardId;
|
|
32
|
+
clearMessages();
|
|
33
|
+
try {
|
|
34
|
+
const response = await authStore.deleteCard(cardId);
|
|
35
|
+
if (response.status === "Success") {
|
|
36
|
+
successMessage.value = response.message || "Card deleted successfully!";
|
|
37
|
+
cards.value = cards.value.filter((card) => card.id !== cardId);
|
|
38
|
+
return true;
|
|
39
|
+
} else {
|
|
40
|
+
errorMessage.value = response.message || "Failed to delete card. Please try again.";
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.error("Delete card error:", error);
|
|
45
|
+
errorMessage.value = error.message || "Failed to delete card. Please try again.";
|
|
46
|
+
return false;
|
|
47
|
+
} finally {
|
|
48
|
+
deletingCardId.value = null;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
return {
|
|
52
|
+
// State
|
|
53
|
+
cards: cardsData,
|
|
54
|
+
loading,
|
|
55
|
+
deletingCardId,
|
|
56
|
+
errorMessage,
|
|
57
|
+
successMessage,
|
|
58
|
+
// Computed
|
|
59
|
+
hasCards,
|
|
60
|
+
// Methods
|
|
61
|
+
fetchCards,
|
|
62
|
+
deleteCard,
|
|
63
|
+
clearMessages
|
|
64
|
+
};
|
|
65
|
+
}
|
|
@@ -1,21 +1,6 @@
|
|
|
1
|
-
import { type Wishlist, type WishlistProduct } from '
|
|
2
|
-
export interface ApiResponse<T> {
|
|
3
|
-
status: string;
|
|
4
|
-
message: string | Record<string, string[]> | null;
|
|
5
|
-
data: T | null;
|
|
6
|
-
}
|
|
7
|
-
export interface CreateWishlistData {
|
|
8
|
-
title: string;
|
|
9
|
-
default: boolean;
|
|
10
|
-
}
|
|
11
|
-
export interface UpdateWishlistData {
|
|
12
|
-
title: string;
|
|
13
|
-
default: boolean;
|
|
14
|
-
}
|
|
15
|
-
export interface AddToWishlistData {
|
|
16
|
-
}
|
|
1
|
+
import { type Wishlist, type WishlistProduct, type CreateWishlistData, type UpdateWishlistData, type AddToWishlistData, type ApiResponse } from '../../stores/wishlists.js';
|
|
17
2
|
export declare function useWishlists(): {
|
|
18
|
-
fetchWishlists: () => Promise<ApiResponse<Wishlist[]>>;
|
|
3
|
+
fetchWishlists: (force?: boolean) => Promise<ApiResponse<Wishlist[]>>;
|
|
19
4
|
fetchWishlistProducts: (listId: number) => Promise<ApiResponse<{
|
|
20
5
|
id: number;
|
|
21
6
|
title: string;
|
|
@@ -30,9 +15,11 @@ export declare function useWishlists(): {
|
|
|
30
15
|
deleteWishlist: (id: number) => Promise<ApiResponse<void>>;
|
|
31
16
|
wishlists: import("vue").ComputedRef<{
|
|
32
17
|
id: number;
|
|
33
|
-
|
|
18
|
+
title: string;
|
|
19
|
+
default: boolean;
|
|
20
|
+
created_at: string;
|
|
34
21
|
}[]>;
|
|
35
|
-
wishlistProducts:
|
|
22
|
+
wishlistProducts: (listId: number) => WishlistProduct[];
|
|
36
23
|
loading: import("vue").ComputedRef<boolean>;
|
|
37
24
|
error: import("vue").ComputedRef<string | null>;
|
|
38
25
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { computed } from "vue";
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import {
|
|
3
|
+
useWishlistsStore
|
|
4
|
+
} from "../../stores/wishlists.js";
|
|
4
5
|
function formatErrorMessage(message) {
|
|
5
6
|
if (!message) return "An error occurred";
|
|
6
7
|
if (typeof message === "string") {
|
|
@@ -18,14 +19,12 @@ function formatErrorMessage(message) {
|
|
|
18
19
|
}
|
|
19
20
|
export function useWishlists() {
|
|
20
21
|
const store = useWishlistsStore();
|
|
21
|
-
|
|
22
|
-
async function fetchWishlists() {
|
|
22
|
+
async function fetchWishlists(force) {
|
|
23
23
|
store.setLoading(true);
|
|
24
24
|
store.setError(null);
|
|
25
25
|
try {
|
|
26
|
-
const response = await
|
|
27
|
-
if (response.status === "Success"
|
|
28
|
-
store.setWishlists(response.data);
|
|
26
|
+
const response = await store.fetchWishlists(force || false);
|
|
27
|
+
if (response.status === "Success") {
|
|
29
28
|
return response;
|
|
30
29
|
} else {
|
|
31
30
|
const errorMessage = formatErrorMessage(response.message);
|
|
@@ -45,10 +44,8 @@ export function useWishlists() {
|
|
|
45
44
|
store.setLoading(true);
|
|
46
45
|
store.setError(null);
|
|
47
46
|
try {
|
|
48
|
-
const response = await
|
|
49
|
-
if (response.status === "Success"
|
|
50
|
-
const products = response.data.products || [];
|
|
51
|
-
store.setWishlistProducts(listId, products);
|
|
47
|
+
const response = await store.fetchWishlistProducts(listId);
|
|
48
|
+
if (response.status === "Success") {
|
|
52
49
|
return response;
|
|
53
50
|
} else {
|
|
54
51
|
const errorMessage = formatErrorMessage(response.message);
|
|
@@ -68,9 +65,8 @@ export function useWishlists() {
|
|
|
68
65
|
store.setLoading(true);
|
|
69
66
|
store.setError(null);
|
|
70
67
|
try {
|
|
71
|
-
const response = await
|
|
72
|
-
if (response.status === "Success"
|
|
73
|
-
store.addWishlist(response.data);
|
|
68
|
+
const response = await store.createWishlist(data);
|
|
69
|
+
if (response.status === "Success") {
|
|
74
70
|
return response;
|
|
75
71
|
} else {
|
|
76
72
|
const errorMessage = formatErrorMessage(response.message);
|
|
@@ -90,9 +86,8 @@ export function useWishlists() {
|
|
|
90
86
|
store.setLoading(true);
|
|
91
87
|
store.setError(null);
|
|
92
88
|
try {
|
|
93
|
-
const response = await
|
|
94
|
-
if (response.status === "Success"
|
|
95
|
-
store.addWishlistProduct(listId, response.data);
|
|
89
|
+
const response = await store.addToWishlist(listId, productSlug, data);
|
|
90
|
+
if (response.status === "Success") {
|
|
96
91
|
return response;
|
|
97
92
|
} else {
|
|
98
93
|
const errorMessage = formatErrorMessage(response.message);
|
|
@@ -112,9 +107,8 @@ export function useWishlists() {
|
|
|
112
107
|
store.setLoading(true);
|
|
113
108
|
store.setError(null);
|
|
114
109
|
try {
|
|
115
|
-
const response = await
|
|
110
|
+
const response = await store.removeFromWishlist(listId, productSlug);
|
|
116
111
|
if (response.status === "Success") {
|
|
117
|
-
store.removeWishlistProduct(listId, productSlug);
|
|
118
112
|
return response;
|
|
119
113
|
} else {
|
|
120
114
|
const errorMessage = formatErrorMessage(response.message);
|
|
@@ -134,9 +128,8 @@ export function useWishlists() {
|
|
|
134
128
|
store.setLoading(true);
|
|
135
129
|
store.setError(null);
|
|
136
130
|
try {
|
|
137
|
-
const response = await
|
|
138
|
-
if (response.status === "Success"
|
|
139
|
-
store.updateWishlist(response.data);
|
|
131
|
+
const response = await store.updateWishlist(id, data);
|
|
132
|
+
if (response.status === "Success") {
|
|
140
133
|
return response;
|
|
141
134
|
} else {
|
|
142
135
|
const errorMessage = formatErrorMessage(response.message);
|
|
@@ -156,10 +149,8 @@ export function useWishlists() {
|
|
|
156
149
|
store.setLoading(true);
|
|
157
150
|
store.setError(null);
|
|
158
151
|
try {
|
|
159
|
-
const response = await
|
|
152
|
+
const response = await store.deleteWishlist(id);
|
|
160
153
|
if (response.status === "Success") {
|
|
161
|
-
store.removeWishlist(id);
|
|
162
|
-
store.clearWishlistProducts(id);
|
|
163
154
|
return response;
|
|
164
155
|
} else {
|
|
165
156
|
const errorMessage = formatErrorMessage(response.message);
|
|
@@ -183,9 +174,10 @@ export function useWishlists() {
|
|
|
183
174
|
removeFromWishlist,
|
|
184
175
|
updateWishlist,
|
|
185
176
|
deleteWishlist,
|
|
186
|
-
wishlists: computed(() => store.
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
177
|
+
wishlists: computed(() => store.getWishlists),
|
|
178
|
+
// Fixed: Remove extra computed wrapper - direct getter for reactivity
|
|
179
|
+
wishlistProducts: (listId) => store.getWishlistProducts(listId),
|
|
180
|
+
loading: computed(() => store.isLoading),
|
|
181
|
+
error: computed(() => store.getError)
|
|
190
182
|
};
|
|
191
183
|
}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
interface Country {
|
|
2
|
+
id: number;
|
|
3
|
+
name: string;
|
|
4
|
+
}
|
|
5
|
+
interface UseCountryReturn {
|
|
6
|
+
data: Ref<Country[] | null>;
|
|
7
|
+
error: Ref<Error | null>;
|
|
8
|
+
refresh: () => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare const useCountry: () => UseCountryReturn;
|
|
11
|
+
export {};
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { useFetch } from "#imports";
|
|
1
2
|
export const useCountry = () => {
|
|
2
|
-
const { data, error, refresh
|
|
3
|
-
server: true
|
|
3
|
+
const { data, error, refresh } = useFetch("/api/checkout/countries", {
|
|
4
|
+
server: true,
|
|
5
|
+
key: "countries"
|
|
4
6
|
});
|
|
5
7
|
return {
|
|
6
8
|
data,
|
|
7
9
|
error,
|
|
8
|
-
refresh
|
|
9
|
-
execute
|
|
10
|
+
refresh
|
|
10
11
|
};
|
|
11
12
|
};
|
|
@@ -1,28 +1,14 @@
|
|
|
1
1
|
export default function (): {
|
|
2
|
-
NavMenu:
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
userData: {};
|
|
8
|
-
menuData: import("vue").ComputedRef<{
|
|
9
|
-
location: string;
|
|
10
|
-
items: {
|
|
11
|
-
title: string;
|
|
12
|
-
url: string;
|
|
13
|
-
sortorder: number;
|
|
14
|
-
children?: /*elided*/ any[] | undefined;
|
|
15
|
-
}[];
|
|
16
|
-
} | undefined>;
|
|
2
|
+
NavMenu: any;
|
|
3
|
+
companyProfile: import("vue").ComputedRef<any>;
|
|
4
|
+
cartStore: any;
|
|
5
|
+
userData: any;
|
|
6
|
+
menuData: import("vue").ComputedRef<any>;
|
|
17
7
|
mobile_menu: import("vue").Ref<boolean, boolean>;
|
|
18
8
|
MainMenu: any;
|
|
19
9
|
wordpressUrl: any;
|
|
20
10
|
OpenMobileMenu: () => void;
|
|
21
|
-
useSearch:
|
|
22
|
-
data: any[];
|
|
23
|
-
}, {}, {
|
|
24
|
-
fetchSearchData(query: string): Promise<any[]>;
|
|
25
|
-
}>;
|
|
11
|
+
useSearch: any;
|
|
26
12
|
getSearchData: (value: string) => void;
|
|
27
13
|
handleSeachInput: (searchValue: string) => void;
|
|
28
14
|
};
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { defineAsyncComponent, ref, computed } from "vue";
|
|
2
|
-
import { useNavMenu, useCompanyProfile,
|
|
2
|
+
import { useNavMenu, useCompanyProfile, useCartStore, useSearchStore } from "#imports";
|
|
3
|
+
import { useAuthStore } from "../../stores/auth.js";
|
|
3
4
|
export default function() {
|
|
4
5
|
const wordpressUrl = import.meta.env.VITE_APP_WORDPRESS_URL;
|
|
5
6
|
const NavMenu = useNavMenu();
|
|
6
7
|
const CompanyProfile = useCompanyProfile();
|
|
7
|
-
const { user } =
|
|
8
|
+
const { user } = useAuthStore();
|
|
8
9
|
const cartStore = useCartStore();
|
|
9
10
|
const useSearch = useSearchStore();
|
|
10
11
|
const companyProfile = computed(() => CompanyProfile.profile);
|
|
@@ -11,7 +11,6 @@ export const useCustomScript = defineStore("CustomScript", {
|
|
|
11
11
|
UNIT_RELATIVE: null,
|
|
12
12
|
DISCOUNTS: null,
|
|
13
13
|
measurementUnit: null,
|
|
14
|
-
promotionSettings: null,
|
|
15
14
|
B2BTYPE: null,
|
|
16
15
|
USEBASEPRICE: null,
|
|
17
16
|
BASEPRICE: null,
|
|
@@ -240,7 +239,7 @@ export const useCustomScript = defineStore("CustomScript", {
|
|
|
240
239
|
showValue(h_aid, h_vid) {
|
|
241
240
|
const element = document.querySelector(`${this.attributeClass + h_aid} [data-value="${h_vid}"]`);
|
|
242
241
|
if (element) {
|
|
243
|
-
element.parentElement.style.display = "
|
|
242
|
+
element.parentElement.style.display = "";
|
|
244
243
|
element.removeAttribute("disabled");
|
|
245
244
|
element.style.display = "";
|
|
246
245
|
}
|
|
@@ -316,10 +315,10 @@ export const useCustomScript = defineStore("CustomScript", {
|
|
|
316
315
|
markSelected(h_aid, h_vid) {
|
|
317
316
|
const element = document.querySelector(`${this.attributeClass}${h_aid} [data-value="${h_vid}"]`);
|
|
318
317
|
if (element) {
|
|
319
|
-
element.parentElement.style.display = "
|
|
318
|
+
element.parentElement.style.display = "";
|
|
320
319
|
element.setAttribute("selected", true);
|
|
321
320
|
element.checked = true;
|
|
322
|
-
element.style.display = "
|
|
321
|
+
element.style.display = "";
|
|
323
322
|
element.classList.add("active");
|
|
324
323
|
if (element.getAttribute("customselect") == "true") {
|
|
325
324
|
element.dispatchEvent(new Event("change"));
|
|
@@ -336,7 +335,7 @@ export const useCustomScript = defineStore("CustomScript", {
|
|
|
336
335
|
if (dataValueElement) {
|
|
337
336
|
dataValueElement.setAttribute("selected", true);
|
|
338
337
|
dataValueElement.checked = true;
|
|
339
|
-
dataValueElement.style.display = "
|
|
338
|
+
dataValueElement.style.display = "";
|
|
340
339
|
dataValueElement.classList.add("active");
|
|
341
340
|
}
|
|
342
341
|
if (value == 0 || value == "0") {
|
|
@@ -66,7 +66,7 @@ export default function (product: any, template?: string): {
|
|
|
66
66
|
}>;
|
|
67
67
|
activeStep: import("vue").Ref<number, number>;
|
|
68
68
|
NextStep: (id: number) => false | undefined;
|
|
69
|
-
sortedGroups: (groups: any) =>
|
|
69
|
+
sortedGroups: (groups: any) => never[];
|
|
70
70
|
scrollToPosition: () => void;
|
|
71
71
|
SingleStep: import("vue").Raw<object>;
|
|
72
72
|
AddToCart: import("vue").Raw<object>;
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { defineAsyncComponent } from "vue";
|
|
2
|
+
import { useHead, useRequestEvent, useRoute } from "#imports";
|
|
3
|
+
import { getRequestURL } from "h3";
|
|
4
|
+
import { GTM_view_item } from "../useDataLayer.js";
|
|
5
|
+
import { META_view_item } from "../useMetaLayer.js";
|
|
6
|
+
import { TikTok_view_item } from "../useTikTokDatalayer.js";
|
|
7
|
+
import { useCompanyProfile } from "../../stores/useCompanyProfile.js";
|
|
2
8
|
export function useProductComponent(product) {
|
|
9
|
+
const route = useRoute();
|
|
3
10
|
const templateName = "Template-" + product.template;
|
|
11
|
+
const companyProfile = useCompanyProfile();
|
|
4
12
|
const components = import.meta.glob(
|
|
5
13
|
"~/components/Product/Template*/index.vue"
|
|
6
14
|
);
|
|
@@ -15,6 +23,108 @@ export function useProductComponent(product) {
|
|
|
15
23
|
}
|
|
16
24
|
}
|
|
17
25
|
});
|
|
26
|
+
let websiteurl = "";
|
|
27
|
+
if (process.server) {
|
|
28
|
+
const event = useRequestEvent();
|
|
29
|
+
websiteurl = getRequestURL(event).origin;
|
|
30
|
+
} else {
|
|
31
|
+
websiteurl = window.location.origin;
|
|
32
|
+
}
|
|
33
|
+
const ifPromotioned = () => {
|
|
34
|
+
if (product.rpfloat > product.pricefloat) {
|
|
35
|
+
return {
|
|
36
|
+
"priceSpecification": [
|
|
37
|
+
{
|
|
38
|
+
"@type": "UnitPriceSpecification",
|
|
39
|
+
"price": product.rpfloat,
|
|
40
|
+
"priceCurrency": companyProfile.profile?.data?.currencyCode || "",
|
|
41
|
+
"priceComponentType": "https://schema.org/ListPrice"
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return [];
|
|
47
|
+
};
|
|
48
|
+
if (product?.faqs?.length) {
|
|
49
|
+
const faqSchema = {
|
|
50
|
+
"@context": "https://schema.org",
|
|
51
|
+
"@type": "FAQPage",
|
|
52
|
+
"name": `${product.name} - FAQs`,
|
|
53
|
+
"mainEntity": product?.faqs.map((faq) => ({
|
|
54
|
+
"@type": "Question",
|
|
55
|
+
"name": faq.question,
|
|
56
|
+
"acceptedAnswer": {
|
|
57
|
+
"@type": "Answer",
|
|
58
|
+
"text": faq.answer.replace(/<\/?p>/g, "")
|
|
59
|
+
// remove <p> tags
|
|
60
|
+
}
|
|
61
|
+
}))
|
|
62
|
+
};
|
|
63
|
+
useHead({
|
|
64
|
+
script: [
|
|
65
|
+
{
|
|
66
|
+
type: "application/ld+json",
|
|
67
|
+
id: "faq-schema",
|
|
68
|
+
children: JSON.stringify(faqSchema)
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
useHead({
|
|
74
|
+
title: product?.meta_title || product?.name || "",
|
|
75
|
+
meta: [
|
|
76
|
+
{
|
|
77
|
+
name: "robots",
|
|
78
|
+
content: product?.robots || ""
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "description",
|
|
82
|
+
content: product?.meta_description || ""
|
|
83
|
+
},
|
|
84
|
+
{ property: "og:title", content: product?.meta_title || product?.name || "" },
|
|
85
|
+
{ property: "og:description", content: product?.meta_description },
|
|
86
|
+
{ property: "og:type", content: "website" },
|
|
87
|
+
{ property: "og:url", content: `${websiteurl}${route.path}` },
|
|
88
|
+
{ property: "og:image", content: product?.image },
|
|
89
|
+
// Optional but recommended
|
|
90
|
+
{ name: "twitter:card", content: "summary_large_image" },
|
|
91
|
+
{ name: "twitter:title", content: product?.meta_title || product?.name || "" },
|
|
92
|
+
{ name: "twitter:description", content: product?.meta_description },
|
|
93
|
+
{ name: "twitter:image", content: product?.image }
|
|
94
|
+
],
|
|
95
|
+
script: [
|
|
96
|
+
{
|
|
97
|
+
type: "application/ld+json",
|
|
98
|
+
id: "product-schema",
|
|
99
|
+
children: JSON.stringify({
|
|
100
|
+
"@context": "https://schema.org/",
|
|
101
|
+
"@type": "Product",
|
|
102
|
+
"name": product?.name || "",
|
|
103
|
+
"image": [
|
|
104
|
+
product?.image || ""
|
|
105
|
+
],
|
|
106
|
+
"description": product?.description || "",
|
|
107
|
+
"sku": product?.sku || "",
|
|
108
|
+
"brand": {
|
|
109
|
+
"@type": "Brand",
|
|
110
|
+
"name": product?.brand || ""
|
|
111
|
+
},
|
|
112
|
+
"offers": {
|
|
113
|
+
"@type": "Offer",
|
|
114
|
+
"url": `${websiteurl}${route.path}`,
|
|
115
|
+
"priceCurrency": companyProfile.profile?.data?.currencyCode || "",
|
|
116
|
+
"price": product?.pricefloat || 0,
|
|
117
|
+
"availability": "https://schema.org/InStock",
|
|
118
|
+
"itemCondition": "https://schema.org/NewCondition",
|
|
119
|
+
...ifPromotioned()
|
|
120
|
+
}
|
|
121
|
+
})
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
});
|
|
125
|
+
GTM_view_item(product, product?.rrpfloat, product?.rpfloat);
|
|
126
|
+
META_view_item(product, product?.rrpfloat, product?.rpfloat);
|
|
127
|
+
TikTok_view_item(product, product?.rrpfloat, product?.rpfloat);
|
|
18
128
|
return {
|
|
19
129
|
Template
|
|
20
130
|
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useFetch } from "#imports";
|
|
2
|
+
import { readonly } from "vue";
|
|
3
|
+
export const useQuickView = (slug) => {
|
|
4
|
+
const { data, error, refresh, execute, pending } = useFetch(
|
|
5
|
+
`/api/quickview/${slug}`,
|
|
6
|
+
{
|
|
7
|
+
method: "POST",
|
|
8
|
+
body: { slug },
|
|
9
|
+
lazy: true,
|
|
10
|
+
server: false,
|
|
11
|
+
default: () => null
|
|
12
|
+
}
|
|
13
|
+
);
|
|
14
|
+
return {
|
|
15
|
+
data: readonly(data),
|
|
16
|
+
error: readonly(error),
|
|
17
|
+
refresh,
|
|
18
|
+
execute,
|
|
19
|
+
pending: readonly(pending)
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export const useSendQuickValues = async (attributes, slug) => {
|
|
23
|
+
return await $fetch(`/api/quickview/${slug}`, {
|
|
24
|
+
method: "POST",
|
|
25
|
+
body: attributes
|
|
26
|
+
});
|
|
27
|
+
};
|