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