diff --git a/frontend/components/cart/global/CartSummary.vue b/frontend/components/cart/global/CartSummary.vue index 46e3968..8ed8a79 100644 --- a/frontend/components/cart/global/CartSummary.vue +++ b/frontend/components/cart/global/CartSummary.vue @@ -1,6 +1,7 @@ diff --git a/frontend/components/global/Input.vue b/frontend/components/global/Input.vue index ebee80b..c766fc7 100644 --- a/frontend/components/global/Input.vue +++ b/frontend/components/global/Input.vue @@ -15,7 +15,7 @@ const props = withDefaults(defineProps(), { disabled: false, placeholder: "وارد نشده", }); -const { variant, error, modelValue } = toRefs(props); +const { variant, error, modelValue, disabled } = toRefs(props); // emits @@ -38,6 +38,7 @@ const classes = computed(() => { { "input-solid": variant.value === "solid", "input-outlined": variant.value === "outlined", + "pointer-events-none opacity-80 text-slate-500": disabled.value, "input-effects": !error.value, [variant.value === "solid" ? "input-solid-error" diff --git a/frontend/composables/api/orders/useDeleteDiscountCode.ts b/frontend/composables/api/orders/useDeleteDiscountCode.ts new file mode 100644 index 0000000..7bf07b3 --- /dev/null +++ b/frontend/composables/api/orders/useDeleteDiscountCode.ts @@ -0,0 +1,25 @@ +// imports + +import { useMutation } from "@tanstack/vue-query"; +import { API_ENDPOINTS } from "~/constants"; + +const useDeleteDiscountCode = () => { + // state + + const { $axios: axios } = useNuxtApp(); + + // methods + + const handleDeleteDiscountCode = async () => { + const { data } = await axios.delete( + API_ENDPOINTS.orders.cart.delete_discount + ); + return data; + }; + + return useMutation({ + mutationFn: () => handleDeleteDiscountCode(), + }); +}; + +export default useDeleteDiscountCode; diff --git a/frontend/composables/global/usePwa.ts b/frontend/composables/global/usePwa.ts new file mode 100644 index 0000000..7b8fd55 --- /dev/null +++ b/frontend/composables/global/usePwa.ts @@ -0,0 +1,19 @@ +export const usePWA = () => { + const isInstalledAsPWA = ref(false); + + const checkPWAInstallation = () => { + const isStandalone = window.matchMedia( + "(display-mode: standalone)" + ).matches; + const isIOSPWA = (window.navigator as any).standalone; + isInstalledAsPWA.value = isStandalone || isIOSPWA; + }; + + onMounted(() => { + checkPWAInstallation(); + }); + + return { + isInstalledAsPWA, + }; +}; diff --git a/frontend/constants/index.ts b/frontend/constants/index.ts index 178d14b..25b2ed4 100644 --- a/frontend/constants/index.ts +++ b/frontend/constants/index.ts @@ -50,6 +50,7 @@ export const API_ENDPOINTS = { delete_all: "/order/cart/all", add_one: "/order/cart/item", add_discount: "/order/cart/discount", + delete_discount: "/order/cart/discount", }, }, }; diff --git a/frontend/plugins/pwaUpdate.client.ts b/frontend/plugins/pwaUpdate.client.ts index 4129f69..ac9ce3c 100644 --- a/frontend/plugins/pwaUpdate.client.ts +++ b/frontend/plugins/pwaUpdate.client.ts @@ -1,50 +1,39 @@ import { Workbox } from "workbox-window"; +import { usePWA } from "~/composables/global/usePwa"; export default defineNuxtPlugin(() => { const updateAvailable = ref(false); let wb: Workbox | null = null; - if ("serviceWorker" in navigator) { + const { isInstalledAsPWA } = usePWA(); + + if ("serviceWorker" in navigator && isInstalledAsPWA.value) { wb = new Workbox("/sw.js"); - const isStandalone = window.matchMedia( - "(display-mode: standalone)" - ).matches; - const isIOSPWA = (window.navigator as any).standalone; - const isInstalledAsPWA = isStandalone || isIOSPWA; - - // Listen for messages from the service worker - navigator.serviceWorker.addEventListener("message", (event) => { - if ( - event.data && - event.data.type === "VERSION_CHECK" - ) { - checkForUpdate(event.data.version); - } + wb.addEventListener("waiting", () => { + checkForUpdate(); }); - // Register the service worker and check if there's already a waiting one - wb.register().then((registration: any) => { - if (registration.waiting) { - checkForUpdate(); - } - }); + wb.register() + .then((registration: any) => { + if (registration.waiting) { + checkForUpdate(); + } + }) + .catch((error) => { + console.error("Service worker registration failed:", error); + }); } - // 🔹 Function to compare versions and show update modal if needed - const checkForUpdate = (newVersion?: string) => { - const currentVersion = localStorage.getItem("pwa_version"); - - if (newVersion && currentVersion !== newVersion) { - updateAvailable.value = true; - localStorage.setItem("pwa_version", newVersion); - } + const checkForUpdate = () => { + updateAvailable.value = true; }; - - // 🔹 Function to apply the update const handleUpdate = () => { - wb?.messageSW({ type: "SKIP_WAITING" }); - window.location.reload(); + if (wb) { + wb.messageSW({ type: "SKIP_WAITING" }).then(() => { + window.location.reload(); + }); + } }; return { diff --git a/frontend/types/global.d.ts b/frontend/types/global.d.ts index 637c56c..6362e85 100644 --- a/frontend/types/global.d.ts +++ b/frontend/types/global.d.ts @@ -71,7 +71,7 @@ declare global { discount: number; color: string; video: string | null; - cart_quantity : number; + cart_quantity: number; }; type Product = { @@ -215,6 +215,10 @@ declare global { discount_amount: string; final_price: string; }; + discount: number; + discount_amount: string; + price: string; + final_price: string; quantity: number; };