From caace928ac81c284629ee50942d72179d4da9784 Mon Sep 17 00:00:00 2001
From: Biswa Kalyan Bhuyan <biswa@surgot.in>
Date: Thu, 24 Apr 2025 09:13:07 +0530
Subject: feat: Fix loan API type assertion and complete core loan features

- Resolve interface conversion panic in loan handlers by correcting
  user type assertions from *models.User to models.User
- Finalize loan management API integration with frontend components
- Implement remaining loan calculation logic and CRUD operations
- Connect loan display components to backend APIs as per Phase 3
- Update project status in README.md to reflect completed loan features
- Add CORS middleware configuration for frontend-backend communication

This commit completes core loan management functionality and fixes critical
type safety issues in the API handlers, enabling proper user context handling.
---
 .../src/components/shared/NotificationContext.tsx  | 55 ++++++++++++++++++++++
 1 file changed, 55 insertions(+)
 create mode 100644 frontend/src/components/shared/NotificationContext.tsx

(limited to 'frontend/src/components/shared/NotificationContext.tsx')

diff --git a/frontend/src/components/shared/NotificationContext.tsx b/frontend/src/components/shared/NotificationContext.tsx
new file mode 100644
index 0000000..a8f6454
--- /dev/null
+++ b/frontend/src/components/shared/NotificationContext.tsx
@@ -0,0 +1,55 @@
+'use client';
+
+import { createContext, useContext, useState, ReactNode } from 'react';
+import { Notification, NotificationType } from './Notification';
+
+type NotificationData = {
+  id: string;
+  type: NotificationType;
+  message: string;
+  duration?: number;
+};
+
+interface NotificationContextType {
+  showNotification: (type: NotificationType, message: string, duration?: number) => void;
+  hideNotification: (id: string) => void;
+}
+
+const NotificationContext = createContext<NotificationContextType | undefined>(undefined);
+
+export function NotificationProvider({ children }: { children: ReactNode }) {
+  const [notifications, setNotifications] = useState<NotificationData[]>([]);
+
+  const showNotification = (type: NotificationType, message: string, duration?: number) => {
+    const id = Math.random().toString(36).substring(2, 9);
+    setNotifications(prev => [...prev, { id, type, message, duration }]);
+    return id;
+  };
+
+  const hideNotification = (id: string) => {
+    setNotifications(prev => prev.filter(notification => notification.id !== id));
+  };
+
+  return (
+    <NotificationContext.Provider value={{ showNotification, hideNotification }}>
+      {children}
+      {notifications.map(notification => (
+        <Notification
+          key={notification.id}
+          type={notification.type}
+          message={notification.message}
+          duration={notification.duration}
+          onClose={() => hideNotification(notification.id)}
+        />
+      ))}
+    </NotificationContext.Provider>
+  );
+}
+
+export function useNotification() {
+  const context = useContext(NotificationContext);
+  if (context === undefined) {
+    throw new Error('useNotification must be used within a NotificationProvider');
+  }
+  return context;
+} 
\ No newline at end of file
-- 
cgit v1.2.3-59-g8ed1b

