Skip to content

Commit abb20f2

Browse files
committed
feat: added workshop auth
1 parent c0015eb commit abb20f2

4 files changed

Lines changed: 109 additions & 1 deletion

File tree

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,7 @@ dist-ssr
2525
.supabase_readme
2626
.cursor
2727
.tmp-*.sql
28-
docs/superpowers/plans/
28+
docs/superpowers/plans/
29+
30+
# Local-only printable workshop QR (do not commit)
31+
workshop-qr-print.html

src/pages/WorkshopEntryPage.tsx

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { useEffect, useState } from "react";
2+
import { useNavigate } from "react-router-dom";
3+
import supabase from "../supabase";
4+
import {
5+
ensureMemorialSitesProjectForUser,
6+
ensureWorkshopPinkProjectForUser,
7+
} from "../supabase/projects";
8+
9+
const WorkshopEntryPage = () => {
10+
const navigate = useNavigate();
11+
const [errorMessage, setErrorMessage] = useState("");
12+
13+
useEffect(() => {
14+
let isMounted = true;
15+
16+
const bootstrapWorkshopUser = async () => {
17+
try {
18+
const { data, error: sessionError } = await supabase.auth.getSession();
19+
if (sessionError) {
20+
throw sessionError;
21+
}
22+
23+
let session = data.session;
24+
25+
if (!session) {
26+
const { data: anonymousData, error: anonymousError } =
27+
await supabase.auth.signInAnonymously();
28+
if (anonymousError) {
29+
throw anonymousError;
30+
}
31+
session = anonymousData.session;
32+
}
33+
34+
if (!session?.user?.id) {
35+
throw new Error("Workshop session did not include a user");
36+
}
37+
38+
await ensureMemorialSitesProjectForUser(session.user.id);
39+
await ensureWorkshopPinkProjectForUser(session.user.id);
40+
41+
if (isMounted) {
42+
navigate("/map-page");
43+
}
44+
} catch (error) {
45+
if (!isMounted) {
46+
return;
47+
}
48+
49+
const fallbackMessage =
50+
error instanceof Error ? error.message : "אירעה שגיאה לא צפויה";
51+
setErrorMessage(`לא הצלחנו להיכנס לסדנה: ${fallbackMessage}`);
52+
}
53+
};
54+
55+
bootstrapWorkshopUser();
56+
57+
return () => {
58+
isMounted = false;
59+
};
60+
}, [navigate]);
61+
62+
return (
63+
<main>
64+
<section className="main-container">
65+
<h1 className="header-text">טוען גישת סדנה...</h1>
66+
{errorMessage && <p>{errorMessage}</p>}
67+
</section>
68+
</main>
69+
);
70+
};
71+
72+
export default WorkshopEntryPage;

src/router/index.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import MapPage from "../pages/MapPage/index.tsx";
77
import NotFoundPage from "../pages/404Page.tsx";
88
import AuthProtectedRoute from "./AuthProtectedRoute.tsx";
99
import Providers from "../Providers.tsx";
10+
import WorkshopEntryPage from "../pages/WorkshopEntryPage.tsx";
1011

1112
const router = createBrowserRouter(
1213
[
@@ -28,6 +29,10 @@ const router = createBrowserRouter(
2829
path: "/auth/sign-up",
2930
element: <SignUpPage />,
3031
},
32+
{
33+
path: "workshop",
34+
element: <WorkshopEntryPage />,
35+
},
3136
// Auth Protected routes
3237
{
3338
path: "/",

src/supabase/projects.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,34 @@ export async function ensureMemorialSitesProjectForUser(userId: string) {
3535
}
3636
}
3737

38+
export async function ensureWorkshopPinkProjectForUser(userId: string) {
39+
const pinkLineProjectId = "22222222-2222-2222-2222-222222222222";
40+
41+
const { data: existing, error: selectError } = await supabase
42+
.from("project_members")
43+
.select("project_id")
44+
.eq("project_id", pinkLineProjectId)
45+
.eq("user_id", userId);
46+
47+
if (selectError) {
48+
throw selectError;
49+
}
50+
51+
if (existing && existing.length > 0) {
52+
return;
53+
}
54+
55+
const { error: insertError } = await supabase.from("project_members").insert({
56+
project_id: pinkLineProjectId,
57+
user_id: userId,
58+
role: "editor",
59+
});
60+
61+
if (insertError) {
62+
throw insertError;
63+
}
64+
}
65+
3866
export async function loadProjects() {
3967
const {
4068
data: { user },

0 commit comments

Comments
 (0)