xref: /MusicFree/src/core/musicSheet/storage.ts (revision adf41771e5c3ca7c27879b461cece7e444d1dc58)
1import getOrCreateMMKV from '@/utils/getOrCreateMMKV.ts';
2import safeParse from '@/utils/safeParse.ts';
3import {InteractionManager} from 'react-native';
4import safeStringify from '@/utils/safeStringify.ts';
5import {SortType} from '@/constants/commonConst.ts';
6
7function getStorageBase(key: string) {
8    const mmkv = getOrCreateMMKV(`LocalSheet.${key}`);
9
10    return safeParse(mmkv.getString('data'));
11}
12
13async function setStorageBase(key: string, value: any) {
14    return InteractionManager.runAfterInteractions(() => {
15        const mmkv = getOrCreateMMKV(`LocalSheet.${key}`);
16        mmkv.set('data', safeStringify(value));
17    });
18}
19
20function removeStorageBase(key: string) {
21    const mmkv = getOrCreateMMKV(`LocalSheet.${key}`);
22    mmkv.clearAll();
23}
24
25/**
26 * 存储歌单的基本信息
27 * @param sheets 歌单数据
28 */
29async function setSheets(sheets: IMusic.IMusicSheetItemBase[]) {
30    return await setStorageBase('music-sheets', sheets);
31}
32
33/**
34 * 获取歌单的基本信息
35 */
36function getSheets(): IMusic.IMusicSheetItemBase[] {
37    return getStorageBase('music-sheets');
38}
39
40/**
41 * 存储歌单的基本信息
42 * @param sheets 歌单数据
43 */
44async function setStarredSheets(sheets: IMusic.IMusicSheetItemBase[]) {
45    return await setStorageBase('starred-sheets', sheets);
46}
47
48/**
49 * 获取歌单的基本信息
50 */
51function getStarredSheets(): IMusic.IMusicSheetItem[] {
52    return getStorageBase('starred-sheets');
53}
54
55/**
56 * 存储歌单内的歌曲
57 * @param sheetId 歌单id
58 * @param musicList 歌曲列表
59 */
60async function setMusicList(sheetId: string, musicList: IMusic.IMusicItem[]) {
61    return await setStorageBase(sheetId, musicList);
62}
63
64/**
65 * 获取歌单内的歌曲
66 * @param sheetId 歌单id
67 * @returns 歌曲列表
68 */
69function getMusicList(sheetId: string): IMusic.IMusicItem[] {
70    return getStorageBase(sheetId);
71}
72
73/**
74 * 清空歌单内的歌曲/其他信息
75 * @param sheetId
76 */
77function removeMusicList(sheetId: string) {
78    return removeStorageBase(sheetId);
79}
80
81interface IMusicSheetMeta extends Record<string, string> {
82    sort: SortType;
83}
84
85function setSheetMeta<K extends keyof IMusicSheetMeta>(
86    sheetId: string,
87    key: K,
88    value: IMusicSheetMeta[K],
89) {
90    const mmkv = getOrCreateMMKV(`LocalSheet.${sheetId}`);
91    mmkv.set('meta.' + key, value);
92}
93
94function getSheetMeta<K extends keyof IMusicSheetMeta>(
95    sheetId: string,
96    key: K,
97): IMusicSheetMeta[K] | null {
98    const mmkv = getOrCreateMMKV(`LocalSheet.${sheetId}`);
99    return mmkv.getString('meta.' + key) || null;
100}
101
102const storage = {
103    setSheets,
104    getSheets,
105    setMusicList,
106    getMusicList,
107    removeMusicList,
108    setSheetMeta,
109    getSheetMeta,
110    setStarredSheets,
111    getStarredSheets,
112};
113
114export default storage;
115