diff --git a/app/hooks/settings.ts b/app/hooks/settings.ts index 647d4a7..d0a714d 100644 --- a/app/hooks/settings.ts +++ b/app/hooks/settings.ts @@ -30,39 +30,46 @@ export const useFirstRun = () => { export const useResetImageCache = () => { const serverIds = useStoreDeep(store => Object.keys(store.settings.servers)) const changeCacheBuster = useStore(store => store.changeCacheBuster) + const setDisableMusicTabs = useStore(store => store.setDisableMusicTabs) return async () => { - // disable/invalidate queries - await Promise.all([ - queryClient.cancelQueries(qk.artistArt(), { active: true }), - queryClient.cancelQueries(qk.coverArt(), { active: true }), - queryClient.cancelQueries(qk.existingFiles(), { active: true }), - queryClient.invalidateQueries(qk.artistArt(), { refetchActive: false }), - queryClient.invalidateQueries(qk.coverArt(), { refetchActive: false }), - queryClient.invalidateQueries(qk.existingFiles(), { refetchActive: false }), - ]) + setDisableMusicTabs(true) - // delete all images - const itemTypes: CacheItemTypeKey[] = ['artistArt', 'artistArtThumb', 'coverArt', 'coverArtThumb'] - await Promise.all( - serverIds.flatMap(id => - itemTypes.map(async type => { - const dir = cacheDir(id, type) - try { - await RNFS.unlink(dir) - } catch {} - }), - ), - ) + try { + // disable/invalidate queries + await Promise.all([ + queryClient.cancelQueries(qk.artistArt(), { active: true }), + queryClient.cancelQueries(qk.coverArt(), { active: true }), + queryClient.cancelQueries(qk.existingFiles(), { active: true }), + queryClient.invalidateQueries(qk.artistArt(), { refetchActive: false }), + queryClient.invalidateQueries(qk.coverArt(), { refetchActive: false }), + queryClient.invalidateQueries(qk.existingFiles(), { refetchActive: false }), + ]) - // change cacheBuster - changeCacheBuster() + // delete all images + const itemTypes: CacheItemTypeKey[] = ['artistArt', 'artistArtThumb', 'coverArt', 'coverArtThumb'] + await Promise.all( + serverIds.flatMap(id => + itemTypes.map(async type => { + const dir = cacheDir(id, type) + try { + await RNFS.unlink(dir) + } catch {} + }), + ), + ) - // enable queries - await Promise.all([ - queryClient.refetchQueries(qk.existingFiles(), { active: true }), - queryClient.refetchQueries(qk.artistArt(), { active: true }), - queryClient.refetchQueries(qk.coverArt(), { active: true }), - ]) + // change cacheBuster + changeCacheBuster() + } finally { + setDisableMusicTabs(false) + + // enable queries + await Promise.all([ + queryClient.refetchQueries(qk.existingFiles(), { active: true }), + queryClient.refetchQueries(qk.artistArt(), { active: true }), + queryClient.refetchQueries(qk.coverArt(), { active: true }), + ]) + } } } diff --git a/app/navigation/BottomTabBar.tsx b/app/navigation/BottomTabBar.tsx index 29be252..03e2cd9 100644 --- a/app/navigation/BottomTabBar.tsx +++ b/app/navigation/BottomTabBar.tsx @@ -18,10 +18,11 @@ const BottomTabButton = React.memo<{ isFocused: boolean icon: OutlineFillIcon navigation: NavigationHelpers -}>(({ routeKey, label, name, isFocused, icon, navigation }) => { + disabled?: boolean +}>(({ routeKey, label, name, isFocused, icon, navigation, disabled }) => { const firstRun = useFirstRun() - const disabled = firstRun && name !== 'settings' + disabled = !!disabled || (firstRun && name !== 'settings') const onPress = () => { const event = navigation.emit({ @@ -67,6 +68,13 @@ const BottomTabBar: React.FC = ({ state, descriptors, navigat ? options.title : route.name + let iconKey = route.name + let disabled = false + if (route.name.endsWith('-disabled')) { + iconKey = route.name.split('-')[0] + disabled = true + } + return ( = ({ state, descriptors, navigat label={label} name={route.name} isFocused={state.index === index} - icon={bottomTabIcons[route.name]} + icon={bottomTabIcons[iconKey]} navigation={navigation} + disabled={disabled} /> ) })} diff --git a/app/navigation/BottomTabNavigator.tsx b/app/navigation/BottomTabNavigator.tsx index 78ff200..c0f3b8d 100644 --- a/app/navigation/BottomTabNavigator.tsx +++ b/app/navigation/BottomTabNavigator.tsx @@ -176,12 +176,24 @@ const Tab = createBottomTabNavigator() const BottomTabNavigator = withSuspense(() => { const { t } = useTranslation() const firstRun = useFirstRun() - const resetServer = useStore(store => store.resetServer) + const disableMusicTabs = useStore(store => store.disableMusicTabs) return ( - {resetServer ? ( - <> + {disableMusicTabs ? ( + <> + null} options={{ tabBarLabel: t('navigation.tabs.home') }} /> + null} + options={{ tabBarLabel: t('navigation.tabs.library') }} + /> + null} + options={{ tabBarLabel: t('navigation.tabs.search') }} + /> + ) : ( <> diff --git a/app/state/settings.ts b/app/state/settings.ts index 35cb654..8949be1 100644 --- a/app/state/settings.ts +++ b/app/state/settings.ts @@ -27,7 +27,9 @@ export type SettingsSlice = { } client?: SubsonicApiClient - resetServer: boolean + + disableMusicTabs: boolean + setDisableMusicTabs: (value: boolean) => void changeCacheBuster: () => void @@ -79,7 +81,12 @@ export const createSettingsSlice = (set: SetStore, get: GetStore): SettingsSlice cacheBuster: newCacheBuster(), }, - resetServer: false, + disableMusicTabs: false, + setDisableMusicTabs: value => { + set(store => { + store.disableMusicTabs = value + }) + }, changeCacheBuster: () => { set(store => { @@ -104,7 +111,7 @@ export const createSettingsSlice = (set: SetStore, get: GetStore): SettingsSlice } set(state => { - state.resetServer = true + state.disableMusicTabs = true }) set(state => { @@ -113,7 +120,7 @@ export const createSettingsSlice = (set: SetStore, get: GetStore): SettingsSlice }) set(state => { - state.resetServer = false + state.disableMusicTabs = false }) },