disable/unmount tabs while clearing image cache

This commit is contained in:
austinried 2022-04-21 12:32:01 +09:00
parent 05e4b46469
commit 1944add558
4 changed files with 74 additions and 39 deletions

View File

@ -30,39 +30,46 @@ export const useFirstRun = () => {
export const useResetImageCache = () => { export const useResetImageCache = () => {
const serverIds = useStoreDeep(store => Object.keys(store.settings.servers)) const serverIds = useStoreDeep(store => Object.keys(store.settings.servers))
const changeCacheBuster = useStore(store => store.changeCacheBuster) const changeCacheBuster = useStore(store => store.changeCacheBuster)
const setDisableMusicTabs = useStore(store => store.setDisableMusicTabs)
return async () => { return async () => {
// disable/invalidate queries setDisableMusicTabs(true)
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 }),
])
// delete all images try {
const itemTypes: CacheItemTypeKey[] = ['artistArt', 'artistArtThumb', 'coverArt', 'coverArtThumb'] // disable/invalidate queries
await Promise.all( await Promise.all([
serverIds.flatMap(id => queryClient.cancelQueries(qk.artistArt(), { active: true }),
itemTypes.map(async type => { queryClient.cancelQueries(qk.coverArt(), { active: true }),
const dir = cacheDir(id, type) queryClient.cancelQueries(qk.existingFiles(), { active: true }),
try { queryClient.invalidateQueries(qk.artistArt(), { refetchActive: false }),
await RNFS.unlink(dir) queryClient.invalidateQueries(qk.coverArt(), { refetchActive: false }),
} catch {} queryClient.invalidateQueries(qk.existingFiles(), { refetchActive: false }),
}), ])
),
)
// change cacheBuster // delete all images
changeCacheBuster() 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 // change cacheBuster
await Promise.all([ changeCacheBuster()
queryClient.refetchQueries(qk.existingFiles(), { active: true }), } finally {
queryClient.refetchQueries(qk.artistArt(), { active: true }), setDisableMusicTabs(false)
queryClient.refetchQueries(qk.coverArt(), { active: true }),
]) // enable queries
await Promise.all([
queryClient.refetchQueries(qk.existingFiles(), { active: true }),
queryClient.refetchQueries(qk.artistArt(), { active: true }),
queryClient.refetchQueries(qk.coverArt(), { active: true }),
])
}
} }
} }

View File

@ -18,10 +18,11 @@ const BottomTabButton = React.memo<{
isFocused: boolean isFocused: boolean
icon: OutlineFillIcon icon: OutlineFillIcon
navigation: NavigationHelpers<ParamListBase, BottomTabNavigationEventMap> navigation: NavigationHelpers<ParamListBase, BottomTabNavigationEventMap>
}>(({ routeKey, label, name, isFocused, icon, navigation }) => { disabled?: boolean
}>(({ routeKey, label, name, isFocused, icon, navigation, disabled }) => {
const firstRun = useFirstRun() const firstRun = useFirstRun()
const disabled = firstRun && name !== 'settings' disabled = !!disabled || (firstRun && name !== 'settings')
const onPress = () => { const onPress = () => {
const event = navigation.emit({ const event = navigation.emit({
@ -67,6 +68,13 @@ const BottomTabBar: React.FC<BottomTabBarProps> = ({ state, descriptors, navigat
? options.title ? options.title
: route.name : route.name
let iconKey = route.name
let disabled = false
if (route.name.endsWith('-disabled')) {
iconKey = route.name.split('-')[0]
disabled = true
}
return ( return (
<BottomTabButton <BottomTabButton
key={route.key} key={route.key}
@ -74,8 +82,9 @@ const BottomTabBar: React.FC<BottomTabBarProps> = ({ state, descriptors, navigat
label={label} label={label}
name={route.name} name={route.name}
isFocused={state.index === index} isFocused={state.index === index}
icon={bottomTabIcons[route.name]} icon={bottomTabIcons[iconKey]}
navigation={navigation} navigation={navigation}
disabled={disabled}
/> />
) )
})} })}

View File

@ -176,12 +176,24 @@ const Tab = createBottomTabNavigator()
const BottomTabNavigator = withSuspense(() => { const BottomTabNavigator = withSuspense(() => {
const { t } = useTranslation() const { t } = useTranslation()
const firstRun = useFirstRun() const firstRun = useFirstRun()
const resetServer = useStore(store => store.resetServer) const disableMusicTabs = useStore(store => store.disableMusicTabs)
return ( return (
<Tab.Navigator tabBar={BottomTabBar} initialRouteName={firstRun ? 'settings' : 'home'}> <Tab.Navigator tabBar={BottomTabBar} initialRouteName={firstRun ? 'settings' : 'home'}>
{resetServer ? ( {disableMusicTabs ? (
<></> <>
<Tab.Screen name="home-disabled" children={() => null} options={{ tabBarLabel: t('navigation.tabs.home') }} />
<Tab.Screen
name="library-disabled"
children={() => null}
options={{ tabBarLabel: t('navigation.tabs.library') }}
/>
<Tab.Screen
name="search-disabled"
children={() => null}
options={{ tabBarLabel: t('navigation.tabs.search') }}
/>
</>
) : ( ) : (
<> <>
<Tab.Screen name="home" component={HomeTab} options={{ tabBarLabel: t('navigation.tabs.home') }} /> <Tab.Screen name="home" component={HomeTab} options={{ tabBarLabel: t('navigation.tabs.home') }} />

View File

@ -27,7 +27,9 @@ export type SettingsSlice = {
} }
client?: SubsonicApiClient client?: SubsonicApiClient
resetServer: boolean
disableMusicTabs: boolean
setDisableMusicTabs: (value: boolean) => void
changeCacheBuster: () => void changeCacheBuster: () => void
@ -79,7 +81,12 @@ export const createSettingsSlice = (set: SetStore, get: GetStore): SettingsSlice
cacheBuster: newCacheBuster(), cacheBuster: newCacheBuster(),
}, },
resetServer: false, disableMusicTabs: false,
setDisableMusicTabs: value => {
set(store => {
store.disableMusicTabs = value
})
},
changeCacheBuster: () => { changeCacheBuster: () => {
set(store => { set(store => {
@ -104,7 +111,7 @@ export const createSettingsSlice = (set: SetStore, get: GetStore): SettingsSlice
} }
set(state => { set(state => {
state.resetServer = true state.disableMusicTabs = true
}) })
set(state => { set(state => {
@ -113,7 +120,7 @@ export const createSettingsSlice = (set: SetStore, get: GetStore): SettingsSlice
}) })
set(state => { set(state => {
state.resetServer = false state.disableMusicTabs = false
}) })
}, },