chore: vendor client into main repo
This commit is contained in:
67
client/src/storage/appStorage.ts
Normal file
67
client/src/storage/appStorage.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
import AsyncStorage from '@react-native-async-storage/async-storage';
|
||||
|
||||
/**
|
||||
* 本地存储 key 统一管理,避免 UI 里散落硬编码
|
||||
*/
|
||||
const KEY_ONBOARDING_COMPLETED = 'onboarding.completed';
|
||||
const KEY_PUSH_PROMPT_STATE = 'push.promptState';
|
||||
const KEY_CONTENT_REACTIONS = 'content.reactions';
|
||||
const KEY_FAVORITES_ITEMS = 'favorites.items';
|
||||
|
||||
export type PushPromptState = 'enabled' | 'skipped' | 'unknown';
|
||||
export type Reaction = 'like' | 'dislike';
|
||||
export type ReactionsMap = Record<string, Reaction>;
|
||||
|
||||
async function getJson<T>(key: string, fallback: T): Promise<T> {
|
||||
const raw = await AsyncStorage.getItem(key);
|
||||
if (!raw) return fallback;
|
||||
try {
|
||||
return JSON.parse(raw) as T;
|
||||
} catch {
|
||||
return fallback;
|
||||
}
|
||||
}
|
||||
|
||||
async function setJson<T>(key: string, value: T): Promise<void> {
|
||||
await AsyncStorage.setItem(key, JSON.stringify(value));
|
||||
}
|
||||
|
||||
export async function getOnboardingCompleted(): Promise<boolean> {
|
||||
const raw = await AsyncStorage.getItem(KEY_ONBOARDING_COMPLETED);
|
||||
return raw === 'true';
|
||||
}
|
||||
|
||||
export async function setOnboardingCompleted(completed: boolean): Promise<void> {
|
||||
await AsyncStorage.setItem(KEY_ONBOARDING_COMPLETED, completed ? 'true' : 'false');
|
||||
}
|
||||
|
||||
export async function getPushPromptState(): Promise<PushPromptState> {
|
||||
const raw = await AsyncStorage.getItem(KEY_PUSH_PROMPT_STATE);
|
||||
if (raw === 'enabled' || raw === 'skipped' || raw === 'unknown') return raw;
|
||||
return 'unknown';
|
||||
}
|
||||
|
||||
export async function setPushPromptState(state: PushPromptState): Promise<void> {
|
||||
await AsyncStorage.setItem(KEY_PUSH_PROMPT_STATE, state);
|
||||
}
|
||||
|
||||
export async function getReactions(): Promise<ReactionsMap> {
|
||||
return await getJson<ReactionsMap>(KEY_CONTENT_REACTIONS, {});
|
||||
}
|
||||
|
||||
export async function setReaction(contentId: string, reaction: Reaction): Promise<void> {
|
||||
const next = await getReactions();
|
||||
next[contentId] = reaction;
|
||||
await setJson(KEY_CONTENT_REACTIONS, next);
|
||||
}
|
||||
|
||||
export async function getFavorites(): Promise<string[]> {
|
||||
return await getJson<string[]>(KEY_FAVORITES_ITEMS, []);
|
||||
}
|
||||
|
||||
export async function addFavorite(contentId: string): Promise<void> {
|
||||
const list = await getFavorites();
|
||||
if (list.includes(contentId)) return;
|
||||
await setJson(KEY_FAVORITES_ITEMS, [...list, contentId]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user