Skip to content

Commit 9c43fae

Browse files
committed
feat: add AppLoginPopupProvider for login modal functionality
1 parent fac0fbc commit 9c43fae

File tree

4 files changed

+74
-2
lines changed

4 files changed

+74
-2
lines changed

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
"dotenv": "^16.4.7",
4545
"drizzle-orm": "^0.41.0",
4646
"immer": "^10.1.1",
47-
"instantsearch.css": "^8.5.1",
4847
"jotai": "^2.12.2",
4948
"lottie-react": "^2.4.1",
5049
"lucide-react": "^0.484.0",

src/app/test/page.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
"use client";
2+
3+
import { useLoginPopup } from "@/components/app-login-popup";
4+
import React from "react";
5+
6+
const Page = () => {
7+
const pp = useLoginPopup();
8+
return (
9+
<div>
10+
<button onClick={() => pp.show()}>open</button>
11+
</div>
12+
);
13+
};
14+
15+
export default Page;

src/components/app-login-popup.tsx

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
"use client";
2+
3+
import React, { createContext, useCallback, useContext, useState } from "react";
4+
import {
5+
AlertDialog,
6+
AlertDialogContent,
7+
AlertDialogDescription,
8+
AlertDialogHeader,
9+
AlertDialogTitle,
10+
} from "./ui/alert-dialog";
11+
12+
interface ContextType {
13+
show: () => void;
14+
closeModal: () => void;
15+
}
16+
17+
const Context = createContext<ContextType | undefined>(undefined);
18+
19+
export function AppLoginPopupProvider({
20+
children,
21+
}: {
22+
children: React.ReactNode;
23+
}) {
24+
const [isOpen, setIsOpen] = useState(false);
25+
26+
const show = useCallback(() => {
27+
setIsOpen(true);
28+
}, []);
29+
30+
const closeModal = useCallback(() => {
31+
setIsOpen(false);
32+
}, []);
33+
34+
return (
35+
<Context.Provider value={{ show, closeModal }}>
36+
{children}
37+
<AlertDialog open={isOpen} onOpenChange={setIsOpen}>
38+
<AlertDialogContent aria-describedby={undefined}>
39+
<AlertDialogHeader>
40+
<AlertDialogTitle>Titleee</AlertDialogTitle>
41+
</AlertDialogHeader>
42+
<AlertDialogDescription>COntent</AlertDialogDescription>
43+
</AlertDialogContent>
44+
</AlertDialog>
45+
</Context.Provider>
46+
);
47+
}
48+
49+
export function useLoginPopup() {
50+
const context = useContext(Context);
51+
if (context === undefined) {
52+
throw new Error("useLoginPopup must be used within a ModalProvider");
53+
}
54+
return context;
55+
}

src/components/providers/CommonProviders.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { Provider as JotaiProvider } from "jotai";
1111
import { ThemeProvider } from "next-themes";
1212
import { AppConfirmProvider } from "../app-confirm";
1313
import { AppAlertProvider } from "../app-alert";
14+
import { AppLoginPopupProvider } from "../app-login-popup";
1415

1516
interface Props {
1617
session: SessionResult;
@@ -26,7 +27,9 @@ const CommonProviders: React.FC<PropsWithChildren<Props>> = ({
2627
<SessionProvider session={session}>
2728
<AppConfirmProvider>
2829
<AppAlertProvider>
29-
<ThemeProvider attribute="data-theme">{children}</ThemeProvider>
30+
<AppLoginPopupProvider>
31+
<ThemeProvider attribute="data-theme">{children}</ThemeProvider>
32+
</AppLoginPopupProvider>
3033
</AppAlertProvider>
3134
</AppConfirmProvider>
3235
</SessionProvider>

0 commit comments

Comments
 (0)