From 2e759db70f1906a3d03a7b82d02d9e7b5d69bb15 Mon Sep 17 00:00:00 2001 From: Tashif Ahmad Khan Date: Sun, 9 Nov 2025 21:26:26 +0530 Subject: [PATCH 1/8] updated jportal version --- jportal/src/App.jsx | 33 +++++++++++++++++++++++++++++++- jportal/src/components/Login.jsx | 2 +- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/jportal/src/App.jsx b/jportal/src/App.jsx index 1eb4fab..ffe1be3 100644 --- a/jportal/src/App.jsx +++ b/jportal/src/App.jsx @@ -15,7 +15,7 @@ import { DynamicFontLoader } from "./components/DynamicFontLoader"; import { Toaster } from "./components/ui/sonner"; import "./App.css"; -import { WebPortal, LoginError } from "https://cdn.jsdelivr.net/npm/jsjiit@0.0.20/dist/jsjiit.esm.js"; +import { WebPortal, LoginError } from "https://cdn.jsdelivr.net/npm/jsjiit@0.0.22/dist/jsjiit.esm.js"; import MockWebPortal from "./components/MockWebPortal"; import { TriangleAlert } from "lucide-react"; @@ -297,6 +297,37 @@ function App() { setIsDemoMode(true); }; + // After authentication (including auto-login), fetch and print fee summary and pending fines + useEffect(() => { + if (!isAuthenticated) return; + + const portal = isDemoMode ? mockPortal : realPortal; + + const fetchAndLogPayments = async () => { + try { + const feeSummary = await portal.get_fee_summary(); + console.log("[Portal] Fee summary:", feeSummary); + } catch (err) { + console.error("[Portal] Failed to fetch fee summary:", err); + } + + try { + const fines = await portal.get_fines_msc_charges(); + console.log("[Portal] Pending miscellaneous charges / fines:", fines); + } catch (err) { + // The API may return Failure with message "NO APPROVED REQUEST FOUND" when there are no fines + if (err && err.message && err.message.includes("NO APPROVED REQUEST FOUND")) { + console.info("[Portal] No pending fines found (NO APPROVED REQUEST FOUND)."); + } else { + console.error("[Portal] Failed to fetch pending fines:", err); + } + } + }; + + // Do not block UI - fire and forget + fetchAndLogPayments(); + }, [isAuthenticated, isDemoMode]); + if (isLoading) { return ( <> diff --git a/jportal/src/components/Login.jsx b/jportal/src/components/Login.jsx index 3c39c1d..0e6e6e7 100644 --- a/jportal/src/components/Login.jsx +++ b/jportal/src/components/Login.jsx @@ -7,7 +7,7 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/com import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { toast } from "sonner"; -import { LoginError } from "https://cdn.jsdelivr.net/npm/jsjiit@0.0.20/dist/jsjiit.esm.js"; +import { LoginError } from "https://cdn.jsdelivr.net/npm/jsjiit@0.0.22/dist/jsjiit.esm.js"; import PublicHeader from "./PublicHeader"; // Define the form schema From 052f59854a8af03b8ddb47773235ca65ce59fbe2 Mon Sep 17 00:00:00 2001 From: Tashif Ahmad Khan Date: Sun, 9 Nov 2025 21:27:16 +0530 Subject: [PATCH 2/8] added componet from the testing branch --- jportal/src/components/Fees.jsx | 476 ++++++++++++++++++++++++++++++++ 1 file changed, 476 insertions(+) create mode 100644 jportal/src/components/Fees.jsx diff --git a/jportal/src/components/Fees.jsx b/jportal/src/components/Fees.jsx new file mode 100644 index 0000000..37605ad --- /dev/null +++ b/jportal/src/components/Fees.jsx @@ -0,0 +1,476 @@ +import React, { useState, useEffect } from "react"; +import Loader from "./Loader"; +import { Tabs, TabsList, TabsTrigger, TabsContent } from "./ui/tabs"; +import { useSwipeable } from "react-swipeable"; +import TopTabsBar from "./ui/TopTabsBar"; +import { useTheme } from "./ThemeProvider"; +import { AlertCircle, CheckCircle, DollarSign, FileText, TrendingUp } from "lucide-react"; + +export default function Fees({ w, feesData, setFeesData, guest = false }) { + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [activeTab, setActiveTab] = useState("fines"); + + const { theme, customThemes, selectedCustomTheme, useCardBackgrounds } = + useTheme(); + + const accentSeparator = + theme === "custom" + ? customThemes[selectedCustomTheme]?.colors["--accent-color"] || "#7ec3f0" + : theme === "white" + ? "#3182ce" + : theme === "cream" + ? "#A47551" + : theme === "amoled" + ? "#00bcd4" + : "#7ec3f0"; + + const separatorStyle = !useCardBackgrounds + ? { + borderBottom: `1px solid ${accentSeparator}66`, + margin: "2px 0", + minHeight: 0, + height: 0, + } + : {}; + + // Tab order for swiping + const tabOrder = ["fines", "summary"]; + + // Swipe handlers for tab navigation + const swipeHandlers = useSwipeable({ + onSwipedLeft: () => { + const currentIndex = tabOrder.indexOf(activeTab); + if (currentIndex < tabOrder.length - 1) { + setActiveTab(tabOrder[currentIndex + 1]); + } + }, + onSwipedRight: () => { + const currentIndex = tabOrder.indexOf(activeTab); + if (currentIndex > 0) { + setActiveTab(tabOrder[currentIndex - 1]); + } + }, + preventDefaultTouchmoveEvent: true, + trackMouse: true, + delta: 50, + swipeDuration: 500, + }); + + useEffect(() => { + const fetchFeesData = async () => { + // Return early if data is already cached + if (feesData) { + setLoading(false); + return; + } + + setLoading(true); + setError(null); + try { + const [finesData, summaryData] = await Promise.all([ + w.get_fines_msc_charges().catch((err) => { + // If the API returns "NO APPROVED REQUEST FOUND", treat it as empty array + if (err.message?.includes("NO APPROVED REQUEST FOUND")) { + return []; + } + throw err; + }), + w.get_fee_summary(), + ]); + + setFeesData({ + fines: Array.isArray(finesData) ? finesData : [], + summary: summaryData || {}, + }); + + // Debug logs + try { + console.groupCollapsed("Fees: API responses"); + console.log("finesData:", Array.isArray(finesData) ? finesData : []); + console.log("summaryData (raw):", summaryData); + console.groupEnd(); + } catch (e) { + console.warn("Failed to log fee data for debug", e); + } + } catch (error) { + console.error("Failed to fetch fees data:", error); + setError(error.message || "Failed to load fees data"); + } finally { + setLoading(false); + } + }; + + fetchFeesData(); + }, [w, feesData, setFeesData]); + + if (loading) { + return ; + } + + if (error) { + return ( +
+
+ +

