Skip to Content
Megérkezett a Planitapp dokumentációja. 🎉

Supabase

Áttekintés

A projektben a Supabase-t használjuk real-time adatbázisként, amely lehetővé teszi az adatok valós idejű szinkronizálását. A rendszer két fő táblát használ: Messages és Notifications táblákat.

A @supabase/supabase-js csomagot használja az alkalmazás.

Supabase Inicializálása

A Supabase kliens inicializálása a következőképpen történik:

supabase.ts
import { createClient } from "@supabase/supabase-js" export const supabase = createClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY! )

Környezeti Változók

NEXT_PUBLIC_SUPABASE_URL="" NEXT_PUBLIC_SUPABASE_ANON_KEY=""

Adatbázis Struktúra

Az adatbázis részletes leírása megtalálható: itt

Messages Real-time Kezelése React Komponensben

Az alábbi példa bemutatja, hogyan implementálhatjuk a messages tábla real-time kezelését egy React komponensben:

hooks/useMessages.tsx
interface Message { id: string project_id: string // ... további message mezők } interface EnrichedMessage extends Message { // ... user details-szel kibővített message típus } // React komponensen belül: useEffect(() => { // Üzenetek lekérése a projekthez const fetchMessages = async () => { const { data: messages, error } = await supabase .from("messages") .select("*") .eq("project_id", projectId) .order("created_at", { ascending: true }) if (error) { setError(error.message) return } const enrichedMessages = await fetchMessageWithUserDetails(messages) setMessages(enrichedMessages) } // Real-time feliratkozás a messages táblára const channel = supabase .channel("messages") // INSERT események figyelése .on( "postgres_changes", { event: "INSERT", schema: "public", table: "messages", filter: `project_id=eq.${projectId}`, }, async (payload) => { const newMessage = ( await fetchMessageWithUserDetails([payload.new as Message]) )[0] as EnrichedMessage setMessages((prevMessages) => [...prevMessages, newMessage]) } ) // UPDATE események figyelése .on( "postgres_changes", { event: "UPDATE", schema: "public", table: "messages", filter: `project_id=eq.${projectId}`, }, async (payload) => { const updatedMessage = ( await fetchMessageWithUserDetails([payload.new as Message]) )[0] as EnrichedMessage setMessages((prevMessages) => prevMessages.map((message) => message.id === updatedMessage.id ? updatedMessage : message ) ) } ) // DELETE események figyelése .on( "postgres_changes", { event: "DELETE", schema: "public", table: "messages" }, async (payload) => { setMessages((prevMessages) => prevMessages.filter( (message) => message.id !== (payload.old as Message).id ) ) } ) .subscribe() // Kezdeti üzenetek lekérése fetchMessages() // Feliratkozás megszüntetése komponens unmount esetén return () => { supabase.removeChannel(channel) } }, [projectId])

A Kód Működésének Magyarázata

1. Kezdeti Adatlekérés

  • A fetchMessages függvény lekéri az összes üzenetet az adott projekthez
  • Az üzeneteket a created_at mező szerint rendezi
  • A lekért üzeneteket kibővíti felhasználói adatokkal

2. Real-time Események Kezelése

  • INSERT: Új üzenet érkezésekor hozzáadja az üzenetet a meglévő listához
  • UPDATE: Üzenet módosításakor frissíti a megfelelő üzenetet a listában
  • DELETE: Üzenet törlésekor eltávolítja az üzenetet a listából

3. Tisztitás

  • A komponens unmount esetén megszünteti a real-time feliratkozást

Fontos Megjegyzések

  • A fetchMessageWithUserDetails függvény implementációja szükséges az üzenetek felhasználói adatokkal való kibővítéséhez
  • A projektId props változásakor a useEffect újra lefut, így új feliratkozást hoz létre
  • Az üzenetek state kezelése optimisztikus, azonnal frissíti a UI-t a real-time események alapján

Hibaelhárítás

  • Ellenőrizd, hogy a környezeti változók helyesen vannak-e beállítva
  • Győződj meg róla, hogy a Supabase projekt real-time funkciói engedélyezve vannak
  • Figyeld meg, hogy a console.log üzeneteket a real-time események debuggolásához
Utoljára frissítve: