From e3994a60e64343c72f9dd2b61527e9ec5ea2e5b0 Mon Sep 17 00:00:00 2001 From: Jamil Date: Wed, 24 Jan 2024 09:23:09 -0800 Subject: [PATCH] refactor(windows): Add logo and version to About window (#3378) Fixes #3354 Fixes #3229 --------- Co-authored-by: Reactor Scram --- rust/windows-client/src-tauri/src/client.rs | 3 +- .../src-tauri/src/client/about.rs | 12 ++++++ .../src-tauri/src/client/gui.rs | 4 +- rust/windows-client/src/about.html | 32 ++++---------- rust/windows-client/src/about.ts | 35 ++++++++++++++++ rust/windows-client/src/logo.png | Bin 0 -> 31564 bytes rust/windows-client/src/settings.html | 2 +- rust/windows-client/src/settings.ts | 39 ++---------------- rust/windows-client/src/tauri_stub.ts | 32 ++++++++++++++ 9 files changed, 98 insertions(+), 61 deletions(-) create mode 100644 rust/windows-client/src-tauri/src/client/about.rs create mode 100644 rust/windows-client/src/about.ts create mode 100644 rust/windows-client/src/logo.png create mode 100644 rust/windows-client/src/tauri_stub.ts diff --git a/rust/windows-client/src-tauri/src/client.rs b/rust/windows-client/src-tauri/src/client.rs index 5597ea2e0..b37e6bc4b 100644 --- a/rust/windows-client/src-tauri/src/client.rs +++ b/rust/windows-client/src-tauri/src/client.rs @@ -2,6 +2,7 @@ use anyhow::Result; use clap::{Args, Parser}; use std::{os::windows::process::CommandExt, process::Command}; +mod about; mod auth; mod crash_handling; mod debug_commands; @@ -35,7 +36,7 @@ pub const BUNDLE_ID: &str = "dev.firezone.client"; /// * `g` doesn't mean anything /// * `ed5437c88` is the Git commit hash /// * `-modified` is present if the working dir has any changes from that commit number -const GIT_VERSION: &str = +pub const GIT_VERSION: &str = git_version::git_version!(args = ["--always", "--dirty=-modified", "--tags"]); /// GuiParams prevents a problem where changing the args to `gui::run` breaks static analysis on non-Windows targets, where the gui is stubbed out diff --git a/rust/windows-client/src-tauri/src/client/about.rs b/rust/windows-client/src-tauri/src/client/about.rs new file mode 100644 index 000000000..e7c1cce9a --- /dev/null +++ b/rust/windows-client/src-tauri/src/client/about.rs @@ -0,0 +1,12 @@ +//! Everything related to the About window +use crate::client::GIT_VERSION; + +#[tauri::command] +pub(crate) fn get_cargo_version() -> String { + env!("CARGO_PKG_VERSION").to_string() +} + +#[tauri::command] +pub(crate) fn get_git_version() -> String { + GIT_VERSION.to_string() +} diff --git a/rust/windows-client/src-tauri/src/client/gui.rs b/rust/windows-client/src-tauri/src/client/gui.rs index 2109b90b9..78bf1b301 100644 --- a/rust/windows-client/src-tauri/src/client/gui.rs +++ b/rust/windows-client/src-tauri/src/client/gui.rs @@ -7,7 +7,7 @@ use crate::client::{self, deep_link, network_changes, AppLocalDataDir, BUNDLE_ID use anyhow::{anyhow, bail, Context, Result}; use arc_swap::ArcSwap; use client::{ - logging, + about, logging, settings::{self, AdvancedSettings}, }; use connlib_client_shared::{file_logger, ResourceDescription}; @@ -137,6 +137,8 @@ pub(crate) fn run(params: client::GuiParams) -> Result<()> { } }) .invoke_handler(tauri::generate_handler![ + about::get_cargo_version, + about::get_git_version, logging::clear_logs, logging::count_logs, logging::export_logs, diff --git a/rust/windows-client/src/about.html b/rust/windows-client/src/about.html index 1610e7ac6..595b99099 100644 --- a/rust/windows-client/src/about.html +++ b/rust/windows-client/src/about.html @@ -5,32 +5,18 @@ About Firezone - - + + - +
-

About Firezone

- - - - - + Firezone Logo +

+ Version + + () +

diff --git a/rust/windows-client/src/about.ts b/rust/windows-client/src/about.ts new file mode 100644 index 000000000..93f4701dd --- /dev/null +++ b/rust/windows-client/src/about.ts @@ -0,0 +1,35 @@ +import "./tauri_stub.js"; + +const invoke = window.__TAURI__.tauri.invoke; + +const cargoVersionSpan = ( + document.getElementById("cargo-version") +); +const gitVersionSpan = document.getElementById("git-version"); + +function get_cargo_version() { + invoke("get_cargo_version") + .then((cargoVersion: string) => { + cargoVersionSpan.innerText = cargoVersion; + }) + .catch((e: Error) => { + cargoVersionSpan.innerText = "Unknown"; + console.error(e); + }); +} + +function get_git_version() { + invoke("get_git_version") + .then((gitVersion: string) => { + gitVersionSpan.innerText = gitVersion; + }) + .catch((e: Error) => { + gitVersionSpan.innerText = "Unknown"; + console.error(e); + }); +} + +document.addEventListener("DOMContentLoaded", () => { + get_cargo_version(); + get_git_version(); +}); diff --git a/rust/windows-client/src/logo.png b/rust/windows-client/src/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..12a2c97eb42134c4aa512cec4f935fdb698cde22 GIT binary patch literal 31564 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 z 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 literal 0 HcmV?d00001 diff --git a/rust/windows-client/src/settings.html b/rust/windows-client/src/settings.html index a08da7db6..c488e1ae3 100644 --- a/rust/windows-client/src/settings.html +++ b/rust/windows-client/src/settings.html @@ -5,6 +5,7 @@ Settings + @@ -176,6 +177,5 @@ - diff --git a/rust/windows-client/src/settings.ts b/rust/windows-client/src/settings.ts index 8453d5db7..0671020b8 100644 --- a/rust/windows-client/src/settings.ts +++ b/rust/windows-client/src/settings.ts @@ -1,4 +1,8 @@ // Purpose: TypeScript file for the settings page. +import "./tauri_stub.js"; + +const invoke = window.__TAURI__.tauri.invoke; +const listen = window.__TAURI__.event.listen; // Custom types interface Settings { @@ -7,46 +11,11 @@ interface Settings { log_filter: string; } -interface TauriEvent { - type: string; - payload: any; -} - interface FileCount { files: number; bytes: number; } -// Stub Tauri API for TypeScript. Helpful when developing without Tauri running. -export {}; -declare global { - interface Window { - __TAURI__: { - tauri: { - invoke: (cmd: string, args?: any) => Promise; - }; - event: { - listen: (cmd: string, callback: (event: TauriEvent) => void) => void; - }; - }; - } -} -window.__TAURI__ = window.__TAURI__ || { - tauri: { - invoke: (_cmd: string, _args?: any) => { - return Promise.reject("Tauri API not initialized"); - }, - }, - event: { - listen: (_cmd: string, _callback: (event: TauriEvent) => void) => { - console.error("Tauri API not initialized"); - }, - }, -}; - -const { invoke } = window.__TAURI__.tauri; -const { listen } = window.__TAURI__.event; - // DOM elements const form = document.getElementById("advanced-settings-form"); const authBaseUrlInput = ( diff --git a/rust/windows-client/src/tauri_stub.ts b/rust/windows-client/src/tauri_stub.ts new file mode 100644 index 000000000..755786add --- /dev/null +++ b/rust/windows-client/src/tauri_stub.ts @@ -0,0 +1,32 @@ +// Stub Tauri API for TypeScript. Helpful when developing without Tauri running. + +interface TauriEvent { + type: string; + payload: any; +} + +export {}; +declare global { + interface Window { + __TAURI__: { + tauri: { + invoke: (cmd: string, args?: any) => Promise; + }; + event: { + listen: (cmd: string, callback: (event: TauriEvent) => void) => void; + }; + }; + } +} +window.__TAURI__ = window.__TAURI__ || { + tauri: { + invoke: (_cmd: string, _args?: any) => { + return Promise.reject("Tauri API not initialized"); + }, + }, + event: { + listen: (_cmd: string, _callback: (event: TauriEvent) => void) => { + console.error("Tauri API not initialized"); + }, + }, +};