{error}

+
+
+ ); + } + + const finesArray = feesData?.fines || []; + const summaryData = feesData?.summary || {}; + const feeHeads = summaryData.feeHeads || []; + const studentInfo = summaryData.studentInfo?.[0] || {}; + const advanceAmount = summaryData.advanceamount?.[0]?.amount || 0; + + // Helper function to format currency + const formatCurrency = (amount) => { + if (amount === null || amount === undefined) return "N/A"; + const num = parseFloat(amount); + if (isNaN(num)) return "N/A"; + return `₹${num.toLocaleString("en-IN", { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + })}`; + }; + + // Calculate total fines + const totalFines = finesArray.reduce((sum, fine) => { + return sum + (parseFloat(fine.charge) || parseFloat(fine.feeamounttobepaid) || 0); + }, 0); + + // Calculate summary totals from feeHeads + const totalFeeAmount = feeHeads.reduce((sum, head) => sum + (parseFloat(head.feeamount) || 0), 0); + const totalReceived = feeHeads.reduce((sum, head) => sum + (parseFloat(head.receiveamount) || 0), 0); + const totalDue = feeHeads.reduce((sum, head) => sum + (parseFloat(head.dueamount) || 0), 0); + const totalRefund = feeHeads.reduce((sum, head) => sum + (parseFloat(head.refundamount) || 0), 0); + + return ( +
+ {guest && ( +
+ Guest Demo: Viewing Sample Data +
+ )} + +
+ + {/* Sidebar Tabs for large screens */} +
+ + + + Pending Fines + + + + Fee Summary + + +
+ + {/* Main Content */} +
+ {/* TabsList for mobile only */} +
+ + + Pending Fines + + + Fee Summary + + +
+ + {/* Pending Fines Tab */} + +
+ {finesArray.length > 0 ? ( + <> + {/* Total Fines Summary Card */} +
+
+
+

Total Fines Pending

+

+ {formatCurrency(totalFines)} +

+
+ +
+
+ + {/* Individual Fines */} + {finesArray.map((fine, index) => ( +
+
+
+

+ {fine.servicename || "Miscellaneous Charge"} +

+

+ {fine.remarksbyauthority || "No remarks"} +

+
+ + {formatCurrency(fine.charge || fine.feeamounttobepaid)} + +
+ +
+ {fine.servicecode && ( +
+ Service +

+ {fine.servicecode} +

+
+ )} + {fine.requestno && ( +
+ Request No +

+ {fine.requestno} +

+
+ )} + {fine.quantity && ( +
+ Quantity +

+ {fine.quantity} +

+
+ )} +
+ + {fine.remarksbystudents && ( +
+ + Student Remarks + +

+ {fine.remarksbystudents} +

+
+ )} +
+ ))} + + ) : ( +
+ +

+ No Pending Fines +

+

+ You don't have any pending fines or miscellaneous charges. +

+
+ )} +
+
+ + {/* Fee Summary Tab */} + +
+ {/* Overall Summary Cards */} +
+ {/* Total Fee Card */} +
+
+
+

