about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorSamuel Newman <mozzius@protonmail.com>2025-03-06 00:01:17 +0000
committerGitHub <noreply@github.com>2025-03-05 16:01:17 -0800
commit9fde3957e76050a78c04509c84e5091f20975555 (patch)
tree557166acd4090279e9250e36223831ca1f87cc96 /src
parentdae152da85d74f68e637d5867cdba46a20d79251 (diff)
downloadvoidsky-9fde3957e76050a78c04509c84e5091f20975555.tar.zst
ota helper in dev mode (#7911)
Diffstat (limited to 'src')
-rw-r--r--src/screens/Settings/AboutSettings.tsx2
-rw-r--r--src/screens/Settings/components/OTAInfo.tsx82
-rw-r--r--src/screens/Settings/components/OTAInfo.web.tsx3
3 files changed, 87 insertions, 0 deletions
diff --git a/src/screens/Settings/AboutSettings.tsx b/src/screens/Settings/AboutSettings.tsx
index 8b1b1f76d..afae1096c 100644
--- a/src/screens/Settings/AboutSettings.tsx
+++ b/src/screens/Settings/AboutSettings.tsx
@@ -17,6 +17,7 @@ import {Globe_Stroke2_Corner0_Rounded as GlobeIcon} from '#/components/icons/Glo
 import {Newspaper_Stroke2_Corner2_Rounded as NewspaperIcon} from '#/components/icons/Newspaper'
 import {Wrench_Stroke2_Corner2_Rounded as WrenchIcon} from '#/components/icons/Wrench'
 import * as Layout from '#/components/Layout'
+import {OTAInfo} from './components/OTAInfo'
 
 type Props = NativeStackScreenProps<CommonNavigatorParams, 'AboutSettings'>
 export function AboutSettingsScreen({}: Props) {
@@ -92,6 +93,7 @@ export function AboutSettingsScreen({}: Props) {
             </SettingsList.ItemText>
             <SettingsList.BadgeText>{bundleInfo}</SettingsList.BadgeText>
           </SettingsList.PressableItem>
+          {devModeEnabled && <OTAInfo />}
         </SettingsList.Container>
       </Layout.Content>
     </Layout.Screen>
diff --git a/src/screens/Settings/components/OTAInfo.tsx b/src/screens/Settings/components/OTAInfo.tsx
new file mode 100644
index 000000000..ee63d150f
--- /dev/null
+++ b/src/screens/Settings/components/OTAInfo.tsx
@@ -0,0 +1,82 @@
+import * as Updates from 'expo-updates'
+import {msg, Trans} from '@lingui/macro'
+import {useLingui} from '@lingui/react'
+import {useMutation, useQuery} from '@tanstack/react-query'
+
+import * as Toast from '#/view/com/util/Toast'
+import {Button, ButtonIcon, ButtonText} from '#/components/Button'
+import {ArrowRotateCounterClockwise_Stroke2_Corner0_Rounded as RetryIcon} from '#/components/icons/ArrowRotateCounterClockwise'
+import {Shapes_Stroke2_Corner0_Rounded as ShapesIcon} from '#/components/icons/Shapes'
+import {Loader} from '#/components/Loader'
+import * as SettingsList from '../components/SettingsList'
+
+export function OTAInfo() {
+  const {_} = useLingui()
+  const {
+    data: isAvailable,
+    isPending: isPendingInfo,
+    isFetching: isFetchingInfo,
+    isError: isErrorInfo,
+    refetch,
+  } = useQuery({
+    queryKey: ['ota-info'],
+    queryFn: async () => {
+      const status = await Updates.checkForUpdateAsync()
+      return status.isAvailable
+    },
+  })
+
+  const {mutate: fetchAndLaunchUpdate, isPending: isPendingUpdate} =
+    useMutation({
+      mutationFn: async () => {
+        await Updates.fetchUpdateAsync()
+        await Updates.reloadAsync()
+      },
+      onError: error =>
+        Toast.show(`Failed to update: ${error.message}`, 'xmark'),
+    })
+
+  if (!Updates.isEnabled || __DEV__) {
+    return null
+  }
+
+  return (
+    <SettingsList.Item>
+      <SettingsList.ItemIcon icon={ShapesIcon} />
+      <SettingsList.ItemText>
+        {isAvailable ? (
+          <Trans>OTA status: Available!</Trans>
+        ) : isErrorInfo ? (
+          <Trans>OTA status: Error fetching update</Trans>
+        ) : isPendingInfo ? (
+          <Trans>OTA status: ...</Trans>
+        ) : (
+          <Trans>OTA status: None available</Trans>
+        )}
+      </SettingsList.ItemText>
+      <Button
+        label={isAvailable ? _(msg`Update`) : _(msg`Fetch update`)}
+        disabled={isFetchingInfo || isPendingUpdate}
+        variant="solid"
+        size="small"
+        color={isAvailable ? 'primary' : 'secondary_inverted'}
+        onPress={() => {
+          if (isFetchingInfo || isPendingUpdate) return
+
+          if (isAvailable) {
+            fetchAndLaunchUpdate()
+          } else {
+            refetch()
+          }
+        }}>
+        {isAvailable ? (
+          <ButtonText>
+            <Trans>Update</Trans>
+          </ButtonText>
+        ) : (
+          <ButtonIcon icon={isFetchingInfo ? Loader : RetryIcon} />
+        )}
+      </Button>
+    </SettingsList.Item>
+  )
+}
diff --git a/src/screens/Settings/components/OTAInfo.web.tsx b/src/screens/Settings/components/OTAInfo.web.tsx
new file mode 100644
index 000000000..af6464ee6
--- /dev/null
+++ b/src/screens/Settings/components/OTAInfo.web.tsx
@@ -0,0 +1,3 @@
+export function OTAInfo() {
+  return null
+}