From 975e29bbc927ada9513995e32ae368e8d2a3248e Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Wed, 3 Dec 2025 09:08:48 +0330 Subject: [PATCH] Create file constant --- next.config.ts | 5 -- .../[id]/components/AddressSection.tsx | 53 +++++++++++++++---- .../(Dialogs)/order/checkout/[id]/page.tsx | 3 +- .../address/new/hooks/useAddressForm.ts | 16 ++++-- src/config/const.ts | 3 ++ src/features/auth/components/StepOtp.tsx | 5 +- src/lib/api/auth/refresh-token.ts | 3 +- src/lib/api/axiosInstance.ts | 3 +- src/lib/api/func.ts | 27 +++------- 9 files changed, 76 insertions(+), 42 deletions(-) create mode 100644 src/config/const.ts diff --git a/next.config.ts b/next.config.ts index 22d32de..a58c212 100644 --- a/next.config.ts +++ b/next.config.ts @@ -4,11 +4,6 @@ import withPWA from "next-pwa"; const nextConfig: NextConfig = { output: "standalone", poweredByHeader: false, - env: { - NEXT_PUBLIC_API_BASE_URL: process.env.NEXT_PUBLIC_API_BASE_URL, - NEXT_PUBLIC_TOKEN_NAME: process.env.NEXT_PUBLIC_TOKEN_NAME, - NEXT_PUBLIC_REFRESH_TOKEN_NAME: process.env.NEXT_PUBLIC_REFRESH_TOKEN_NAME, - }, images: { remotePatterns: [ { diff --git a/src/app/[name]/(Dialogs)/order/checkout/[id]/components/AddressSection.tsx b/src/app/[name]/(Dialogs)/order/checkout/[id]/components/AddressSection.tsx index e307a58..da53cd3 100644 --- a/src/app/[name]/(Dialogs)/order/checkout/[id]/components/AddressSection.tsx +++ b/src/app/[name]/(Dialogs)/order/checkout/[id]/components/AddressSection.tsx @@ -1,32 +1,67 @@ 'use client'; import { useGetAddresses } from '@/app/[name]/(Profile)/profile/address/hooks/useAddressData'; +import { Address } from '@/app/[name]/(Profile)/profile/address/types/Types'; +import PrimaryButton from '@/components/button/PrimaryButton'; import { ChevronLeft } from 'lucide-react'; import Link from 'next/link'; import { useParams } from 'next/navigation'; import { useTranslation } from 'react-i18next'; -type AddressSectionProps = { - address: string; +const formatAddress = (address: Address) => { + return `${address.address}، ${address.city}، ${address.province}`; }; -export const AddressSection = ({ address }: AddressSectionProps) => { - +export const AddressSection = () => { const params = useParams<{ name: string; id: string }>(); const { t } = useTranslation('parallels', { keyPrefix: 'OrderDetail' }); - const { data: addresses } = useGetAddresses(); + const { data: addressesResponse, isLoading } = useGetAddresses(); + const addresses = addressesResponse?.data || []; + const redirectUrl = `/${params.name}/order/checkout/${params.id}`; - console.log(addresses); + // اگر در حال بارگذاری است، چیزی نمایش نده + if (isLoading) { + return null; + } + + // اگر آدرس ندارد + if (addresses.length === 0) { + return ( +
+
+

{t("SectionAddress.Title")}

+

+ آدرسی ثبت نشده است +

+ + + افزودن آدرس جدید + + +
+
+ ); + } + + // فیلتر کردن آدرس‌های غیر پیش‌فرض + const nonDefaultAddresses = addresses.filter(addr => !addr.isDefault); + + // اگر فقط آدرس پیش‌فرض دارد، نمایش نده + if (nonDefaultAddresses.length === 0) { + return null; + } + + // آدرس اول غیر پیش‌فرض را نمایش بده + const firstNonDefaultAddress = nonDefaultAddresses[0]; return (

{t("SectionAddress.Title")}

- +

- {address} + {formatAddress(firstNonDefaultAddress)}

diff --git a/src/app/[name]/(Dialogs)/order/checkout/[id]/page.tsx b/src/app/[name]/(Dialogs)/order/checkout/[id]/page.tsx index d4ffd15..1232e89 100644 --- a/src/app/[name]/(Dialogs)/order/checkout/[id]/page.tsx +++ b/src/app/[name]/(Dialogs)/order/checkout/[id]/page.tsx @@ -17,7 +17,6 @@ function OrderDetailInex() { const [couponCode, setCouponCode] = React.useState(''); const [couponCodeError, setCouponCodeError] = React.useState(''); const [tableNumber, setTableNumber] = useState(0); - const address = "اراک، مصطفی خمینی، خیابان سینا کوچه چمران ساختمان شهرزاد"; const { state: cartModal, toggle: toggleCartModal } = useToggle(); const incrementTableNumber = () => setTableNumber((prev) => prev + 1); @@ -51,7 +50,7 @@ function OrderDetailInex() { /> {deliveryType === '0' && ( - + )} {deliveryType === '1' && ( diff --git a/src/app/[name]/(Profile)/profile/address/new/hooks/useAddressForm.ts b/src/app/[name]/(Profile)/profile/address/new/hooks/useAddressForm.ts index e9bda66..9337f7e 100644 --- a/src/app/[name]/(Profile)/profile/address/new/hooks/useAddressForm.ts +++ b/src/app/[name]/(Profile)/profile/address/new/hooks/useAddressForm.ts @@ -1,5 +1,5 @@ import { useState, useEffect } from 'react'; -import { useRouter } from 'next/navigation'; +import { useRouter, useSearchParams } from 'next/navigation'; import { useCreateAddress, useUpdateAddress } from '../../hooks/useAddressData'; import { toast } from '@/components/Toast'; import { CreateAddressType, UpdateAddressType, NominatimReverseGeocodingResponse, Address } from '../../types/Types'; @@ -20,6 +20,8 @@ export const useAddressForm = ({ addressData = null, }: UseAddressFormProps) => { const router = useRouter(); + const searchParams = useSearchParams(); + const redirect = searchParams.get('redirect'); const { mutate: createAddress, isPending: isCreating } = useCreateAddress(); const { mutate: updateAddress, isPending: isUpdating } = useUpdateAddress(); const isPending = isCreating || isUpdating; @@ -92,7 +94,11 @@ export const useAddressForm = ({ updateAddress(updateData, { onSuccess: () => { toast('آدرس با موفقیت به‌روزرسانی شد', 'success'); - router.back(); + if (redirect) { + router.replace(redirect); + } else { + router.back(); + } }, onError: (error) => { const errorMessage = error instanceof Error ? error.message : 'خطا در به‌روزرسانی آدرس'; @@ -105,7 +111,11 @@ export const useAddressForm = ({ createAddress(createData, { onSuccess: () => { toast('آدرس با موفقیت ثبت شد', 'success'); - router.back(); + if (redirect) { + router.replace(redirect); + } else { + router.back(); + } }, onError: (error) => { const errorMessage = error instanceof Error ? error.message : 'خطا در ثبت آدرس'; diff --git a/src/config/const.ts b/src/config/const.ts new file mode 100644 index 0000000..db02b3a --- /dev/null +++ b/src/config/const.ts @@ -0,0 +1,3 @@ +export const API_BASE_URL = "https://dmenuplus-api.dev.danakcorp.com"; +export const TOKEN_NAME = "dmenu-t"; +export const REFRESH_TOKEN_NAME = "dmenu-rt"; diff --git a/src/features/auth/components/StepOtp.tsx b/src/features/auth/components/StepOtp.tsx index 37d3b6c..05e60a8 100644 --- a/src/features/auth/components/StepOtp.tsx +++ b/src/features/auth/components/StepOtp.tsx @@ -10,6 +10,7 @@ import Button from '@/components/button/PrimaryButton' import { extractErrorMessage } from '@/lib/func' import { useReceiptStore } from '@/zustand/receiptStore' import { useBulkCart } from '@/app/[name]/(Dialogs)/cart/hooks/useCartData' +import { setRefreshToken, setToken } from '@/lib/api/func' type Props = { @@ -38,8 +39,8 @@ const StepOtp = ({ phone, slug }: Props) => { mutateOtpVerify(values, { onSuccess: (data) => { toast(t('otp_verified'), 'success') - localStorage.setItem(process.env.NEXT_PUBLIC_TOKEN_NAME as string, data?.data?.tokens?.accessToken?.token as string) - localStorage.setItem(process.env.NEXT_PUBLIC_REFRESH_TOKEN_NAME as string, data?.data?.tokens?.refreshToken?.token as string) + setToken(data?.data?.tokens?.accessToken?.token as string) + setRefreshToken(data?.data?.tokens?.refreshToken?.token as string) if (Object.keys(items).length > 0) { const bulkCartItems = Object.entries(items).map(([key, value]) => { diff --git a/src/lib/api/auth/refresh-token.ts b/src/lib/api/auth/refresh-token.ts index a136fc1..6465fcf 100644 --- a/src/lib/api/auth/refresh-token.ts +++ b/src/lib/api/auth/refresh-token.ts @@ -1,4 +1,5 @@ import axios from "axios"; +import { API_BASE_URL } from "@/config/const"; export type RefreshTokenRequestModel = { token: string; @@ -6,7 +7,7 @@ export type RefreshTokenRequestModel = { export const refreshToken = async (model: RefreshTokenRequestModel) => { const res = await axios.post( - `${process.env.NEXT_PUBLIC_API_BASE_URL}/public/auth/refresh`, + `${API_BASE_URL}/public/auth/refresh`, { refreshToken: model.token }, { headers: { "Content-Type": "application/json" }, diff --git a/src/lib/api/axiosInstance.ts b/src/lib/api/axiosInstance.ts index a25be56..112657f 100644 --- a/src/lib/api/axiosInstance.ts +++ b/src/lib/api/axiosInstance.ts @@ -8,6 +8,7 @@ import { removeRefreshToken, } from "./func"; import { refreshToken } from "./auth/refresh-token"; +import { API_BASE_URL } from "@/config/const"; declare global { interface Window { @@ -16,7 +17,7 @@ declare global { } const axiosInstance = axios.create({ - baseURL: process.env.NEXT_PUBLIC_API_BASE_URL, + baseURL: API_BASE_URL, headers: { "Content-Type": "application/json" }, }); diff --git a/src/lib/api/func.ts b/src/lib/api/func.ts index 0786196..ad7f4f1 100644 --- a/src/lib/api/func.ts +++ b/src/lib/api/func.ts @@ -1,42 +1,31 @@ +import { REFRESH_TOKEN_NAME, TOKEN_NAME } from "@/config/const"; + export const getToken = async (): Promise => { if (typeof window === "undefined") return null; - return localStorage.getItem( - process.env.NEXT_PUBLIC_TOKEN_NAME as string - ); + return localStorage.getItem(TOKEN_NAME); }; export const getRefreshToken = async (): Promise => { if (typeof window === "undefined") return null; - return localStorage.getItem( - process.env.NEXT_PUBLIC_REFRESH_TOKEN_NAME as string - ); + return localStorage.getItem(REFRESH_TOKEN_NAME); }; export const setToken = async (token: string): Promise => { if (typeof window === "undefined") return; - localStorage.setItem( - process.env.NEXT_PUBLIC_TOKEN_NAME as string, - token - ); + localStorage.setItem(TOKEN_NAME, token); }; export const setRefreshToken = async (token: string): Promise => { if (typeof window === "undefined") return; - localStorage.setItem( - process.env.NEXT_PUBLIC_REFRESH_TOKEN_NAME as string, - token - ); + localStorage.setItem(REFRESH_TOKEN_NAME, token); }; export const removeToken = async (): Promise => { if (typeof window === "undefined") return; - localStorage.removeItem(process.env.NEXT_PUBLIC_TOKEN_NAME as string); + localStorage.removeItem(TOKEN_NAME); }; export const removeRefreshToken = async (): Promise => { if (typeof window === "undefined") return; - localStorage.removeItem( - process.env.NEXT_PUBLIC_REFRESH_TOKEN_NAME as string - ); + localStorage.removeItem(REFRESH_TOKEN_NAME); }; -