david
2 years ago
5 changed files with 140 additions and 47 deletions
@ -0,0 +1,96 @@
|
||||
import { useEffect, useState, createContext, useContext } from 'react'; |
||||
import { supabase } from '../supabaseClient'; |
||||
import { useAuth } from '../Contexts/AuthContext'; |
||||
|
||||
const AppContext = createContext(); |
||||
|
||||
const AppProvider = ({ children }) => { |
||||
const [userSettings, setUserSettings] = useState(null); |
||||
const [messages, setMessages] = useState([]); |
||||
const [appDataLoading, setAppDataLoading] = useState(true); |
||||
const { user } = useAuth(); |
||||
|
||||
/** |
||||
* get messagaes |
||||
* start listeners |
||||
* make money |
||||
*/ |
||||
|
||||
useEffect(() => { |
||||
console.log('gettn profile data'); |
||||
!userSettings && |
||||
supabase |
||||
.from('users') |
||||
.select('username') |
||||
.eq('id', user.id) |
||||
.then(({ data }) => setUserSettings({ ...userSettings, ...data[0] })); |
||||
|
||||
console.log('gettn message data'); |
||||
!messages.length && |
||||
supabase |
||||
.from('messages') |
||||
.select('*, author:user_id(*)') |
||||
.then(({ data }) => setMessages([...messages, ...data])); |
||||
|
||||
console.log('loading profile listener'); |
||||
const { data: profileListener } = supabase |
||||
.from('users') |
||||
.on('*', (payload) => { |
||||
console.log('Change received!', payload); |
||||
setUserSettings({ ...userSettings, ...payload.new }); |
||||
}) |
||||
.subscribe(); |
||||
|
||||
console.log('loading message listener'); |
||||
const { data: msgListener } = supabase |
||||
.from('messages') |
||||
.on('*', (payload) => { |
||||
console.log('Change received!', payload); |
||||
setUserSettings({ ...userSettings, ...payload.new }); |
||||
}) |
||||
.subscribe(); |
||||
|
||||
profileListener && setAppDataLoading(false); |
||||
|
||||
return () => { |
||||
profileListener?.unsubscribe(); |
||||
msgListener?.unsubscribe(); |
||||
console.log('unloading app listeners'); |
||||
}; |
||||
}, []); |
||||
|
||||
const updateProfile = async (updateData) => { |
||||
const { data, error } = await supabase |
||||
.from('users') |
||||
.update({ username: updateData }) |
||||
.eq('id', user.id); |
||||
|
||||
if (error) return { error }; |
||||
|
||||
return { data }; |
||||
}; |
||||
|
||||
const value = { |
||||
userSettings, |
||||
updateProfile, |
||||
messages, |
||||
}; |
||||
|
||||
return ( |
||||
<AppContext.Provider value={value}> |
||||
{/* maybe cud show some loading animations using the app loading const idk*/} |
||||
{appDataLoading && children} |
||||
</AppContext.Provider> |
||||
); |
||||
}; |
||||
|
||||
const useAppContext = () => { |
||||
const context = useContext(AppContext); |
||||
|
||||
if (!context) |
||||
throw new Error('useAppContext must be used within AppProvider'); |
||||
|
||||
return context; |
||||
}; |
||||
|
||||
export { AppProvider, useAppContext }; |
Loading…
Reference in new issue