75 lines
1.8 KiB
TypeScript
75 lines
1.8 KiB
TypeScript
import React, { createContext, useContext, ReactNode, useEffect } from "react";
|
|
import { saveUserToDatabase } from "./appwrite";
|
|
import { getCurrentUser } from "./appwrite";
|
|
import { useAppwrite } from "./useAppwrite";
|
|
import { Redirect } from "expo-router";
|
|
// import {replace} from "@remix-run/router";
|
|
import { config } from "./appwrite";
|
|
|
|
interface GlobalContextType {
|
|
isLoggedIn: boolean;
|
|
user: User | null;
|
|
loading: boolean;
|
|
refetch: (newParams?: Record<string, string | number>) => Promise<void>
|
|
}
|
|
|
|
interface User {
|
|
$id: string;
|
|
name: string;
|
|
email: string;
|
|
avatar: string;
|
|
}
|
|
|
|
const GlobalContext = createContext<GlobalContextType | undefined>(undefined);
|
|
|
|
interface GlobalProviderProps {
|
|
children: ReactNode;
|
|
}
|
|
|
|
export const GlobalProvider = ({ children }: {children: ReactNode}) => {
|
|
const {
|
|
data: user,
|
|
loading,
|
|
refetch,
|
|
} = useAppwrite({
|
|
fn: getCurrentUser,
|
|
});
|
|
|
|
useEffect(() => {
|
|
if (user && !loading) {
|
|
// Save user data when they first log in
|
|
saveUserToDatabase({
|
|
userId: user.$id,
|
|
name: user.name,
|
|
email: user.email,
|
|
avatar: user.avatar,
|
|
});
|
|
}
|
|
}, [user, loading]);
|
|
|
|
const isLoggedIn = !!user;
|
|
console.log(JSON.stringify(user));
|
|
|
|
return (
|
|
<GlobalContext.Provider
|
|
value={{
|
|
isLoggedIn,
|
|
user,
|
|
loading,
|
|
refetch,
|
|
}}
|
|
>
|
|
{children}
|
|
</GlobalContext.Provider>
|
|
);
|
|
};
|
|
|
|
export const useGlobalContext = (): GlobalContextType => {
|
|
const context = useContext(GlobalContext);
|
|
if (!context)
|
|
throw new Error("useGlobalContext must be used within a GlobalProvider");
|
|
|
|
return context;
|
|
};
|
|
|
|
export default GlobalProvider; |