Files
IB/src/app/(main)/accounts/account_details/page.tsx
tomosa.sarkar 10a3da8949 fix: Homepage design
wip :Integrate quick pay for own bank
wip: Design account page as discussed
2025-07-20 11:23:07 +05:30

180 lines
7.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use client";
import React, { useEffect, useState } from "react";
import {
Group,
Paper,
Select,
Stack,
Text,
Title,
} from "@mantine/core";
import { notifications } from "@mantine/notifications";
import { useRouter } from "next/navigation";
import { useSearchParams } from "next/navigation";
interface accountData {
stAccountNo: string;
stAccountType: string;
stAvailableBalance: string;
custname: string;
stBookingNumber: string;
stApprovedAmount?: string; // optional for loan accounts
}
export default function AccountDetails() {
const router = useRouter();
const [accountOptions, setAccountOptions] = useState<{ value: string; label: string }[]>([]);
const [selectedAccNo, setSelectedAccNo] = useState<string | null>(null);
const [authorized, setAuthorized] = useState<boolean | null>(null);
const [accountDetails, setAccountDetails] = useState<accountData | null>(null);
const searchParams = useSearchParams();
const passedAccNo = searchParams.get("accNo");
useEffect(() => {
const token = localStorage.getItem("access_token");
if (!token) {
setAuthorized(false);
router.push("/login");
} else {
setAuthorized(true);
}
}, []);
useEffect(() => {
if (authorized) {
const saved = sessionStorage.getItem("accountData");
if (saved) {
const parsed: accountData[] = JSON.parse(saved);
const options = parsed.map((acc) => ({
label: `${acc.stAccountNo} - ${acc.stAccountType}`,
value: acc.stAccountNo,
}));
setAccountOptions(options);
if (passedAccNo) {
handleAccountSelection(passedAccNo);
}
}
}
}, [authorized]);
const handleAccountSelection = async (accNo: string | null) => {
setSelectedAccNo(accNo);
setAccountDetails(null);
if (!accNo) return;
try {
const token = localStorage.getItem("access_token");
const response = await fetch("/api/customer", {
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
});
const data: accountData[] = await response.json();
if (response.ok && Array.isArray(data)) {
const matched = data.find((acc) => acc.stAccountNo === accNo);
if (matched) {
// Simulate approvedBalance for loan accounts
if (matched.stAccountType.toUpperCase().includes("LN")) {
matched.stApprovedAmount = (
parseFloat(matched.stAvailableBalance) + 20000
).toFixed(2); // dummy logic
}
setAccountDetails(matched);
} else {
notifications.show({
withBorder: true,
color: "orange",
title: "Account not found",
message: "Selected account was not found in the response.",
});
}
} else {
throw new Error("Invalid response");
}
} catch (err) {
notifications.show({
withBorder: true,
color: "red",
title: "Fetch failed",
message: "Could not fetch account details. Try again.",
});
}
};
if (!authorized) return null;
return (
<Paper shadow="sm" radius="md" p="md" withBorder h={400}>
<Title order={3} mb="md">
Account Details
</Title>
<Stack gap="md">
<Select
label="Select Account Number"
placeholder="Choose account number"
data={accountOptions}
value={selectedAccNo}
onChange={handleAccountSelection}
searchable
/>
{accountDetails && (
<Paper withBorder p="md" radius="md" bg="gray.0">
<Stack gap="sm">
<Group p="apart">
<Text size="sm" fw={500} c="dimmed">Account Number</Text>
<Text size="md">{accountDetails.stAccountNo}</Text>
</Group>
<Group p="apart">
<Text size="sm" fw={500} c="dimmed">Account Type</Text>
<Text size="md">{accountDetails.stAccountType}</Text>
</Group>
<Group p="apart">
<Text size="sm" fw={500} c="dimmed">Description</Text>
<Text size="md">{accountDetails.stBookingNumber}</Text>
</Group>
{/* Show Loan-specific fields */}
{accountDetails.stAccountType.toUpperCase().includes("LN") ? (
<>
<Group p="apart">
<Text size="sm" fw={500} c="dimmed">Approved Balance</Text>
<Text size="md" c="gray.8">
{parseFloat(accountDetails.stApprovedAmount || "0").toLocaleString("en-IN", {
minimumFractionDigits: 2,
})}
</Text>
</Group>
<Group p="apart">
<Text size="sm" fw={500} c="dimmed">Available Balance</Text>
<Text size="md" c="red">
{parseFloat(accountDetails.stAvailableBalance).toLocaleString("en-IN", {
minimumFractionDigits: 2,
})}
</Text>
</Group>
</>
) : (
<Group p="apart">
<Text size="sm" fw={500} c="dimmed">Available Balance</Text>
<Text size="md" c="green">
{parseFloat(accountDetails.stAvailableBalance).toLocaleString("en-IN", {
minimumFractionDigits: 2,
})}
</Text>
</Group>
)}
</Stack>
</Paper>
)}
</Stack>
</Paper>
);
}