diff --git a/package.json b/package.json index 00e7ac90..38c952f0 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "@nanostores/persistent": "^0.7.0", "@nanostores/react": "^0.4.1", "@radix-ui/react-dialog": "^1.0.2", + "@radix-ui/react-dropdown-menu": "^2.0.2", "@radix-ui/react-icons": "^1.2.0", "@tauri-apps/api": "^1.2.0", "@uiw/react-markdown-preview": "^4.1.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 612140bf..1ecd81e3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,7 @@ specifiers: '@nanostores/persistent': ^0.7.0 '@nanostores/react': ^0.4.1 '@radix-ui/react-dialog': ^1.0.2 + '@radix-ui/react-dropdown-menu': ^2.0.2 '@radix-ui/react-icons': ^1.2.0 '@tailwindcss/typography': ^0.5.9 '@tauri-apps/api': ^1.2.0 @@ -52,6 +53,7 @@ dependencies: '@nanostores/persistent': 0.7.0_nanostores@0.7.4 '@nanostores/react': 0.4.1_nkfnbc2tpc77iht7asm3uqwau4 '@radix-ui/react-dialog': 1.0.2_zula6vjvt3wdocc4mwcxqa6nzi + '@radix-ui/react-dropdown-menu': 2.0.2_zula6vjvt3wdocc4mwcxqa6nzi '@radix-ui/react-icons': 1.2.0_react@18.2.0 '@tauri-apps/api': 1.2.0 '@uiw/react-markdown-preview': 4.1.8_zula6vjvt3wdocc4mwcxqa6nzi @@ -399,6 +401,30 @@ packages: - supports-color dev: true + /@floating-ui/core/0.7.3: + resolution: {integrity: sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==} + dev: false + + /@floating-ui/dom/0.5.4: + resolution: {integrity: sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==} + dependencies: + '@floating-ui/core': 0.7.3 + dev: false + + /@floating-ui/react-dom/0.7.2_zula6vjvt3wdocc4mwcxqa6nzi: + resolution: {integrity: sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 0.5.4 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + use-isomorphic-layout-effect: 1.1.2_pmekkgnqduwlme35zpnqhenc34 + transitivePeerDependencies: + - '@types/react' + dev: false + /@humanwhocodes/config-array/0.11.8: resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} @@ -697,6 +723,33 @@ packages: '@babel/runtime': 7.21.0 dev: false + /@radix-ui/react-arrow/1.0.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.21.0 + '@radix-ui/react-primitive': 1.0.1_biqbaboplfbrettd7655fr4n2y + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + + /@radix-ui/react-collection/1.0.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.21.0 + '@radix-ui/react-compose-refs': 1.0.0_react@18.2.0 + '@radix-ui/react-context': 1.0.0_react@18.2.0 + '@radix-ui/react-primitive': 1.0.1_biqbaboplfbrettd7655fr4n2y + '@radix-ui/react-slot': 1.0.1_react@18.2.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + /@radix-ui/react-compose-refs/1.0.0_react@18.2.0: resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} peerDependencies: @@ -742,6 +795,15 @@ packages: - '@types/react' dev: false + /@radix-ui/react-direction/1.0.0_react@18.2.0: + resolution: {integrity: sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.21.0 + react: 18.2.0 + dev: false + /@radix-ui/react-dismissable-layer/1.0.2_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==} peerDependencies: @@ -758,6 +820,26 @@ packages: react-dom: 18.2.0_react@18.2.0 dev: false + /@radix-ui/react-dropdown-menu/2.0.2_zula6vjvt3wdocc4mwcxqa6nzi: + resolution: {integrity: sha512-r0kN0fstrSi+uAdK2GkLxnnbhqVBy/9Q4o4PvGOYipW0BldQlYBMSmZprvCNj2i2mAATx16kvzIn12GnaGjbMw==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.21.0 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-compose-refs': 1.0.0_react@18.2.0 + '@radix-ui/react-context': 1.0.0_react@18.2.0 + '@radix-ui/react-id': 1.0.0_react@18.2.0 + '@radix-ui/react-menu': 2.0.2_zula6vjvt3wdocc4mwcxqa6nzi + '@radix-ui/react-primitive': 1.0.1_biqbaboplfbrettd7655fr4n2y + '@radix-ui/react-use-controllable-state': 1.0.0_react@18.2.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + transitivePeerDependencies: + - '@types/react' + dev: false + /@radix-ui/react-focus-guards/1.0.0_react@18.2.0: resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==} peerDependencies: @@ -799,6 +881,60 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-menu/2.0.2_zula6vjvt3wdocc4mwcxqa6nzi: + resolution: {integrity: sha512-H5dtBi/k3tc45IMd2Pu+Q2PyONFlsYJ5sWUlflSs8BQRghh5GhJHLRuB1yb88VOywuzzvGkaR/HUJJ65Jf2POA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.21.0 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-collection': 1.0.1_biqbaboplfbrettd7655fr4n2y + '@radix-ui/react-compose-refs': 1.0.0_react@18.2.0 + '@radix-ui/react-context': 1.0.0_react@18.2.0 + '@radix-ui/react-direction': 1.0.0_react@18.2.0 + '@radix-ui/react-dismissable-layer': 1.0.2_biqbaboplfbrettd7655fr4n2y + '@radix-ui/react-focus-guards': 1.0.0_react@18.2.0 + '@radix-ui/react-focus-scope': 1.0.1_biqbaboplfbrettd7655fr4n2y + '@radix-ui/react-id': 1.0.0_react@18.2.0 + '@radix-ui/react-popper': 1.1.0_zula6vjvt3wdocc4mwcxqa6nzi + '@radix-ui/react-portal': 1.0.1_biqbaboplfbrettd7655fr4n2y + '@radix-ui/react-presence': 1.0.0_biqbaboplfbrettd7655fr4n2y + '@radix-ui/react-primitive': 1.0.1_biqbaboplfbrettd7655fr4n2y + '@radix-ui/react-roving-focus': 1.0.2_biqbaboplfbrettd7655fr4n2y + '@radix-ui/react-slot': 1.0.1_react@18.2.0 + '@radix-ui/react-use-callback-ref': 1.0.0_react@18.2.0 + aria-hidden: 1.2.2_pmekkgnqduwlme35zpnqhenc34 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-remove-scroll: 2.5.5_pmekkgnqduwlme35zpnqhenc34 + transitivePeerDependencies: + - '@types/react' + dev: false + + /@radix-ui/react-popper/1.1.0_zula6vjvt3wdocc4mwcxqa6nzi: + resolution: {integrity: sha512-07U7jpI0dZcLRAxT7L9qs6HecSoPhDSJybF7mEGHJDBDv+ZoGCvIlva0s+WxMXwJEav+ckX3hAlXBtnHmuvlCQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.21.0 + '@floating-ui/react-dom': 0.7.2_zula6vjvt3wdocc4mwcxqa6nzi + '@radix-ui/react-arrow': 1.0.1_biqbaboplfbrettd7655fr4n2y + '@radix-ui/react-compose-refs': 1.0.0_react@18.2.0 + '@radix-ui/react-context': 1.0.0_react@18.2.0 + '@radix-ui/react-primitive': 1.0.1_biqbaboplfbrettd7655fr4n2y + '@radix-ui/react-use-callback-ref': 1.0.0_react@18.2.0 + '@radix-ui/react-use-layout-effect': 1.0.0_react@18.2.0 + '@radix-ui/react-use-rect': 1.0.0_react@18.2.0 + '@radix-ui/react-use-size': 1.0.0_react@18.2.0 + '@radix-ui/rect': 1.0.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + transitivePeerDependencies: + - '@types/react' + dev: false + /@radix-ui/react-portal/1.0.1_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig==} peerDependencies: @@ -836,6 +972,26 @@ packages: react-dom: 18.2.0_react@18.2.0 dev: false + /@radix-ui/react-roving-focus/1.0.2_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-HLK+CqD/8pN6GfJm3U+cqpqhSKYAWiOJDe+A+8MfxBnOue39QEeMa43csUn2CXCHQT0/mewh1LrrG4tfkM9DMA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.21.0 + '@radix-ui/primitive': 1.0.0 + '@radix-ui/react-collection': 1.0.1_biqbaboplfbrettd7655fr4n2y + '@radix-ui/react-compose-refs': 1.0.0_react@18.2.0 + '@radix-ui/react-context': 1.0.0_react@18.2.0 + '@radix-ui/react-direction': 1.0.0_react@18.2.0 + '@radix-ui/react-id': 1.0.0_react@18.2.0 + '@radix-ui/react-primitive': 1.0.1_biqbaboplfbrettd7655fr4n2y + '@radix-ui/react-use-callback-ref': 1.0.0_react@18.2.0 + '@radix-ui/react-use-controllable-state': 1.0.0_react@18.2.0 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + dev: false + /@radix-ui/react-slot/1.0.1_react@18.2.0: resolution: {integrity: sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==} peerDependencies: @@ -884,6 +1040,32 @@ packages: react: 18.2.0 dev: false + /@radix-ui/react-use-rect/1.0.0_react@18.2.0: + resolution: {integrity: sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.21.0 + '@radix-ui/rect': 1.0.0 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-size/1.0.0_react@18.2.0: + resolution: {integrity: sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + dependencies: + '@babel/runtime': 7.21.0 + '@radix-ui/react-use-layout-effect': 1.0.0_react@18.2.0 + react: 18.2.0 + dev: false + + /@radix-ui/rect/1.0.0: + resolution: {integrity: sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==} + dependencies: + '@babel/runtime': 7.21.0 + dev: false + /@rushstack/eslint-patch/1.2.0: resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} dev: true @@ -4869,6 +5051,19 @@ packages: tslib: 2.5.0 dev: false + /use-isomorphic-layout-effect/1.1.2_pmekkgnqduwlme35zpnqhenc34: + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.0.28 + react: 18.2.0 + dev: false + /use-sidecar/1.1.2_pmekkgnqduwlme35zpnqhenc34: resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index f6cc8a89..691b7d1b 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -530,6 +530,17 @@ dependencies = [ "syn", ] +[[package]] +name = "dbus" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" +dependencies = [ + "libc", + "libdbus-sys", + "winapi", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -918,7 +929,7 @@ dependencies = [ "libc", "log", "rustversion", - "windows", + "windows 0.39.0", ] [[package]] @@ -1388,6 +1399,15 @@ version = "0.2.139" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +[[package]] +name = "libdbus-sys" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f8d7ae751e1cb825c840ae5e682f59b098cdfd213c350ac268b61449a5f58a0" +dependencies = [ + "pkg-config", +] + [[package]] name = "libsqlite3-sys" version = "0.24.2" @@ -1474,6 +1494,19 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" +[[package]] +name = "mac-notification-sys" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e72d50edb17756489e79d52eb146927bec8eba9dd48faadf9ef08bca3791ad5" +dependencies = [ + "cc", + "dirs-next", + "objc-foundation", + "objc_id", + "time 0.3.17", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -1625,6 +1658,17 @@ dependencies = [ "memchr", ] +[[package]] +name = "notify-rust" +version = "4.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ce656bb6d22a93ae276a23de52d1aec5ba4db3ece3c0eb79dfd5add7384db6a" +dependencies = [ + "dbus", + "mac-notification-sys", + "tauri-winrt-notification", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1706,6 +1750,17 @@ dependencies = [ "objc_exception", ] +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + [[package]] name = "objc_exception" version = "0.1.2" @@ -2011,7 +2066,7 @@ dependencies = [ "base64 0.13.1", "indexmap", "line-wrap", - "quick-xml", + "quick-xml 0.26.0", "serde", "time 0.3.17", ] @@ -2089,6 +2144,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "quick-xml" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11bafc859c6815fbaffbbbf4229ecb767ac913fecb27f9ad4343662e9ef099ea" +dependencies = [ + "memchr", +] + [[package]] name = "quick-xml" version = "0.26.0" @@ -2252,6 +2316,30 @@ dependencies = [ "winapi", ] +[[package]] +name = "rfd" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" +dependencies = [ + "block", + "dispatch", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "lazy_static", + "log", + "objc", + "objc-foundation", + "objc_id", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.37.0", +] + [[package]] name = "ring" version = "0.16.20" @@ -2758,6 +2846,27 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strum" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7ac893c7d471c8a21f31cfe213ec4f6d9afeed25537c772e08ef3f005f8729e" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339f799d8b549e3744c7ac7feb216383e4005d94bdb22561b3ab8f3b808ae9fb" +dependencies = [ + "heck 0.3.3", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "syn" version = "1.0.107" @@ -2836,7 +2945,7 @@ dependencies = [ "serde", "unicode-segmentation", "uuid 1.3.0", - "windows", + "windows 0.39.0", "windows-implement", "x11-dl", ] @@ -2871,6 +2980,7 @@ dependencies = [ "heck 0.4.1", "http", "ignore", + "notify-rust", "objc", "once_cell", "open", @@ -2878,6 +2988,7 @@ dependencies = [ "rand 0.8.5", "raw-window-handle", "regex", + "rfd", "semver 1.0.16", "serde", "serde_json", @@ -2896,7 +3007,7 @@ dependencies = [ "uuid 1.3.0", "webkit2gtk", "webview2-com", - "windows", + "windows 0.39.0", ] [[package]] @@ -2987,7 +3098,7 @@ dependencies = [ "thiserror", "uuid 1.3.0", "webview2-com", - "windows", + "windows 0.39.0", ] [[package]] @@ -3006,7 +3117,7 @@ dependencies = [ "uuid 1.3.0", "webkit2gtk", "webview2-com", - "windows", + "windows 0.39.0", "wry", ] @@ -3035,7 +3146,18 @@ dependencies = [ "thiserror", "url", "walkdir", - "windows", + "windows 0.39.0", +] + +[[package]] +name = "tauri-winrt-notification" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c58de036c4d2e20717024de2a3c4bf56c301f07b21bc8ef9b57189fce06f1f3b" +dependencies = [ + "quick-xml 0.23.1", + "strum", + "windows 0.39.0", ] [[package]] @@ -3455,6 +3577,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.84" @@ -3580,7 +3714,7 @@ checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows", + "windows 0.39.0", "windows-implement", ] @@ -3605,7 +3739,7 @@ dependencies = [ "serde", "serde_json", "thiserror", - "windows", + "windows 0.39.0", "windows-bindgen", "windows-metadata", ] @@ -3641,6 +3775,19 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" +dependencies = [ + "windows_aarch64_msvc 0.37.0", + "windows_i686_gnu 0.37.0", + "windows_i686_msvc 0.37.0", + "windows_x86_64_gnu 0.37.0", + "windows_x86_64_msvc 0.37.0", +] + [[package]] name = "windows" version = "0.39.0" @@ -3732,6 +3879,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +[[package]] +name = "windows_aarch64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" + [[package]] name = "windows_aarch64_msvc" version = "0.39.0" @@ -3744,6 +3897,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +[[package]] +name = "windows_i686_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" + [[package]] name = "windows_i686_gnu" version = "0.39.0" @@ -3756,6 +3915,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +[[package]] +name = "windows_i686_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" + [[package]] name = "windows_i686_msvc" version = "0.39.0" @@ -3768,6 +3933,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +[[package]] +name = "windows_x86_64_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" + [[package]] name = "windows_x86_64_gnu" version = "0.39.0" @@ -3786,6 +3957,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +[[package]] +name = "windows_x86_64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" + [[package]] name = "windows_x86_64_msvc" version = "0.39.0" @@ -3841,7 +4018,7 @@ dependencies = [ "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows", + "windows 0.39.0", "windows-implement", ] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 472882c1..02ff929a 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -16,7 +16,7 @@ tauri-build = { version = "1.2", features = [] } [dependencies] serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } -tauri = { version = "1.2", features = ["shell-open", "window-start-dragging"] } +tauri = { version = "1.2", features = ["clipboard-all", "notification-all", "shell-open", "window-start-dragging"] } webpage = "1.5.0" [dependencies.tauri-plugin-sql] diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 7787c363..223857c6 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -17,6 +17,14 @@ "all": false, "open": true }, + "clipboard": { + "all": true, + "writeText": true, + "readText": true + }, + "notification": { + "all": true + }, "window": { "startDragging": true } diff --git a/src/components/navigatorBar/index.tsx b/src/components/navigatorBar/index.tsx index 67699574..d3c9e338 100644 --- a/src/components/navigatorBar/index.tsx +++ b/src/components/navigatorBar/index.tsx @@ -1,16 +1,36 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import ActiveLink from '@components/activeLink'; import CreatePost from '@components/navigatorBar/createPost'; +import { ProfileMenu } from '@components/navigatorBar/profileMenu'; +import { truncate } from '@utils/truncate'; + +import { currentUser } from '@stores/currentUser'; + +import { useStore } from '@nanostores/react'; import { PlusIcon } from '@radix-ui/react-icons'; export default function NavigatorBar() { + const $currentUser: any = useStore(currentUser); + const profile = JSON.parse($currentUser.metadata); + return (
{/* main */}
{/* Create post */}
+
+
+
+ {profile.display_name || profile.name} +
+ +
+ + @{profile.username || truncate($currentUser.pubkey, 16, ' .... ')} + +
@@ -28,15 +48,15 @@ export default function NavigatorBar() {
+ activeClassName="ring-1 ring-white/10 dark:bg-zinc-900 dark:text-white" + className="flex h-10 items-center gap-1 rounded-lg px-2.5 text-sm font-medium hover:bg-zinc-900"> # following + activeClassName="ring-1 ring-white/10 dark:bg-zinc-900 dark:text-white" + className="flex h-10 items-center gap-1 rounded-lg px-2.5 text-sm font-medium hover:bg-zinc-900"> # global diff --git a/src/components/navigatorBar/profileMenu.tsx b/src/components/navigatorBar/profileMenu.tsx new file mode 100644 index 00000000..6f65c1f1 --- /dev/null +++ b/src/components/navigatorBar/profileMenu.tsx @@ -0,0 +1,48 @@ +import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; +import { DotsHorizontalIcon } from '@radix-ui/react-icons'; +import { writeText } from '@tauri-apps/api/clipboard'; +import { useRouter } from 'next/router'; +import { nip19 } from 'nostr-tools'; +import { memo } from 'react'; + +export const ProfileMenu = memo(function ProfileMenu({ pubkey }: { pubkey: string }) { + const router = useRouter(); + + const viewProfile = () => { + router.push(`/profile/${pubkey}`); + }; + + const copyPubkey = async () => { + const npub = nip19.npubEncode(pubkey); + await writeText(npub); + }; + + return ( + + + + + + + viewProfile()} + className="group relative flex h-[30px] select-none items-center rounded px-1 pl-6 text-sm leading-none text-zinc-100 outline-none data-[disabled]:pointer-events-none data-[highlighted]:bg-zinc-700 data-[highlighted]:text-fuchsia-400 data-[disabled]:text-zinc-400"> + View profile + + copyPubkey()} + className="group relative flex h-[30px] select-none items-center rounded px-1 pl-6 text-sm leading-none text-zinc-100 outline-none data-[disabled]:pointer-events-none data-[highlighted]:bg-zinc-700 data-[highlighted]:text-fuchsia-400 data-[disabled]:text-zinc-400"> + Copy public key + + + Log out + + + + + ); +}); diff --git a/src/pages/profile/[pubkey].tsx b/src/pages/profile/[pubkey].tsx new file mode 100644 index 00000000..72dc9938 --- /dev/null +++ b/src/pages/profile/[pubkey].tsx @@ -0,0 +1,35 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import BaseLayout from '@layouts/baseLayout'; + +import { GetStaticPaths } from 'next'; +import { JSXElementConstructor, ReactElement, ReactFragment, ReactPortal } from 'react'; + +export default function Page({ pubkey }: { pubkey: string }) { + return
{pubkey}
; +} + +export const getStaticPaths: GetStaticPaths = async () => { + return { + paths: [], + fallback: 'blocking', + }; +}; + +export async function getStaticProps(context) { + const pubkey = context.params.pubkey; + return { + props: { pubkey }, + }; +} + +Page.getLayout = function getLayout( + page: + | string + | number + | boolean + | ReactElement> + | ReactFragment + | ReactPortal +) { + return {page}; +}; diff --git a/tailwind.config.js b/tailwind.config.js index 2dbb4434..ee947538 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -49,11 +49,31 @@ module.exports = { from: { opacity: 0, transform: 'translate(-50%, -48%) scale(0.96)' }, to: { opacity: 1, transform: 'translate(-50%, -50%) scale(1)' }, }, + slideDownAndFade: { + from: { opacity: 0, transform: 'translateY(-2px)' }, + to: { opacity: 1, transform: 'translateY(0)' }, + }, + slideLeftAndFade: { + from: { opacity: 0, transform: 'translateX(2px)' }, + to: { opacity: 1, transform: 'translateX(0)' }, + }, + slideUpAndFade: { + from: { opacity: 0, transform: 'translateY(2px)' }, + to: { opacity: 1, transform: 'translateY(0)' }, + }, + slideRightAndFade: { + from: { opacity: 0, transform: 'translateX(2px)' }, + to: { opacity: 1, transform: 'translateX(0)' }, + }, }, animation: { disco: 'disco 1.5s linear infinite', overlayShow: 'overlayShow 150ms cubic-bezier(0.16, 1, 0.3, 1)', contentShow: 'contentShow 150ms cubic-bezier(0.16, 1, 0.3, 1)', + slideDownAndFade: 'slideDownAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)', + slideLeftAndFade: 'slideLeftAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)', + slideUpAndFade: 'slideUpAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)', + slideRightAndFade: 'slideRightAndFade 400ms cubic-bezier(0.16, 1, 0.3, 1)', }, }, },