import type { MetaFunction } from "@remix-run/node"; import { ArrowRight, Check, X, Loader2 } from "lucide-react"; import { formatDate, formatPrice, formatTime, safeGoBack } from "../utils/helpers"; import { useNavigate } from "@remix-run/react"; import { useState } from "react"; import { Button } from "../components/ui/button"; import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, } from "../components/ui/drawer"; import { RadioGroup, RadioGroupItem } from "../components/ui/radio-group"; import PersianDatePicker from "../components/PersianDatePicker"; import { useSearchParams, useParams } from "react-router-dom"; import { useServiceGetPayoutRequests } from "../requestHandler/use-wallet-hooks"; import { useRequireOwner } from "../hooks/useStoreOwnership"; import jMoment from "moment-jalaali"; import filterIcon from "~/assets/icons/filter.png"; import filterIconDark from "~/assets/icons/filter-dark.png"; import { useRootData } from "~/hooks/use-root-data"; export const meta: MetaFunction = () => { return [ { title: "لیست تراکنش‌ها - ویترون" }, { name: "description", content: "مشاهده و پیگیری تمام تراکنش‌های مالی فروشگاه شما در ویترون. فیلتر زمانی و جزئیات تراکنش‌ها.", }, { name: "keywords", content: "تراکنش، تراکنش مالی، برداشت وجه، تاریخچه مالی، فروشگاه، ویترون", }, { name: "robots", content: "noindex, follow" }, { property: "og:title", content: "لیست تراکنش‌ها - ویترون" }, { property: "og:description", content: "مشاهده و پیگیری تمام تراکنش‌های مالی فروشگاه شما در ویترون. فیلتر زمانی و جزئیات تراکنش‌ها.", }, { property: "og:type", content: "website" }, { name: "twitter:card", content: "summary" }, { name: "twitter:title", content: "لیست تراکنش‌ها - ویترون" }, { name: "twitter:description", content: "مشاهده و پیگیری تمام تراکنش‌های مالی فروشگاه شما در ویترون. فیلتر زمانی و جزئیات تراکنش‌ها.", }, ]; }; export default function Transactions() { const navigate = useNavigate(); const { storeId } = useParams(); useRequireOwner(storeId); // financial is owner-only const [isFilterDrawerOpen, setIsFilterDrawerOpen] = useState(false); const [searchParams] = useSearchParams(); const { theme } = useRootData(); // Convert Persian date to Gregorian ISO string const convertPersianToGregorian = (persianDate: string): string => { // Persian date format is expected to be YYYY/MM/DD const [year, month, day] = persianDate.split("/"); const jMomentDate = jMoment(`${year}/${month}/${day}`, "jYYYY/jM/jD"); return jMomentDate.format("YYYY-MM-DD"); }; // Map URL params to API filters const getFilters = () => { const order = searchParams.get("order") as | "all" | "today" | "lastWeek" | "lastMonth" | "other"; const fromDate = searchParams.get("fromDate"); const toDate = searchParams.get("toDate"); if (!order || order === "all") { return undefined; } // Map URL params to API params const apiFilters: { dateFilter?: "today" | "last_7" | "last_30" | "custom"; fromDate?: string; toDate?: string; } = {}; switch (order) { case "today": apiFilters.dateFilter = "today"; break; case "lastWeek": apiFilters.dateFilter = "last_7"; break; case "lastMonth": apiFilters.dateFilter = "last_30"; break; case "other": // Allow custom filter even with only one date (fromDate OR toDate) if (fromDate || toDate) { apiFilters.dateFilter = "custom"; if (fromDate) { try { apiFilters.fromDate = convertPersianToGregorian(fromDate); } catch (error) { console.error("Error converting fromDate:", error); apiFilters.fromDate = fromDate; // fallback to original } } if (toDate) { try { apiFilters.toDate = convertPersianToGregorian(toDate); } catch (error) { console.error("Error converting toDate:", error); apiFilters.toDate = toDate; // fallback to original } } } break; } return Object.keys(apiFilters).length > 0 ? apiFilters : undefined; }; const { data: payoutRequests, isLoading } = useServiceGetPayoutRequests(getFilters()); const handleBack = () => { safeGoBack(navigate); }; const filterIconClicked = () => { setIsFilterDrawerOpen(true); }; return (
{/* Header (keeps the filter button; just constrained on desktop) */}

لیست تراکنش‌ها

{ filterIconClicked(); }} role="button" tabIndex={0} onKeyDown={(e) => { if (e.key === "Enter") { filterIconClicked(); } }} className="absolute top-4 h-8 w-8 left-5 rounded-full bg-WHITE shadow-xl flex items-center justify-center" > filter
{isLoading ? (
) : payoutRequests && payoutRequests.length > 0 ? ( payoutRequests.map((request) => (

{request.requestedAt ? formatDate(request.requestedAt) : "تاریخ نامشخص"}

{request.requestedAt ? formatTime(request.requestedAt) : ""}

{request.status === "completed" ? (

موفق

) : request.status === "rejected" ? (

ناموفق

) : (

در انتظار

)}

مبلغ

{formatPrice(request.amount)}

{request.bankAccountCardNumber && (

شماره کارت:

{request.bankAccountCardNumber}

)} {request.bankAccountIban && (

شماره شبا:

{request.bankAccountIban}

)} {request.shomareMarja && (

شماره مرجع بانک:

{request.shomareMarja}

)} {request.shomareErja && (

شماره ارجاع:

{request.shomareErja}

)} {request.processedAt && (

تاریخ پردازش:

{formatDate(request.processedAt)}{" "} {formatTime(request.processedAt)}

)}
)) ) : (

هیچ تراکنشی یافت نشد

هنوز درخواست برداشتی ثبت نکرده‌اید

)}
setIsFilterDrawerOpen(false)} />
); } type dateRangeTypes = "all" | "today" | "lastWeek" | "lastMonth" | "other"; const FilterDrawer = ({ isOpen, onClose, }: { isOpen: boolean; onClose: () => void; }) => { const [searchParams, setSearchParams] = useSearchParams(); // Date states for custom range const [order, setOrder] = useState( (searchParams.get("order") as dateRangeTypes) || "all" ); const [fromDate, setFromDate] = useState( searchParams.get("fromDate") || "" ); const [toDate, setToDate] = useState( searchParams.get("toDate") || "" ); const filterTransactions = () => { const params: Record = {}; if (order !== "all") { params.order = order; } // Only include date params if order is "other" (custom) if (order === "other") { if (fromDate) { params.fromDate = fromDate; } if (toDate) { params.toDate = toDate; } } // For non-custom filters, fromDate and toDate are intentionally not included // This will remove them from the URL params setSearchParams(params, { replace: true }); onClose(); }; return (
onClose()} /> فیلتر نتایج
setOrder(value as dateRangeTypes)} value={order} >
{/* Custom Date Range Picker */} {order === "other" && (
{/* From Date */}
{/* To Date */}
)}
); };