<< All versions
Skill v1.0.1
currentLLM-judged scan100/100majiayu000/claude-skill-registry/library-chiraitori-paperand-2
3 files
──Details
PublishedMay 22, 2026 at 06:53 PM
Content Hashsha256:88893d626fe93bb9...
Git SHA87774d02808d
Bump Typepatch
──Files
Files (1 file, 4.1 KB)
SKILL.md4.1 KBactive
SKILL.md · 192 lines · 4.1 KB
version: "1.0.1" name: Library Management description: User library, favorites, and reading progress
Library Management
Library Context
typescript
import { useLibrary } from '../context/LibraryContext';const {// Statelibrary, // Manga[] - all saved mangafavorites, // string[] - favorite manga IDsreadingProgress, // { [mangaId]: { chapterId, page } }history, // HistoryItem[] - reading history// ActionsaddToLibrary, // (manga: Manga) => voidremoveFromLibrary, // (mangaId: string) => voidisInLibrary, // (mangaId: string) => booleantoggleFavorite, // (mangaId: string) => voidisFavorite, // (mangaId: string) => booleanupdateProgress, // (mangaId, chapterId, page) => voidaddToHistory, // (manga, chapter) => void} = useLibrary();
Add to Library
typescript
function MangaDetailScreen() {const { addToLibrary, removeFromLibrary, isInLibrary } = useLibrary();const inLibrary = isInLibrary(manga.id);const handleLibraryToggle = () => {if (inLibrary) {removeFromLibrary(manga.id);} else {addToLibrary(manga);}};return (<Buttontitle={inLibrary ? 'Remove from Library' : 'Add to Library'}onPress={handleLibraryToggle}/>);}
Favorites
typescript
function LibraryScreen() {const { library, favorites, toggleFavorite } = useLibrary();// Filter favoritesconst favoritesList = library.filter(m => favorites.includes(m.id));return (<FlatListdata={library}renderItem={({ item }) => (<MangaCardmanga={item}isFavorite={favorites.includes(item.id)}onFavoritePress={() => toggleFavorite(item.id)}/>)}/>);}
Reading Progress
typescript
function ReaderScreen() {const { updateProgress, readingProgress } = useLibrary();const { manga, chapter } = useRoute().params;// Get saved progressconst savedProgress = readingProgress[manga.id];const startPage = savedProgress?.chapterId === chapter.id? savedProgress.page: 0;// Save on page changeconst handlePageChange = (page: number) => {updateProgress(manga.id, chapter.id, page);};return <Reader startPage={startPage} onPageChange={handlePageChange} />;}
Reading History
typescript
// Add to history when opening a chapterconst handleOpenChapter = (chapter: Chapter) => {addToHistory(manga, chapter);navigation.navigate('Reader', { manga, chapter, sourceId });};// Display historyfunction HistoryScreen() {const { history } = useLibrary();return (<FlatListdata={history}keyExtractor={(item) => `${item.mangaId}-${item.chapterId}`}renderItem={({ item }) => (<HistoryItemmanga={item.manga}chapter={item.chapter}timestamp={item.timestamp}/>)}/>);}
Data Types
typescript
interface LibraryManga extends Manga {addedAt: Date;sourceId: string;}interface ReadingProgress {[mangaId: string]: {chapterId: string;page: number;updatedAt: Date;};}interface HistoryItem {mangaId: string;manga: Manga;chapterId: string;chapter: Chapter;timestamp: Date;sourceId: string;}
Storage
typescript
// AsyncStorage keysconst LIBRARY_KEY = '@library';const FAVORITES_KEY = '@favorites';const PROGRESS_KEY = '@reading_progress';const HISTORY_KEY = '@history';// Save libraryawait AsyncStorage.setItem(LIBRARY_KEY, JSON.stringify(library));// Load libraryconst json = await AsyncStorage.getItem(LIBRARY_KEY);const library = json ? JSON.parse(json) : [];
Library Filters
typescript
type LibraryFilter = 'all' | 'favorites' | 'reading' | 'completed';function filterLibrary(library: Manga[], filter: LibraryFilter) {switch (filter) {case 'favorites':return library.filter(m => favorites.includes(m.id));case 'reading':return library.filter(m => readingProgress[m.id]);case 'completed':return library.filter(m => m.status === 'completed');default:return library;}}