xref: /MusicFree/src/core/router/index.ts (revision b4c389f44ac4dad056e7314478fadd2eca82a4b1)
1*b4c389f4Smaotoumaoimport { useNavigation, useRoute } from "@react-navigation/native";
2*b4c389f4Smaotoumaoimport { useCallback } from "react";
3*b4c389f4Smaotoumaoimport { LogBox } from "react-native";
4*b4c389f4Smaotoumao
5*b4c389f4SmaotoumaoLogBox.ignoreLogs([
6*b4c389f4Smaotoumao    'Non-serializable values were found in the navigation state',
7*b4c389f4Smaotoumao]);
8*b4c389f4Smaotoumao
9*b4c389f4Smaotoumao/** 路由key */
10*b4c389f4Smaotoumaoexport const ROUTE_PATH = {
11*b4c389f4Smaotoumao    /** 主页 */
12*b4c389f4Smaotoumao    HOME: 'home',
13*b4c389f4Smaotoumao    /** 音乐播放页 */
14*b4c389f4Smaotoumao    MUSIC_DETAIL: 'music-detail',
15*b4c389f4Smaotoumao    /** 搜索页 */
16*b4c389f4Smaotoumao    SEARCH_PAGE: 'search-page',
17*b4c389f4Smaotoumao    /** 本地歌单页 */
18*b4c389f4Smaotoumao    LOCAL_SHEET_DETAIL: 'local-sheet-detail',
19*b4c389f4Smaotoumao    /** 专辑页 */
20*b4c389f4Smaotoumao    ALBUM_DETAIL: 'album-detail',
21*b4c389f4Smaotoumao    /** 歌手页 */
22*b4c389f4Smaotoumao    ARTIST_DETAIL: 'artist-detail',
23*b4c389f4Smaotoumao    /** 榜单页 */
24*b4c389f4Smaotoumao    TOP_LIST: 'top-list',
25*b4c389f4Smaotoumao    /** 榜单详情页 */
26*b4c389f4Smaotoumao    TOP_LIST_DETAIL: 'top-list-detail',
27*b4c389f4Smaotoumao    /** 设置页 */
28*b4c389f4Smaotoumao    SETTING: 'setting',
29*b4c389f4Smaotoumao    /** 本地音乐 */
30*b4c389f4Smaotoumao    LOCAL: 'local',
31*b4c389f4Smaotoumao    /** 正在下载 */
32*b4c389f4Smaotoumao    DOWNLOADING: 'downloading',
33*b4c389f4Smaotoumao    /** 从歌曲列表中搜索 */
34*b4c389f4Smaotoumao    SEARCH_MUSIC_LIST: 'search-music-list',
35*b4c389f4Smaotoumao    /** 批量编辑 */
36*b4c389f4Smaotoumao    MUSIC_LIST_EDITOR: 'music-list-editor',
37*b4c389f4Smaotoumao    /** 选择文件夹 */
38*b4c389f4Smaotoumao    FILE_SELECTOR: 'file-selector',
39*b4c389f4Smaotoumao    /** 推荐歌单 */
40*b4c389f4Smaotoumao    RECOMMEND_SHEETS: 'recommend-sheets',
41*b4c389f4Smaotoumao    /** 歌单详情 */
42*b4c389f4Smaotoumao    PLUGIN_SHEET_DETAIL: 'plugin-sheet-detail',
43*b4c389f4Smaotoumao    /** 历史记录 */
44*b4c389f4Smaotoumao    HISTORY: 'history',
45*b4c389f4Smaotoumao    /** 自定义主题 */
46*b4c389f4Smaotoumao    SET_CUSTOM_THEME: 'set-custom-theme',
47*b4c389f4Smaotoumao    /** 权限管理 */
48*b4c389f4Smaotoumao    PERMISSIONS: 'permissions',
49*b4c389f4Smaotoumao} as const;
50*b4c389f4Smaotoumao
51*b4c389f4Smaotoumaotype ValueOf<T> = T[keyof T];
52*b4c389f4Smaotoumaotype RoutePaths = ValueOf<typeof ROUTE_PATH>;
53*b4c389f4Smaotoumao
54*b4c389f4Smaotoumaotype RouterParamsBase = Record<RoutePaths, any>;
55*b4c389f4Smaotoumao/** 路由参数 */
56*b4c389f4Smaotoumaointerface RouterParams extends RouterParamsBase {
57*b4c389f4Smaotoumao    home: undefined;
58*b4c389f4Smaotoumao    'music-detail': undefined;
59*b4c389f4Smaotoumao    'search-page': undefined;
60*b4c389f4Smaotoumao    'local-sheet-detail': {
61*b4c389f4Smaotoumao        id: string;
62*b4c389f4Smaotoumao    };
63*b4c389f4Smaotoumao    'album-detail': {
64*b4c389f4Smaotoumao        albumItem: IAlbum.IAlbumItem;
65*b4c389f4Smaotoumao    };
66*b4c389f4Smaotoumao    'artist-detail': {
67*b4c389f4Smaotoumao        artistItem: IArtist.IArtistItem;
68*b4c389f4Smaotoumao        pluginHash: string;
69*b4c389f4Smaotoumao    };
70*b4c389f4Smaotoumao    setting: {
71*b4c389f4Smaotoumao        type: string;
72*b4c389f4Smaotoumao        // anchor?: string | number;
73*b4c389f4Smaotoumao    };
74*b4c389f4Smaotoumao    local: undefined;
75*b4c389f4Smaotoumao    downloading: undefined;
76*b4c389f4Smaotoumao    'search-music-list': {
77*b4c389f4Smaotoumao        musicList: IMusic.IMusicItem[] | null;
78*b4c389f4Smaotoumao        musicSheet?: IMusic.IMusicSheetItem;
79*b4c389f4Smaotoumao    };
80*b4c389f4Smaotoumao    'music-list-editor': {
81*b4c389f4Smaotoumao        musicSheet?: Partial<IMusic.IMusicSheetItem>;
82*b4c389f4Smaotoumao        musicList: IMusic.IMusicItem[] | null;
83*b4c389f4Smaotoumao    };
84*b4c389f4Smaotoumao    'file-selector': {
85*b4c389f4Smaotoumao        fileType?: 'folder' | 'file' | 'file-and-folder'; // 10: folder 11: file and folder,
86*b4c389f4Smaotoumao        multi?: boolean; // 是否多选
87*b4c389f4Smaotoumao        actionText?: string; // 底部行动点的文本
88*b4c389f4Smaotoumao        actionIcon?: string; // 底部行动点的图标
89*b4c389f4Smaotoumao        onAction?: (
90*b4c389f4Smaotoumao            selectedFiles: {
91*b4c389f4Smaotoumao                path: string;
92*b4c389f4Smaotoumao                type: 'file' | 'folder';
93*b4c389f4Smaotoumao            }[],
94*b4c389f4Smaotoumao        ) => Promise<boolean>; // true会自动关闭,false会停在当前页面
95*b4c389f4Smaotoumao        matchExtension?: (path: string) => boolean;
96*b4c389f4Smaotoumao    };
97*b4c389f4Smaotoumao    'top-list-detail': {
98*b4c389f4Smaotoumao        pluginHash: string;
99*b4c389f4Smaotoumao        topList: IMusic.IMusicSheetItemBase;
100*b4c389f4Smaotoumao    };
101*b4c389f4Smaotoumao    'plugin-sheet-detail': {
102*b4c389f4Smaotoumao        pluginHash?: string;
103*b4c389f4Smaotoumao        sheetInfo: IMusic.IMusicSheetItemBase;
104*b4c389f4Smaotoumao    };
105*b4c389f4Smaotoumao}
106*b4c389f4Smaotoumao
107*b4c389f4Smaotoumao/** 路由参数Hook */
108*b4c389f4Smaotoumaoexport function useParams<T extends RoutePaths>(): RouterParams[T] {
109*b4c389f4Smaotoumao    const route = useRoute<any>();
110*b4c389f4Smaotoumao
111*b4c389f4Smaotoumao    const routeParams = route?.params as RouterParams[T];
112*b4c389f4Smaotoumao    return routeParams;
113*b4c389f4Smaotoumao}
114*b4c389f4Smaotoumao
115*b4c389f4Smaotoumao/** 导航 */
116*b4c389f4Smaotoumaoexport function useNavigate() {
117*b4c389f4Smaotoumao    const navigation = useNavigation<any>();
118*b4c389f4Smaotoumao
119*b4c389f4Smaotoumao    const navigate = useCallback(function <T extends RoutePaths>(
120*b4c389f4Smaotoumao        route: T,
121*b4c389f4Smaotoumao        params?: RouterParams[T],
122*b4c389f4Smaotoumao    ) {
123*b4c389f4Smaotoumao        navigation.navigate(route, params);
124*b4c389f4Smaotoumao    },
125*b4c389f4Smaotoumao    []);
126*b4c389f4Smaotoumao
127*b4c389f4Smaotoumao    return navigate;
128*b4c389f4Smaotoumao}
129