Skip to content

Commit a07b5d6

Browse files
author
igardev
committed
use Modal Provider to simplify the use of confirm and alert modals.
1 parent 30be997 commit a07b5d6

File tree

6 files changed

+254
-260
lines changed

6 files changed

+254
-260
lines changed

tools/server/public/index.html.gz

70 Bytes
Binary file not shown.

tools/server/webui/src/App.tsx

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,24 @@ import { AppContextProvider, useAppContext } from './utils/app.context';
55
import ChatScreen from './components/ChatScreen';
66
import SettingDialog from './components/SettingDialog';
77
import { Toaster } from 'react-hot-toast';
8+
import { ModalProvider } from './components/ModalProvider';
89

910
function App() {
1011
return (
11-
<HashRouter>
12-
<div className="flex flex-row drawer lg:drawer-open">
13-
<AppContextProvider>
14-
<Routes>
15-
<Route element={<AppLayout />}>
16-
<Route path="/chat/:convId" element={<ChatScreen />} />
17-
<Route path="*" element={<ChatScreen />} />
18-
</Route>
19-
</Routes>
20-
</AppContextProvider>
21-
</div>
22-
</HashRouter>
12+
<ModalProvider>
13+
<HashRouter>
14+
<div className="flex flex-row drawer lg:drawer-open">
15+
<AppContextProvider>
16+
<Routes>
17+
<Route element={<AppLayout />}>
18+
<Route path="/chat/:convId" element={<ChatScreen />} />
19+
<Route path="*" element={<ChatScreen />} />
20+
</Route>
21+
</Routes>
22+
</AppContextProvider>
23+
</div>
24+
</HashRouter>
25+
</ModalProvider>
2326
);
2427
}
2528

tools/server/webui/src/components/CustomModals.tsx

Lines changed: 0 additions & 54 deletions
This file was deleted.
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
import React, { createContext, useState, useContext } from 'react';
2+
3+
type ModalContextType = {
4+
showConfirm: (message: string) => Promise<boolean>;
5+
showAlert: (message: string) => Promise<void>;
6+
};
7+
const ModalContext = createContext<ModalContextType>(null!);
8+
9+
export function ModalProvider({ children }: { children: React.ReactNode }) {
10+
const [confirmState, setConfirmState] = useState<{
11+
isOpen: boolean;
12+
message: string;
13+
resolve: ((value: boolean) => void) | null;
14+
}>({ isOpen: false, message: '', resolve: null });
15+
16+
const [alertState, setAlertState] = useState<{
17+
isOpen: boolean;
18+
message: string;
19+
resolve: (() => void) | null;
20+
}>({ isOpen: false, message: '', resolve: null });
21+
22+
const showConfirm = (message: string): Promise<boolean> => {
23+
return new Promise((resolve) => {
24+
setConfirmState({ isOpen: true, message, resolve });
25+
});
26+
};
27+
28+
const showAlert = (message: string): Promise<void> => {
29+
return new Promise((resolve) => {
30+
setAlertState({ isOpen: true, message, resolve });
31+
});
32+
};
33+
34+
const handleConfirm = (result: boolean) => {
35+
confirmState.resolve?.(result);
36+
setConfirmState({ isOpen: false, message: '', resolve: null });
37+
};
38+
39+
const handleAlertClose = () => {
40+
alertState.resolve?.();
41+
setAlertState({ isOpen: false, message: '', resolve: null });
42+
};
43+
44+
return (
45+
<ModalContext.Provider value={{ showConfirm, showAlert }}>
46+
{children}
47+
48+
{/* Confirm Modal */}
49+
{confirmState.isOpen && (
50+
<div className="modal modal-open z-[1000]">
51+
<div className="modal-box">
52+
<h3 className="font-bold text-lg">{confirmState.message}</h3>
53+
<div className="modal-action">
54+
<button
55+
className="btn btn-ghost"
56+
onClick={() => handleConfirm(false)}
57+
>
58+
Cancel
59+
</button>
60+
<button
61+
className="btn btn-error"
62+
onClick={() => handleConfirm(true)}
63+
>
64+
Confirm
65+
</button>
66+
</div>
67+
</div>
68+
</div>
69+
)}
70+
71+
{/* Alert Modal */}
72+
{alertState.isOpen && (
73+
<div className="modal modal-open z-[1000]">
74+
<div className="modal-box">
75+
<h3 className="font-bold text-lg">{alertState.message}</h3>
76+
<div className="modal-action">
77+
<button className="btn" onClick={handleAlertClose}>
78+
OK
79+
</button>
80+
</div>
81+
</div>
82+
</div>
83+
)}
84+
</ModalContext.Provider>
85+
);
86+
}
87+
88+
export function useModals() {
89+
const context = useContext(ModalContext);
90+
if (!context) throw new Error('useModals must be used within ModalProvider');
91+
return context;
92+
}

0 commit comments

Comments
 (0)