From 220c8be526fd5920d2839f6225bd0aa8eab68510 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Mon, 15 Sep 2025 11:30:41 +0330 Subject: [PATCH] refresh token + base orders list and detail order --- package-lock.json | 136 ++++-- package.json | 4 +- src/app/auth/service/Service.ts | 11 +- src/app/auth/types/Types.ts | 4 + .../[id]/components/CancelOrderModal.tsx | 132 ++++++ .../[id]/components/OrderMainContent.tsx | 96 ++++ .../[id]/components/OrderProductItem.tsx | 97 ++++ .../orders/[id]/components/OrderSidebar.tsx | 104 +++++ src/app/profile/orders/[id]/page.tsx | 414 +++--------------- .../orders/components/OrderButtons.tsx | 103 +++++ .../profile/orders/components/OrderItem.tsx | 53 +++ .../orders/components/OrderProducts.tsx | 47 ++ .../profile/orders/components/OrderTabs.tsx | 55 +++ src/app/profile/orders/hooks/useOrdersData.ts | 19 + src/app/profile/orders/page.tsx | 169 +++---- src/app/profile/orders/service/Service.ts | 33 ++ src/app/profile/orders/types/Types.ts | 293 +++++++++++++ src/config/axios.ts | 80 +++- 18 files changed, 1316 insertions(+), 534 deletions(-) create mode 100644 src/app/profile/orders/[id]/components/CancelOrderModal.tsx create mode 100644 src/app/profile/orders/[id]/components/OrderMainContent.tsx create mode 100644 src/app/profile/orders/[id]/components/OrderProductItem.tsx create mode 100644 src/app/profile/orders/[id]/components/OrderSidebar.tsx create mode 100644 src/app/profile/orders/components/OrderButtons.tsx create mode 100644 src/app/profile/orders/components/OrderItem.tsx create mode 100644 src/app/profile/orders/components/OrderProducts.tsx create mode 100644 src/app/profile/orders/components/OrderTabs.tsx create mode 100644 src/app/profile/orders/hooks/useOrdersData.ts create mode 100644 src/app/profile/orders/service/Service.ts create mode 100644 src/app/profile/orders/types/Types.ts diff --git a/package-lock.json b/package-lock.json index e270c56..b5351f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,8 @@ "embla-carousel-react": "^8.6.0", "iconsax-react": "^0.0.8", "lucide-react": "^0.539.0", - "next": "15.4.5", + "moment-jalaali": "^0.10.4", + "next": "^15.5.3", "rc-rate": "^2.13.1", "react": "19.1.0", "react-dom": "19.1.0", @@ -38,6 +39,7 @@ "devDependencies": { "@eslint/eslintrc": "^3", "@tailwindcss/postcss": "^4", + "@types/moment-jalaali": "^0.7.9", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", @@ -820,9 +822,9 @@ } }, "node_modules/@next/env": { - "version": "15.4.5", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.4.5.tgz", - "integrity": "sha512-ruM+q2SCOVCepUiERoxOmZY9ZVoecR3gcXNwCYZRvQQWRjhOiPJGmQ2fAiLR6YKWXcSAh7G79KEFxN3rwhs4LQ==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.3.tgz", + "integrity": "sha512-RSEDTRqyihYXygx/OJXwvVupfr9m04+0vH8vyy0HfZ7keRto6VX9BbEk0J2PUk0VGy6YhklJUSrgForov5F9pw==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -836,9 +838,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.4.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.4.5.tgz", - "integrity": "sha512-84dAN4fkfdC7nX6udDLz9GzQlMUwEMKD7zsseXrl7FTeIItF8vpk1lhLEnsotiiDt+QFu3O1FVWnqwcRD2U3KA==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.3.tgz", + "integrity": "sha512-nzbHQo69+au9wJkGKTU9lP7PXv0d1J5ljFpvb+LnEomLtSbJkbZyEs6sbF3plQmiOB2l9OBtN2tNSvCH1nQ9Jg==", "cpu": [ "arm64" ], @@ -852,9 +854,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.4.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.4.5.tgz", - "integrity": "sha512-CL6mfGsKuFSyQjx36p2ftwMNSb8PQog8y0HO/ONLdQqDql7x3aJb/wB+LA651r4we2pp/Ck+qoRVUeZZEvSurA==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.3.tgz", + "integrity": "sha512-w83w4SkOOhekJOcA5HBvHyGzgV1W/XvOfpkrxIse4uPWhYTTRwtGEM4v/jiXwNSJvfRvah0H8/uTLBKRXlef8g==", "cpu": [ "x64" ], @@ -868,9 +870,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.4.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.4.5.tgz", - "integrity": "sha512-1hTVd9n6jpM/thnDc5kYHD1OjjWYpUJrJxY4DlEacT7L5SEOXIifIdTye6SQNNn8JDZrcN+n8AWOmeJ8u3KlvQ==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.3.tgz", + "integrity": "sha512-+m7pfIs0/yvgVu26ieaKrifV8C8yiLe7jVp9SpcIzg7XmyyNE7toC1fy5IOQozmr6kWl/JONC51osih2RyoXRw==", "cpu": [ "arm64" ], @@ -884,9 +886,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.4.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.4.5.tgz", - "integrity": "sha512-4W+D/nw3RpIwGrqpFi7greZ0hjrCaioGErI7XHgkcTeWdZd146NNu1s4HnaHonLeNTguKnL2Urqvj28UJj6Gqw==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.3.tgz", + "integrity": "sha512-u3PEIzuguSenoZviZJahNLgCexGFhso5mxWCrrIMdvpZn6lkME5vc/ADZG8UUk5K1uWRy4hqSFECrON6UKQBbQ==", "cpu": [ "arm64" ], @@ -900,9 +902,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.4.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.4.5.tgz", - "integrity": "sha512-N6Mgdxe/Cn2K1yMHge6pclffkxzbSGOydXVKYOjYqQXZYjLCfN/CuFkaYDeDHY2VBwSHyM2fUjYBiQCIlxIKDA==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.3.tgz", + "integrity": "sha512-lDtOOScYDZxI2BENN9m0pfVPJDSuUkAD1YXSvlJF0DKwZt0WlA7T7o3wrcEr4Q+iHYGzEaVuZcsIbCps4K27sA==", "cpu": [ "x64" ], @@ -916,9 +918,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.4.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.4.5.tgz", - "integrity": "sha512-YZ3bNDrS8v5KiqgWE0xZQgtXgCTUacgFtnEgI4ccotAASwSvcMPDLua7BWLuTfucoRv6mPidXkITJLd8IdJplQ==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.3.tgz", + "integrity": "sha512-9vWVUnsx9PrY2NwdVRJ4dUURAQ8Su0sLRPqcCCxtX5zIQUBES12eRVHq6b70bbfaVaxIDGJN2afHui0eDm+cLg==", "cpu": [ "x64" ], @@ -932,9 +934,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.4.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.4.5.tgz", - "integrity": "sha512-9Wr4t9GkZmMNcTVvSloFtjzbH4vtT4a8+UHqDoVnxA5QyfWe6c5flTH1BIWPGNWSUlofc8dVJAE7j84FQgskvQ==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.3.tgz", + "integrity": "sha512-1CU20FZzY9LFQigRi6jM45oJMU3KziA5/sSG+dXeVaTm661snQP6xu3ykGxxwU5sLG3sh14teO/IOEPVsQMRfA==", "cpu": [ "arm64" ], @@ -948,9 +950,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.4.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.4.5.tgz", - "integrity": "sha512-voWk7XtGvlsP+w8VBz7lqp8Y+dYw/MTI4KeS0gTVtfdhdJ5QwhXLmNrndFOin/MDoCvUaLWMkYKATaCoUkt2/A==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.3.tgz", + "integrity": "sha512-JMoLAq3n3y5tKXPQwCK5c+6tmwkuFDa2XAxz8Wm4+IVthdBZdZGh+lmiLUHg9f9IDwIQpUjp+ysd6OkYTyZRZw==", "cpu": [ "x64" ], @@ -1853,6 +1855,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/moment-jalaali": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/@types/moment-jalaali/-/moment-jalaali-0.7.9.tgz", + "integrity": "sha512-gsDOoAzRnCfQTbfdlUrCvX6R0wIto6CvwfvV2C3j4qJLK+DEiTK8Rl/xlOCBO9C6qeUfX8oyZ2UfjnXJTOvHSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "moment": ">=2.14.0" + } + }, "node_modules/@types/node": { "version": "20.19.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.9.tgz", @@ -2723,9 +2735,9 @@ } }, "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -4777,6 +4789,12 @@ "node": ">= 0.4" } }, + "node_modules/jalaali-js": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/jalaali-js/-/jalaali-js-1.2.8.tgz", + "integrity": "sha512-Jl/EwY84JwjW2wsWqeU4pNd22VNQ7EkjI36bDuLw31wH98WQW4fPjD0+mG7cdCK+Y8D6s9R3zLiQ3LaKu6bD8A==", + "license": "MIT" + }, "node_modules/jiti": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", @@ -5309,6 +5327,38 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/moment-jalaali": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/moment-jalaali/-/moment-jalaali-0.10.4.tgz", + "integrity": "sha512-/eD0HeyvATznb5iE0G1BHjKRZAFEpJ9ZNUkcHwXhNgt1WJJVVzHD7+uDmqzZWVFLdbGme2gvIXKb3ezDYOXcZA==", + "license": "MIT", + "dependencies": { + "jalaali-js": "^1.2.7", + "moment": "^2.29.4", + "moment-timezone": "^0.5.46" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz", + "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==", + "license": "MIT", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5358,12 +5408,12 @@ "license": "MIT" }, "node_modules/next": { - "version": "15.4.5", - "resolved": "https://registry.npmjs.org/next/-/next-15.4.5.tgz", - "integrity": "sha512-nJ4v+IO9CPmbmcvsPebIoX3Q+S7f6Fu08/dEWu0Ttfa+wVwQRh9epcmsyCPjmL2b8MxC+CkBR97jgDhUUztI3g==", + "version": "15.5.3", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.3.tgz", + "integrity": "sha512-r/liNAx16SQj4D+XH/oI1dlpv9tdKJ6cONYPwwcCC46f2NjpaRWY+EKCzULfgQYV6YKXjHBchff2IZBSlZmJNw==", "license": "MIT", "dependencies": { - "@next/env": "15.4.5", + "@next/env": "15.5.3", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -5376,14 +5426,14 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.4.5", - "@next/swc-darwin-x64": "15.4.5", - "@next/swc-linux-arm64-gnu": "15.4.5", - "@next/swc-linux-arm64-musl": "15.4.5", - "@next/swc-linux-x64-gnu": "15.4.5", - "@next/swc-linux-x64-musl": "15.4.5", - "@next/swc-win32-arm64-msvc": "15.4.5", - "@next/swc-win32-x64-msvc": "15.4.5", + "@next/swc-darwin-arm64": "15.5.3", + "@next/swc-darwin-x64": "15.5.3", + "@next/swc-linux-arm64-gnu": "15.5.3", + "@next/swc-linux-arm64-musl": "15.5.3", + "@next/swc-linux-x64-gnu": "15.5.3", + "@next/swc-linux-x64-musl": "15.5.3", + "@next/swc-win32-arm64-msvc": "15.5.3", + "@next/swc-win32-x64-msvc": "15.5.3", "sharp": "^0.34.3" }, "peerDependencies": { diff --git a/package.json b/package.json index 51113ba..bc8c2eb 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "embla-carousel-react": "^8.6.0", "iconsax-react": "^0.0.8", "lucide-react": "^0.539.0", - "next": "15.4.5", + "moment-jalaali": "^0.10.4", + "next": "^15.5.3", "rc-rate": "^2.13.1", "react": "19.1.0", "react-dom": "19.1.0", @@ -39,6 +40,7 @@ "devDependencies": { "@eslint/eslintrc": "^3", "@tailwindcss/postcss": "^4", + "@types/moment-jalaali": "^0.7.9", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", diff --git a/src/app/auth/service/Service.ts b/src/app/auth/service/Service.ts index 37c938a..535b50f 100644 --- a/src/app/auth/service/Service.ts +++ b/src/app/auth/service/Service.ts @@ -1,5 +1,9 @@ import axios from "@/config/axios"; -import { AuthenticationType, VerifyOtpType } from "../types/Types"; +import { + AuthenticationType, + RefreshTokenType, + VerifyOtpType, +} from "../types/Types"; export const authentication = async (params: AuthenticationType) => { const { data } = await axios.post("/user/authenticate", params); @@ -10,3 +14,8 @@ export const verifyOtp = async (params: VerifyOtpType) => { const { data } = await axios.post("/user/login/otp", params); return data; }; + +export const refreshToken = async (params: RefreshTokenType) => { + const { data } = await axios.post(`/auth/refresh`, params); + return data; +}; diff --git a/src/app/auth/types/Types.ts b/src/app/auth/types/Types.ts index f6a8fff..1fe5a4d 100644 --- a/src/app/auth/types/Types.ts +++ b/src/app/auth/types/Types.ts @@ -13,3 +13,7 @@ export type VerifyOtpType = { phone: string; otpCode: string; }; + +export type RefreshTokenType = { + token: string; +}; diff --git a/src/app/profile/orders/[id]/components/CancelOrderModal.tsx b/src/app/profile/orders/[id]/components/CancelOrderModal.tsx new file mode 100644 index 0000000..cd5abb7 --- /dev/null +++ b/src/app/profile/orders/[id]/components/CancelOrderModal.tsx @@ -0,0 +1,132 @@ +'use client' +import React from 'react' +import { useForm } from 'react-hook-form' +import { yupResolver } from '@hookform/resolvers/yup' +import * as yup from 'yup' +import Modal from '@/components/Modal' +import Select from '@/components/Select' +import Input from '@/components/Input' +import { Button } from '@/components/ui/button' + +interface CancelOrderFormData { + reason: string + count: string + description: string +} + +interface CancelReason { + _id: string + title: string +} + +interface CancelOrderModalProps { + showModalCancel: boolean + setShowModalCancel: (show: boolean) => void + onSubmit: (data: CancelOrderFormData) => void + isLoading: boolean + cancelReasons?: Array<{ _id: string; title: string }> +} + +const cancelOrderSchema = yup.object({ + reason: yup.string().required('دلیل لغو سفارش را انتخاب کنید'), + count: yup.string().required('تعداد را وارد کنید'), + description: yup.string().required('توضیحات را وارد کنید') +}) + +const CancelOrderModal: React.FC = ({ + showModalCancel, + setShowModalCancel, + onSubmit, + isLoading, + cancelReasons = [] +}) => { + const { + register, + handleSubmit, + watch, + setValue, + formState: { errors }, + reset + } = useForm({ + resolver: yupResolver(cancelOrderSchema) + }) + + const handleFormSubmit = (data: CancelOrderFormData) => { + onSubmit(data) + reset() + } + + return ( + setShowModalCancel(false)} + isHeader + title='درخواست لغو سفارش' + > +
+ + +
+
توضیحات :
+