Browse Source

use 1 app listerner for all events, add channel selection buttons, filter msgs shown for the selected channel

master
david 2 years ago
parent
commit
a6f36bc4b1
  1. 17
      src/Components/Channels.js
  2. 16
      src/Components/Messages.js
  3. 53
      src/Contexts/AppContext.js

17
src/Components/Channels.js

@ -1,6 +1,16 @@
import { Box, Drawer, Toolbar, Divider, Typography } from '@mui/material'; import {
Box,
Drawer,
Toolbar,
Divider,
Typography,
Button,
} from '@mui/material';
import { useAppContext } from '../Contexts/AppContext';
export function Channels({ drawerWidth, showChannels, setShowChannels }) { export function Channels({ drawerWidth, showChannels, setShowChannels }) {
const { channels, setCurrentChannel } = useAppContext();
return ( return (
<Box sx={{ display: 'flex' }}> <Box sx={{ display: 'flex' }}>
<Drawer <Drawer
@ -33,6 +43,11 @@ export function Channels({ drawerWidth, showChannels, setShowChannels }) {
</Box> </Box>
</Toolbar> </Toolbar>
<Divider /> <Divider />
{channels.map((channel) => (
<Button onClick={() => setCurrentChannel(channel)} key={channel.id}>
{channel.slug}
</Button>
))}
</Drawer> </Drawer>
</Box> </Box>
); );

16
src/Components/Messages.js

@ -1,15 +1,19 @@
import { useAppContext } from '../Contexts/AppContext'; import { useAppContext } from '../Contexts/AppContext';
export const Messages = () => { export const Messages = () => {
const { messages } = useAppContext(); const { messages, currentChannel } = useAppContext();
return ( return (
<> <>
{messages.map((msg) => ( {messages
<div key={msg.id}> ? messages
{msg.inserted_at}: {msg.author.username} {msg.message} .filter((msg) => msg.channel_id === currentChannel?.id)
</div> .map((msg) => (
))} <div key={msg?.id}>
{msg.inserted_at}: {msg.author.username} {msg.message}
</div>
))
: 'loading'}
</> </>
); );
}; };

53
src/Contexts/AppContext.js

@ -7,11 +7,13 @@ const AppContext = createContext();
const AppProvider = ({ children }) => { const AppProvider = ({ children }) => {
const [userSettings, setUserSettings] = useState(null); const [userSettings, setUserSettings] = useState(null);
const [messages, setMessages] = useState([]); const [messages, setMessages] = useState([]);
const [channels, setChannels] = useState([]);
const [currentChannel, setCurrentChannel] = useState(null);
const [appDataLoading, setAppDataLoading] = useState(true); const [appDataLoading, setAppDataLoading] = useState(true);
const { user } = useAuth(); const { user } = useAuth();
/** /**
* get messagaes * get data
* start listeners * start listeners
* make money * make money
*/ */
@ -23,42 +25,51 @@ const AppProvider = ({ children }) => {
.from('users') .from('users')
.select('username') .select('username')
.eq('id', user.id) .eq('id', user.id)
.then(({ data }) => setUserSettings({ ...userSettings, ...data[0] })); .then(({ data }) =>
setUserSettings((userSettings) => ({ ...userSettings, ...data[0] }))
);
console.log('gettn message data'); console.log('gettn message data');
!messages.length && !messages.length &&
supabase supabase
.from('messages') .from('messages')
.select('*, author:user_id(*)') .select('*, author:user_id(*)')
.then(({ data }) => setMessages([...messages, ...data])); .then(({ data }) => setMessages((messages) => [...messages, ...data]));
console.log('loading profile listener'); console.log('gettn channel data');
const { data: profileListener } = supabase !messages.length &&
.from('users') supabase
.on('*', (payload) => { .from('channels')
console.log('Change received!', payload); .select('*')
setUserSettings({ ...userSettings, ...payload.new }); .then(({ data }) => setChannels((channels) => [...channels, ...data]));
})
.subscribe();
console.log('loading message listener'); console.log('loading app listener');
const { data: msgListener } = supabase const { data: appListener } = supabase
.from('messages') .from('*')
.on('*', (payload) => { .on('*', (payload) => {
console.log('Change received!', payload); const { eventType, table, new: newData } = payload;
setUserSettings({ ...userSettings, ...payload.new }); // console.log('Change received!', payload);
if (table === 'users')
setUserSettings((userSettings) => ({ ...userSettings, ...newData }));
if (table === 'messages')
setMessages((messages) => [...messages, newData]);
}) })
.subscribe(); .subscribe();
profileListener && setAppDataLoading(false); appListener && setAppDataLoading(false);
return () => { return () => {
profileListener?.unsubscribe(); appListener?.unsubscribe();
msgListener?.unsubscribe();
console.log('unloading app listeners'); console.log('unloading app listeners');
}; };
}, []); }, []);
useEffect(() => {
setCurrentChannel(channels.find((channel) => channel.id));
}, [channels]);
const updateProfile = async (updateData) => { const updateProfile = async (updateData) => {
const { data, error } = await supabase const { data, error } = await supabase
.from('users') .from('users')
@ -74,6 +85,10 @@ const AppProvider = ({ children }) => {
userSettings, userSettings,
updateProfile, updateProfile,
messages, messages,
channels,
currentChannel,
setCurrentChannel,
setAppDataLoading,
}; };
return ( return (

Loading…
Cancel
Save