From 41a3a1fccf5be5643c4ee48a558c83e0db264f92 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Wed, 22 Oct 2025 15:35:42 -0700 Subject: [PATCH] Updated settings screen. --- components/global-search/global-search.jsx | 3 +- components/settings/settings.jsx | 171 +++++++++++++++---- components/settings/upload-delete-switch.jsx | 35 +--- translations/en-US/common.json | 2 +- util/theme.js | 2 +- 5 files changed, 149 insertions(+), 64 deletions(-) diff --git a/components/global-search/global-search.jsx b/components/global-search/global-search.jsx index 2615b95..79d319e 100644 --- a/components/global-search/global-search.jsx +++ b/components/global-search/global-search.jsx @@ -4,7 +4,7 @@ import debounce from "lodash/debounce"; import { useCallback, useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { FlatList, View } from "react-native"; -import { ActivityIndicator, Text } from "react-native-paper"; +import { ActivityIndicator, Icon, Text } from "react-native-paper"; import env from "../../env"; import ErrorDisplay from "../error/error-display"; import JobListItem from "../jobs-list/job-list-item"; @@ -82,6 +82,7 @@ export default function GlobalSearch() { if (globalSearch === undefined || globalSearch.trim() === "") { return ( + {t("globalsearch.labels.entersearch")} diff --git a/components/settings/settings.jsx b/components/settings/settings.jsx index 6c97dd8..d2d365e 100644 --- a/components/settings/settings.jsx +++ b/components/settings/settings.jsx @@ -1,11 +1,14 @@ import SignOutButton from "@/components-old/sign-out-button/sign-out-button.component"; -import { toggleDeleteAfterUpload } from "@/redux/app/app.actions"; import { selectDeleteAfterUpload } from "@/redux/app/app.selectors"; -import { selectBodyshop } from "@/redux/user/user.selectors"; +import { selectBodyshop, selectCurrentUser } from "@/redux/user/user.selectors"; import { formatBytes } from "@/util/uploadUtils"; import AsyncStorage from "@react-native-async-storage/async-storage"; -import { StyleSheet, View } from "react-native"; -import { Button, Divider, Text } from "react-native-paper"; +import * as Application from "expo-application"; +import Constants from "expo-constants"; +import { useTranslation } from "react-i18next"; +import { Alert, ScrollView, StyleSheet, View } from "react-native"; +import { Button, Card, Divider, List, Text } from "react-native-paper"; +import { SafeAreaView } from "react-native-safe-area-context"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import UploadDeleteSwitch from "./upload-delete-switch"; @@ -13,44 +16,148 @@ import UploadDeleteSwitch from "./upload-delete-switch"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, deleteAfterUpload: selectDeleteAfterUpload, + currentUser: selectCurrentUser, }); -const mapDispatchToProps = (dispatch) => ({ - toggleDeleteAfterUpload: () => dispatch(toggleDeleteAfterUpload()), -}); +const mapDispatchToProps = (dispatch) => ({}); export default connect(mapStateToProps, mapDispatchToProps)(Tab); -function Tab({ bodyshop, deleteAfterUpload, toggleDeleteAfterUpload }) { +function Tab({ bodyshop, currentUser }) { + const { t } = useTranslation(); + const handleClearStorage = () => { + Alert.alert( + "Clear Local Cache", + "This will remove persisted Redux state. Media already uploaded won't be affected. Continue?", + [ + { text: "Cancel", style: "cancel" }, + { + text: "Clear", + style: "destructive", + onPress: async () => { + try { + await AsyncStorage.removeItem("persist:root"); + Alert.alert("Cleared", "Local cache cleared."); + } catch (_e) { + Alert.alert("Error", "Unable to clear local cache."); + } + }, + }, + ] + ); + }; + return ( - - Settings - - Media Storage:{" "} - {bodyshop?.uselocalmediaserver - ? bodyshop.localmediaserverhttp - : "Cloud"} - - {!bodyshop?.uselocalmediaserver && ( - Job Size Limit: {formatBytes(bodyshop?.jobsizelimit)} - )} - - - - - + + + + Settings + + + + + + + + + {" "} + {t("mediabrowser.labels.deleteafterupload")} + + + + } + /> + {!bodyshop?.uselocalmediaserver && ( + } + /> + )} + + + + + + + + + + + Signed in to bodyshop:{" "} + {bodyshop?.shopname || bodyshop?.id || "Unknown"} + + + Signed in to as: {currentUser?.email || "Unknown"} + + + + + + + + + + {t("settings.labels.version", { + number: `${Constants.expoConfig.version}(${Application.nativeBuildVersion} - ${Constants.expoConfig.extra.expover})`, + })} + + + ); } const styles = StyleSheet.create({ container: { - flex: 1, - justifyContent: "center", + paddingVertical: 24, + paddingHorizontal: 20, + }, + title: { + marginBottom: 12, + fontWeight: "600", + }, + section: { + marginBottom: 20, + }, + inlineRow: { + flexDirection: "row", alignItems: "center", + justifyContent: "space-between", + paddingVertical: 8, + paddingHorizontal: 4, + }, + switchLabel: { + fontSize: 16, + fontWeight: "500", + }, + paragraph: { + marginBottom: 8, + }, + actionsRow: { + justifyContent: "flex-end", + }, + divider: { + marginTop: 8, + }, + footerNote: { + textAlign: "center", + // color: "#666", + marginTop: 16, }, }); diff --git a/components/settings/upload-delete-switch.jsx b/components/settings/upload-delete-switch.jsx index 7e9f263..1da515e 100644 --- a/components/settings/upload-delete-switch.jsx +++ b/components/settings/upload-delete-switch.jsx @@ -1,6 +1,4 @@ import React from "react"; -import { useTranslation } from "react-i18next"; -import { StyleSheet, Text, View } from "react-native"; import { Switch } from "react-native-paper"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; @@ -19,35 +17,14 @@ export function UploadDeleteSwitch({ deleteAfterUpload, toggleDeleteAfterUpload, }) { - - const { t } = useTranslation(); return ( - - - {t("mediabrowser.labels.deleteafterupload")} - - { - toggleDeleteAfterUpload(); - }} - value={deleteAfterUpload} - /> - + { + toggleDeleteAfterUpload(); + }} + value={deleteAfterUpload} + /> ); } -const styles = StyleSheet.create({ - container: { - display: "flex", - flexDirection: "row", - alignItems: "center", - margin: 10, - }, - text: { - flex: 1, - }, -}); export default connect(mapStateToProps, mapDispatchToProps)(UploadDeleteSwitch); diff --git a/translations/en-US/common.json b/translations/en-US/common.json index 3c88c9f..537448a 100644 --- a/translations/en-US/common.json +++ b/translations/en-US/common.json @@ -21,7 +21,7 @@ }, "globalsearch": { "labels": { - "entersearch": "Recent items" + "entersearch": "Job Search" } }, "jobdetail": { diff --git a/util/theme.js b/util/theme.js index e62977e..27e31b7 100644 --- a/util/theme.js +++ b/util/theme.js @@ -21,7 +21,7 @@ export default //Custom values were used as the overrides did not work. onBackground: "#1a1c1e", surface: "#fdfcff", onSurface: "#1a1c1e", - surfaceVariant: "#e0e2ec", + surfaceVariant: "#dededeff", onSurfaceVariant: "#43474e", outline: "#74777f", outlineVariant: "#c3c6cf",