Connectivity + auth scaffold only: Expo Router, Clerk session auth via expo-secure-store, and a type-only tRPC AppRouter import from the web app's router — no backend changes needed. See mobile/README.md.
33 lines
883 B
TypeScript
33 lines
883 B
TypeScript
import * as SecureStore from "expo-secure-store";
|
|
import type { TokenCache } from "@clerk/expo";
|
|
|
|
/**
|
|
* Persists the Clerk session JWT in the OS-level secure keystore (Android
|
|
* Keystore / iOS Keychain) instead of Clerk's in-memory default, so the
|
|
* signed-in session survives an app restart.
|
|
*/
|
|
export const secureTokenCache: TokenCache = {
|
|
async getToken(key) {
|
|
try {
|
|
return await SecureStore.getItemAsync(key);
|
|
} catch {
|
|
return null;
|
|
}
|
|
},
|
|
async saveToken(key, value) {
|
|
try {
|
|
await SecureStore.setItemAsync(key, value);
|
|
} catch {
|
|
// Storage write failed (e.g. no keystore available) — session simply
|
|
// won't persist across restarts; sign-in flow still works this run.
|
|
}
|
|
},
|
|
async clearToken(key) {
|
|
try {
|
|
await SecureStore.deleteItemAsync(key);
|
|
} catch {
|
|
// best-effort cleanup
|
|
}
|
|
},
|
|
};
|