Total Fee

+

+ {formatCurrency(totalFeeAmount)} +

+
+ +
+
+ + {/* Total Received Card */} +
+
+
+

Total Received

+

+ {formatCurrency(totalReceived)} +

+
+ +
+
+ + {/* Total Due Card */} +
+
+
+

Total Due

+

+ {formatCurrency(totalDue)} +

+
+ +
+
+ + {/* Advance/Refund Card */} + {(advanceAmount > 0 || totalRefund > 0) && ( +
+
+
+

+ {advanceAmount > 0 ? "Advance" : "Refund"} +

+

+ {formatCurrency(advanceAmount > 0 ? advanceAmount : totalRefund)} +

+
+ +
+
+ )} +
+ + {/* Fee Heads by Semester/Event */} + {feeHeads.length > 0 && ( +
+

+ Fee Breakdown by Semester +

+ +
+ {feeHeads.map((head, idx) => { + const academicYear = head.academicyear || "N/A"; + const semester = head.stynumber ? `Semester ${head.stynumber}` : "N/A"; + const feeAmount = parseFloat(head.feeamount) || 0; + const received = parseFloat(head.receiveamount) || 0; + const due = parseFloat(head.dueamount) || 0; + const refund = parseFloat(head.refundamount) || 0; + + return ( +
+
+
+

+ {semester} ({academicYear}) +

+

+ Event: {head.eventid} +

+
+ + {head.stytypedesc || "Regular"} + +
+ +
+
+ Fee Amount +

+ {formatCurrency(feeAmount)} +

+
+
+ Received +

+ {formatCurrency(received)} +

+
+
+ Due +

+ {formatCurrency(due)} +

+
+ {refund > 0 && ( +
+ Refund +

+ {formatCurrency(refund)} +

+
+ )} +
+ + {/* Waiver, Transfer details if present */} + {(parseFloat(head.waiveramount) > 0 || + parseFloat(head.transferinamount) > 0 || + parseFloat(head.transferoutamount) > 0) && ( +
+ {parseFloat(head.waiveramount) > 0 && ( +
+ Waived +

+ {formatCurrency(head.waiveramount)} +

+
+ )} + {parseFloat(head.transferinamount) > 0 && ( +
+ Transfer In +

+ {formatCurrency(head.transferinamount)} +

+
+ )} + {parseFloat(head.transferoutamount) > 0 && ( +
+ Transfer Out +

+ {formatCurrency(head.transferoutamount)} +

+
+ )} +
+ )} +
+ ); + })} +
+
+ )} + +
+
+
+
+
+
+ ); +} From 375636493a9b59e5d02da8986797d04785535811 Mon Sep 17 00:00:00 2001 From: Tashif Ahmad Khan Date: Sun, 9 Nov 2025 21:36:28 +0530 Subject: [PATCH 3/8] updated to use the new themeing system --- jportal/src/components/Fees.jsx | 148 +++++++++++++++----------------- 1 file changed, 67 insertions(+), 81 deletions(-) diff --git a/jportal/src/components/Fees.jsx b/jportal/src/components/Fees.jsx index 37605ad..204522b 100644 --- a/jportal/src/components/Fees.jsx +++ b/jportal/src/components/Fees.jsx @@ -3,7 +3,7 @@ import Loader from "./Loader"; import { Tabs, TabsList, TabsTrigger, TabsContent } from "./ui/tabs"; import { useSwipeable } from "react-swipeable"; import TopTabsBar from "./ui/TopTabsBar"; -import { useTheme } from "./ThemeProvider"; +import { useThemeStore } from "@/stores/theme-store"; import { AlertCircle, CheckCircle, DollarSign, FileText, TrendingUp } from "lucide-react"; export default function Fees({ w, feesData, setFeesData, guest = false }) { @@ -11,28 +11,14 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) { const [error, setError] = useState(null); const [activeTab, setActiveTab] = useState("fines"); - const { theme, customThemes, selectedCustomTheme, useCardBackgrounds } = - useTheme(); + // Subscribe to theme store to ensure re-renders on theme changes + const themeState = useThemeStore((state) => state.themeState); - const accentSeparator = - theme === "custom" - ? customThemes[selectedCustomTheme]?.colors["--accent-color"] || "#7ec3f0" - : theme === "white" - ? "#3182ce" - : theme === "cream" - ? "#A47551" - : theme === "amoled" - ? "#00bcd4" - : "#7ec3f0"; - - const separatorStyle = !useCardBackgrounds - ? { - borderBottom: `1px solid ${accentSeparator}66`, - margin: "2px 0", - minHeight: 0, - height: 0, - } - : {}; + // Force re-render when theme changes + const [, setForceUpdate] = useState({}); + useEffect(() => { + setForceUpdate({}); + }, [themeState]); // Tab order for swiping const tabOrder = ["fines", "summary"]; @@ -112,8 +98,8 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) { return (
- -

{error}

+ +

{error}

); @@ -150,7 +136,7 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) { return (
{guest && ( -
+
Guest Demo: Viewing Sample Data
)} @@ -169,14 +155,14 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) { > Pending Fines Fee Summary @@ -197,13 +183,13 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) { > Pending Fines Fee Summary @@ -216,11 +202,11 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) { {finesArray.length > 0 ? ( <> {/* Total Fines Summary Card */} -
+
-

Total Fines Pending

-

+

Total Fines Pending

+

{formatCurrency(totalFines)}

@@ -232,14 +218,14 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) { {finesArray.map((fine, index) => (
-

+

{fine.servicename || "Miscellaneous Charge"}

-

+

{fine.remarksbyauthority || "No remarks"}

@@ -251,24 +237,24 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) {
{fine.servicecode && (
- Service -

+ Service +

{fine.servicecode}

)} {fine.requestno && (
- Request No -

+ Request No +

{fine.requestno}

)} {fine.quantity && (
- Quantity -

+ Quantity +

{fine.quantity}

@@ -276,11 +262,11 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) {
{fine.remarksbystudents && ( -
- +
+ Student Remarks -

+

{fine.remarksbystudents}

@@ -289,12 +275,12 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) { ))} ) : ( -
- -

+
+ +

No Pending Fines

-

+

You don't have any pending fines or miscellaneous charges.

@@ -308,11 +294,11 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) { {/* Overall Summary Cards */}
{/* Total Fee Card */} -
+
-

Total Fee

-

+

Total Fee

+

{formatCurrency(totalFeeAmount)}

@@ -321,37 +307,37 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) {
{/* Total Received Card */} -
+
-

Total Received

-

+

Total Received

+

{formatCurrency(totalReceived)}

- +
{/* Total Due Card */} -
+
-

Total Due

-

+

Total Due

+

{formatCurrency(totalDue)}

- +
{/* Advance/Refund Card */} {(advanceAmount > 0 || totalRefund > 0) && ( -
+
-

+

{advanceAmount > 0 ? "Advance" : "Refund"}

@@ -366,8 +352,8 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) { {/* Fee Heads by Semester/Event */} {feeHeads.length > 0 && ( -

-

+
+

Fee Breakdown by Semester

@@ -383,44 +369,44 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) { return (
-

+

{semester} ({academicYear})

-

+

Event: {head.eventid}

- + {head.stytypedesc || "Regular"}
- Fee Amount -

+ Fee Amount +

{formatCurrency(feeAmount)}

- Received -

+ Received +

{formatCurrency(received)}

- Due -

+ Due +

{formatCurrency(due)}

{refund > 0 && (
- Refund + Refund

{formatCurrency(refund)}

@@ -432,27 +418,27 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) { {(parseFloat(head.waiveramount) > 0 || parseFloat(head.transferinamount) > 0 || parseFloat(head.transferoutamount) > 0) && ( -
+
{parseFloat(head.waiveramount) > 0 && (
- Waived -

+ Waived +

{formatCurrency(head.waiveramount)}

)} {parseFloat(head.transferinamount) > 0 && (
- Transfer In -

+ Transfer In +

{formatCurrency(head.transferinamount)}

)} {parseFloat(head.transferoutamount) > 0 && (
- Transfer Out -

+ Transfer Out +

{formatCurrency(head.transferoutamount)}

From adafed53b855548267c172bf77df25f05193ce80 Mon Sep 17 00:00:00 2001 From: Tashif Ahmad Khan Date: Sun, 9 Nov 2025 21:38:41 +0530 Subject: [PATCH 4/8] removed loader --- jportal/src/components/Fees.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jportal/src/components/Fees.jsx b/jportal/src/components/Fees.jsx index 204522b..e0db380 100644 --- a/jportal/src/components/Fees.jsx +++ b/jportal/src/components/Fees.jsx @@ -1,5 +1,4 @@ import React, { useState, useEffect } from "react"; -import Loader from "./Loader"; import { Tabs, TabsList, TabsTrigger, TabsContent } from "./ui/tabs"; import { useSwipeable } from "react-swipeable"; import TopTabsBar from "./ui/TopTabsBar"; @@ -91,7 +90,7 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) { }, [w, feesData, setFeesData]); if (loading) { - return ; + return

Loading fees data...

; } if (error) { From 2932519e564d6680604cf846f32a86d55006fb10 Mon Sep 17 00:00:00 2001 From: Tashif Ahmad Khan Date: Sun, 9 Nov 2025 21:40:42 +0530 Subject: [PATCH 5/8] removed react-swipeables --- jportal/src/components/Fees.jsx | 30 ++---------------------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/jportal/src/components/Fees.jsx b/jportal/src/components/Fees.jsx index e0db380..8985977 100644 --- a/jportal/src/components/Fees.jsx +++ b/jportal/src/components/Fees.jsx @@ -1,6 +1,5 @@ import React, { useState, useEffect } from "react"; import { Tabs, TabsList, TabsTrigger, TabsContent } from "./ui/tabs"; -import { useSwipeable } from "react-swipeable"; import TopTabsBar from "./ui/TopTabsBar"; import { useThemeStore } from "@/stores/theme-store"; import { AlertCircle, CheckCircle, DollarSign, FileText, TrendingUp } from "lucide-react"; @@ -18,29 +17,7 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) { useEffect(() => { setForceUpdate({}); }, [themeState]); - - // Tab order for swiping - const tabOrder = ["fines", "summary"]; - - // Swipe handlers for tab navigation - const swipeHandlers = useSwipeable({ - onSwipedLeft: () => { - const currentIndex = tabOrder.indexOf(activeTab); - if (currentIndex < tabOrder.length - 1) { - setActiveTab(tabOrder[currentIndex + 1]); - } - }, - onSwipedRight: () => { - const currentIndex = tabOrder.indexOf(activeTab); - if (currentIndex > 0) { - setActiveTab(tabOrder[currentIndex - 1]); - } - }, - preventDefaultTouchmoveEvent: true, - trackMouse: true, - delta: 50, - swipeDuration: 500, - }); + // Theme re-render helper (swipe removed) useEffect(() => { const fetchFeesData = async () => { @@ -170,10 +147,7 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) {
{/* Main Content */} -
+
{/* TabsList for mobile only */}
Date: Sun, 9 Nov 2025 21:45:06 +0530 Subject: [PATCH 6/8] added consistent tabs --- jportal/src/components/Fees.jsx | 73 +++++++++------------------------ 1 file changed, 20 insertions(+), 53 deletions(-) diff --git a/jportal/src/components/Fees.jsx b/jportal/src/components/Fees.jsx index 8985977..9b29790 100644 --- a/jportal/src/components/Fees.jsx +++ b/jportal/src/components/Fees.jsx @@ -1,8 +1,7 @@ import React, { useState, useEffect } from "react"; import { Tabs, TabsList, TabsTrigger, TabsContent } from "./ui/tabs"; -import TopTabsBar from "./ui/TopTabsBar"; import { useThemeStore } from "@/stores/theme-store"; -import { AlertCircle, CheckCircle, DollarSign, FileText, TrendingUp } from "lucide-react"; +import { AlertCircle, CheckCircle, DollarSign, TrendingUp } from "lucide-react"; export default function Fees({ w, feesData, setFeesData, guest = false }) { const [loading, setLoading] = useState(true); @@ -117,60 +116,29 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) {
)} -
+
- {/* Sidebar Tabs for large screens */} -
- + - - - Pending Fines - - - - Fee Summary - - -
- - {/* Main Content */} -
- {/* TabsList for mobile only */} -
- - - Pending Fines - - - Fee Summary - - -
+ Pending Fines + + + Fee Summary + + - {/* Pending Fines Tab */} - + {/* Pending Fines Tab */} +
{finesArray.length > 0 ? ( <> @@ -261,8 +229,8 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) {
- {/* Fee Summary Tab */} - + {/* Fee Summary Tab */} +
{/* Overall Summary Cards */}
@@ -427,7 +395,6 @@ export default function Fees({ w, feesData, setFeesData, guest = false }) {
-
From 6565eb6f72cec5f11bfe54ecf32e61059d75c7c5 Mon Sep 17 00:00:00 2001 From: Tashif Ahmad Khan Date: Sun, 9 Nov 2025 21:45:13 +0530 Subject: [PATCH 7/8] added a fees route --- jportal/src/App.jsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/jportal/src/App.jsx b/jportal/src/App.jsx index ffe1be3..5f00854 100644 --- a/jportal/src/App.jsx +++ b/jportal/src/App.jsx @@ -8,6 +8,7 @@ import Grades from "./components/Grades"; import Exams from "./components/Exams"; import Subjects from "./components/Subjects"; import Profile from "./components/Profile"; +import Fees from "./components/Fees"; import Cloudflare from "@/components/Cloudflare"; import { ThemeProvider } from "./components/theme-provider"; import { ThemeScript } from "./components/theme-script"; @@ -99,6 +100,9 @@ function AuthenticatedApp({ w, setIsAuthenticated, setIsDemoMode }) { const [isAttendanceMetaLoading, setIsAttendanceMetaLoading] = useState(true); const [isAttendanceDataLoading, setIsAttendanceDataLoading] = useState(true); + // Add state for fees data + const [feesData, setFeesData] = useState(null); + return (
@@ -212,6 +216,10 @@ function AuthenticatedApp({ w, setIsAuthenticated, setIsDemoMode }) { } /> } /> + } + />
From cc1b9e462b7af9f6b1f69e913858d73c25323342 Mon Sep 17 00:00:00 2001 From: Tashif Ahmad Khan Date: Tue, 18 Nov 2025 21:43:17 +0530 Subject: [PATCH 8/8] updaed 0.23 to avoid conflict --- jportal/src/App.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jportal/src/App.jsx b/jportal/src/App.jsx index 5f00854..04f7e1c 100644 --- a/jportal/src/App.jsx +++ b/jportal/src/App.jsx @@ -16,7 +16,7 @@ import { DynamicFontLoader } from "./components/DynamicFontLoader"; import { Toaster } from "./components/ui/sonner"; import "./App.css"; -import { WebPortal, LoginError } from "https://cdn.jsdelivr.net/npm/jsjiit@0.0.22/dist/jsjiit.esm.js"; +import { WebPortal, LoginError } from "https://cdn.jsdelivr.net/npm/jsjiit@0.0.23/dist/jsjiit.esm.js"; import MockWebPortal from "./components/MockWebPortal"; import { TriangleAlert } from "lucide-react";