diff --git a/.vscode/launch.json b/.vscode/launch.json
index 9f5b364..6f7a0fb 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -23,10 +23,15 @@
"request": "launch",
"name": "Tauri Production Debug",
"cargo": {
- "args": ["build", "--release", "--manifest-path=./src-tauri/Cargo.toml"]
+ "args": [
+ "build",
+ "--release",
+ "--manifest-path=./src-tauri/Cargo.toml"
+ ]
},
// task for the `beforeBuildCommand` if used, must be configured in `.vscode/tasks.json`
"preLaunchTask": "ui:build"
- }
+ },
]
- }
\ No newline at end of file
+ }
+
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index ed1ada8..a8e2133 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -3,30 +3,43 @@
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
+ {
+ "label": "tauri:dev",
+ "type": "shell",
+ "command": "cargo",
+ "problemMatcher": [],
+ "args": [
+ "tauri",
+ "dev"
+ ],
+ "icon": {
+ "id": "run"
+ },
+ },
{
"label": "ui:dev",
"type": "shell",
- // `dev` keeps running in the background
- // ideally you should also configure a `problemMatcher`
- // see https://code.visualstudio.com/docs/editor/tasks#_can-a-background-task-be-used-as-a-prelaunchtask-in-launchjson
"isBackground": true,
- // change this to your `beforeDevCommand`:
"command": "npm",
- "args": ["run", "dev"]
+ "problemMatcher": [],
+ "args": [
+ "run",
+ "dev",
+ "--",
+ "--clearScreen",
+ "false"
+ ]
},
{
"label": "ui:build",
+ "group": "build",
"type": "shell",
- // change this to your `beforeBuildCommand`:
"command": "npm",
- "args": ["run", "build"],
- },
- {
- "label": "full:dev",
- "type": "shell",
- "isBackground": true,
- "command": "cargo",
- "args": ["tauri", "dev"]
+ "problemMatcher": [],
+ "args": [
+ "run",
+ "build"
+ ]
}
- ]
- }
\ No newline at end of file
+ ],
+ }
diff --git a/README.md b/README.md
index c4a8ae9..ad2b1df 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,14 @@
A basic timer for my broken brain.
+## Acknowledgements
+
+- Potato icon from https://github.com/googlefonts/noto-emoji
+
+## Forking
+
+I'm developing this for myself, and have limited goals.
+
## License
Copyright (C) 2022 ModZero
diff --git a/index.html b/index.html
index b5b1252..a027cd0 100644
--- a/index.html
+++ b/index.html
@@ -2,9 +2,9 @@
-
+
- Vite + Svelte + TS
+ Ziemniak
diff --git a/package-lock.json b/package-lock.json
index f598173..6cb4be3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,6 +7,7 @@
"": {
"name": "ziemniak",
"version": "0.0.0",
+ "license": "AGPL-3.0-or-later",
"dependencies": {
"@tauri-apps/api": "^1.0.2"
},
@@ -14,6 +15,8 @@
"@sveltejs/vite-plugin-svelte": "^1.0.1",
"@tauri-apps/cli": "^1.0.5",
"@tsconfig/svelte": "^3.0.0",
+ "@types/luxon": "^3.0.0",
+ "luxon": "^3.0.1",
"svelte": "^3.49.0",
"svelte-check": "^2.8.0",
"svelte-preprocess": "^4.10.7",
@@ -313,6 +316,12 @@
"integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==",
"dev": true
},
+ "node_modules/@types/luxon": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.0.0.tgz",
+ "integrity": "sha512-Lx+EZoJxUKw4dp8uei9XiUVNlgkYmax5+ovqt6Xf3LzJOnWhlfJw/jLBmqfGVwOP/pDr4HT8bI1WtxK0IChMLw==",
+ "dev": true
+ },
"node_modules/@types/node": {
"version": "18.6.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.1.tgz",
@@ -1045,6 +1054,15 @@
"node": ">=6"
}
},
+ "node_modules/luxon": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.0.1.tgz",
+ "integrity": "sha512-hF3kv0e5gwHQZKz4wtm4c+inDtyc7elkanAsBq+fundaCdUBNJB1dHEGUZIM6SfSBUlbVFduPwEtNjFK8wLtcw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/magic-string": {
"version": "0.26.2",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz",
@@ -1789,6 +1807,12 @@
"integrity": "sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==",
"dev": true
},
+ "@types/luxon": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.0.0.tgz",
+ "integrity": "sha512-Lx+EZoJxUKw4dp8uei9XiUVNlgkYmax5+ovqt6Xf3LzJOnWhlfJw/jLBmqfGVwOP/pDr4HT8bI1WtxK0IChMLw==",
+ "dev": true
+ },
"@types/node": {
"version": "18.6.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.1.tgz",
@@ -2245,6 +2269,12 @@
"integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
"dev": true
},
+ "luxon": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.0.1.tgz",
+ "integrity": "sha512-hF3kv0e5gwHQZKz4wtm4c+inDtyc7elkanAsBq+fundaCdUBNJB1dHEGUZIM6SfSBUlbVFduPwEtNjFK8wLtcw==",
+ "dev": true
+ },
"magic-string": {
"version": "0.26.2",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz",
diff --git a/package.json b/package.json
index fcb3f3d..cb846e5 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,8 @@
"@sveltejs/vite-plugin-svelte": "^1.0.1",
"@tauri-apps/cli": "^1.0.5",
"@tsconfig/svelte": "^3.0.0",
+ "@types/luxon": "^3.0.0",
+ "luxon": "^3.0.1",
"svelte": "^3.49.0",
"svelte-check": "^2.8.0",
"svelte-preprocess": "^4.10.7",
@@ -25,4 +27,4 @@
"dependencies": {
"@tauri-apps/api": "^1.0.2"
}
-}
\ No newline at end of file
+}
diff --git a/public/potato.svg b/public/potato.svg
new file mode 100644
index 0000000..e1cfedb
--- /dev/null
+++ b/public/potato.svg
@@ -0,0 +1,23 @@
+
\ No newline at end of file
diff --git a/public/vite.svg b/public/vite.svg
deleted file mode 100644
index e7b8dfb..0000000
--- a/public/vite.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock
index 64bc60c..0295798 100644
--- a/src-tauri/Cargo.lock
+++ b/src-tauri/Cargo.lock
@@ -263,6 +263,19 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+[[package]]
+name = "chrono"
+version = "0.4.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
+dependencies = [
+ "libc",
+ "num-integer",
+ "num-traits",
+ "serde",
+ "winapi",
+]
+
[[package]]
name = "cocoa"
version = "0.24.0"
@@ -3130,6 +3143,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f"
dependencies = [
"getrandom 0.2.7",
+ "rand 0.8.5",
+ "serde",
]
[[package]]
@@ -3707,8 +3722,11 @@ checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
name = "ziemniak"
version = "0.1.0"
dependencies = [
+ "chrono",
"serde",
"serde_json",
"tauri",
"tauri-build",
+ "tokio",
+ "uuid 1.1.2",
]
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
index 0361143..a2a4391 100644
--- a/src-tauri/Cargo.toml
+++ b/src-tauri/Cargo.toml
@@ -15,9 +15,12 @@ rust-version = "1.57"
tauri-build = { version = "1.0.4", features = [] }
[dependencies]
-serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
+serde_json = "1.0"
tauri = { version = "1.0.5", features = ["api-all"] }
+chrono = { version = "0.4.19", default-features = false, features = [ "std", "clock", "serde" ] }
+tokio = { version = "1.19", features = [ "rt", "rt-multi-thread", "sync", "fs", "io-util", "time" ] }
+uuid = { version = "1.1.2", features = [ "v4", "fast-rng", "serde" ] }
[features]
# by default Tauri runs in production mode
diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png
index 6be5e50..f91e974 100644
Binary files a/src-tauri/icons/128x128.png and b/src-tauri/icons/128x128.png differ
diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png
index e81bece..ef7c7e4 100644
Binary files a/src-tauri/icons/128x128@2x.png and b/src-tauri/icons/128x128@2x.png differ
diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png
index a437dd5..964341b 100644
Binary files a/src-tauri/icons/32x32.png and b/src-tauri/icons/32x32.png differ
diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png
index 0ca4f27..804dff2 100644
Binary files a/src-tauri/icons/Square107x107Logo.png and b/src-tauri/icons/Square107x107Logo.png differ
diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png
index b81f820..5c3a366 100644
Binary files a/src-tauri/icons/Square142x142Logo.png and b/src-tauri/icons/Square142x142Logo.png differ
diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png
index 624c7bf..143f20e 100644
Binary files a/src-tauri/icons/Square150x150Logo.png and b/src-tauri/icons/Square150x150Logo.png differ
diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png
index c021d2b..7e0db74 100644
Binary files a/src-tauri/icons/Square284x284Logo.png and b/src-tauri/icons/Square284x284Logo.png differ
diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png
index 6219700..071cbe0 100644
Binary files a/src-tauri/icons/Square30x30Logo.png and b/src-tauri/icons/Square30x30Logo.png differ
diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png
index f9bc048..e9b5f9a 100644
Binary files a/src-tauri/icons/Square310x310Logo.png and b/src-tauri/icons/Square310x310Logo.png differ
diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png
index d5fbfb2..0b54254 100644
Binary files a/src-tauri/icons/Square44x44Logo.png and b/src-tauri/icons/Square44x44Logo.png differ
diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png
index 63440d7..dfb61ec 100644
Binary files a/src-tauri/icons/Square71x71Logo.png and b/src-tauri/icons/Square71x71Logo.png differ
diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png
index f3f705a..1cc5c18 100644
Binary files a/src-tauri/icons/Square89x89Logo.png and b/src-tauri/icons/Square89x89Logo.png differ
diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png
index 4556388..c3e2770 100644
Binary files a/src-tauri/icons/StoreLogo.png and b/src-tauri/icons/StoreLogo.png differ
diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns
index 87f09b4..7775675 100644
Binary files a/src-tauri/icons/icon.icns and b/src-tauri/icons/icon.icns differ
diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico
index b3636e4..1eab178 100644
Binary files a/src-tauri/icons/icon.ico and b/src-tauri/icons/icon.ico differ
diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png
index e1cd261..3822240 100644
Binary files a/src-tauri/icons/icon.png and b/src-tauri/icons/icon.png differ
diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs
index 96af599..81c767e 100644
--- a/src-tauri/src/main.rs
+++ b/src-tauri/src/main.rs
@@ -1,16 +1,84 @@
#![cfg_attr(
- all(not(debug_assertions), target_os = "windows"),
- windows_subsystem = "windows"
+ all(not(debug_assertions), target_os = "windows"),
+ windows_subsystem = "windows"
)]
+use std::time::{Duration, Instant};
+
+use chrono::{DateTime, FixedOffset, Local};
+use tauri::{async_runtime::spawn, Window};
+use tokio::time::interval;
+use uuid::Uuid;
+
+#[derive(Clone, Default, serde::Serialize)]
+struct Timer {
+ id: Uuid,
+ started: Option>,
+ duration: Duration,
+ elapsed: Option,
+ message: String,
+}
+
+impl Timer {
+ fn new(message: &str, duration: Duration) -> Self {
+ return Self {
+ id: Uuid::new_v4(),
+ duration: duration,
+ message: message.to_string(),
+ ..Default::default()
+ };
+ }
+
+ fn complete(self: &Self) -> bool {
+ return self.elapsed.map_or(false, |e| e >= self.duration);
+ }
+
+ async fn run(self: &mut Self, window: Window) {
+ self.started = Some(Local::now().into());
+ let mut elapsed = Duration::from_secs(0);
+ self.elapsed = Some(elapsed);
+ let mut last_checked = Instant::now();
+
+ let mut interval = interval(Duration::from_secs(1) / 60);
+ loop {
+ interval.tick().await;
+ let now = Instant::now();
+ let duration = now - last_checked;
+
+ elapsed = elapsed + duration;
+ self.elapsed = Some(elapsed);
+
+ if self.complete() {
+ break;
+ }
+
+ if let Err(_) = window.emit("timer-tick", self.clone()) {
+ break;
+ }
+ last_checked = now;
+ }
+
+ window
+ .emit("timer-done", self.clone())
+ .expect("Our window went away?");
+ }
+}
+
#[tauri::command]
-fn greet(name: &str) -> String {
- format!("Hello, {}!", name)
+fn start_timer(window: Window, duration: Duration, message: &str) -> Uuid {
+ let mut timer = Timer::new(message, duration);
+ let timer_id = timer.id.clone();
+
+ spawn(async move {
+ timer.run(window).await;
+ });
+
+ timer_id
}
fn main() {
- tauri::Builder::default()
- .invoke_handler(tauri::generate_handler![greet])
- .run(tauri::generate_context!())
- .expect("error while running tauri application");
+ tauri::Builder::default()
+ .invoke_handler(tauri::generate_handler![start_timer])
+ .run(tauri::generate_context!())
+ .expect("error while running tauri application");
}
diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json
index 74b569e..9bcfcd0 100644
--- a/src-tauri/tauri.conf.json
+++ b/src-tauri/tauri.conf.json
@@ -16,8 +16,8 @@
},
"bundle": {
"active": true,
- "category": "DeveloperTool",
- "copyright": "",
+ "category": "Lifestyle",
+ "copyright": "2022 ModZero",
"deb": {
"depends": []
},
@@ -29,8 +29,8 @@
"icons/icon.icns",
"icons/icon.ico"
],
- "identifier": "com.tauri.dev",
- "longDescription": "",
+ "identifier": "xyz.modzero.ziemniak",
+ "longDescription": "A bit more flexible interval timer",
"macOS": {
"entitlements": null,
"exceptionDomain": "",
diff --git a/src/App.svelte b/src/App.svelte
index d061fbd..a0b5234 100644
--- a/src/App.svelte
+++ b/src/App.svelte
@@ -1,5 +1,26 @@
@@ -7,5 +28,5 @@
Fire after
-
+
diff --git a/src/assets/potato.svg b/src/assets/potato.svg
new file mode 100644
index 0000000..e1cfedb
--- /dev/null
+++ b/src/assets/potato.svg
@@ -0,0 +1,23 @@
+
\ No newline at end of file
diff --git a/src/assets/svelte.svg b/src/assets/svelte.svg
deleted file mode 100644
index c5e0848..0000000
--- a/src/assets/svelte.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/lib/Counter.svelte b/src/lib/Counter.svelte
deleted file mode 100644
index 0b98585..0000000
--- a/src/lib/Counter.svelte
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
diff --git a/src/main.ts b/src/main.ts
index 3dc6ae5..5c1f795 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,8 +1,6 @@
import './app.css'
import App from './App.svelte'
-import { invoke } from '@tauri-apps/api'
-
const app = new App({
target: document.getElementById('app')
})
diff --git a/vite.config.ts b/vite.config.ts
index 401b4d4..c356f41 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -3,5 +3,8 @@ import { svelte } from '@sveltejs/vite-plugin-svelte'
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [svelte()]
+ plugins: [svelte()],
+ build: {
+ write: true
+ }
})