chore: check app update via general setting (#5167)

This commit is contained in:
Faisal Amir 2025-06-02 20:33:48 +07:00 committed by GitHub
parent 1a0f643d87
commit d56686fd21
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 40 additions and 2 deletions

View File

@ -34,7 +34,7 @@ const DialogAppUpdater = () => {
return ( return (
<> <>
{updateState.isUpdateAvailable && ( {updateState.isUpdateAvailable && (
<div className="fixed z-50 w-[400px] bottom-2 right-2 bg-main-view text-main-view-fg flex items-center justify-center border border-main-view-fg/10 rounded-lg shadow-md"> <div className="fixed z-50 w-[400px] bottom-3 right-3 bg-main-view text-main-view-fg flex items-center justify-center border border-main-view-fg/10 rounded-lg shadow-md">
<div className="px-0 py-4"> <div className="px-0 py-4">
<div className="px-4"> <div className="px-4">
<div className="flex items-start gap-2"> <div className="flex items-start gap-2">

View File

@ -8,6 +8,7 @@ import { Card, CardItem } from '@/containers/Card'
import LanguageSwitcher from '@/containers/LanguageSwitcher' import LanguageSwitcher from '@/containers/LanguageSwitcher'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useGeneralSetting } from '@/hooks/useGeneralSetting' import { useGeneralSetting } from '@/hooks/useGeneralSetting'
import { useAppUpdater } from '@/hooks/useAppUpdater'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { open } from '@tauri-apps/plugin-dialog' import { open } from '@tauri-apps/plugin-dialog'
import { revealItemInDir } from '@tauri-apps/plugin-opener' import { revealItemInDir } from '@tauri-apps/plugin-opener'
@ -59,10 +60,12 @@ const openFileTitle = (): string => {
function General() { function General() {
const { t } = useTranslation() const { t } = useTranslation()
const { spellCheckChatInput, setSpellCheckChatInput } = useGeneralSetting() const { spellCheckChatInput, setSpellCheckChatInput } = useGeneralSetting()
const { checkForUpdate } = useAppUpdater()
const [janDataFolder, setJanDataFolder] = useState<string | undefined>() const [janDataFolder, setJanDataFolder] = useState<string | undefined>()
const [isCopied, setIsCopied] = useState(false) const [isCopied, setIsCopied] = useState(false)
const [selectedNewPath, setSelectedNewPath] = useState<string | null>(null) const [selectedNewPath, setSelectedNewPath] = useState<string | null>(null)
const [isDialogOpen, setIsDialogOpen] = useState(false) const [isDialogOpen, setIsDialogOpen] = useState(false)
const [isCheckingUpdate, setIsCheckingUpdate] = useState(false)
useEffect(() => { useEffect(() => {
const fetchDataFolder = async () => { const fetchDataFolder = async () => {
@ -161,6 +164,22 @@ function General() {
} }
} }
const handleCheckForUpdate = async () => {
setIsCheckingUpdate(true)
try {
const update = await checkForUpdate()
if (!update) {
toast.success('You are using the latest version of Jan!')
}
// If update is available, the AppUpdater dialog will automatically show
} catch (error) {
console.error('Failed to check for updates:', error)
toast.error('Failed to check for updates. Please try again later.')
} finally {
setIsCheckingUpdate(false)
}
}
return ( return (
<div className="flex flex-col h-full"> <div className="flex flex-col h-full">
<HeaderPage> <HeaderPage>
@ -175,7 +194,26 @@ function General() {
<CardItem <CardItem
title="App Version" title="App Version"
actions={ actions={
<span className="text-main-view-fg/80">v{VERSION}</span> <span className="text-main-view-fg/80 font-medium">
v{VERSION}
</span>
}
/>
<CardItem
title="Check for Updates"
description="Check if a newer version of Jan is available"
actions={
<Button
variant="link"
size="sm"
className="p-0"
onClick={handleCheckForUpdate}
disabled={isCheckingUpdate}
>
<div className="cursor-pointer rounded-sm hover:bg-main-view-fg/15 bg-main-view-fg/10 transition-all duration-200 ease-in-out px-2 py-1 gap-1">
{isCheckingUpdate ? 'Checking...' : 'Check for Updates'}
</div>
</Button>
} }
/> />
<CardItem <CardItem