about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEric Bailey <git@esb.lol>2023-11-21 10:16:22 -0600
committerGitHub <noreply@github.com>2023-11-21 10:16:22 -0600
commit71b59021b9e2cea7241622ef7ae51fbd2bd687f9 (patch)
tree3482a5d429cb7c818559cbe404c397b21a5f77a3
parent3a21c02b8a9f49381db2c06f2bb925f2d11fb3ee (diff)
downloadvoidsky-71b59021b9e2cea7241622ef7ae51fbd2bd687f9.tar.zst
Add dev-only button to clear storage (#1965)
* Add dev-only button to clear storage

* Add legacy storage clearing too

* Use try/catch
-rw-r--r--src/state/persisted/legacy.ts12
-rw-r--r--src/state/persisted/store.ts9
-rw-r--r--src/view/screens/Settings.tsx33
3 files changed, 54 insertions, 0 deletions
diff --git a/src/state/persisted/legacy.ts b/src/state/persisted/legacy.ts
index 79e8810b3..655409aed 100644
--- a/src/state/persisted/legacy.ts
+++ b/src/state/persisted/legacy.ts
@@ -130,6 +130,8 @@ export async function migrate() {
       const newData = transform(legacyData)
       await write(newData)
       logger.debug('persisted state: migrated legacy storage')
+    } else {
+      logger.debug('persisted state: no migration needed')
     }
   } catch (e) {
     logger.error('persisted state: error migrating legacy storage', {
@@ -137,3 +139,13 @@ export async function migrate() {
     })
   }
 }
+
+export async function clearLegacyStorage() {
+  try {
+    await AsyncStorage.removeItem(DEPRECATED_ROOT_STATE_STORAGE_KEY)
+  } catch (e: any) {
+    logger.error(`persisted legacy store: failed to clear`, {
+      error: e.toString(),
+    })
+  }
+}
diff --git a/src/state/persisted/store.ts b/src/state/persisted/store.ts
index 2b03bec20..04858fe5b 100644
--- a/src/state/persisted/store.ts
+++ b/src/state/persisted/store.ts
@@ -1,6 +1,7 @@
 import AsyncStorage from '@react-native-async-storage/async-storage'
 
 import {Schema, schema} from '#/state/persisted/schema'
+import {logger} from '#/logger'
 
 const BSKY_STORAGE = 'BSKY_STORAGE'
 
@@ -16,3 +17,11 @@ export async function read(): Promise<Schema | undefined> {
     return objData
   }
 }
+
+export async function clear() {
+  try {
+    await AsyncStorage.removeItem(BSKY_STORAGE)
+  } catch (e: any) {
+    logger.error(`persisted store: failed to clear`, {error: e.toString()})
+  }
+}
diff --git a/src/view/screens/Settings.tsx b/src/view/screens/Settings.tsx
index 1f7623440..cc4348fff 100644
--- a/src/view/screens/Settings.tsx
+++ b/src/view/screens/Settings.tsx
@@ -64,6 +64,8 @@ import {
 import {useProfileQuery} from '#/state/queries/profile'
 import {useClearPreferencesMutation} from '#/state/queries/preferences'
 import {useInviteCodesQuery} from '#/state/queries/invites'
+import {clear as clearStorage} from '#/state/persisted/store'
+import {clearLegacyStorage} from '#/state/persisted/legacy'
 
 // TEMPORARY (APP-700)
 // remove after backend testing finishes
@@ -266,6 +268,15 @@ export const SettingsScreen = withAuthRequired(function Settings({}: Props) {
     Linking.openURL(STATUS_PAGE_URL)
   }, [])
 
+  const clearAllStorage = React.useCallback(async () => {
+    await clearStorage()
+    Toast.show(`Storage cleared, you need to restart the app now.`)
+  }, [])
+  const clearAllLegacyStorage = React.useCallback(async () => {
+    await clearLegacyStorage()
+    Toast.show(`Legacy storage cleared, you need to restart the app now.`)
+  }, [])
+
   return (
     <View style={[s.hContentRegion]} testID="settingsScreen">
       <ViewHeader title={_(msg`Settings`)} />
@@ -671,6 +682,28 @@ export const SettingsScreen = withAuthRequired(function Settings({}: Props) {
                 <Trans>Reset onboarding state</Trans>
               </Text>
             </TouchableOpacity>
+            <TouchableOpacity
+              style={[pal.view, styles.linkCardNoIcon]}
+              onPress={clearAllLegacyStorage}
+              accessibilityRole="button"
+              accessibilityHint="Clear all legacy storage data"
+              accessibilityLabel={_(msg`Clear all legacy storage data`)}>
+              <Text type="lg" style={pal.text}>
+                <Trans>
+                  Clear all legacy storage data (restart after this)
+                </Trans>
+              </Text>
+            </TouchableOpacity>
+            <TouchableOpacity
+              style={[pal.view, styles.linkCardNoIcon]}
+              onPress={clearAllStorage}
+              accessibilityRole="button"
+              accessibilityHint="Clear all storage data"
+              accessibilityLabel={_(msg`Clear all storage data`)}>
+              <Text type="lg" style={pal.text}>
+                <Trans>Clear all storage data (restart after this)</Trans>
+              </Text>
+            </TouchableOpacity>
           </>
         ) : null}
         <View style={[styles.footer]}>