Files
mobile-darmasaba/providers/AuthProvider.tsx
amaliadwiy 602860d9c3 upd: clear warning
Deskripsi:
- update firebase > clear warning

No Issues
2025-08-08 11:26:09 +08:00

110 lines
3.2 KiB
TypeScript

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';
import { Platform } from 'react-native';
const AuthContext = createContext<{
signIn: (arg0: string) => void;
signOut: () => void
decryptToken: (arg0: string) => Promise<string>
encryptToken: (arg0: string) => Promise<string>
token: MutableRefObject<string | null> | 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<string | null>(null);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
(async (): Promise<void> => {
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, "your password");
var result = Decrypted.toString(C.enc.Utf8);
return result
})
const encryptToken = (async (token: string) => {
var result = CryptoES.AES.encrypt(token, "your password").toString();
return result
})
const signIn = useCallback(async (token: string) => {
const hasil = await decryptToken(String(token))
const permission = await requestPermission()
if (permission) {
try {
// COMING SOON
if (Platform.OS === 'android') {
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))
// COMING SOON
if (Platform.OS === 'android') {
const token = await getToken()
const response = await apiUnregisteredToken({ user: hasil, token: String(token) })
}
} catch (error) {
console.error(error)
} finally {
await AsyncStorage.setItem('@token', '');
tokenRef.current = null;
router.replace('/');
}
}, []);
return (
<AuthContext.Provider
value={{
signIn,
signOut,
token: tokenRef,
decryptToken,
encryptToken,
isLoading
}}
>
{children}
</AuthContext.Provider>
);
};