diff --git a/app/screens/Settings.tsx b/app/screens/Settings.tsx
index ec4dc5b..fc74d22 100644
--- a/app/screens/Settings.tsx
+++ b/app/screens/Settings.tsx
@@ -6,6 +6,7 @@ import SettingsItem from '@app/components/SettingsItem'
import SettingsSwitch from '@app/components/SettingsSwitch'
import { useSwitchActiveServer } from '@app/hooks/server'
import { Server } from '@app/models/settings'
+import { selectCache } from '@app/state/cache'
import { selectSettings } from '@app/state/settings'
import { useStore } from '@app/state/store'
import colors from '@app/styles/colors'
@@ -142,8 +143,26 @@ const SettingsContent = React.memo(() => {
const maxBitrateMobile = useStore(selectSettings.maxBitrateMobile)
const setMaxBitrateMobile = useStore(selectSettings.setMaxBitrateMobile)
+ const clearImageCache = useStore(selectCache.clearImageCache)
+ const [clearing, setClearing] = useState(false)
+
const navigation = useNavigation()
+ const clear = useCallback(() => {
+ setClearing(true)
+
+ const waitForClear = async () => {
+ try {
+ await clearImageCache()
+ } catch (err) {
+ console.log(err)
+ } finally {
+ setClearing(false)
+ }
+ }
+ waitForClear()
+ }, [clearImageCache])
+
return (
@@ -173,8 +192,20 @@ const SettingsContent = React.memo(() => {
setValue={setScrobble}
/>
-
)
})
diff --git a/app/state/cache.ts b/app/state/cache.ts
index a6aae4d..49c1546 100644
--- a/app/state/cache.ts
+++ b/app/state/cache.ts
@@ -39,20 +39,13 @@ export type CacheSlice = {
prepareCache: (serverId: string) => void
pendingRemoval: Record
removeCache: (serverId: string) => Promise
+ clearImageCache: () => Promise
}
export const selectCache = {
cacheItem: (store: CacheSlice) => store.cacheItem,
fetchCoverArtFilePath: (store: CacheSlice) => store.fetchCoverArtFilePath,
-
- songCacheDir: (store: Store) => {
- const activeServerId = store.settings.activeServer
- if (!activeServerId) {
- return
- }
-
- return store.cacheDirs[activeServerId].song
- },
+ clearImageCache: (store: CacheSlice) => store.clearImageCache,
}
export const createCacheSlice = (set: SetState, get: GetState): CacheSlice => ({
@@ -242,4 +235,31 @@ export const createCacheSlice = (set: SetState, get: GetState): Ca
}),
)
},
+
+ clearImageCache: async () => {
+ const cacheRequests = get().cacheRequests
+ for (const serverId in cacheRequests) {
+ const coverArtRequests = cacheRequests[serverId].coverArt
+ const artstArtRequests = cacheRequests[serverId].artistArt
+ const requests = [...Object.values(coverArtRequests), ...Object.values(artstArtRequests)]
+ const pendingRequests = [
+ ...(requests.filter(r => r.promise !== undefined).map(r => r.promise) as Promise[]),
+ ]
+
+ await Promise.all(pendingRequests)
+
+ await rmdir(get().cacheDirs[serverId].coverArt)
+ await mkdir(get().cacheDirs[serverId].coverArt)
+
+ await rmdir(get().cacheDirs[serverId].artistArt)
+ await mkdir(get().cacheDirs[serverId].artistArt)
+
+ set(
+ produce(state => {
+ state.cacheFiles[serverId].coverArt = {}
+ state.cacheFiles[serverId].artistArt = {}
+ }),
+ )
+ }
+ },
})