mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-15 13:21:08 +02:00
Move inactive projects out of active workspace: - bauntown (community website) - maerchenzauber (AI story generation) - memoro (voice memo app) - news (news aggregation) - nutriphi (nutrition tracking) - reader (reading app) - uload (URL shortener) - wisekeep (AI wisdom extraction) Update CLAUDE.md documentation: - Add presi to active projects - Document archived projects section - Update workspace configuration Archived apps can be re-activated by moving back to apps/ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
84 lines
1.9 KiB
TypeScript
84 lines
1.9 KiB
TypeScript
import { create } from 'zustand';
|
|
import { persist, createJSONStorage } from 'zustand/middleware';
|
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
|
|
interface User {
|
|
id: string;
|
|
email: string;
|
|
}
|
|
|
|
interface AppState {
|
|
// User
|
|
user: User | null;
|
|
setUser: (user: User | null) => void;
|
|
|
|
// Settings
|
|
settings: {
|
|
voice: string;
|
|
speed: number;
|
|
theme: 'light' | 'dark';
|
|
playbackRate: number;
|
|
};
|
|
updateSettings: (settings: Partial<AppState['settings']>) => void;
|
|
|
|
// Audio Player
|
|
currentTextId: string | null;
|
|
isPlaying: boolean;
|
|
currentPosition: number;
|
|
setCurrentText: (textId: string | null) => void;
|
|
setIsPlaying: (playing: boolean) => void;
|
|
setCurrentPosition: (position: number) => void;
|
|
|
|
// UI State
|
|
selectedTags: string[];
|
|
toggleTag: (tag: string) => void;
|
|
clearTags: () => void;
|
|
}
|
|
|
|
export const useStore = create<AppState>()(
|
|
persist(
|
|
(set) => ({
|
|
// User
|
|
user: null,
|
|
setUser: (user) => set({ user }),
|
|
|
|
// Settings
|
|
settings: {
|
|
voice: 'de-DE-Neural2-A',
|
|
speed: 1.0,
|
|
theme: 'light',
|
|
playbackRate: 1.0,
|
|
},
|
|
updateSettings: (newSettings) =>
|
|
set((state) => ({
|
|
settings: { ...state.settings, ...newSettings },
|
|
})),
|
|
|
|
// Audio Player
|
|
currentTextId: null,
|
|
isPlaying: false,
|
|
currentPosition: 0,
|
|
setCurrentText: (textId) => set({ currentTextId: textId, currentPosition: 0 }),
|
|
setIsPlaying: (playing) => set({ isPlaying: playing }),
|
|
setCurrentPosition: (position) => set({ currentPosition: position }),
|
|
|
|
// UI State
|
|
selectedTags: [],
|
|
toggleTag: (tag) =>
|
|
set((state) => ({
|
|
selectedTags: state.selectedTags.includes(tag)
|
|
? state.selectedTags.filter((t) => t !== tag)
|
|
: [...state.selectedTags, tag],
|
|
})),
|
|
clearTags: () => set({ selectedTags: [] }),
|
|
}),
|
|
{
|
|
name: 'reader-storage',
|
|
storage: createJSONStorage(() => AsyncStorage),
|
|
partialize: (state) => ({
|
|
settings: state.settings,
|
|
selectedTags: state.selectedTags,
|
|
}),
|
|
}
|
|
)
|
|
);
|