import { ExternalLinkIcon } from "lucide-react" import { useState } from "react" import { useTranslation } from "react-i18next" import { toast } from "sonner" import { Button } from "@/components/ui/button" import { Switch } from "@/components/ui/switch" import { cn } from "@/lib/utils" import { settingsStoreActions, useAppStore } from "@/store" import { openSettingsExternalUrl } from "./side-effect-utils" import { SettingsRow } from "./settings-row" import { defaultSettingsConfig } from "./utils" import { useSettingsSave } from "./use-settings-save" interface SettingsSectionAboutProps { isItemVisible: (itemId: string) => boolean } const aboutLinks = [ { id: "website", labelKey: "SETTINGS_LINK_WEBSITE", url: "https://picgo.app/", searchItemId: "about-link-website", }, { id: "github", labelKey: "SETTINGS_LINK_GITHUB", url: "https://github.com/Molunerfinn/PicGo", searchItemId: "about-link-github", }, { id: "docs", labelKey: "SETTINGS_LINK_DOCS", url: "https://docs.picgo.app/gui/", searchItemId: "about-link-docs", }, { id: "privacy", labelKey: "SETTINGS_LINK_PRIVACY", url: "https://picgo.app/privacy/", searchItemId: "about-link-privacy", }, { id: "terms", labelKey: "SETTINGS_LINK_TERMS", url: "https://picgo.app/terms/", searchItemId: "about-link-terms", }, ] as const function resolveErrorMessage(error: unknown, fallback: string) { if (error instanceof Error && error.message.trim().length > 0) { return error.message } return fallback } export function SettingsSectionAbout({ isItemVisible, }: SettingsSectionAboutProps) { const { t } = useTranslation() const appConfig = useAppStore.use.appConfig() const settingsVersion = useAppStore.use.settingsVersion() const settingsConfig = appConfig?.settings ?? defaultSettingsConfig const saveSettingsConfig = useSettingsSave() const [isCheckingUpdates, setCheckingUpdates] = useState(false) const runCheckUpdates = async () => { setCheckingUpdates(true) try { const result = await settingsStoreActions.checkUpdates() toast.success( t("SETTINGS_UPDATE_CHECK_RESULT", { version: result.latestVersion, action: result.hasUpdate ? t("SETTINGS_UPDATE_CHECK_CAN_UPDATE") : t("SETTINGS_UPDATE_CHECK_NO_UPDATE") }) ) } catch (error) { toast.error(resolveErrorMessage(error, t("FAILED"))) } finally { setCheckingUpdates(false) } } const handleCheckUpdates = async () => { await runCheckUpdates() } const handleOpenExternalUrl = async (url: string) => { try { await openSettingsExternalUrl(url) } catch (error) { toast.error(resolveErrorMessage(error, t("FAILED"))) } } return (
{isItemVisible("about-version") ? (
PicGo Logo
PicGo
{t("SETTINGS_CURRENT_VERSION")}: {settingsVersion.currentVersion}
{settingsVersion.latestVersion ? (
{t("SETTINGS_NEWEST_VERSION")}: {settingsVersion.latestVersion}
) : null}
) : null}
{aboutLinks.some((link) => isItemVisible(link.searchItemId)) ? (
{aboutLinks .filter((link) => isItemVisible(link.searchItemId)) .map((link) => ( ))}
) : null}
) }