From 9399a653a36b41d0322065807914741fe93f8fb7 Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Mon, 16 Jun 2025 17:08:11 +0100 Subject: [PATCH 1/2] feat: realtime updates for study spaces and reports --- src/lib/components/Feedback.svelte | 5 +++++ src/lib/components/Report.svelte | 6 ++++++ src/routes/+layout.svelte | 11 ++++++++++- src/routes/space/[id]/edit/+page.svelte | 7 +++++++ src/routes/space/reports/+page.svelte | 11 +++++++++++ 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/lib/components/Feedback.svelte b/src/lib/components/Feedback.svelte index 0504d1f..b416adb 100644 --- a/src/lib/components/Feedback.svelte +++ b/src/lib/components/Feedback.svelte @@ -33,6 +33,11 @@ tags: newStudySpaceData.tags }) .eq("id", newStudySpaceData.id ?? ""); + await supabase.channel("study_space_updates").send({ + type: "broadcast", + event: "study_space_updated", + payload: { id: newStudySpaceData.id } + }); invalidate("db:study_spaces"); if (feedbackUpload) return alert(`Error submitting feedback: ${feedbackUpload.message}`); else alert("Feedback submitted successfully!"); diff --git a/src/lib/components/Report.svelte b/src/lib/components/Report.svelte index 6322b9b..a9badd8 100644 --- a/src/lib/components/Report.svelte +++ b/src/lib/components/Report.svelte @@ -29,6 +29,12 @@ .select() .single(); + await supabase.channel("report_updates").send({ + type: "broadcast", + event: "reports_updated", + payload: { study_space_id: studySpaceId } + }); + if (reportUploadError) return alert(`Error submitting report: ${reportUploadError.message}`); else alert("Report submitted successfully!"); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 309f8aa..25a2c5b 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -17,7 +17,16 @@ invalidate("supabase:auth"); } }); - return () => data.subscription.unsubscribe(); + const spacesChannel = supabase + .channel("study_space_updates") + .on("broadcast", { event: "study_space_updated" }, (payload) => { + invalidate("db:study_spaces"); + }) + .subscribe(); + return () => { + data.subscription.unsubscribe(); + spacesChannel.unsubscribe(); + }; }); $effect(() => { if (route.id === "/filter") { diff --git a/src/routes/space/[id]/edit/+page.svelte b/src/routes/space/[id]/edit/+page.svelte index 127be79..5b2b6a9 100644 --- a/src/routes/space/[id]/edit/+page.svelte +++ b/src/routes/space/[id]/edit/+page.svelte @@ -207,6 +207,13 @@ .insert(genTimings(studySpaceInsert.id)); if (hoursErr) return alert(`Error saving opening times: ${hoursErr.message}`); } + await supabase.channel("study_space_updates").send({ + type: "broadcast", + event: "study_space_updated", + payload: { + study_space_id: studySpaceInsert.id + } + }); alert("Thank you for your contribution!"); // Redirect to the new study space page await goto(`/space/${studySpaceInsert.id}`, { diff --git a/src/routes/space/reports/+page.svelte b/src/routes/space/reports/+page.svelte index 70b87dd..10ca031 100644 --- a/src/routes/space/reports/+page.svelte +++ b/src/routes/space/reports/+page.svelte @@ -5,6 +5,7 @@ const { data } = $props(); const { reports, supabase } = $derived(data); import { invalidate } from "$app/navigation"; + import { onMount } from "svelte"; let deleting = $state(false); @@ -18,6 +19,16 @@ return alert(`Error submitting report: ${reportDeleteError.message}`); else alert("Report deleted successfully!"); } + + onMount(() => { + const reportsChannel = supabase + .channel("report_updates") + .on("broadcast", { event: "reports_updated" }, () => { + invalidate("db:reports"); + }) + .subscribe(); + return () => reportsChannel.unsubscribe(); + }); From ba05fd478f8b63fca81ee6044d5c547168bbe3be Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Mon, 16 Jun 2025 17:19:10 +0100 Subject: [PATCH 2/2] style: remove unused payload --- src/routes/+layout.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 25a2c5b..17c5e03 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -19,7 +19,7 @@ }); const spacesChannel = supabase .channel("study_space_updates") - .on("broadcast", { event: "study_space_updated" }, (payload) => { + .on("broadcast", { event: "study_space_updated" }, () => { invalidate("db:study_spaces"); }) .subscribe();