diff --git a/FastNotes/libs/supabase.ts b/FastNotes/libs/supabase.ts index 36970a9..2e58882 100644 --- a/FastNotes/libs/supabase.ts +++ b/FastNotes/libs/supabase.ts @@ -1,53 +1,26 @@ +import '@react-native-async-storage/async-storage' import { createClient } from '@supabase/supabase-js' -import AsyncStorage from '@react-native-async-storage/async-storage' +import Constants from "expo-constants" import { deleteItemAsync, getItemAsync, setItemAsync } from 'expo-secure-store' -import 'react-native-url-polyfill/auto' -import Constants from 'expo-constants' import { Platform } from 'react-native' +import 'react-native-url-polyfill/auto' -const REFRESH_TOKEN_STORAGE_KEY = 'supabase.auth.refresh-token' - -type PersistedSession = { - refresh_token?: string -} - -const NativeSplitStorageAdapter = { - getItem: async (key: string) => { - return AsyncStorage.getItem(key) +const ExpoSecureStoreAdapter = { + getItem: (key: string) => { + return getItemAsync(key) }, - - setItem: async (key: string, value: string) => { - await AsyncStorage.setItem(key, value) - - try { - const session = JSON.parse(value) as PersistedSession - - if (session.refresh_token) { - await setItemAsync(REFRESH_TOKEN_STORAGE_KEY, session.refresh_token) - } else { - await deleteItemAsync(REFRESH_TOKEN_STORAGE_KEY) - } - } catch (error) { - console.warn('Stored Supabase session, but could not parse refresh token for SecureStore backup.', error) + setItem: (key: string, value: string) => { + if (value.length > 2048) { + console.warn('Value being stored in SecureStore is larger than 2048 bytes and it may not be stored successfully. In a future SDK version, this call may throw an error.') } + return setItemAsync(key, value) }, - - removeItem: async (key: string) => { - await AsyncStorage.removeItem(key) - await deleteItemAsync(REFRESH_TOKEN_STORAGE_KEY) + removeItem: (key: string) => { + return deleteItemAsync(key) }, } -export const hasSecureRefreshToken = async () => { - if (Platform.OS === 'web') { - return false - } - - const refreshToken = await getItemAsync(REFRESH_TOKEN_STORAGE_KEY) - return Boolean(refreshToken) -} - -const extra = (Constants.expoConfig?.extra ?? Constants.manifest?.extra) as { +const extra = (Constants.expoConfig?.extra ?? Constants.expoConfig?.extra) as { supabaseUrl?: string supabaseKey?: string } @@ -55,17 +28,22 @@ const extra = (Constants.expoConfig?.extra ?? Constants.manifest?.extra) as { const supabaseUrl = extra?.supabaseUrl const supabaseAnonKey = extra?.supabaseKey -if (!supabaseUrl || !supabaseAnonKey) { - throw new Error('Cannot read env variables') +if(!supabaseUrl || !supabaseAnonKey){ + throw new Error("Cannot read env variables") } -const storage = Platform.OS === 'web' ? window.localStorage : NativeSplitStorageAdapter +const storage = ( + Platform.OS === "web" + ? window.localStorage + : ExpoSecureStoreAdapter +) export const supabase = createClient(supabaseUrl, supabaseAnonKey, { auth: { - storage: storage as any, - autoRefreshToken: true, - persistSession: true, - detectSessionInUrl: false, - }, -}) + storage: storage as any, + autoRefreshToken: true, + persistSession: true, + detectSessionInUrl: false, + }, + } +)