diff --git a/src/app/[name]/(Dialogs)/order/checkout/[id]/components/SummarySection.tsx b/src/app/[name]/(Dialogs)/order/checkout/[id]/components/SummarySection.tsx index 1c5e8eb..429954f 100644 --- a/src/app/[name]/(Dialogs)/order/checkout/[id]/components/SummarySection.tsx +++ b/src/app/[name]/(Dialogs)/order/checkout/[id]/components/SummarySection.tsx @@ -25,8 +25,8 @@ type SummarySectionProps = { export const SummarySection = ({ cartModal, onToggleCartModal, deliveryType }: SummarySectionProps) => { const { t } = useTranslation('parallels', { keyPrefix: 'OrderDetail' }); - const { isSelectedAddress, isSelectedShipment, isSelectedPayment, deliveryType: storeDeliveryType, paymentType, selectedAddressId, tableNumber, carAddress } = useCheckoutStore(); - const { description } = useCartStore(); + const { isSelectedAddress, isSelectedShipment, isSelectedPayment, deliveryType: storeDeliveryType, paymentType, selectedAddressId, tableNumber, carAddress, clear } = useCheckoutStore(); + const { description, reset: resetCart } = useCartStore(); const { mutate: createOrder } = useCreateOrder(); const { mutate: saveAllMethod } = useSaveAllMethod() const params = useParams(); @@ -89,7 +89,7 @@ export const SummarySection = ({ cartModal, onToggleCartModal, deliveryType }: S return; } - if (!isDeliveryCar && !selectedAddressId) { + if (!isDeliveryCar && !isDineIn && !selectedAddressId) { toast('لطفا آدرس را انتخاب کنید', 'error'); return; } @@ -128,11 +128,13 @@ export const SummarySection = ({ cartModal, onToggleCartModal, deliveryType }: S } createOrder(orderData, { onSuccess: (data) => { + clear(); + resetCart(); if (data?.data?.paymentUrl) { window.location.href = data?.data?.paymentUrl; toast('در حال ریدایرکت به صفحه پرداخت...', 'success'); } else { - window.location.href = `/${name}/verify/${data?.data?.order?.id}`; + window.location.href = `/${name}/order/track/${data?.data?.order?.id}`; toast('سفارش با موفقیت ثبت شد', 'success'); } }, diff --git a/src/app/[name]/(Dialogs)/order/checkout/store/Store.ts b/src/app/[name]/(Dialogs)/order/checkout/store/Store.ts index dd2b768..c2f0300 100644 --- a/src/app/[name]/(Dialogs)/order/checkout/store/Store.ts +++ b/src/app/[name]/(Dialogs)/order/checkout/store/Store.ts @@ -2,25 +2,44 @@ import { create } from "zustand"; import { createJSONStorage, persist } from "zustand/middleware"; import { CheckoutStoreType } from "../types/Types"; +const initialState = { + isSelectedAddress: false, + selectedAddressId: null, + isSelectedPayment: false, + isSelectedShipment: false, + deliveryType: "0", + paymentType: "0", + tableNumber: 0, + carAddress: null as { + carModel: string; + carColor: string; + plateNumber: string; + } | null, + lastUpdated: null as number | null, +}; + export const useCheckoutStore = create()( persist( (set) => ({ - isSelectedAddress: false, - setIsSelectedAddress: (value) => set({ isSelectedAddress: value }), - selectedAddressId: null, - setSelectedAddressId: (value) => set({ selectedAddressId: value }), - isSelectedPayment: false, - setIsSelectedPayment: (value) => set({ isSelectedPayment: value }), - isSelectedShipment: false, - setIsSelectedShipment: (value) => set({ isSelectedShipment: value }), - deliveryType: "0", - setDeliveryType: (value) => set({ deliveryType: value }), - paymentType: "0", - setPaymentType: (value) => set({ paymentType: value }), - tableNumber: 0, - setTableNumber: (value) => set({ tableNumber: value }), - carAddress: null, - setCarAddress: (value) => set({ carAddress: value }), + ...initialState, + setIsSelectedAddress: (value) => + set({ isSelectedAddress: value, lastUpdated: Date.now() }), + setSelectedAddressId: (value) => + set({ selectedAddressId: value, lastUpdated: Date.now() }), + setIsSelectedPayment: (value) => + set({ isSelectedPayment: value, lastUpdated: Date.now() }), + setIsSelectedShipment: (value) => + set({ isSelectedShipment: value, lastUpdated: Date.now() }), + setDeliveryType: (value) => + set({ deliveryType: value, lastUpdated: Date.now() }), + setPaymentType: (value) => + set({ paymentType: value, lastUpdated: Date.now() }), + setTableNumber: (value) => + set({ tableNumber: value, lastUpdated: Date.now() }), + setCarAddress: (value) => + set({ carAddress: value, lastUpdated: Date.now() }), + setLastUpdated: (value) => set({ lastUpdated: value }), + clear: () => set({ ...initialState }), }), { name: "checkout-storage", @@ -28,3 +47,34 @@ export const useCheckoutStore = create()( } ) ); + +// چک خودکار برای پاک کردن بعد از 2 ساعت +if (typeof window !== "undefined") { + const TWO_HOURS = 2 * 60 * 60 * 1000; // 2 ساعت به میلی‌ثانیه + + const checkAndClear = () => { + const stored = localStorage.getItem("checkout-storage"); + if (stored) { + try { + const parsed = JSON.parse(stored); + const state = parsed.state; + if (state?.lastUpdated) { + const now = Date.now(); + const timeDiff = now - state.lastUpdated; + if (timeDiff >= TWO_HOURS) { + useCheckoutStore.getState().clear(); + } + } + } catch { + // در صورت خطا در parse، store را پاک می‌کنیم + useCheckoutStore.getState().clear(); + } + } + }; + + // چک در زمان لود شدن + checkAndClear(); + + // چک هر 5 دقیقه + setInterval(checkAndClear, 5 * 60 * 1000); +} diff --git a/src/app/[name]/(Dialogs)/order/checkout/types/Types.ts b/src/app/[name]/(Dialogs)/order/checkout/types/Types.ts index 2cd155f..d517e90 100644 --- a/src/app/[name]/(Dialogs)/order/checkout/types/Types.ts +++ b/src/app/[name]/(Dialogs)/order/checkout/types/Types.ts @@ -145,6 +145,9 @@ export type CheckoutStoreType = { plateNumber: string; } | null ) => void; + lastUpdated: number | null; + setLastUpdated: (value: number | null) => void; + clear: () => void; }; export interface OrderUser {