import { ConstEnv } from '@/constants/ConstEnv'; import { apiRegisteredToken, apiUnregisteredToken } from '@/lib/api'; import { getToken, requestPermission } from '@/lib/useNotification'; import AsyncStorage from '@react-native-async-storage/async-storage'; import CryptoES from "crypto-es"; import { router } from "expo-router"; import { createContext, MutableRefObject, ReactNode, useCallback, useContext, useEffect, useRef, useState } from 'react'; const AuthContext = createContext<{ signIn: (arg0: string) => void; signOut: () => void decryptToken: (arg0: string) => Promise encryptToken: (arg0: string) => Promise token: MutableRefObject | null; isLoading: boolean }>({ signIn: () => null, signOut: () => null, decryptToken: () => Promise.resolve(''), encryptToken: () => Promise.resolve(''), token: null, isLoading: true }); // This hook can be used to access the user info. export function useAuthSession() { return useContext(AuthContext); } export default function AuthProvider({ children }: { children: ReactNode }): ReactNode { const tokenRef = useRef(null); const [isLoading, setIsLoading] = useState(true); useEffect(() => { (async (): Promise => { const token = await AsyncStorage.getItem('@token'); tokenRef.current = token || ''; setIsLoading(false); })() }, []); const decryptToken = (async (token: string) => { var C = require("crypto-js"); var Decrypted = C.AES.decrypt(token, ConstEnv.pass_encrypt); var result = Decrypted.toString(C.enc.Utf8); return result }) const encryptToken = (async (token: string) => { var result = CryptoES.AES.encrypt(token, ConstEnv.pass_encrypt).toString(); return result }) const signIn = useCallback(async (token: string) => { const hasil = await decryptToken(String(token)) const permission = await requestPermission() if (permission) { try { // if (Platform.OS === 'android') { const tokenDevice = await getToken() const register = await apiRegisteredToken({ user: hasil, token: String(tokenDevice) }) // }else{ // const tokenDevice = await getToken() // const register = await apiRegisteredToken({ user: hasil, token: String(tokenDevice) }) // } } catch (error) { console.error(error) } finally { await AsyncStorage.setItem('@token', token); tokenRef.current = token; router.replace('/home') return true } } else { await AsyncStorage.setItem('@token', token); tokenRef.current = token; router.replace('/home') } }, []); const signOut = useCallback(async () => { try { const hasil = await decryptToken(String(tokenRef.current)) // if (Platform.OS === 'android') { const token = await getToken() const response = await apiUnregisteredToken({ user: hasil, token: String(token) }) // }else{ // const response = await apiUnregisteredToken({ user: hasil, token: "" }) // } } catch (error) { console.error(error) } finally { await AsyncStorage.setItem('@token', ''); tokenRef.current = null; router.replace('/'); } }, []); return ( {children} ); };