0x0x230x

Untitled

Apr 22nd, 2025
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.83 KB | None | 0 0
  1. // SupabaseRealtimeSubscription.jsx
  2. import React, { useState, useEffect } from 'react';
  3. import { createClient } from '@supabase/supabase-js';
  4.  
  5. // Replace with your Supabase URL and anon key
  6. const supabaseUrl = 'https://your-project-url.supabase.co';
  7. const supabaseKey = 'your-anon-key';
  8. const supabase = createClient(supabaseUrl, supabaseKey);
  9.  
  10. const SupabaseRealtimeSubscription = () => {
  11. const [data, setData] = useState([]);
  12. const [status, setStatus] = useState('Connecting...');
  13. const tableName = 'your_table_name'; // Replace with your table name
  14.  
  15. useEffect(() => {
  16. // Fetch initial data
  17. const fetchData = async () => {
  18. try {
  19. const { data, error } = await supabase
  20. .from(tableName)
  21. .select('*');
  22.  
  23. if (error) {
  24. throw error;
  25. }
  26.  
  27. setData(data);
  28. setStatus('Connected and listening for changes');
  29. } catch (error) {
  30. console.error('Error fetching data:', error);
  31. setStatus(`Error: ${error.message}`);
  32. }
  33. };
  34.  
  35. fetchData();
  36.  
  37. // Set up real-time subscription
  38. const subscription = supabase
  39. .channel('table-changes')
  40. .on(
  41. 'postgres_changes',
  42. {
  43. event: '*', // Listen for all events (INSERT, UPDATE, DELETE)
  44. schema: 'public',
  45. table: tableName,
  46. },
  47. (payload) => {
  48. console.log('Change received:', payload);
  49.  
  50. // Handle different event types
  51. switch (payload.eventType) {
  52. case 'INSERT':
  53. setData((currentData) => [...currentData, payload.new]);
  54. break;
  55. case 'UPDATE':
  56. setData((currentData) =>
  57. currentData.map((item) =>
  58. item.id === payload.new.id ? payload.new : item
  59. )
  60. );
  61. break;
  62. case 'DELETE':
  63. setData((currentData) =>
  64. currentData.filter((item) => item.id !== payload.old.id)
  65. );
  66. break;
  67. default:
  68. break;
  69. }
  70. }
  71. )
  72. .subscribe((status) => {
  73. console.log('Subscription status:', status);
  74.  
  75. if (status === 'SUBSCRIBED') {
  76. setStatus('Connected and listening for changes');
  77. } else if (status === 'CHANNEL_ERROR') {
  78. setStatus('Subscription error');
  79. }
  80. });
  81.  
  82. // Cleanup subscription on component unmount
  83. return () => {
  84. supabase.removeChannel(subscription);
  85. };
  86. }, [tableName]);
  87.  
  88. return (
  89. <div>
  90. <h2>Real-time Supabase Table: {tableName}</h2>
  91. <p>Status: {status}</p>
  92. <h3>Data:</h3>
  93. <pre>{JSON.stringify(data, null, 2)}</pre>
  94. </div>
  95. );
  96. };
  97.  
  98. export default SupabaseRealtimeSubscription;
Advertisement
Add Comment
Please, Sign In to add comment