From 3d58a0663a497fe6dea51bda64f2c2add73a4220 Mon Sep 17 00:00:00 2001 From: Joshua Seigler <2583159+seigler@users.noreply.github.com> Date: Sun, 6 Apr 2025 18:38:38 -0700 Subject: [PATCH] persistence --- package-lock.json | 41 +++++++++++++++++++++++++ package.json | 2 ++ src-tauri/Cargo.lock | 29 ++++++++++++++++++ src-tauri/Cargo.toml | 1 + src-tauri/capabilities/default.json | 14 +++++++-- src-tauri/src/lib.rs | 1 + src-tauri/src/main.rs | 5 ++++ src/App.css | 24 +++++++-------- src/App.tsx | 41 +++++++++++++++---------- src/FitText.tsx | 32 ++++++++------------ src/useAppModel.ts | 46 ++++++++++++++++++++++------- 11 files changed, 176 insertions(+), 60 deletions(-) diff --git a/package-lock.json b/package-lock.json index c9845ee..6ebb233 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,10 @@ "version": "0.1.0", "license": "MIT", "dependencies": { + "@solid-primitives/storage": "^4.3.1", "@tauri-apps/api": "^2", "@tauri-apps/plugin-opener": "^2", + "@tauri-apps/plugin-store": "^2.2.0", "solid-js": "^1.9.3" }, "devDependencies": { @@ -1048,6 +1050,36 @@ "win32" ] }, + "node_modules/@solid-primitives/storage": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@solid-primitives/storage/-/storage-4.3.1.tgz", + "integrity": "sha512-xAJsY2pvXrAaCai4N2grmWY3xh5om9suTDVzGkRF5JBpDzs3Apk+xIovdTErbW0iCzXIEefENXb9xmSzdjuLYA==", + "license": "MIT", + "dependencies": { + "@solid-primitives/utils": "^6.3.0" + }, + "peerDependencies": { + "@tauri-apps/plugin-store": "*", + "solid-js": "^1.6.12" + }, + "peerDependenciesMeta": { + "@tauri-apps/plugin-store": { + "optional": true + }, + "solid-start": { + "optional": true + } + } + }, + "node_modules/@solid-primitives/utils": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-6.3.0.tgz", + "integrity": "sha512-e7hTlJ1Ywh2+g/Qug+n4L1mpfxsikoIS4/sHE2EK9WatQt8UJqop/vE6bsLnXlU1xuhb/jo94Ah5Y27rd4wP7A==", + "license": "MIT", + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, "node_modules/@tauri-apps/api": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.4.1.tgz", @@ -1284,6 +1316,15 @@ "@tauri-apps/api": "^2.0.0" } }, + "node_modules/@tauri-apps/plugin-store": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-store/-/plugin-store-2.2.0.tgz", + "integrity": "sha512-hJTRtuJis4w5fW1dkcgftsYxKXK0+DbAqurZ3CURHG5WkAyyZgbxpeYctw12bbzF9ZbZREXZklPq8mocCC3Sgg==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.0.0" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", diff --git a/package.json b/package.json index dd38e98..cabca8c 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,10 @@ }, "license": "MIT", "dependencies": { + "@solid-primitives/storage": "^4.3.1", "@tauri-apps/api": "^2", "@tauri-apps/plugin-opener": "^2", + "@tauri-apps/plugin-store": "^2.2.0", "solid-js": "^1.9.3" }, "devDependencies": { diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 952ddc4..b15277e 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3282,6 +3282,7 @@ dependencies = [ "tauri", "tauri-build", "tauri-plugin-opener", + "tauri-plugin-store", ] [[package]] @@ -3665,6 +3666,22 @@ dependencies = [ "zbus", ] +[[package]] +name = "tauri-plugin-store" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c0c08fae6995909f5e9a0da6038273b750221319f2c0f3b526d6de1cde21505" +dependencies = [ + "dunce", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.12", + "tokio", + "tracing", +] + [[package]] name = "tauri-runtime" version = "2.5.1" @@ -3883,9 +3900,21 @@ dependencies = [ "mio", "pin-project-lite", "socket2", + "tokio-macros", "windows-sys 0.52.0", ] +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "tokio-util" version = "0.7.14" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 1c21bbf..dabcb34 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -22,4 +22,5 @@ tauri = { version = "2", features = [] } tauri-plugin-opener = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" +tauri-plugin-store = "2" diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 4cdbf49..89bc05a 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -2,9 +2,17 @@ "$schema": "../gen/schemas/desktop-schema.json", "identifier": "default", "description": "Capability for the main window", - "windows": ["main"], + "windows": [ + "main" + ], "permissions": [ "core:default", - "opener:default" + "opener:default", + "store:allow-get", + "store:allow-set", + "store:allow-delete", + "store:allow-keys", + "store:allow-clear", + "store:default" ] -} +} \ No newline at end of file diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 4a277ef..2a7b19c 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -7,6 +7,7 @@ fn greet(name: &str) -> String { #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { tauri::Builder::default() + .plugin(tauri_plugin_store::Builder::new().build()) .plugin(tauri_plugin_opener::init()) .invoke_handler(tauri::generate_handler![greet]) .run(tauri::generate_context!()) diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index ee86b7e..0b33f5b 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -2,5 +2,10 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] fn main() { + tauri::Builder::default() + // initialize store plugin: + .plugin(tauri_plugin_store::Builder::new().build()) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); slick_connections_lib::run() } diff --git a/src/App.css b/src/App.css index b78a925..de3cb16 100644 --- a/src/App.css +++ b/src/App.css @@ -20,6 +20,7 @@ --color-background: lch(var(--background-lightness) var(--background-chroma) var(--background-hue)); --color-foreground-trace: lch(var(--foreground-lightness) var(--foreground-chroma) var(--foreground-hue) / 0.1); --color-foreground-faint: lch(var(--foreground-lightness) var(--foreground-chroma) var(--foreground-hue) / 0.25); + --color-foreground-medium: lch(var(--foreground-lightness) var(--foreground-chroma) var(--foreground-hue) / 0.5); color: var(--color-foreground); background-color: var(--color-background); @@ -112,20 +113,21 @@ user-select: none; flex-basis: 0; flex-grow: 1; - padding: calc(1 * var(--unit)); + padding: calc(0.5 * var(--unit)); border-radius: calc(1 * var(--unit)); background-color: var(--color-foreground-trace); font-size: calc(5 * var(--unit)); font-weight: 600; } .badge { + font-size: calc(3 * var(--unit)); position: absolute; top: 0; left: 0; filter: grayscale(100%); } .puzzle-item.is-selected { - background-color: var(--color-foreground-faint); + background-color: var(--color-foreground-medium); outline: calc(0.33 * var(--unit)) solid var(--color-foreground); } .puzzle-group { @@ -157,18 +159,17 @@ font-weight: 700; } .puzzle-group-members { - font-weight: 500; + font-weight: 400; + font-size: 0.8em; } .puzzle-actions { display: flex; - margin-top: calc(1 * var(--unit)); + margin-top: calc(4 * var(--unit)); gap: calc(1 * var(--unit)); -} -.puzzle-actions-secondary { - display: flex; - flex-direction: column; - gap: calc(1 * var(--unit)); - min-width: calc(20 * var(--unit)); + &>button { + flex-basis: 0; + flex-grow: 1; + } } select { @@ -212,6 +213,3 @@ button:focus-visible, button:hover { button:active { box-shadow: 0 0 3em -1.5em inset var(--color-foreground) } -#submitButton { - flex-grow: 1; -} diff --git a/src/App.tsx b/src/App.tsx index 4924fd6..d5bc89b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -3,6 +3,13 @@ import "./App.css"; import useAppModel from "./useAppModel"; import FitText from "./FitText"; +// TODO +// add routing +// make overview page with calendar list of puzzles +// show solved / aced / busted +// make detail page with puzzle id in path +// add nav links + function App() { const { connections, @@ -12,6 +19,7 @@ function App() { handlePinUnpin, handleSelectGame, handleShuffle, + handleDeselect, getFromPuzzle, } = useAppModel(); @@ -97,21 +105,24 @@ function App() { )}
-
- - -
+ + +