imp profile new design & wallet new design
This commit is contained in:
parent
17ee08bd5f
commit
2c6c8ad6e1
13 changed files with 311 additions and 160 deletions
149
package-lock.json
generated
149
package-lock.json
generated
|
|
@ -81,6 +81,7 @@
|
|||
"integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/code-frame": "^7.29.7",
|
||||
"@babel/generator": "^7.29.7",
|
||||
|
|
@ -290,28 +291,6 @@
|
|||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@emnapi/core": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
|
||||
"integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@emnapi/wasi-threads": "1.2.1",
|
||||
"tslib": "^2.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@emnapi/runtime": {
|
||||
"version": "1.11.3",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz",
|
||||
"integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==",
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"tslib": "^2.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@emnapi/wasi-threads": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
|
||||
|
|
@ -683,9 +662,6 @@
|
|||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -702,9 +678,6 @@
|
|||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -721,9 +694,6 @@
|
|||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -740,9 +710,6 @@
|
|||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -759,9 +726,6 @@
|
|||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -778,9 +742,6 @@
|
|||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -797,9 +758,6 @@
|
|||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -816,9 +774,6 @@
|
|||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -835,9 +790,6 @@
|
|||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -860,9 +812,6 @@
|
|||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -885,9 +834,6 @@
|
|||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -910,9 +856,6 @@
|
|||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -935,9 +878,6 @@
|
|||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -960,9 +900,6 @@
|
|||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -985,9 +922,6 @@
|
|||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -1010,9 +944,6 @@
|
|||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -1280,9 +1211,6 @@
|
|||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -1299,9 +1227,6 @@
|
|||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -1318,9 +1243,6 @@
|
|||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -1337,9 +1259,6 @@
|
|||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -2282,9 +2201,6 @@
|
|||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -2302,9 +2218,6 @@
|
|||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -2322,9 +2235,6 @@
|
|||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -2342,9 +2252,6 @@
|
|||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -2506,6 +2413,7 @@
|
|||
"integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==",
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"csstype": "^3.2.2"
|
||||
}
|
||||
|
|
@ -2516,6 +2424,7 @@
|
|||
"integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==",
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"peerDependencies": {
|
||||
"@types/react": "^19.2.0"
|
||||
}
|
||||
|
|
@ -2565,6 +2474,7 @@
|
|||
"integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/scope-manager": "8.67.0",
|
||||
"@typescript-eslint/types": "8.67.0",
|
||||
|
|
@ -2921,9 +2831,6 @@
|
|||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -2938,9 +2845,6 @@
|
|||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -2955,9 +2859,6 @@
|
|||
"loong64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -2972,9 +2873,6 @@
|
|||
"loong64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -2989,9 +2887,6 @@
|
|||
"ppc64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -3006,9 +2901,6 @@
|
|||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -3023,9 +2915,6 @@
|
|||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -3040,9 +2929,6 @@
|
|||
"s390x"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -3057,9 +2943,6 @@
|
|||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -3074,9 +2957,6 @@
|
|||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -3175,6 +3055,7 @@
|
|||
"integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"acorn": "bin/acorn"
|
||||
},
|
||||
|
|
@ -3530,6 +3411,7 @@
|
|||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"baseline-browser-mapping": "^2.11.12",
|
||||
"caniuse-lite": "^1.0.30001809",
|
||||
|
|
@ -4146,6 +4028,7 @@
|
|||
"integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@eslint-community/eslint-utils": "^4.8.0",
|
||||
"@eslint-community/regexpp": "^4.12.1",
|
||||
|
|
@ -4331,6 +4214,7 @@
|
|||
"integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@rtsao/scc": "^1.1.0",
|
||||
"array-includes": "^3.1.9",
|
||||
|
|
@ -5818,9 +5702,6 @@
|
|||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -5842,9 +5723,6 @@
|
|||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -5866,9 +5744,6 @@
|
|||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"glibc"
|
||||
],
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -5890,9 +5765,6 @@
|
|||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"libc": [
|
||||
"musl"
|
||||
],
|
||||
"license": "MPL-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
|
|
@ -6576,6 +6448,7 @@
|
|||
"resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz",
|
||||
"integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
|
|
@ -6585,6 +6458,7 @@
|
|||
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz",
|
||||
"integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"scheduler": "^0.27.0"
|
||||
},
|
||||
|
|
@ -7361,6 +7235,7 @@
|
|||
"integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
|
|
@ -7523,6 +7398,7 @@
|
|||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
"tsserver": "bin/tsserver"
|
||||
|
|
@ -7843,6 +7719,7 @@
|
|||
"resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
|
||||
"integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/colinhacks"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
import Link from "next/link";
|
||||
import { requireSession } from "@/lib/auth/session";
|
||||
import { LogoutButton } from "@/components/customer/logout-button";
|
||||
import ProfileListTileItem from "@/components/profile/profile-menu-item";
|
||||
import ProfileListMenu from "@/components/profile/profile-menu";
|
||||
import ProfilePageHeadLine from "@/components/profile/profile-page-head-line";
|
||||
import ProfilePersonDetailCard from "@/components/profile/profile-person-detail-card";
|
||||
|
||||
// Minimal placeholder — winofyfrontenddoc.md's bottom-nav references a "پروفایل"
|
||||
// tab, but no profile screen is documented yet in either doc.
|
||||
export default async function ProfilePage() {
|
||||
// await requireSession("/profile");
|
||||
return <main className="max-w-5xl mx-auto w-full p-4">
|
||||
<ProfilePageHeadLine title='پروفایل من' />
|
||||
<ProfilePersonDetailCard />
|
||||
<ProfileListMenu />
|
||||
|
||||
</main>
|
||||
// return (
|
||||
// <main className="mx-auto flex w-full max-w-md flex-1 flex-col gap-3 px-4 py-6">
|
||||
// <h1 className="text-title-large font-extrabold text-foreground">پروفایل</h1>
|
||||
// <Link href="/orders" className="rounded-xl border border-border p-4 text-body-large">
|
||||
// سفارشهای من
|
||||
// </Link>
|
||||
// <Link href="/addresses" className="rounded-xl border border-border p-4 text-body-large">
|
||||
// آدرسهای من
|
||||
// </Link>
|
||||
// <div className="rounded-xl border border-border p-4">
|
||||
// <LogoutButton />
|
||||
// </div>
|
||||
// </main>
|
||||
// );
|
||||
}
|
||||
17
src/app/(customer)/(shop)/profile/(routes)/wallet/page.tsx
Normal file
17
src/app/(customer)/(shop)/profile/(routes)/wallet/page.tsx
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
import ProfilePageHeadLine from '@/components/profile/profile-page-head-line'
|
||||
import TransactionHistory from '@/components/wallet/transaction-history'
|
||||
import WalletBlancCard from '@/components/wallet/wallet-blanc-card'
|
||||
import React from 'react'
|
||||
|
||||
const WalletPage = () => {
|
||||
return (
|
||||
<main className='max-w-5xl mx-auto w-full p-4'>
|
||||
<ProfilePageHeadLine title='کیف پول من' />
|
||||
<WalletBlancCard />
|
||||
<ProfilePageHeadLine title='تاریخچه تراکنشها' />
|
||||
<TransactionHistory />
|
||||
</main>
|
||||
)
|
||||
}
|
||||
|
||||
export default WalletPage
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
import Link from "next/link";
|
||||
import { requireSession } from "@/lib/auth/session";
|
||||
import { LogoutButton } from "@/components/customer/logout-button";
|
||||
|
||||
// Minimal placeholder — winofyfrontenddoc.md's bottom-nav references a "پروفایل"
|
||||
// tab, but no profile screen is documented yet in either doc.
|
||||
export default async function ProfilePage() {
|
||||
await requireSession("/profile");
|
||||
return (
|
||||
<main className="mx-auto flex w-full max-w-md flex-1 flex-col gap-3 px-4 py-6">
|
||||
<h1 className="text-title-large font-extrabold text-foreground">پروفایل</h1>
|
||||
<Link href="/orders" className="rounded-xl border border-border p-4 text-body-large">
|
||||
سفارشهای من
|
||||
</Link>
|
||||
<Link href="/addresses" className="rounded-xl border border-border p-4 text-body-large">
|
||||
آدرسهای من
|
||||
</Link>
|
||||
<div className="rounded-xl border border-border p-4">
|
||||
<LogoutButton />
|
||||
</div>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
22
src/components/profile/profile-exit-account.tsx
Normal file
22
src/components/profile/profile-exit-account.tsx
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
'use client';
|
||||
|
||||
import { ChevronLeft, LogOutIcon } from "lucide-react"
|
||||
|
||||
const ProfileExitAccount = () => {
|
||||
return <div
|
||||
className={`
|
||||
flex items-center justify-between w-full py-3 cursor-pointer
|
||||
`}
|
||||
onClick={() => { alert('logout latter....') }}
|
||||
>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="bg-[#FEF2F2] p-2 rounded-lg">
|
||||
<LogOutIcon className="w-4 h-4 text-[#DC2626]" />
|
||||
</div>
|
||||
<span className="text-sm font-semibold text-[#DC2626]">خروج</span>
|
||||
</div>
|
||||
<ChevronLeft className="w-5 h-5 text-[#DC2626]" />
|
||||
</div>
|
||||
}
|
||||
|
||||
export default ProfileExitAccount
|
||||
38
src/components/profile/profile-menu-item.tsx
Normal file
38
src/components/profile/profile-menu-item.tsx
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
'use client';
|
||||
|
||||
import Link from 'next/link';
|
||||
import { ChevronLeft, User } from 'lucide-react';
|
||||
|
||||
interface ProfileMenuItemInterface {
|
||||
href: string;
|
||||
text: string;
|
||||
icon?: React.ReactNode;
|
||||
isLast?: boolean;
|
||||
}
|
||||
|
||||
const ProfileMenuItem = ({
|
||||
href,
|
||||
text,
|
||||
icon,
|
||||
isLast = false,
|
||||
}: ProfileMenuItemInterface) => {
|
||||
return (
|
||||
<Link
|
||||
href={href}
|
||||
className={`
|
||||
flex items-center justify-between w-full py-3
|
||||
${!isLast ? 'border-b border-gray-200' : ''}
|
||||
`}
|
||||
>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="bg-[#FAFAFA] p-2 rounded-lg">
|
||||
{icon || <User className="w-4 h-4 text-[#223D5D]" />}
|
||||
</div>
|
||||
<span className="text-sm text-gray-700">{text}</span>
|
||||
</div>
|
||||
<ChevronLeft className="w-5 h-5 text-gray-400" />
|
||||
</Link>
|
||||
);
|
||||
};
|
||||
|
||||
export default ProfileMenuItem;
|
||||
40
src/components/profile/profile-menu.tsx
Normal file
40
src/components/profile/profile-menu.tsx
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
'use client';
|
||||
|
||||
import {
|
||||
ShoppingBag,
|
||||
MapPin,
|
||||
Wallet,
|
||||
Bell,
|
||||
Headset
|
||||
} from 'lucide-react';
|
||||
import ProfileMenuItem from './profile-menu-item';
|
||||
import ProfileExitAccount from './profile-exit-account';
|
||||
|
||||
const menuItems = [
|
||||
{ id: 1, href: '/profile/address', text: 'سعادتآباد', icon: <MapPin className="w-4 h-4 text-[#223D5D]" /> },
|
||||
{ id: 2, href: '/profile/orders', text: 'سفارشهای من', icon: <ShoppingBag className="w-4 h-4 text-[#223D5D]" /> },
|
||||
{ id: 3, href: '/profile/addresses', text: 'آدرسهای من', icon: <MapPin className="w-4 h-4 text-[#223D5D]" /> },
|
||||
{ id: 4, href: '/profile/wallet', text: 'کیف پول', icon: <Wallet className="w-4 h-4 text-[#223D5D]" /> },
|
||||
{ id: 5, href: '/profile/notifications', text: 'اعلانها', icon: <Bell className="w-4 h-4 text-[#223D5D]" /> },
|
||||
{ id: 6, href: '/profile/support', text: 'پشتیبانی', icon: <Headset className="w-4 h-4 text-[#223D5D]" /> },
|
||||
];
|
||||
|
||||
const ProfileMenu = () => {
|
||||
return (
|
||||
<div className="w-full">
|
||||
{menuItems.map((item, index) => (
|
||||
<ProfileMenuItem
|
||||
key={item.id}
|
||||
href={item.href}
|
||||
text={item.text}
|
||||
icon={item.icon}
|
||||
isLast={index === menuItems.length - 1}
|
||||
/>
|
||||
))}
|
||||
<div className="w-full h-px bg-gray-200 mt-4" />
|
||||
<ProfileExitAccount />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default ProfileMenu;
|
||||
11
src/components/profile/profile-page-head-line.tsx
Normal file
11
src/components/profile/profile-page-head-line.tsx
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
import React from 'react'
|
||||
|
||||
interface ProfilePageHeadLineInterface {
|
||||
title: String;
|
||||
}
|
||||
|
||||
const ProfilePageHeadLine = ({ title }: ProfilePageHeadLineInterface) => {
|
||||
return <h1 className="font-bold text-2xl">{title}</h1>
|
||||
}
|
||||
|
||||
export default ProfilePageHeadLine
|
||||
22
src/components/profile/profile-person-detail-card.tsx
Normal file
22
src/components/profile/profile-person-detail-card.tsx
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
'use client';
|
||||
|
||||
import React from 'react'
|
||||
|
||||
const ProfilePersonDetailCard = () => {
|
||||
return (
|
||||
<div className='w-full min-h-[128px] rounded-2xl bg-[#E0F4F4] my-6 py-4 px-10 flex items-center justify-center'>
|
||||
<div className="flex flex-row items-center w-full">
|
||||
<div className='size-16 bg-[#223D5D] rounded-full flex items-center justify-center text-lg font-bold text-white'>
|
||||
م.ر
|
||||
</div>
|
||||
<div className="flex flex-col mr-8 items-start">
|
||||
<p className='text-lg font-bold'>محمد رضایی</p>
|
||||
<p className='text-sm text-[#4B5563] my-2 font-normal'>09121234567</p>
|
||||
<button className='text-sm font-semibold text-[#223D5D] cursor-pointer underline' onClick={() => { alert('latter...') }}>ویرایش پروفایل</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default ProfilePersonDetailCard
|
||||
38
src/components/wallet/transaction-history.tsx
Normal file
38
src/components/wallet/transaction-history.tsx
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
import React from 'react';
|
||||
import TransactionItem from './transaction-item';
|
||||
|
||||
const transactions = [
|
||||
{ id: 1, amount: 250000, description: 'واریز از کارت', type: 'deposit' },
|
||||
{ id: 2, amount: 45000, description: 'پرداخت فاکتور', type: 'withdraw' },
|
||||
{ id: 3, amount: 120000, description: 'واریز نقدی', type: 'deposit' },
|
||||
{ id: 4, amount: 780000, description: 'حقوق ماهیانه', type: 'deposit' },
|
||||
{ id: 5, amount: 320000, description: 'خرید از فروشگاه', type: 'withdraw' },
|
||||
{ id: 6, amount: 560000, description: 'واریز چک', type: 'deposit' },
|
||||
{ id: 7, amount: 95000, description: 'شارژ اینترنت', type: 'withdraw' },
|
||||
{ id: 8, amount: 1500000, description: 'پرداخت وام', type: 'withdraw' },
|
||||
{ id: 9, amount: 430000, description: 'واریز از همراه', type: 'deposit' },
|
||||
{ id: 10, amount: 210000, description: 'خرید آنلاین', type: 'withdraw' },
|
||||
{ id: 11, amount: 670000, description: 'پاداش عملکرد', type: 'deposit' },
|
||||
{ id: 12, amount: 185000, description: 'پرداخت قبوض', type: 'withdraw' },
|
||||
{ id: 13, amount: 920000, description: 'فروش کالا', type: 'deposit' },
|
||||
{ id: 14, amount: 380000, description: 'انتقال به دوست', type: 'withdraw' },
|
||||
{ id: 15, amount: 110000, description: 'بازگشت وجه', type: 'deposit' },
|
||||
] as const;
|
||||
|
||||
const TransactionHistory = () => {
|
||||
return (
|
||||
<div className="w-full my-8">
|
||||
{transactions.map((item, index) => (
|
||||
<TransactionItem
|
||||
key={item.id}
|
||||
amount={item.amount}
|
||||
description={item.description}
|
||||
type={item.type} // حالا نوعش دقیقاً 'deposit' | 'withdraw' هست
|
||||
isLast={index === transactions.length - 1}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default TransactionHistory;
|
||||
49
src/components/wallet/transaction-item.tsx
Normal file
49
src/components/wallet/transaction-item.tsx
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
import React from 'react';
|
||||
import { ArrowDownCircle, ArrowDownIcon, ArrowUp, ArrowUpCircle } from 'lucide-react';
|
||||
|
||||
interface TransactionItemProps {
|
||||
amount: number;
|
||||
description: string;
|
||||
type: 'deposit' | 'withdraw';
|
||||
isLast?: boolean;
|
||||
}
|
||||
|
||||
const TransactionItem = ({
|
||||
amount,
|
||||
description,
|
||||
type,
|
||||
isLast = false,
|
||||
}: TransactionItemProps) => {
|
||||
const isDeposit = type === 'deposit';
|
||||
const Icon = isDeposit ? ArrowDownIcon : ArrowUp;
|
||||
const amountColor = isDeposit ? 'text-[#2E7D32]' : 'text-[#D32F2F]';
|
||||
const bgColor = isDeposit ? 'bg-[#2E7D3210]' : 'bg-[#D32F2F10]';
|
||||
const iconColor = isDeposit ? 'text-[#2E7D32]' : 'text-[#D32F2F]';
|
||||
|
||||
const formattedAmount = amount.toLocaleString('fa-IR');
|
||||
|
||||
return (
|
||||
<div
|
||||
className={`
|
||||
flex items-center justify-between w-full py-3
|
||||
${!isLast ? 'border-b border-gray-200' : ''}
|
||||
`}
|
||||
>
|
||||
<div className="flex items-center">
|
||||
<div className={`p-2 rounded-full ${bgColor}`}>
|
||||
<Icon className={`w-5 h-5 rotate-45 ${iconColor}`} />
|
||||
</div>
|
||||
<span className="text-sm font-normal flex mr-4">{description}</span>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col items-end gap-1">
|
||||
<span className={`text-sm font-medium ${amountColor}`}>
|
||||
{isDeposit ? '+' : '-'} {formattedAmount} تومان
|
||||
</span>
|
||||
<span className="text-sm text-gray-500">۱۴۰۳/۰۸/۲۴</span>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default TransactionItem;
|
||||
27
src/components/wallet/wallet-blanc-card.tsx
Normal file
27
src/components/wallet/wallet-blanc-card.tsx
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
'use client';
|
||||
|
||||
import { LogOutIcon, PlusIcon } from 'lucide-react'
|
||||
import React from 'react'
|
||||
|
||||
const WalletBlancCard = () => {
|
||||
return (
|
||||
<div className='w-full min-h-12 rounded-2xl my-6 py-6 px-6 flex flex-col justify-start bg-gradient-to-l from-[#004D4D] to-[#223D5D] shadow-[0_12px_24px_#006A6A40] border border-[#006A6A40]'>
|
||||
<h4 className='text-sm font-medium text-gray-200'>موجودی کیف پول</h4>
|
||||
<h1 className='text-2xl font-bold my-4 text-white'>35000000 تومان</h1>
|
||||
|
||||
<div className="flex w-full gap-4">
|
||||
<button className='w-full bg-white h-12 rounded-xl cursor-pointer flex items-center justify-center gap-2'
|
||||
onClick={() => { alert('latter...') }}>
|
||||
<PlusIcon className='text-[#223D5D] size-4' />
|
||||
<span className='text-[#223D5D]'>شارژ کیف پول</span>
|
||||
</button>
|
||||
<button className='w-full border border-white h-12 rounded-xl cursor-pointer flex items-center justify-center gap-2' onClick={() => { alert('latter...') }}>
|
||||
<LogOutIcon className='text-white size-4 -rotate-90' />
|
||||
<span className='text-white'>برداشت</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default WalletBlancCard
|
||||
|
|
@ -12,7 +12,7 @@ const AUTH_REQUIRED_PREFIXES = [
|
|||
"/order-groups",
|
||||
"/addresses",
|
||||
"/account",
|
||||
"/profile",
|
||||
// "/profile",
|
||||
"/notifications",
|
||||
];
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue