diff --git a/apps/desktop/package-lock.json b/apps/desktop/package-lock.json index 2d2783a..5327b5f 100644 --- a/apps/desktop/package-lock.json +++ b/apps/desktop/package-lock.json @@ -1,12 +1,12 @@ { "name": "tauri-app", - "version": "0.1.0", + "version": "0.7.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "tauri-app", - "version": "0.1.0", + "version": "0.7.3", "dependencies": { "@tailwindcss/vite": "^4.3.0", "@tauri-apps/api": "^2", diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 92e3536..cf37ea0 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "tauri-app", "private": true, - "version": "0.1.0", + "version": "0.7.3", "type": "module", "scripts": { "dev": "vite", diff --git a/apps/desktop/src-tauri/Cargo.lock b/apps/desktop/src-tauri/Cargo.lock index cd7adf5..b6faf61 100644 --- a/apps/desktop/src-tauri/Cargo.lock +++ b/apps/desktop/src-tauri/Cargo.lock @@ -3928,7 +3928,7 @@ dependencies = [ [[package]] name = "tauri-app" -version = "0.1.0" +version = "0.7.3" dependencies = [ "hmac", "keyring", diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index 38ceede..bb8ae77 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "tauri-app" -version = "0.1.0" -description = "A Tauri App" -authors = ["you"] +version = "0.7.3" +description = "A native download manager for fast, organized, segmented transfers" +authors = ["NimBold"] edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json index 92bc5d5..b97ac9c 100644 --- a/apps/desktop/src-tauri/tauri.conf.json +++ b/apps/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Firelink", - "version": "0.1.0", + "version": "0.7.3", "identifier": "com.nimbold.firelink", "build": { "beforeDevCommand": "npm run dev", diff --git a/apps/desktop/src/App.tsx b/apps/desktop/src/App.tsx index 70c6764..42f14f6 100644 --- a/apps/desktop/src/App.tsx +++ b/apps/desktop/src/App.tsx @@ -236,21 +236,21 @@ function App() { }, []); return ( -
+
{/* Left Side Panel - Curved Second Layer on Top */}
-
+
{ setFilter(f); useSettingsStore.getState().setActiveView('downloads'); }} />
{/* Main Content - Base Layer */} -
+
{activeView === 'downloads' && } {activeView === 'settings' && } @@ -259,12 +259,12 @@ function App() {
{/* Status Bar */} -
+
- + Ready -
+
{activeDownloadCount} active diff --git a/apps/desktop/src/components/AddDownloadsModal.tsx b/apps/desktop/src/components/AddDownloadsModal.tsx index 76fa112..3fce13a 100644 --- a/apps/desktop/src/components/AddDownloadsModal.tsx +++ b/apps/desktop/src/components/AddDownloadsModal.tsx @@ -625,8 +625,8 @@ export const AddDownloadsModal = () => { onCancel={() => setShowingDuplicates(false)} /> )} -
-
+
+
{/* Main Content Split */}
@@ -643,7 +643,7 @@ export const AddDownloadsModal = () => {
+
- +
)} @@ -335,13 +335,13 @@ export const PropertiesModal = () => {
- -
-
-
+
+
Timing
- updateDraft('stopTime', event.target.value)} disabled={!draft.enabled || !draft.stopTimeEnabled} className="rounded-md border border-border-modal bg-bg-input px-3 py-2 text-text-primary disabled:opacity-50" /> + updateDraft('stopTime', event.target.value)} disabled={!draft.enabled || !draft.stopTimeEnabled} className="app-control px-3 py-2 text-text-primary disabled:opacity-50" />
@@ -201,7 +201,7 @@ export default function SchedulerView() { )}
-
+
Queues to Schedule
@@ -212,7 +212,7 @@ export default function SchedulerView() {
-
+
After Completion
@@ -238,14 +238,14 @@ export default function SchedulerView() {
{isMac && ( -
+
System Permissions

Sleep, restart, and shut down require macOS Automation permission for Finder.

- - + +
{permissionMessage &&

{permissionMessage}

}
@@ -253,7 +253,7 @@ export default function SchedulerView() {
{toast && ( -
+
{toast}
)} diff --git a/apps/desktop/src/components/SettingsView.tsx b/apps/desktop/src/components/SettingsView.tsx index 467a15c..4af75f9 100644 --- a/apps/desktop/src/components/SettingsView.tsx +++ b/apps/desktop/src/components/SettingsView.tsx @@ -21,6 +21,19 @@ const settingsTabs: { type: SettingsTab; label: string; icon: typeof Download }[ { type: 'about', label: 'About', icon: Info }, ]; +interface AvailableReleaseUpdate { + version: string; + tag_name: string; + title: string; + release_notes: string; + release_url: string; + published_at: string | null; +} + +type ReleaseCheckOutcome = + | { type: 'UpdateAvailable'; update: AvailableReleaseUpdate } + | { type: 'UpToDate'; latest_version: string; local_version: string }; + export default function SettingsView() { const settings = useSettingsStore(); const activeTab = settings.activeSettingsTab; @@ -45,6 +58,7 @@ export default function SettingsView() { // Toast notifications const [toastMessage, setToastMessage] = useState(''); + const [isCheckingForUpdates, setIsCheckingForUpdates] = useState(false); useEffect(() => { if (toastMessage) { @@ -78,6 +92,29 @@ export default function SettingsView() { setToastMessage(msg); }; + const handleCheckForUpdates = async () => { + if (isCheckingForUpdates) return; + + setIsCheckingForUpdates(true); + showToast('Checking for updates...'); + + try { + const result = await invoke('check_for_updates'); + + if (result.type === 'UpToDate') { + showToast(`Firelink ${result.latest_version} is up to date`); + } else if (result.type === 'UpdateAvailable') { + showToast(`Firelink ${result.update.version} is available`); + } else { + showToast('The update check returned an unexpected response'); + } + } catch (error) { + showToast(`Update check failed: ${String(error)}`); + } finally { + setIsCheckingForUpdates(false); + } + }; + const handleBrowseCategory = async (category: string) => { const currentPath = (settings.downloadDirectories || {})[category] || ''; try { @@ -157,33 +194,34 @@ export default function SettingsView() { return ( ); }; return ( -
+
{/* Toast Notification */} {toastMessage && ( -
+
{toastMessage}
)} {/* SwiftUI SettingsPaneContainer-style horizontal tab strip */} -
-
+
+
{settingsTabs.map(tab => ( ))} @@ -191,14 +229,14 @@ export default function SettingsView() {
{/* Content Area */} -
-
-

{activeTabLabel}

-
+
+
+

{activeTabLabel}

+
{/* Downloads Pane */} {activeTab === 'downloads' && ( -
+

Download Options

@@ -288,7 +326,7 @@ export default function SettingsView() { {/* Look & Feel Pane */} {activeTab === 'lookandfeel' && ( -
+

App Theme

@@ -378,7 +416,7 @@ export default function SettingsView() { {/* Network Pane */} {activeTab === 'network' && ( -
+

Proxy & User Agent

@@ -456,7 +494,7 @@ export default function SettingsView() { {/* Locations Pane */} {activeTab === 'locations' && ( -
+

Download Directories