chore: vendor client into main repo

This commit is contained in:
吕新雨
2026-01-28 22:54:21 +08:00
parent 7d743e78ea
commit 6a598f0a98
79 changed files with 12952 additions and 1 deletions

View 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]);
}