Compare commits

..

No commits in common. "cbd0b4bebe857b50750f1ee471e901a523f8a8f6" and "17ee08bd5f0f3194ad437679212b798a5db906eb" have entirely different histories.

14 changed files with 159 additions and 361 deletions

149
package-lock.json generated
View file

@ -81,7 +81,6 @@
"integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/code-frame": "^7.29.7",
"@babel/generator": "^7.29.7",
@ -291,6 +290,28 @@
"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",
@ -662,6 +683,9 @@
"cpu": [
"arm"
],
"libc": [
"glibc"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@ -678,6 +702,9 @@
"cpu": [
"arm64"
],
"libc": [
"glibc"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@ -694,6 +721,9 @@
"cpu": [
"ppc64"
],
"libc": [
"glibc"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@ -710,6 +740,9 @@
"cpu": [
"riscv64"
],
"libc": [
"glibc"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@ -726,6 +759,9 @@
"cpu": [
"s390x"
],
"libc": [
"glibc"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@ -742,6 +778,9 @@
"cpu": [
"x64"
],
"libc": [
"glibc"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@ -758,6 +797,9 @@
"cpu": [
"arm64"
],
"libc": [
"musl"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@ -774,6 +816,9 @@
"cpu": [
"x64"
],
"libc": [
"musl"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@ -790,6 +835,9 @@
"cpu": [
"arm"
],
"libc": [
"glibc"
],
"license": "Apache-2.0",
"optional": true,
"os": [
@ -812,6 +860,9 @@
"cpu": [
"arm64"
],
"libc": [
"glibc"
],
"license": "Apache-2.0",
"optional": true,
"os": [
@ -834,6 +885,9 @@
"cpu": [
"ppc64"
],
"libc": [
"glibc"
],
"license": "Apache-2.0",
"optional": true,
"os": [
@ -856,6 +910,9 @@
"cpu": [
"riscv64"
],
"libc": [
"glibc"
],
"license": "Apache-2.0",
"optional": true,
"os": [
@ -878,6 +935,9 @@
"cpu": [
"s390x"
],
"libc": [
"glibc"
],
"license": "Apache-2.0",
"optional": true,
"os": [
@ -900,6 +960,9 @@
"cpu": [
"x64"
],
"libc": [
"glibc"
],
"license": "Apache-2.0",
"optional": true,
"os": [
@ -922,6 +985,9 @@
"cpu": [
"arm64"
],
"libc": [
"musl"
],
"license": "Apache-2.0",
"optional": true,
"os": [
@ -944,6 +1010,9 @@
"cpu": [
"x64"
],
"libc": [
"musl"
],
"license": "Apache-2.0",
"optional": true,
"os": [
@ -1211,6 +1280,9 @@
"cpu": [
"arm64"
],
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@ -1227,6 +1299,9 @@
"cpu": [
"arm64"
],
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@ -1243,6 +1318,9 @@
"cpu": [
"x64"
],
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@ -1259,6 +1337,9 @@
"cpu": [
"x64"
],
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@ -2201,6 +2282,9 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@ -2218,6 +2302,9 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@ -2235,6 +2322,9 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@ -2252,6 +2342,9 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@ -2413,7 +2506,6 @@
"integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==",
"devOptional": true,
"license": "MIT",
"peer": true,
"dependencies": {
"csstype": "^3.2.2"
}
@ -2424,7 +2516,6 @@
"integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==",
"devOptional": true,
"license": "MIT",
"peer": true,
"peerDependencies": {
"@types/react": "^19.2.0"
}
@ -2474,7 +2565,6 @@
"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",
@ -2831,6 +2921,9 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@ -2845,6 +2938,9 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@ -2859,6 +2955,9 @@
"loong64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@ -2873,6 +2972,9 @@
"loong64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@ -2887,6 +2989,9 @@
"ppc64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@ -2901,6 +3006,9 @@
"riscv64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@ -2915,6 +3023,9 @@
"riscv64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@ -2929,6 +3040,9 @@
"s390x"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@ -2943,6 +3057,9 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@ -2957,6 +3074,9 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@ -3055,7 +3175,6 @@
"integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@ -3411,7 +3530,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.11.12",
"caniuse-lite": "^1.0.30001809",
@ -4028,7 +4146,6 @@
"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",
@ -4214,7 +4331,6 @@
"integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@rtsao/scc": "^1.1.0",
"array-includes": "^3.1.9",
@ -5702,6 +5818,9 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@ -5723,6 +5842,9 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@ -5744,6 +5866,9 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@ -5765,6 +5890,9 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@ -6448,7 +6576,6 @@
"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"
}
@ -6458,7 +6585,6 @@
"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"
},
@ -7235,7 +7361,6 @@
"integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@ -7398,7 +7523,6 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@ -7719,7 +7843,6 @@
"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"
}

View file

@ -1,11 +0,0 @@
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";
export default function ProfilePage() {
return <section>
<ProfilePageHeadLine title='پروفایل من' />
<ProfilePersonDetailCard />
<ProfileListMenu />
</section>
}

View file

@ -1,16 +0,0 @@
import ProfilePageHeadLine from '@/components/profile/profile-page-head-line'
import TransactionHistory from '@/components/wallet/transaction-history'
import WalletBlancCard from '@/components/wallet/wallet-blanc-card'
const WalletPage = () => {
return (
<section>
<ProfilePageHeadLine title='کیف پول من' />
<WalletBlancCard />
<ProfilePageHeadLine title='تاریخچه تراکنش‌ها' />
<TransactionHistory />
</section>
)
}
export default WalletPage

View file

@ -1,17 +0,0 @@
import { requireSession } from '@/lib/auth/session';
import React from 'react'
interface ProfileLayoutInterface {
children: React.ReactNode;
}
const ProfileLayout = async ({ children }: ProfileLayoutInterface) => {
await requireSession("/profile");
return <main className='max-w-5xl mx-auto w-full p-4'>
{children}
</main>
}
export default ProfileLayout

View file

@ -0,0 +1,23 @@
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>
);
}

View file

@ -1,36 +0,0 @@
'use client';
import { ChevronLeft, LogOutIcon } from "lucide-react"
import { useRouter } from "next/navigation";
import { useTransition } from "react";
const ProfileExitAccount = () => {
const router = useRouter();
const [isPending, startTransition] = useTransition();
function handleLogout() {
startTransition(async () => {
await fetch("/api/auth/logout", { method: "POST" });
router.push("/");
router.refresh();
});
}
return <div
className={`
flex items-center justify-between w-full py-3 cursor-pointer
`}
onClick={handleLogout}
>
<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

View file

@ -1,38 +0,0 @@
'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;

View file

@ -1,41 +0,0 @@
'use client';
import {
ShoppingBag,
MapPin,
Wallet,
Bell,
Headset,
CircleQuestionMark
} from 'lucide-react';
import ProfileMenuItem from './profile-menu-item';
import ProfileExitAccount from './profile-exit-account';
const menuItems = [
{ id: 1, href: '/addresses', text: 'سعادت‌آباد', icon: <MapPin className="size-5 text-[#223D5D]" /> },
{ id: 2, href: '/orders', text: 'سفارش‌های من', icon: <ShoppingBag className="size-5 text-[#223D5D]" /> },
{ id: 3, href: '/addresses', text: 'آدرس‌های من', icon: <MapPin className="size-5 text-[#223D5D]" /> },
{ id: 4, href: '/profile/wallet', text: 'کیف پول', icon: <Wallet className="size-5 text-[#223D5D]" /> },
{ id: 5, href: '/profile/notifications', text: 'اعلان‌ها', icon: <Bell className="size-5 text-[#223D5D]" /> },
{ id: 6, href: '/profile/support', text: 'پشتیبانی', icon: <CircleQuestionMark className="size-5 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;

View file

@ -1,11 +0,0 @@
import React from 'react'
interface ProfilePageHeadLineInterface {
title: String;
}
const ProfilePageHeadLine = ({ title }: ProfilePageHeadLineInterface) => {
return <h1 className="font-bold text-2xl">{title}</h1>
}
export default ProfilePageHeadLine

View file

@ -1,22 +0,0 @@
'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

View file

@ -1,38 +0,0 @@
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;

View file

@ -1,48 +0,0 @@
import React from 'react';
import { ArrowDownCircle, ArrowDownIcon, ArrowUp, ArrowUpCircle } from 'lucide-react';
import { formatPriceWithToman } from '@/lib/utils/priceUtils';
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]';
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 ? '+' : '-'} {formatPriceWithToman(amount)}
</span>
<span className="text-sm text-gray-500">۱۴۰۳/۰۸/۲۴</span>
</div>
</div>
);
};
export default TransactionItem;

View file

@ -1,28 +0,0 @@
'use client';
import { formatPriceWithToman } from '@/lib/utils/priceUtils';
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'>{formatPriceWithToman(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

View file

@ -1,42 +0,0 @@
/**
* Converts Rial to Toman (divides by 10)
*/
export const convertRialToToman = (rialAmount: number): number => {
return Math.round(rialAmount / 10);
};
/**
* Formats number with comma separators (e.g., 3,000,000)
*/
export const formatNumberWithCommas = (amount: number): string => {
return amount.toLocaleString('fa-IR'); // for Persian digits
// Or for English digits: return amount.toLocaleString('en-US');
};
/**
* Main function: receives amount in Rial or Toman, returns formatted with comma separators and "Toman" label
*
* @param amount - input amount (in Rial or Toman)
* @param inputIsRial - whether the input amount is in Rial (default: true)
* @returns string - formatted amount with Toman label (e.g., "۳,۰۰۰,۰۰۰ تومان")
*/
export const formatPriceWithToman = (
amount: number,
inputIsRial: boolean = true
): string => {
// If amount is in Rial, convert to Toman first
const tomanAmount = inputIsRial ? convertRialToToman(amount) : amount;
// Add comma separators
const formatted = formatNumberWithCommas(tomanAmount);
// Return with Toman label
return `${formatted} تومان`;
};
/**
* Simpler version: just take an amount in Toman and format it
*/
export const formatTomanPrice = (tomanAmount: number): string => {
return `${formatNumberWithCommas(tomanAmount)} تومان`;
};