Compare commits

..
218 Commits
Author SHA1 Message Date
Ren AmamiyaandGitHub 619bfb8dff Merge pull request #122 from luminous-devs/v2.1.4
v2.1.4
2023-11-26 07:22:13 +07:00
reya 7759851541 clean up 2023-11-26 07:21:24 +07:00
reya 9112c1c24a improve connection 2023-11-25 17:56:45 +07:00
reya 24b21a9451 update 2023-11-25 16:03:05 +07:00
reya 31a53b9c48 add @ suggestion popup 2023-11-25 15:41:18 +07:00
reya dc229f40cb fix new article layout 2023-11-25 11:07:31 +07:00
reya 54ad1e6e1d fix new post layout 2023-11-25 09:22:15 +07:00
Ren AmamiyaandGitHub 065ccbbea4 Merge pull request #121 from luminous-devs/fix/nsecbunker
Fix stuck issue for connect with nsecbunker
2023-11-24 13:53:26 +07:00
reya 74738c36cd disable blockUntilReady 2023-11-23 15:12:46 +07:00
Ren AmamiyaandGitHub 2fdf437789 Merge pull request #120 from luminous-devs/fix/logout
Fix logout function and other issues
2023-11-23 08:54:24 +07:00
reya 731c72535c bump version 2023-11-23 08:52:47 +07:00
reya 628102087e fix total account count function 2023-11-23 08:52:04 +07:00
reya 536ea30ed2 fix logout function 2023-11-23 08:49:05 +07:00
reya 8ee38cdb42 temp disable single-instance plugin 2023-11-22 17:27:09 +07:00
Ren AmamiyaandGitHub a896300f23 Merge pull request #118 from luminous-devs/v2.1.2
v2.1.2
2023-11-22 16:18:02 +07:00
reya d3cf1200ba bump version 2023-11-22 16:13:06 +07:00
reya b5ac3df090 fix package 2023-11-22 16:10:20 +07:00
reya 3b40dd6903 update dependencies 2023-11-22 15:27:19 +07:00
Ren AmamiyaandGitHub efba6b20ea Merge pull request #117 from luminous-devs/feat/optional-updater
Make auto update is optional
2023-11-22 10:34:49 +07:00
Ren AmamiyaandGitHub 05fb56e5fc Merge pull request #116 from vivganes/patch-1
Little grammar corrections
2023-11-22 10:32:47 +07:00
Vivek GanesanandGitHub 59d9646e9f Little grammar corrections 2023-11-22 08:43:31 +05:30
reya b73d84fccb update storage provider 2023-11-22 09:05:10 +07:00
reya 1929ceb72d add toast message 2023-11-22 08:31:58 +07:00
reya a1d22c1daf make auto update is optional 2023-11-22 08:30:43 +07:00
reya cf7af1ba64 fix ci again again 2023-11-20 08:47:16 +07:00
reya 933ca758ee fix ci again 2023-11-20 08:27:37 +07:00
reya f537209b92 fix ci 2023-11-20 08:16:39 +07:00
reya 6777610b07 update dependencies 2023-11-20 08:02:09 +07:00
reya 88803cd3cd bump version 2023-11-19 19:51:00 +07:00
Ren AmamiyaandGitHub 6adf5933b0 Merge pull request #113 from luminous-devs/hotfix/themes
Add support dark mode for toaster
2023-11-19 19:49:59 +07:00
reya 9521a49fff support dark mode for toaster 2023-11-19 19:49:26 +07:00
Ren AmamiyaandGitHub 5789a105f5 Merge pull request #112 from luminous-devs/hotfix/settings
Fix settings screen
2023-11-19 15:15:11 +07:00
reya b7a18bea34 respect user settings 2023-11-19 14:50:59 +07:00
reya 7117ed05a9 update settings screen 2023-11-19 08:48:01 +07:00
reya c53bdb68e5 add change theme function 2023-11-18 21:17:37 +07:00
reya 6725dca807 fix all dms bugs 2023-11-17 16:03:12 +07:00
Ren AmamiyaandGitHub 077712cf43 Merge pull request #105 from luminous-devs/feat/v2.1.0
v2.1.0
2023-11-17 10:06:58 +07:00
reya 2794c78ee1 add new private key screen 2023-11-17 09:24:21 +07:00
reya 21574023db update dark mode 2023-11-17 08:16:25 +07:00
reya 954b729dc9 wip: settings screen 2023-11-16 17:48:29 +07:00
reya 6dc4e1cde6 bump version 2023-11-16 08:38:23 +07:00
reya efbdf26706 add window state plugin 2023-11-16 08:25:08 +07:00
reya b41ec353c6 improve relay connection 2023-11-16 07:59:29 +07:00
reya 875225591a wip: settings screen 2023-11-15 14:20:45 +07:00
reya 04c1223f2e update article screen 2023-11-15 13:32:23 +07:00
reya 773e49afa2 wip 2023-11-15 13:13:11 +07:00
reya 025d7a623b polish 2023-11-15 10:27:47 +07:00
reya b6caab15e1 update tauri controls 2023-11-15 09:26:59 +07:00
reya 1d3d0a17dc fix updater 2023-11-15 08:32:40 +07:00
reya 1cbe781698 update error screen 2023-11-14 16:14:40 +07:00
reya dc5b4f8ac1 refactor publish event 2023-11-14 15:15:13 +07:00
reya fee4ad7b98 smal fixes and update article layout 2023-11-13 15:44:58 +07:00
reya d5647d7452 redesign loading screen 2023-11-13 08:16:36 +07:00
reya 0a5076f06c polish 2023-11-12 15:43:14 +07:00
reya a3632571ff polish 2023-11-12 08:41:47 +07:00
reya 5c48ebe103 improve spacing 2023-11-11 16:12:50 +07:00
reya 1c3119577f update widget list 2023-11-11 09:14:23 +07:00
reya 0710996a0d wip: update widget list 2023-11-10 16:05:20 +07:00
reya 0cdf199cb5 wip: rework widget 2023-11-09 18:02:25 +07:00
reya cb9006abb2 add topic widget 2023-11-09 09:12:42 +07:00
reya 108ecafab7 update widgets 2023-11-08 16:17:47 +07:00
reya 6b030f2902 polish 2023-11-08 08:21:52 +07:00
reya ce864c8990 wip 2023-11-07 16:23:01 +07:00
reya ee3e8eb105 wip 2023-11-07 09:35:13 +07:00
reya 701712e7b8 polish 2023-11-05 15:19:51 +07:00
reya dad388c6ab new parser 2023-11-04 14:18:29 +07:00
Ren AmamiyaandGitHub 912c740c51 Merge pull request #103 from luminous-devs/feat/personal-dashboard
Add personal dashboard
2023-11-03 15:41:28 +07:00
reya da0b48c5df update personal dashboard screen 2023-11-03 15:38:58 +07:00
reya 64b4745993 update personal screen 2023-11-03 08:45:25 +07:00
reya 8aa2ef39c5 update nip-05 and user profile component styles 2023-11-02 13:47:44 +07:00
reya a945f04959 update dependencies 2023-11-02 13:09:52 +07:00
reya c93989237a fix app crash issue 2023-11-01 16:59:13 +07:00
reya 95cf3f60f3 readd updater pubkey 2023-11-01 16:42:20 +07:00
Ren AmamiyaandGitHub dd21633624 Merge pull request #102 from luminous-devs/feat/v2.0.1
v2.0.1
2023-11-01 15:38:39 +07:00
reya f01074ea9f fix article 2023-11-01 15:37:50 +07:00
reya c8d04f4695 support tiff image 2023-11-01 15:24:46 +07:00
reya 2f8aa66ff6 bump version 2023-11-01 15:08:22 +07:00
reya 3ad6830bfb update title bar 2023-11-01 14:58:20 +07:00
reya f2dddf97f5 polish 2023-11-01 13:01:52 +07:00
reya e218ebee89 refactor text parser 2023-11-01 10:05:08 +07:00
reya fd5ecc18a9 refactor all widgets 2023-11-01 08:07:49 +07:00
reya e7738fb128 refactor newsfeed widget 2023-10-30 16:29:49 +07:00
reya 0b25a4a04b add ndk cache tauri 2023-10-29 11:07:05 +07:00
reya ace58ecdd5 refactor text parser 2023-10-28 14:36:12 +07:00
reya 6685d9af38 update user component 2023-10-28 08:29:38 +07:00
reya 60b803f419 unify upload function 2023-10-28 07:51:42 +07:00
reya 555c8ec08a migrate to tanstack query v5 2023-10-28 07:35:39 +07:00
reya 42eb882f52 update dependencies 2023-10-27 17:45:08 +07:00
reya b6784aa979 add missing deps to gh ci 2023-10-26 13:39:11 +07:00
reya 08a7bdc6d5 fix ci again 2023-10-26 13:30:43 +07:00
reya 6fac37a0ca improve follow/unfollow, support petname 2023-10-26 13:29:13 +07:00
reya 37ed0f4892 fix ci 2023-10-26 13:11:06 +07:00
reya 1cb2d8cb41 small fixes 2023-10-26 12:32:03 +07:00
reya 3abce5e6d6 update appicon and tauri config 2023-10-26 12:24:32 +07:00
reya 842f9e14e0 add updater v2 2023-10-26 10:33:27 +07:00
reya 0c8dcef937 ready for alpha 2023-10-26 09:29:33 +07:00
Ren AmamiyaandGitHub 50f81a7d0b Merge pull request #98 from sectore/feat/flake-nix
Add Nix dev environment
2023-10-25 09:23:45 +07:00
reya dcacf23625 add notification widget 2023-10-25 09:23:20 +07:00
jk b01af39445 typo + cleanup 2023-10-24 17:26:50 +02:00
reya 507628bcaa update ui for consistent in light and dark mode 2023-10-24 21:15:59 +07:00
jk 4dfea49f71 Nix dev environment 2023-10-24 14:57:15 +02:00
reya 854a47f266 wip 2023-10-24 13:11:10 +07:00
reya b1a44f2cbf wip: new composer 2023-10-22 15:48:06 +07:00
reya cade8c8b4c wip: multi-type composer 2023-10-21 15:58:39 +07:00
reya de88ca51fe update 2023-10-20 15:15:30 +07:00
reya 7c8d8a09fd wip: nsecbunker 2023-10-20 09:36:49 +07:00
reya e1e54c1a98 update thread widget 2023-10-19 14:45:41 +07:00
reya 0de72eb009 polish 2023-10-19 08:59:50 +07:00
reya 823fb0f239 bump version 2023-10-18 14:59:33 +07:00
Ren AmamiyaandGitHub 3660db4887 Merge pull request #94 from luminous-devs/feat/v2
v2.0.0
2023-10-18 14:55:05 +07:00
reya b18ae56c36 Merge branch 'main' into feat/v2 2023-10-18 14:53:11 +07:00
reya 939a72f945 ok fine 2023-10-18 14:49:20 +07:00
reya 489ab6bd0b wip: polish 2023-10-18 08:43:31 +07:00
reya 7fa1e89dc8 wip: complete new onboarding 2023-10-17 16:33:41 +07:00
reya 3aa4f294f9 wip: new onboarding 2023-10-16 14:42:19 +07:00
reya cd3b9ada5a wip: new import account 2023-10-15 16:10:16 +07:00
reya 620e763380 wip: new onboarding 2023-10-14 15:19:49 +07:00
reya 0777c483e5 wip: fix ui for macos 2023-10-13 09:12:30 +07:00
reya 893663561d wip: fix light mode 2023-10-13 08:35:07 +07:00
reya 35650a40f2 wip 2023-10-12 09:13:06 +07:00
Phong 3b46e71525 wip: native secure store 2023-10-11 14:46:35 +07:00
Phong 2fcbf1987b rework macos version 2023-10-11 13:45:56 +07:00
Ren Amamiya c3f399ea0b rollback to virtua v0.9.1 2023-10-11 08:04:20 +07:00
Ren Amamiya 770a63de63 wip 2023-10-10 15:49:23 +07:00
Ren Amamiya bc4c3b9803 wip 2023-10-10 11:51:01 +07:00
Ren Amamiya 043c1b1220 wip: update color palette 2023-10-10 08:25:31 +07:00
Ren Amamiya d20ee26e22 wip: add harmony color palette 2023-10-09 19:05:50 +07:00
Ren Amamiya 8930300fb5 wip 2023-10-09 15:17:15 +07:00
Ren Amamiya 140b8a47bf wip: ui 2023-10-09 11:30:52 +07:00
Ren Amamiya ced23341d2 wip: new sidebar 2023-10-08 18:01:19 +07:00
Ren Amamiya 0946e9125e wip: ui 2023-10-08 14:14:39 +07:00
Ren Amamiya bce76bd41c wip: ui 2023-10-08 09:31:11 +07:00
Ren Amamiya cb91373d33 wip: dark mode - light mode 2023-10-07 09:06:33 +07:00
Ren Amamiya c71bfb3f6d wip: fully migrate to tauri v2 2023-10-06 09:08:37 +07:00
reya 9627c40d75 wip: tauri v2 2023-10-06 08:30:59 +07:00
Ren Amamiya 1240353e30 wip 2023-10-06 07:40:50 +07:00
Ren Amamiya cef6b9aca9 wip: new chat layout 2023-10-05 14:55:12 +07:00
Ren Amamiya 508a746578 wip 2023-10-05 07:28:35 +07:00
Ren Amamiya 222ef2ca32 fix: vidstack bug 2023-10-04 20:30:41 +07:00
Ren Amamiya 32843018aa chore(release): v1.2.7 2023-10-04 14:27:48 +07:00
Ren Amamiya f80dd78a8e wip 2023-10-04 14:11:45 +07:00
Ren Amamiya 9df4835be3 fix ci 2023-10-04 11:17:04 +07:00
Ren Amamiya 480580890e wip: new chat screen 2023-10-04 11:15:10 +07:00
Ren Amamiya ca57ef1760 Merge branch 'main' into feat/nip28 2023-10-04 07:48:52 +07:00
Ren Amamiya 8e39bca57c fix build 2023-10-04 07:48:20 +07:00
Ren Amamiya 8d9ec0dcfd update config 2023-10-03 18:43:39 +07:00
Ren Amamiya 428d52f175 wip 2023-10-03 16:24:09 +07:00
Ren Amamiya cdeb5afd28 upgrade to tauri v1.5.1 2023-10-03 07:38:23 +07:00
Ren Amamiya 1f3ba09cec new app icon 2023-10-02 15:36:20 +07:00
Ren Amamiya 4915b833e7 small fixed 2023-10-01 15:00:38 +07:00
Ren Amamiya 674e5f0339 finish relay manegament screen 2023-10-01 09:02:14 +07:00
Ren Amamiya 11ed618a7f wip: relay manegament screen 2023-09-30 19:07:17 +07:00
Ren Amamiya a2e3247432 wip 2023-09-30 15:12:33 +07:00
Ren Amamiya 09b3eeda99 small fixes and bump version 2023-09-29 12:40:02 +07:00
Ren Amamiya 700f3eb85f upgrade to tauri v1.5.0 2023-09-29 09:19:40 +07:00
Ren Amamiya 2f87ed8949 polish widget code 2023-09-29 09:11:38 +07:00
Ren Amamiya cb3c95b133 clean up and improve perf 2023-09-28 16:18:04 +07:00
Ren Amamiya 4f4e2f5ccd wip: multi account 2023-09-28 14:00:52 +07:00
Ren AmamiyaandGitHub 0e6fc65b08 Merge pull request #91 from luminous-devs/feat/ui-patch
v1.2.6
2023-09-28 08:28:34 +07:00
Ren Amamiya 876d351358 update dependencies and polish 2023-09-28 08:22:38 +07:00
Ren Amamiya c80414a72d small fixes and support $ boost sign 2023-09-28 07:29:05 +07:00
Ren Amamiya 7cef6efa6f fix crash on windows 2023-09-27 18:24:58 +07:00
Ren Amamiya 74ff49b8db fix app window is not resizable 2023-09-27 16:11:33 +07:00
Ren Amamiya 2b50fc438f improve startup time 2023-09-27 14:53:01 +07:00
Ren Amamiya b339e842ca perf improve 2023-09-27 08:32:19 +07:00
Ren Amamiya 1d93f8cf6a clean up 2023-09-26 09:40:02 +07:00
Ren Amamiya 236131087a polish 2023-09-26 09:05:39 +07:00
Ren Amamiya a66770989b wip: finish browse users 2023-09-25 14:35:47 +07:00
Ren Amamiya 9ff74599eb customize traffic light on macOS 2023-09-25 07:43:13 +07:00
Ren Amamiya c049fa8865 wip: update browse user screen 2023-09-24 15:42:49 +07:00
Ren Amamiya 41b12746a7 wip 2023-09-24 09:13:42 +07:00
Ren Amamiya 50f90ddcc2 wip 2023-09-24 07:55:27 +07:00
Ren Amamiya c9bc7b81dd wip: browse user 2023-09-22 14:13:55 +07:00
Ren Amamiya 18a9ba3fb0 wip: replace ndk cache with metadata table 2023-09-21 16:11:35 +07:00
Ren Amamiya 413571ee7f wip 2023-09-21 15:28:01 +07:00
Ren Amamiya 17fe3bb1f6 wip: timeline 2023-09-21 09:11:45 +07:00
Ren Amamiya 0e5adb246f resizable widget 2023-09-20 14:31:14 +07:00
Ren Amamiya 296136203a update dependencies 2023-09-20 08:22:02 +07:00
Ren Amamiya 1bbfebc2b8 fix ci again 2023-09-19 16:31:38 +07:00
Ren Amamiya d84e97b0d4 fix ci 2023-09-19 15:59:50 +07:00
Ren Amamiya 824aa8fa28 back to pnpm, bun is fun but cannot generate tauri build 2023-09-19 15:56:33 +07:00
Ren Amamiya 2b34ef3b7a fix build error 2023-09-19 15:29:26 +07:00
Ren Amamiya 4fa8f40e6a improve nwc 2023-09-19 15:06:12 +07:00
Ren Amamiya c1bddeb6ed bump version 2023-09-19 11:20:15 +07:00
Ren Amamiya 5c2bfa0ea3 improve notification 2023-09-19 11:15:35 +07:00
Ren Amamiya 60e93965ea respect user's relay list (kind 10002) 2023-09-19 08:01:57 +07:00
Ren Amamiya 380d1fb930 temporary using default relays 2023-09-18 15:42:17 +07:00
Ren Amamiya 53aa13c8aa clean up messy code 2023-09-18 09:50:15 +07:00
Ren Amamiya 13f5190ba1 update dependencies and better handle repost 2023-09-17 16:14:04 +07:00
Ren AmamiyaandGitHub c590e290e0 Merge pull request #87 from luminous-devs/feat/improve-onboarding
merge now, improve later
2023-09-17 08:44:16 +07:00
Ren Amamiya cdf86a2613 polish 2023-09-17 08:43:42 +07:00
Ren Amamiya 8726e22b38 replace nostr.com with njump.me 2023-09-17 08:03:29 +07:00
Ren Amamiya 1206486016 partial support replaceable event 2023-09-16 16:06:01 +07:00
Ren Amamiya 11ad281d72 wip 2023-09-16 08:57:24 +07:00
Ren Amamiya fe4bfa1699 wip: learn nostr widget 2023-09-16 07:47:44 +07:00
Ren Amamiya c6a0636e8c add complete screen 2023-09-15 10:29:39 +07:00
Ren Amamiya d3db6492d9 update onboarding 2023-09-15 08:58:09 +07:00
Ren Amamiya 8f8617d8f9 update import key flow 2023-09-14 16:51:38 +07:00
Ren Amamiya 8e513404c3 update create account flow 2023-09-14 09:20:36 +07:00
Ren Amamiya 5a6dd172b1 small fixes 2023-09-13 11:10:24 +07:00
Ren Amamiya fa0d7cac31 hide nwc secret in frontend 2023-09-12 16:16:57 +07:00
Ren Amamiya 432b2ae185 polish nwc connection flow 2023-09-12 16:00:41 +07:00
Ren Amamiya fb8a6581dd replace pnpm with bun 2023-09-12 08:43:12 +07:00
Ren Amamiya a4f221f868 wip: redesign nwc 2023-09-12 08:27:29 +07:00
Ren Amamiya 602d012efe fix alby connection 2023-09-11 07:52:43 +07:00
Ren Amamiya 5bf816eba2 fully suport alby nostr-wallet-connect 2023-09-10 16:25:35 +07:00
Ren Amamiya a33c9d3517 wip: integrate alby 2023-09-10 07:19:36 +07:00
Ren Amamiya 1553f5ced2 bump version 2023-09-09 07:21:02 +07:00
Ren Amamiya 41901b2174 fix hashtag step in onboarding 2023-09-08 17:02:01 +07:00
Ren Amamiya 177e4c1ff7 fix some bugs 2023-09-08 15:29:41 +07:00
Ren Amamiya 10036500cb small fixes 2023-09-08 09:22:09 +07:00
Ren Amamiya a1fa777f8c fix logout function, prepare for multi-account support 2023-09-08 08:36:15 +07:00
Ren Amamiya 472925bb05 small fixes 2023-09-07 12:19:28 +07:00
Ren Amamiya 8eb11efb34 update notification 2023-09-07 11:34:26 +07:00
Ren Amamiya 48066a4018 bump version 2023-09-06 16:53:05 +07:00
Ren Amamiya 5c8850ea8f redesign widget list 2023-09-06 14:30:57 +07:00
Ren Amamiya 09aea3cff5 update widgets 2023-09-06 08:58:02 +07:00
Ren Amamiya 45c5a890b9 update tauri config 2023-09-06 07:46:31 +07:00
369 changed files with 17571 additions and 15175 deletions
+1
View File
@@ -0,0 +1 @@
use flake
+5 -4
View File
@@ -32,7 +32,7 @@ jobs:
if: matrix.settings.platform == 'ubuntu-22.04' if: matrix.settings.platform == 'ubuntu-22.04'
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install -y build-essential libssl-dev libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf sudo apt-get install -y build-essential libssl-dev javascriptcoregtk-4.1 libayatana-appindicator3-dev libsoup-3.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev webkit2gtk-4.1 librsvg2-dev patchelf
- name: Install pnpm - name: Install pnpm
uses: pnpm/action-setup@v2 uses: pnpm/action-setup@v2
with: with:
@@ -51,17 +51,18 @@ jobs:
- uses: tauri-apps/tauri-action@dev - uses: tauri-apps/tauri-action@dev
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
with: with:
tagName: v__VERSION__ tagName: v__VERSION__
releaseName: 'App v__VERSION__' releaseName: 'v__VERSION__'
releaseBody: 'See the assets to download this version and install.' releaseBody: 'See the assets to download this version and install.'
releaseDraft: true releaseDraft: true
prerelease: false prerelease: false
+3 -1
View File
@@ -14,9 +14,11 @@ out
*.local *.local
.next .next
.vscode .vscode
pnpm-lock.yaml
*.db *.db
*.db-journal *.db-journal
bun.lockb
.direnv
# Editor directories and files # Editor directories and files
.vscode/* .vscode/*
+15 -6
View File
@@ -8,6 +8,12 @@ Download Lume for your platform here: [https://github.com/luminous-devs/lume/rel
Supported platform: macOS, Windows and Linux Supported platform: macOS, Windows and Linux
### Prerequisites
- PNPM or Bun (experiment)
- Tauri: https://tauri.app/v1/guides/getting-started/prerequisites#setting-up-macos
### Develop ### Develop
Clone project Clone project
@@ -22,20 +28,23 @@ Install packages
pnpm install pnpm install
``` ```
Run dev Run dev build
``` ```
pnpm tauri dev pnpm tauri dev
``` ```
Build Generate production build
``` ```
pnpm tauri build pnpm tauri build
``` ```
(Advance) - Generate SQLite migration #### Nix
``` Requirements:
pnpm add-migrate <migrate_name>
``` 1. [Install Nix](https://zero-to-flakes.com/install)
1. [Setup `direnv`](https://zero-to-flakes.com/direnv)
`cd` into the root folder of the project to enter `nix develop` shell. Run `direnv allow` (only once). Then run `pnpm` or `bun` (experimental) commands as described above.
Generated
+130
View File
@@ -0,0 +1,130 @@
{
"nodes": {
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1694529238,
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_2": {
"inputs": {
"systems": "systems_2"
},
"locked": {
"lastModified": 1681202837,
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1697723726,
"narHash": "sha256-SaTWPkI8a5xSHX/rrKzUe+/uVNy6zCGMXgoeMb7T9rg=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "7c9cc5a6e5d38010801741ac830a3f8fd667a7a0",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1681358109,
"narHash": "sha256-eKyxW4OohHQx9Urxi7TQlFBTDWII+F+x2hklDOQPB50=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "96ba1c52e54e74c3197f4d43026b3f3d92e83ff9",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs",
"rust-overlay": "rust-overlay"
}
},
"rust-overlay": {
"inputs": {
"flake-utils": "flake-utils_2",
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1697940838,
"narHash": "sha256-eyk92QqAoRNC0V99KOcKcBZjLPixxNBS0PRc4KlSQVs=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "a3e829c06eadf848f13d109c7648570ce37ebccd",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}
+71
View File
@@ -0,0 +1,71 @@
# Nix.flake to build Lume based on Tauri's Guides:
# Prerequisites -> Installing -> Setting Up Linux -> NixOS
# https://tauri.app/v1/guides/getting-started/prerequisites/#1-system-dependencies
#
# To build Rust backend of Tauri `rust-overlay` is used
# https://github.com/oxalica/rust-overlay
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
rust-overlay.url = "github:oxalica/rust-overlay";
};
outputs = { self, nixpkgs, flake-utils, rust-overlay }:
flake-utils.lib.eachDefaultSystem (system:
let
overlays = [ (import rust-overlay) ];
pkgs = import nixpkgs {
inherit system overlays;
};
libraries = with pkgs;[
webkitgtk
gtk3
cairo
gdk-pixbuf
glib
dbus
openssl_3
librsvg
];
packages = with pkgs; [
curl
wget
pkg-config
dbus
openssl_3
glib
gtk3
libsoup
webkitgtk
librsvg
];
rustToolchain = pkgs.rust-bin.stable.latest.default.override {
extensions = [ "rust-src" ]; # needed by rust-analyzer
};
in
{
devShells.default = pkgs.mkShell {
buildInputs = [
rustToolchain
pkgs.nodejs
pkgs.nodePackages.pnpm
pkgs.bun # experimental in Lume
] ++ packages;
shellHook =
''
export LD_LIBRARY_PATH=${pkgs.lib.makeLibraryPath libraries}:$LD_LIBRARY_PATH
export XDG_DATA_DIRS=${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}:${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}:$XDG_DATA_DIRS
'';
# Avoid white screen running with Nix
# https://github.com/tauri-apps/tauri/issues/4315#issuecomment-1207755694
WEBKIT_DISABLE_COMPOSITING_MODE = 1;
};
});
}
+3 -3
View File
@@ -1,11 +1,11 @@
<html lang="en" class="dark"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Lume</title> <title>Lume</title>
</head> </head>
<body class="relative cursor-default select-none overflow-hidden font-sans antialiased h-screen w-screen text-white"> <body class="relative cursor-default select-none overflow-hidden font-sans antialiased h-screen w-screen text-neutral-950 dark:text-neutral-50">
<div id="root"></div> <div id="root"></div>
<script type="module" src="/src/main.tsx"></script> <script type="module" src="/src/main.jsx"></script>
</body> </body>
</html> </html>
+82 -61
View File
@@ -2,7 +2,7 @@
"name": "lume", "name": "lume",
"description": "the communication app", "description": "the communication app",
"private": true, "private": true,
"version": "1.2.2", "version": "2.1.4",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build",
@@ -18,86 +18,107 @@
"**/*.{ts, tsx, css, md, html, json}": "prettier --cache --write" "**/*.{ts, tsx, css, md, html, json}": "prettier --cache --write"
}, },
"dependencies": { "dependencies": {
"@ctrl/magnet-link": "^3.1.2", "@evilmartians/harmony": "^1.1.0",
"@getalby/sdk": "^2.4.0", "@getalby/sdk": "^2.7.0",
"@nostr-dev-kit/ndk": "^0.8.23", "@nostr-dev-kit/ndk": "^2.1.1",
"@nostr-fetch/adapter-ndk": "^0.12.2", "@nostr-fetch/adapter-ndk": "^0.13.1",
"@radix-ui/react-alert-dialog": "^1.0.4", "@radix-ui/react-alert-dialog": "^1.0.5",
"@radix-ui/react-avatar": "^1.0.4",
"@radix-ui/react-collapsible": "^1.0.3", "@radix-ui/react-collapsible": "^1.0.3",
"@radix-ui/react-dialog": "^1.0.4", "@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-dropdown-menu": "^2.0.5", "@radix-ui/react-dropdown-menu": "^2.0.6",
"@radix-ui/react-popover": "^1.0.6", "@radix-ui/react-hover-card": "^1.0.7",
"@radix-ui/react-tooltip": "^1.0.6", "@radix-ui/react-popover": "^1.0.7",
"@tanstack/react-query": "^4.33.0", "@radix-ui/react-switch": "^1.0.3",
"@tanstack/react-virtual": "3.0.0-beta.54", "@radix-ui/react-toolbar": "^1.0.4",
"@tauri-apps/api": "^1.4.0", "@radix-ui/react-tooltip": "^1.0.7",
"@tiptap/extension-image": "^2.1.8", "@tanstack/react-query": "^5.8.7",
"@tiptap/extension-mention": "^2.1.8", "@tauri-apps/api": "2.0.0-alpha.11",
"@tiptap/extension-placeholder": "^2.1.8", "@tauri-apps/cli": "2.0.0-alpha.17",
"@tiptap/pm": "^2.1.8", "@tauri-apps/plugin-autostart": "2.0.0-alpha.3",
"@tiptap/react": "^2.1.8", "@tauri-apps/plugin-clipboard-manager": "2.0.0-alpha.3",
"@tiptap/starter-kit": "^2.1.8", "@tauri-apps/plugin-dialog": "2.0.0-alpha.3",
"@tiptap/suggestion": "^2.1.8", "@tauri-apps/plugin-fs": "2.0.0-alpha.3",
"@void-cat/api": "^1.0.7", "@tauri-apps/plugin-http": "2.0.0-alpha.3",
"dayjs": "^1.11.9", "@tauri-apps/plugin-notification": "2.0.0-alpha.3",
"destr": "^2.0.1", "@tauri-apps/plugin-os": "2.0.0-alpha.4",
"get-urls": "^12.1.0", "@tauri-apps/plugin-process": "2.0.0-alpha.3",
"@tauri-apps/plugin-shell": "2.0.0-alpha.3",
"@tauri-apps/plugin-sql": "2.0.0-alpha.3",
"@tauri-apps/plugin-updater": "2.0.0-alpha.3",
"@tauri-apps/plugin-upload": "2.0.0-alpha.3",
"@tiptap/extension-character-count": "^2.1.12",
"@tiptap/extension-document": "^2.1.12",
"@tiptap/extension-image": "^2.1.12",
"@tiptap/extension-mention": "^2.1.12",
"@tiptap/extension-paragraph": "^2.1.12",
"@tiptap/extension-placeholder": "^2.1.12",
"@tiptap/extension-text": "^2.1.12",
"@tiptap/pm": "^2.1.12",
"@tiptap/react": "^2.1.12",
"@tiptap/starter-kit": "^2.1.12",
"@tiptap/suggestion": "^2.1.12",
"dayjs": "^1.11.10",
"framer-motion": "^10.16.5",
"html-to-text": "^9.0.5", "html-to-text": "^9.0.5",
"idb-keyval": "^6.2.1",
"light-bolt11-decoder": "^3.0.0", "light-bolt11-decoder": "^3.0.0",
"lru-cache": "^10.0.1", "lru-cache": "^10.1.0",
"markdown-to-jsx": "^7.3.2",
"media-chrome": "^1.5.3",
"minidenticons": "^4.2.0", "minidenticons": "^4.2.0",
"nostr-fetch": "^0.13.0", "nanoid": "^5.0.3",
"nostr-tools": "^1.14.2", "nostr-fetch": "^0.13.1",
"nostr-tools": "^1.17.0",
"qrcode.react": "^3.1.0", "qrcode.react": "^3.1.0",
"re-resizable": "^6.9.11",
"react": "^18.2.0", "react": "^18.2.0",
"react-currency-input-field": "^3.6.12",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-hook-form": "^7.46.1", "react-hook-form": "^7.48.2",
"react-hotkeys-hook": "^4.4.1", "react-hotkeys-hook": "^4.4.1",
"react-markdown": "^8.0.7", "react-router-dom": "^6.20.0",
"react-player": "^2.12.0", "react-string-replace": "^1.1.1",
"react-router-dom": "^6.15.0", "reactflow": "^11.10.1",
"react-textarea-autosize": "^8.5.3", "sonner": "^1.2.3",
"react-virtuoso": "^4.5.0", "tailwind-scrollbar": "^3.0.5",
"remark-gfm": "^3.0.1", "tauri-controls": "github:reyamir/tauri-controls",
"tauri-plugin-sql-api": "github:tauri-apps/tauri-plugin-sql#v1",
"tauri-plugin-store-api": "github:tauri-apps/tauri-plugin-store#v1",
"tauri-plugin-stronghold-api": "github:tauri-apps/tauri-plugin-stronghold#v1",
"tauri-plugin-upload-api": "github:tauri-apps/tauri-plugin-upload#v1",
"tippy.js": "^6.3.7", "tippy.js": "^6.3.7",
"zustand": "^4.4.1" "tiptap-markdown": "^0.8.4",
"virtua": "^0.16.7",
"zustand": "^4.4.6"
}, },
"devDependencies": { "devDependencies": {
"@tailwindcss/typography": "^0.5.9", "@tailwindcss/typography": "^0.5.10",
"@tauri-apps/cli": "^1.4.0", "@trivago/prettier-plugin-sort-imports": "^4.3.0",
"@trivago/prettier-plugin-sort-imports": "^4.2.0", "@types/html-to-text": "^9.0.4",
"@types/html-to-text": "^9.0.1", "@types/node": "^20.10.0",
"@types/node": "^20.5.9", "@types/react": "^18.2.38",
"@types/react": "^18.2.21", "@types/react-dom": "^18.2.17",
"@types/react-dom": "^18.2.7", "@types/youtube-player": "^5.5.11",
"@types/youtube-player": "^5.5.7", "@typescript-eslint/eslint-plugin": "^6.12.0",
"@typescript-eslint/eslint-plugin": "^6.6.0", "@typescript-eslint/parser": "^6.12.0",
"@typescript-eslint/parser": "^6.6.0", "@vitejs/plugin-react-swc": "^3.5.0",
"@vitejs/plugin-react-swc": "^3.3.2", "autoprefixer": "^10.4.16",
"autoprefixer": "^10.4.15",
"clsx": "^2.0.0", "clsx": "^2.0.0",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"csstype": "^3.1.2", "csstype": "^3.1.2",
"encoding": "^0.1.13", "encoding": "^0.1.13",
"eslint": "^8.48.0", "eslint": "^8.54.0",
"eslint-config-prettier": "^9.0.0", "eslint-config-prettier": "^9.0.0",
"eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-jsx-a11y": "^6.8.0",
"eslint-plugin-react": "^7.33.2", "eslint-plugin-react": "^7.33.2",
"eslint-plugin-simple-import-sort": "^10.0.0", "eslint-plugin-simple-import-sort": "^10.0.0",
"husky": "^8.0.3", "husky": "^8.0.3",
"lint-staged": "^14.0.1", "lint-staged": "^15.1.0",
"postcss": "^8.4.29", "postcss": "^8.4.31",
"prettier": "^3.0.3", "prettier": "^3.1.0",
"prettier-plugin-tailwindcss": "^0.5.4", "prettier-plugin-tailwindcss": "^0.5.7",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"tailwind-merge": "^1.14.0", "tailwind-merge": "^1.14.0",
"tailwindcss": "^3.3.3", "tailwindcss": "^3.3.5",
"typescript": "^5.2.2", "typescript": "^5.3.2",
"vite": "^4.4.9", "vite": "^4.5.0",
"vite-tsconfig-paths": "^4.2.0" "vite-tsconfig-paths": "^4.2.1"
} }
} }
+2396 -3242
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

+1765 -1582
View File
File diff suppressed because it is too large Load Diff
+27 -35
View File
@@ -1,61 +1,53 @@
[package] [package]
name = "lume" name = "lume"
version = "1.2.2" version = "2.1.4"
description = "the communication app" description = "the communication app"
authors = ["Ren Amamiya"] authors = ["Ren Amamiya"]
license = "GPL-3.0" license = "GPL-3.0"
repository = "https://github.com/luminous-devs/lume" repository = "https://github.com/luminous-devs/lume"
edition = "2021" edition = "2021"
rust-version = "1.71" rust-version = "1.66"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[build-dependencies] [build-dependencies]
tauri-build = { version = "1.4.0", features = [] } tauri-build = { version = "2.0.0-alpha", features = [] }
[dependencies] [dependencies]
serde_json = "1.0" serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
tauri = { version = "1.4.0", features = [ tauri = { version = "2.0.0-alpha", features = [
"fs-read-dir",
"fs-read-file",
"window-start-dragging",
"path-all",
"http-all",
"clipboard-write-text",
"os-all",
"notification-all",
"clipboard-read-text",
"window-set-resizable",
"window-set-size",
"shell-open",
"fs-write-file",
"app-all",
"fs-remove-file",
"window-center",
"dialog-all",
"macos-private-api", "macos-private-api",
"http-multipart", "native-tls-vendored",
] } ] }
tauri-plugin-sql = { git = "hhttps://github.com/tauri-apps/plugins-workspace", branch = "v1", features = [ tauri-plugin-cli = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
tauri-plugin-clipboard-manager = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
tauri-plugin-dialog = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
tauri-plugin-fs = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
tauri-plugin-http = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
tauri-plugin-notification = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
tauri-plugin-os = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
tauri-plugin-process = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
tauri-plugin-shell = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
tauri-plugin-updater = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
tauri-plugin-autostart = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
tauri-plugin-store = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
tauri-plugin-upload = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
tauri-plugin-window-state = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
tauri-plugin-theme = { git = "https://github.com/wyhaya/tauri-plugin-theme" }
tauri-plugin-sql = { git = "hhttps://github.com/tauri-apps/plugins-workspace", branch = "v2", features = [
"sqlite", "sqlite",
] } ] }
tauri-plugin-single-instance = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" }
tauri-plugin-autostart = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" }
tauri-plugin-stronghold = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" }
tauri-plugin-store = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" }
tauri-plugin-upload = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" }
window-vibrancy = { git = "https://github.com/tauri-apps/window-vibrancy", branch = "dev" }
window-shadows = { git = "https://github.com/tauri-apps/window-shadows", branch = "dev" }
sqlx-cli = { version = "0.7.0", default-features = false, features = [ sqlx-cli = { version = "0.7.0", default-features = false, features = [
"sqlite", "sqlite",
] } ] }
rust-argon2 = "1.0"
webpage = { version = "1.6.0", features = ["serde"] } webpage = { version = "1.6.0", features = ["serde"] }
keyring = "2"
[features] [features]
# this feature is used for production builds or when `devPath` points to the filesystem # by default Tauri runs in production mode
# DO NOT REMOVE!! # when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL
default = ["custom-protocol"]
# this feature is used used for production builds where `devPath` points to the filesystem
# DO NOT remove this
custom-protocol = ["tauri/custom-protocol"] custom-protocol = ["tauri/custom-protocol"]
# Optimized for bundle size. If you want faster builds comment out/delete this section. # Optimized for bundle size. If you want faster builds comment out/delete this section.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 731 B

After

Width:  |  Height:  |  Size: 886 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 709 B

After

Width:  |  Height:  |  Size: 894 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 921 B

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 536 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 828 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

@@ -1,45 +1,29 @@
-- Add migration script here
-- create accounts table -- create accounts table
-- is_active (multi-account feature), value:
-- 0: false
-- 1: true
CREATE TABLE CREATE TABLE
accounts ( accounts (
id INTEGER NOT NULL PRIMARY KEY, id TEXT NOT NULL PRIMARY KEY,
npub TEXT NOT NULL UNIQUE,
pubkey TEXT NOT NULL UNIQUE, pubkey TEXT NOT NULL UNIQUE,
privkey TEXT NOT NULL, follows TEXT,
follows JSON, circles TEXT,
is_active INTEGER NOT NULL DEFAULT 0, is_active INTEGER NOT NULL DEFAULT 0,
last_login_at NUMBER NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
); );
-- create notes table -- create notes table
CREATE TABLE CREATE TABLE
notes ( events (
id INTEGER NOT NULL PRIMARY KEY, id TEXT NOT NULL PRIMARY KEY,
event_id TEXT NOT NULL UNIQUE,
account_id INTEGER NOT NULL, account_id INTEGER NOT NULL,
pubkey TEXT NOT NULL, event TEXT NOT NULL,
kind INTEGER NOT NULL DEFAULT 1, author TEXT NOT NULL,
tags JSON, kind NUMBER NOT NULL DEFAULt 1,
content TEXT NOT NULL, root_id TEXT,
reply_id TEXT,
created_at INTEGER NOT NULL, created_at INTEGER NOT NULL,
parent_id TEXT,
FOREIGN KEY (account_id) REFERENCES accounts (id) FOREIGN KEY (account_id) REFERENCES accounts (id)
); );
-- create channels table
CREATE TABLE
channels (
id INTEGER NOT NULL PRIMARY KEY,
event_id TEXT NOT NULL UNIQUE,
name TEXT,
about TEXT,
picture TEXT,
created_at INTEGER NOT NULL
);
-- create settings table -- create settings table
CREATE TABLE CREATE TABLE
settings ( settings (
@@ -49,11 +33,23 @@ CREATE TABLE
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
); );
-- create metadata table
CREATE TABLE CREATE TABLE
metadata ( widgets (
id TEXT NOT NULL PRIMARY KEY, id INTEGER NOT NULL PRIMARY KEY,
pubkey TEXT NOT NULL, account_id INTEGER NOT NULL,
kind INTEGER NOT NULL,
title TEXT NOT NULL,
content TEXT NOT NULL, content TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (account_id) REFERENCES accounts (id)
);
CREATE TABLE
relays (
id INTEGER NOT NULL PRIMARY KEY,
account_id INTEGER NOT NULL,
relay TEXT NOT NULL UNIQUE,
purpose TEXT NOT NULL DEFAULT '',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (account_id) REFERENCES accounts (id)
); );
@@ -1,12 +0,0 @@
-- Add migration script here
-- create chats table
CREATE TABLE
chats (
id INTEGER NOT NULL PRIMARY KEY,
event_id TEXT NOT NULL UNIQUE,
receiver_pubkey INTEGER NOT NULL,
sender_pubkey TEXT NOT NULL,
content TEXT NOT NULL,
tags JSON,
created_at INTEGER NOT NULL
);
@@ -1,14 +0,0 @@
-- Add migration script here
INSERT INTO
settings (key, value)
VALUES
("last_login", "0"),
(
"relays",
'["wss://relayable.org","wss://relay.damus.io","wss://relay.nostr.band/all","wss://relay.nostrgraph.net","wss://nostr.mutinywallet.com"]'
),
("auto_start", "0"),
("cache_time", "86400000"),
("compose_shortcut", "meta+n"),
("add_imageblock_shortcut", "meta+i"),
("add_feedblock_shortcut", "meta+f")
@@ -1,3 +0,0 @@
-- Add migration script here
-- add pubkey to channel
ALTER TABLE channels ADD pubkey TEXT NOT NULL DEFAULT '';
@@ -1,38 +0,0 @@
-- Add migration script here
INSERT
OR IGNORE INTO channels (
event_id,
pubkey,
name,
about,
picture,
created_at
)
VALUES
(
"e3cadf5beca1b2af1cddaa41a633679bedf263e3de1eb229c6686c50d85df753",
"126103bfddc8df256b6e0abfd7f3797c80dcc4ea88f7c2f87dd4104220b4d65f",
"lume-general",
"General channel for Lume",
"https://void.cat/d/UNyxBmAh1MUx5gQTX95jyf.webp",
1681898574
);
INSERT
OR IGNORE INTO channels (
event_id,
pubkey,
name,
about,
picture,
created_at
)
VALUES
(
"25e5c82273a271cb1a840d0060391a0bf4965cafeb029d5ab55350b418953fbb",
"ed1d0e1f743a7d19aa2dfb0162df73bacdbc699f67cc55bb91a98c35f7deac69",
"Nostr",
"",
"https://cloudflare-ipfs.com/ipfs/QmTN4Eas9atUULVbEAbUU8cowhtvK7g3t7jfKztY7wc8eP?.png",
1661333723
);
@@ -1,11 +0,0 @@
-- Add migration script here
-- create blacklist table
CREATE TABLE
blacklist (
id INTEGER NOT NULL PRIMARY KEY,
account_id INTEGER NOT NULL,
content TEXT NOT NULL UNIQUE,
status INTEGER NOT NULL DEFAULT 0,
kind INTEGER NOT NULL,
FOREIGN KEY (account_id) REFERENCES accounts (id)
);
@@ -1,11 +0,0 @@
-- Add migration script here
CREATE TABLE
blocks (
id INTEGER NOT NULL PRIMARY KEY,
account_id INTEGER NOT NULL,
kind INTEGER NOT NULL,
title TEXT NOT NULL,
content TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (account_id) REFERENCES accounts (id)
);
@@ -1,15 +0,0 @@
-- Add migration script here
CREATE TABLE
channel_messages (
id INTEGER NOT NULL PRIMARY KEY,
channel_id TEXT NOT NULL,
event_id TEXT NOT NULL UNIQUE,
pubkey TEXT NOT NULL,
kind INTEGER NOT NULL,
content TEXT NOT NULL,
tags JSON,
mute BOOLEAN DEFAULT 0,
hide BOOLEAN DEFAULT 0,
created_at INTEGER NOT NULL,
FOREIGN KEY (channel_id) REFERENCES channels (event_id)
);
@@ -1,13 +0,0 @@
-- Add migration script here
CREATE TABLE
replies (
id INTEGER NOT NULL PRIMARY KEY,
parent_id TEXT NOT NULL,
event_id TEXT NOT NULL UNIQUE,
pubkey TEXT NOT NULL,
kind INTEGER NOT NULL DEFAULT 1,
tags JSON,
content TEXT NOT NULL,
created_at INTEGER NOT NULL,
FOREIGN KEY (parent_id) REFERENCES notes (event_id)
);
@@ -1,6 +0,0 @@
-- Add migration script here
DROP TABLE IF EXISTS blacklist;
DROP TABLE IF EXISTS channel_messages;
DROP TABLE IF EXISTS channels;
@@ -1,6 +0,0 @@
-- Add migration script here
UPDATE settings
SET
value = '["wss://relayable.org","wss://relay.damus.io","wss://relay.nostr.band/all","wss://nostr.mutinywallet.com"]'
WHERE
key = 'relays';
@@ -1,2 +0,0 @@
-- Add migration script here
ALTER TABLE accounts ADD network JSON;
@@ -1,10 +0,0 @@
-- Add migration script here
CREATE TABLE
relays (
id INTEGER NOT NULL PRIMARY KEY,
account_id INTEGER NOT NULL,
relay TEXT NOT NULL,
purpose TEXT NOT NULL DEFAULT '',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (account_id) REFERENCES accounts (id)
);
@@ -1,3 +0,0 @@
-- Add migration script here
ALTER TABLE blocks
RENAME TO widgets;
@@ -1,13 +0,0 @@
-- Add migration script here
CREATE TABLE
events (
id TEXT NOT NULL PRIMARY KEY,
account_id INTEGER NOT NULL,
event TEXT NOT NULL,
author TEXT NOT NULL,
kind NUMBER NOT NULL DEFAULt 1,
root_id TEXT,
reply_id TEXT,
created_at INTEGER NOT NULL,
FOREIGN KEY (account_id) REFERENCES accounts (id)
);
@@ -1,8 +0,0 @@
-- Add migration script here
DROP TABLE IF EXISTS notes;
DROP TABLE IF EXISTS chats;
DROP TABLE IF EXISTS metadata;
DROP TABLE IF EXISTS replies;
@@ -1,3 +0,0 @@
-- Add migration script here
ALTER TABLE accounts
ADD COLUMN last_login_at NUMBER NOT NULL DEFAULT 0;
@@ -0,0 +1,27 @@
-- Add migration script here
CREATE TABLE
ndk_users (
pubkey TEXT NOT NULL PRIMARY KEY,
profile TEXT,
createdAt NUMBER
);
CREATE TABLE
ndk_events (
id TEXT NOT NULL PRIMARY KEY,
pubkey TEXT,
content TEXT,
kind NUMBER,
createdAt NUMBER,
relay TEXT,
event TEXT
);
CREATE TABLE
ndk_eventtags (
id TEXT NOT NULL PRIMARY KEY,
eventId TEXT,
tag TEXT,
value TEXT,
tagValue TEXT
);
+51 -148
View File
@@ -3,15 +3,12 @@
windows_subsystem = "windows" windows_subsystem = "windows"
)] )]
use tauri::Manager; use keyring::Entry;
use std::time::Duration;
use tauri_plugin_autostart::MacosLauncher; use tauri_plugin_autostart::MacosLauncher;
use tauri_plugin_sql::{Migration, MigrationKind}; use tauri_plugin_sql::{Migration, MigrationKind};
use window_shadows::set_shadow; use tauri_plugin_theme::ThemePlugin;
use webpage::{Webpage, WebpageOptions}; use webpage::{Webpage, WebpageOptions};
use std::time::Duration;
#[cfg(target_os = "macos")]
use window_vibrancy::{apply_vibrancy, NSVisualEffectMaterial};
#[derive(Clone, serde::Serialize)] #[derive(Clone, serde::Serialize)]
struct Payload { struct Payload {
@@ -85,33 +82,44 @@ async fn opengraph(url: String) -> OpenGraphResponse {
} }
#[tauri::command] #[tauri::command]
async fn close_splashscreen(window: tauri::Window) { fn secure_save(key: String, value: String) -> Result<(), ()> {
// Close splashscreen let entry = Entry::new("lume", &key).expect("Failed to create entry");
if let Some(splashscreen) = window.get_window("splashscreen") { let _ = entry.set_password(&value);
splashscreen.close().unwrap(); Ok(())
} }
// Show main window
window.get_window("main").unwrap().show().unwrap(); #[tauri::command]
fn secure_load(key: String) -> Result<String, String> {
let entry = Entry::new("lume", &key).expect("Failed to create entry");
if let Ok(password) = entry.get_password() {
Ok(password)
} else {
Err("not found".to_string())
}
}
#[tauri::command]
fn secure_remove(key: String) -> Result<(), ()> {
let entry = Entry::new("lume", &key).expect("Failed to create entry");
let _ = entry.delete_password();
Ok(())
} }
fn main() { fn main() {
let mut ctx = tauri::generate_context!();
tauri::Builder::default() tauri::Builder::default()
.setup(|app| { .setup(|app| {
let window = app.get_window("main").unwrap(); #[cfg(desktop)]
app
#[cfg(target_os = "macos")] .handle()
apply_vibrancy(&window, NSVisualEffectMaterial::HudWindow, None, None) .plugin(tauri_plugin_updater::Builder::new().build())?;
.expect("Unsupported platform! 'apply_vibrancy' is only supported on macOS");
// set native shadow
set_shadow(&window, true).expect("Unsupported platform!");
Ok(()) Ok(())
}) })
.plugin(ThemePlugin::init(ctx.config_mut()))
.plugin( .plugin(
tauri_plugin_sql::Builder::default() tauri_plugin_sql::Builder::default()
.add_migrations( .add_migrations(
"sqlite:lume.db", "sqlite:lume_v2.db",
vec![ vec![
Migration { Migration {
version: 20230418013219, version: 20230418013219,
@@ -120,140 +128,35 @@ fn main() {
kind: MigrationKind::Up, kind: MigrationKind::Up,
}, },
Migration { Migration {
version: 20230418080146, version: 20231028083224,
description: "create chats", description: "add ndk cache table",
sql: include_str!("../migrations/20230418080146_create_chats.sql"), sql: include_str!("../migrations/20231028083224_add_ndk_cache_table.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230420040005,
description: "insert last login to settings",
sql: include_str!("../migrations/20230420040005_insert_last_login_to_settings.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230425023912,
description: "add pubkey to channel",
sql: include_str!("../migrations/20230425023912_add_pubkey_to_channel.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230425024708,
description: "add default channels",
sql: include_str!("../migrations/20230425024708_add_default_channels.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230425050745,
description: "create blacklist",
sql: include_str!("../migrations/20230425050745_add_blacklist_model.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230521092300,
description: "create block",
sql: include_str!("../migrations/20230521092300_add_block_model.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230617003135,
description: "add channel messages",
sql: include_str!("../migrations/20230617003135_add_channel_messages.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230619082415,
description: "add replies",
sql: include_str!("../migrations/20230619082415_add_replies.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230718072634,
description: "clean up",
sql: include_str!("../migrations/20230718072634_clean_up_old_tables.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230725010250,
description: "update default relays",
sql: include_str!("../migrations/20230725010250_update_default_relays.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230804083544,
description: "add network to accounts",
sql: include_str!("../migrations/20230804083544_add_network_to_account.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230808085847,
description: "add relays",
sql: include_str!("../migrations/20230808085847_add_relays_table.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230811074423,
description: "rename blocks to widgets",
sql: include_str!("../migrations/20230811074423_rename_blocks_to_widgets.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230814083543,
description: "add events",
sql: include_str!("../migrations/20230814083543_add_events_table.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230816090508,
description: "clean up tables",
sql: include_str!("../migrations/20230816090508_clean_up_tables.sql"),
kind: MigrationKind::Up,
},
Migration {
version: 20230817014932,
description: "add last login to account",
sql: include_str!("../migrations/20230817014932_add_last_login_time_to_account.sql"),
kind: MigrationKind::Up, kind: MigrationKind::Up,
}, },
], ],
) )
.build(), .build(),
) )
.plugin( .plugin(tauri_plugin_clipboard_manager::init())
tauri_plugin_stronghold::Builder::new(|password| { .plugin(tauri_plugin_dialog::init())
let config = argon2::Config { .plugin(tauri_plugin_fs::init())
lanes: 2, .plugin(tauri_plugin_http::init())
mem_cost: 50_000, .plugin(tauri_plugin_notification::init())
time_cost: 30, .plugin(tauri_plugin_os::init())
thread_mode: argon2::ThreadMode::from_threads(2), .plugin(tauri_plugin_process::init())
variant: argon2::Variant::Argon2id, .plugin(tauri_plugin_shell::init())
..Default::default() .plugin(tauri_plugin_upload::init())
}; .plugin(tauri_plugin_window_state::Builder::default().build())
let key = argon2::hash_raw(
password.as_ref(),
b"LUME_NEED_RUST_DEVELOPER_HELP_MAKE_SALT_RANDOM",
&config,
)
.expect("failed to hash password");
key.to_vec()
})
.build(),
)
.plugin(tauri_plugin_autostart::init( .plugin(tauri_plugin_autostart::init(
MacosLauncher::LaunchAgent, MacosLauncher::LaunchAgent,
Some(vec!["--flag1", "--flag2"]), Some(vec![]),
)) ))
.plugin(tauri_plugin_single_instance::init(|app, argv, cwd| { .invoke_handler(tauri::generate_handler![
println!("{}, {argv:?}, {cwd}", app.package_info().name); opengraph,
app secure_save,
.emit_all("single-instance", Payload { args: argv, cwd }) secure_load,
.unwrap(); secure_remove
})) ])
.plugin(tauri_plugin_upload::init()) .run(ctx)
.plugin(tauri_plugin_store::Builder::default().build())
.invoke_handler(tauri::generate_handler![close_splashscreen, opengraph])
.run(tauri::generate_context!())
.expect("error while running tauri application"); .expect("error while running tauri application");
} }
+32 -68
View File
@@ -1,39 +1,18 @@
{ {
"$schema": "../node_modules/@tauri-apps/cli/schema.json",
"build": { "build": {
"beforeBuildCommand": "pnpm build", "beforeBuildCommand": "pnpm run build",
"beforeDevCommand": "pnpm dev", "beforeDevCommand": "pnpm run dev",
"devPath": "http://localhost:3000", "devPath": "http://localhost:3000",
"distDir": "../dist", "distDir": "../dist",
"withGlobalTauri": true "withGlobalTauri": true
}, },
"package": { "package": {
"productName": "Lume", "productName": "Lume",
"version": "1.2.2" "version": "2.1.4"
},
"tauri": {
"allowlist": {
"app": {
"all": true,
"show": true,
"hide": true
},
"path": {
"all": true
},
"dialog": {
"all": true,
"ask": true,
"confirm": true,
"message": true,
"open": true,
"save": true
}, },
"plugins": {
"fs": { "fs": {
"all": false,
"removeFile": true,
"writeFile": true,
"readDir": true,
"readFile": true,
"scope": [ "scope": [
"$APPDATA/*", "$APPDATA/*",
"$DATA/*", "$DATA/*",
@@ -48,46 +27,30 @@
] ]
}, },
"http": { "http": {
"all": true,
"scope": [ "scope": [
"http://**", "http://**/",
"https://**" "https://**/"
] ]
}, },
"shell": { "shell": {
"all": false,
"open": true "open": true
}, },
"os": { "updater": {
"all": true "endpoints": [
}, "https://lus.reya3772.workers.dev/v1/{{target}}/{{arch}}/{{current_version}}",
"window": { "https://lus.reya3772.workers.dev/{{target}}/{{current_version}}"
"all": false, ]
"center": true,
"setResizable": true,
"setSize": true,
"startDragging": true
},
"clipboard": {
"all": false,
"writeText": true,
"readText": true
},
"notification": {
"all": true
} }
}, },
"tauri": {
"bundle": { "bundle": {
"active": true, "active": true,
"appimage": {
"bundleMediaFramework": true
},
"category": "SocialNetworking", "category": "SocialNetworking",
"copyright": "",
"deb": { "deb": {
"depends": [] "depends": []
}, },
"externalBin": [], "externalBin": [],
"resources": [],
"icon": [ "icon": [
"icons/32x32.png", "icons/32x32.png",
"icons/128x128.png", "icons/128x128.png",
@@ -95,35 +58,36 @@
"icons/icon.icns", "icons/icon.icns",
"icons/icon.ico" "icons/icon.ico"
], ],
"copyright": "",
"identifier": "com.lume.nu", "identifier": "com.lume.nu",
"longDescription": "", "longDescription": "The communication app build on Nostr Protocol",
"shortDescription": "",
"targets": "all",
"updater": {
"active": true,
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEU3OTdCMkM3RjU5QzE2NzkKUldSNUZwejF4N0tYNTVHYjMrU0JkL090SlEyNUVLYU5TM2hTU3RXSWtEWngrZWJ4a0pydUhXZHEK",
"windows": {
"installMode": "quiet"
}
},
"appimage": {
"bundleMediaFramework": true
},
"macOS": { "macOS": {
"entitlements": null, "entitlements": null,
"exceptionDomain": "", "exceptionDomain": "",
"frameworks": [], "frameworks": [],
"license": "../LICENSE",
"minimumSystemVersion": "10.15.0",
"providerShortName": null, "providerShortName": null,
"signingIdentity": null, "signingIdentity": null
"minimumSystemVersion": "10.15.0"
}, },
"resources": [],
"shortDescription": "",
"targets": "all",
"windows": { "windows": {
"certificateThumbprint": null, "certificateThumbprint": null,
"digestAlgorithm": "sha256", "digestAlgorithm": "sha256",
"timestampUrl": "" "timestampUrl": ""
} }
}, },
"updater": { "macOSPrivateApi": true
"endpoints": [
"https://lus.reya3772.workers.dev/v1/{{target}}/{{arch}}/{{current_version}}",
"https://lus.reya3772.workers.dev/{{target}}/{{current_version}}"
]
},
"security": {
"csp": {
"content-security-policy": "upgrade-insecure-requests"
}
}
} }
} }
+5 -15
View File
@@ -1,30 +1,20 @@
{ {
"$schema": "../node_modules/@tauri-apps/cli/schema.json",
"tauri": { "tauri": {
"windows": [ "windows": [
{
"width": 400,
"height": 500,
"decorations": false,
"title": "Lume",
"center": true,
"resizable": false,
"label": "splashscreen",
"url": "splashscreen"
},
{ {
"width": 1080, "width": 1080,
"height": 800, "height": 800,
"minWidth": 1080, "minWidth": 560,
"minHeight": 800, "minHeight": 800,
"resizable": true, "resizable": true,
"theme": "Dark",
"title": "Lume", "title": "Lume",
"transparent": false,
"center": true, "center": true,
"fullscreen": false, "fullscreen": false,
"hiddenTitle": true, "hiddenTitle": true,
"visible": false, "fileDropEnabled": true,
"fileDropEnabled": true "decorations": false,
"transparent": false
} }
] ]
} }
+8 -18
View File
@@ -1,34 +1,24 @@
{ {
"$schema": "../node_modules/@tauri-apps/cli/schema.json",
"tauri": { "tauri": {
"macOSPrivateApi": true,
"windows": [ "windows": [
{
"width": 400,
"height": 500,
"decorations": true,
"title": "Lume",
"titleBarStyle": "Overlay",
"hiddenTitle": true,
"center": true,
"resizable": false,
"label": "splashscreen",
"url": "splashscreen"
},
{ {
"width": 1080, "width": 1080,
"height": 800, "height": 800,
"minWidth": 1080, "minWidth": 560,
"minHeight": 800, "minHeight": 800,
"resizable": true, "resizable": true,
"theme": "Dark",
"title": "Lume", "title": "Lume",
"titleBarStyle": "Overlay", "titleBarStyle": "Overlay",
"transparent": true,
"center": true, "center": true,
"fullscreen": false, "fullscreen": false,
"hiddenTitle": true, "hiddenTitle": true,
"visible": false, "fileDropEnabled": true,
"fileDropEnabled": true "decorations": true,
"transparent": true,
"windowEffects": {
"effects": ["sidebar"]
}
} }
] ]
} }
+8 -15
View File
@@ -1,30 +1,23 @@
{ {
"$schema": "../node_modules/@tauri-apps/cli/schema.json",
"tauri": { "tauri": {
"windows": [ "windows": [
{
"width": 400,
"height": 500,
"decorations": false,
"title": "Lume",
"center": true,
"resizable": false,
"label": "splashscreen",
"url": "splashscreen"
},
{ {
"width": 1080, "width": 1080,
"height": 800, "height": 800,
"minWidth": 1080, "minWidth": 560,
"minHeight": 800, "minHeight": 800,
"resizable": true, "resizable": true,
"theme": "Dark",
"title": "Lume", "title": "Lume",
"transparent": false,
"center": true, "center": true,
"fullscreen": false, "fullscreen": false,
"hiddenTitle": true, "hiddenTitle": true,
"visible": false, "fileDropEnabled": true,
"fileDropEnabled": true "decorations": false,
"transparent": true,
"windowEffects": {
"effects": ["micaLight", "micaDark"]
}
} }
] ]
} }
+70
View File
@@ -0,0 +1,70 @@
@import 'reactflow/dist/style.css';
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer utilities {
.break-p {
word-break: break-word;
word-wrap: break-word;
overflow-wrap: break-word;
}
.prose :where(iframe):not(:where([class~="not-prose"] *)) {
@apply aspect-video w-full h-auto mx-auto;
}
}
html {
font-size: 14px;
}
a {
@apply cursor-default no-underline !important;
}
button {
@apply cursor-default focus:outline-none;
}
input::-ms-reveal,
input::-ms-clear {
display: none;
}
::-webkit-input-placeholder {
line-height: normal;
}
.border {
background-clip: padding-box;
}
.player {
--brand-color: #f5f5f5;
--focus-color: #4e9cf6;
--audio-brand: var(--brand-color);
--audio-focus-ring-color: var(--focus-color);
--audio-border-radius: 2px;
--video-brand: var(--brand-color);
--video-focus-ring-color: var(--focus-color);
--video-border-radius: 8px;
width: 100%;
}
.player[data-view-type='video'] {
aspect-ratio: 16 /9;
}
.ProseMirror p.is-empty::before {
@apply text-neutral-600 dark:text-neutral-400;
content: attr(data-placeholder);
float: left;
height: 0;
pointer-events: none;
}
.ProseMirror img.ProseMirror-selectednode {
@apply outline-blue-500;
}
+165 -133
View File
@@ -1,59 +1,62 @@
import { RouterProvider, createBrowserRouter, redirect } from 'react-router-dom'; import { message } from '@tauri-apps/plugin-dialog';
import { fetch } from '@tauri-apps/plugin-http';
import { RouterProvider, createBrowserRouter, defer, redirect } from 'react-router-dom';
import { ReactFlowProvider } from 'reactflow';
import { AuthCreateScreen } from '@app/auth/create';
import { AuthImportScreen } from '@app/auth/import';
import { OnboardingScreen } from '@app/auth/onboarding'; import { OnboardingScreen } from '@app/auth/onboarding';
import { ChatsScreen } from '@app/chats';
import { ErrorScreen } from '@app/error'; import { ErrorScreen } from '@app/error';
import { ExploreScreen } from '@app/explore';
import { useStorage } from '@libs/storage/provider';
import { Frame } from '@shared/frame';
import { LoaderIcon } from '@shared/icons'; import { LoaderIcon } from '@shared/icons';
import { AppLayout } from '@shared/layouts/app'; import { AppLayout } from '@shared/layouts/app';
import { AuthLayout } from '@shared/layouts/auth'; import { AuthLayout } from '@shared/layouts/auth';
import { NewLayout } from '@shared/layouts/new';
import { NoteLayout } from '@shared/layouts/note'; import { NoteLayout } from '@shared/layouts/note';
import { SettingsLayout } from '@shared/layouts/settings'; import { SettingsLayout } from '@shared/layouts/settings';
import { checkActiveAccount } from '@utils/checkActiveAccount'; import './app.css';
import './index.css'; export default function App() {
const { db } = useStorage();
async function Loader() { const accountLoader = async () => {
try { try {
const account = await checkActiveAccount(); // redirect to welcome screen if none user exist
const stronghold = sessionStorage.getItem('stronghold'); const totalAccount = await db.checkAccount();
const privkey = JSON.parse(stronghold).state.privkey || null; if (totalAccount === 0) return redirect('/auth/welcome');
const onboarding = localStorage.getItem('onboarding');
const step = JSON.parse(onboarding).state.step || null;
if (step) {
return redirect(step);
}
if (!account) {
return redirect('/auth/welcome');
} else {
if (!privkey) {
return redirect('/auth/unlock');
}
}
return null; return null;
} catch (e) { } catch (e) {
throw new Error('App failed to load'); await message(e, { title: 'An unexpected error has occurred', type: 'error' });
}
} }
};
const relayLoader = async ({ params }) => {
return defer({
relay: fetch(`https://${params.url}`, {
method: 'GET',
headers: {
Accept: 'application/nostr+json',
},
}).then((res) => res.json()),
});
};
const router = createBrowserRouter([ const router = createBrowserRouter([
{ {
path: '/', path: '/',
element: <AppLayout />, element: <AppLayout />,
errorElement: <ErrorScreen />, errorElement: <ErrorScreen />,
loader: Loader, loader: accountLoader,
children: [ children: [
{ {
path: '', path: '',
async lazy() { async lazy() {
const { SpaceScreen } = await import('@app/space'); const { HomeScreen } = await import('@app/home');
return { Component: SpaceScreen }; return { Component: HomeScreen };
}, },
}, },
{ {
@@ -64,17 +67,83 @@ const router = createBrowserRouter([
}, },
}, },
{ {
path: 'chats/:pubkey', path: 'nwc',
async lazy() { async lazy() {
const { ChatScreen } = await import('@app/chats'); const { NWCScreen } = await import('@app/nwc');
return { Component: ChatScreen }; return { Component: NWCScreen };
}, },
}, },
{ {
path: 'notifications', path: 'relays',
async lazy() { async lazy() {
const { NotificationScreen } = await import('@app/notifications'); const { RelaysScreen } = await import('@app/relays');
return { Component: NotificationScreen }; return { Component: RelaysScreen };
},
},
{
path: 'relays/:url',
loader: relayLoader,
async lazy() {
const { RelayScreen } = await import('@app/relays/relay');
return { Component: RelayScreen };
},
},
{
path: 'explore',
element: (
<ReactFlowProvider>
<ExploreScreen />
</ReactFlowProvider>
),
errorElement: <ErrorScreen />,
},
{
path: 'chats',
element: <ChatsScreen />,
errorElement: <ErrorScreen />,
children: [
{
path: 'chat/:pubkey',
async lazy() {
const { ChatScreen } = await import('@app/chats/chat');
return { Component: ChatScreen };
},
},
],
},
],
},
{
path: '/new',
element: <NewLayout />,
errorElement: <ErrorScreen />,
children: [
{
path: '',
async lazy() {
const { NewPostScreen } = await import('@app/new/post');
return { Component: NewPostScreen };
},
},
{
path: 'article',
async lazy() {
const { NewArticleScreen } = await import('@app/new/article');
return { Component: NewArticleScreen };
},
},
{
path: 'file',
async lazy() {
const { NewFileScreen } = await import('@app/new/file');
return { Component: NewFileScreen };
},
},
{
path: 'privkey',
async lazy() {
const { NewPrivkeyScreen } = await import('@app/new/privkey');
return { Component: NewPrivkeyScreen };
}, },
}, },
], ],
@@ -100,14 +169,6 @@ const router = createBrowserRouter([
}, },
], ],
}, },
{
path: '/splashscreen',
errorElement: <ErrorScreen />,
async lazy() {
const { SplashScreen } = await import('@app/splash');
return { Component: SplashScreen };
},
},
{ {
path: '/auth', path: '/auth',
element: <AuthLayout />, element: <AuthLayout />,
@@ -120,62 +181,20 @@ const router = createBrowserRouter([
return { Component: WelcomeScreen }; return { Component: WelcomeScreen };
}, },
}, },
{
path: 'import',
element: <AuthImportScreen />,
errorElement: <ErrorScreen />,
children: [
{
path: '',
async lazy() {
const { ImportStep1Screen } = await import('@app/auth/import/step-1');
return { Component: ImportStep1Screen };
},
},
{
path: 'step-2',
async lazy() {
const { ImportStep2Screen } = await import('@app/auth/import/step-2');
return { Component: ImportStep2Screen };
},
},
{
path: 'step-3',
async lazy() {
const { ImportStep3Screen } = await import('@app/auth/import/step-3');
return { Component: ImportStep3Screen };
},
},
],
},
{ {
path: 'create', path: 'create',
element: <AuthCreateScreen />,
errorElement: <ErrorScreen />,
children: [
{
path: '',
async lazy() { async lazy() {
const { CreateStep1Screen } = await import('@app/auth/create/step-1'); const { CreateAccountScreen } = await import('@app/auth/create');
return { Component: CreateStep1Screen }; return { Component: CreateAccountScreen };
}, },
}, },
{ {
path: 'step-2', path: 'import',
async lazy() { async lazy() {
const { CreateStep2Screen } = await import('@app/auth/create/step-2'); const { ImportAccountScreen } = await import('@app/auth/import');
return { Component: CreateStep2Screen }; return { Component: ImportAccountScreen };
}, },
}, },
{
path: 'step-3',
async lazy() {
const { CreateStep3Screen } = await import('@app/auth/create/step-3');
return { Component: CreateStep3Screen };
},
},
],
},
{ {
path: 'onboarding', path: 'onboarding',
element: <OnboardingScreen />, element: <OnboardingScreen />,
@@ -184,54 +203,32 @@ const router = createBrowserRouter([
{ {
path: '', path: '',
async lazy() { async lazy() {
const { OnboardStep1Screen } = await import('@app/auth/onboarding/step-1'); const { OnboardingListScreen } = await import(
return { Component: OnboardStep1Screen }; '@app/auth/onboarding/list'
);
return { Component: OnboardingListScreen };
}, },
}, },
{ {
path: 'step-2', path: 'enrich',
async lazy() { async lazy() {
const { OnboardStep2Screen } = await import('@app/auth/onboarding/step-2'); const { OnboardEnrichScreen } = await import(
return { Component: OnboardStep2Screen }; '@app/auth/onboarding/enrich'
);
return { Component: OnboardEnrichScreen };
}, },
}, },
{ {
path: 'step-3', path: 'hashtag',
async lazy() { async lazy() {
const { OnboardStep3Screen } = await import('@app/auth/onboarding/step-3'); const { OnboardHashtagScreen } = await import(
return { Component: OnboardStep3Screen }; '@app/auth/onboarding/hashtag'
);
return { Component: OnboardHashtagScreen };
}, },
}, },
], ],
}, },
{
path: 'unlock',
async lazy() {
const { UnlockScreen } = await import('@app/auth/unlock');
return { Component: UnlockScreen };
},
},
{
path: 'migrate',
async lazy() {
const { MigrateScreen } = await import('@app/auth/migrate');
return { Component: MigrateScreen };
},
},
{
path: 'reset',
async lazy() {
const { ResetScreen } = await import('@app/auth/reset');
return { Component: ResetScreen };
},
},
{
path: 'hard-reset',
async lazy() {
const { HardResetScreen } = await import('@app/auth/hardReset');
return { Component: HardResetScreen };
},
},
], ],
}, },
{ {
@@ -242,30 +239,65 @@ const router = createBrowserRouter([
{ {
path: '', path: '',
async lazy() { async lazy() {
const { GeneralSettingsScreen } = await import('@app/settings/general'); const { UserSettingScreen } = await import('@app/settings');
return { Component: GeneralSettingsScreen }; return { Component: UserSettingScreen };
},
},
{
path: 'edit-profile',
async lazy() {
const { EditProfileScreen } = await import('@app/settings/editProfile');
return { Component: EditProfileScreen };
},
},
{
path: 'edit-contact',
async lazy() {
const { EditContactScreen } = await import('@app/settings/editContact');
return { Component: EditContactScreen };
},
},
{
path: 'general',
async lazy() {
const { GeneralSettingScreen } = await import('@app/settings/general');
return { Component: GeneralSettingScreen };
}, },
}, },
{ {
path: 'backup', path: 'backup',
async lazy() { async lazy() {
const { AccountSettingsScreen } = await import('@app/settings/account'); const { BackupSettingScreen } = await import('@app/settings/backup');
return { Component: AccountSettingsScreen }; return { Component: BackupSettingScreen };
},
},
{
path: 'advanced',
async lazy() {
const { AdvancedSettingScreen } = await import('@app/settings/advanced');
return { Component: AdvancedSettingScreen };
},
},
{
path: 'about',
async lazy() {
const { AboutScreen } = await import('@app/settings/about');
return { Component: AboutScreen };
}, },
}, },
], ],
}, },
]); ]);
export default function App() {
return ( return (
<RouterProvider <RouterProvider
router={router} router={router}
fallbackElement={ fallbackElement={
<Frame className="flex h-full w-full items-center justify-center"> <div className="flex h-full w-full items-center justify-center">
<LoaderIcon className="h-6 w-6 animate-spin text-white" /> <LoaderIcon className="h-6 w-6 animate-spin text-white" />
</Frame> </div>
} }
future={{ v7_startTransition: true }}
/> />
); );
} }
@@ -0,0 +1,50 @@
import { isPermissionGranted, requestPermission } from '@tauri-apps/plugin-notification';
import { CheckCircleIcon } from '@shared/icons';
import { useOnboarding } from '@stores/onboarding';
export function AllowNotification() {
const [notification, setNotification] = useOnboarding((state) => [
state.notification,
state.toggleNotification,
]);
const allow = async () => {
let permissionGranted = await isPermissionGranted();
if (!permissionGranted) {
const permission = await requestPermission();
permissionGranted = permission === 'granted';
}
if (permissionGranted) {
setNotification();
}
};
return (
<div className="rounded-xl bg-neutral-100 p-3 text-neutral-800 dark:bg-neutral-900 dark:text-neutral-200">
<div className="flex items-start justify-between gap-2">
<div>
<h5 className="font-semibold">Allow notification</h5>
<p className="text-sm">
By allowing Lume to send notifications in your OS settings, you will receive
notification messages when someone interacts with you or your content.
</p>
</div>
{notification ? (
<div className="mt-1 inline-flex h-9 w-24 shrink-0 items-center justify-center rounded-lg bg-teal-500 text-white">
<CheckCircleIcon className="h-4 w-4" />
</div>
) : (
<button
type="button"
onClick={allow}
className="mt-1 inline-flex h-9 w-24 shrink-0 items-center justify-center rounded-lg bg-neutral-200 font-medium hover:bg-blue-500 hover:text-white dark:bg-neutral-800"
>
Allow
</button>
)}
</div>
</div>
);
}
@@ -0,0 +1,100 @@
import { NDKEvent, NDKKind } from '@nostr-dev-kit/ndk';
import { LRUCache } from 'lru-cache';
import { useState } from 'react';
import { toast } from 'sonner';
import { useNDK } from '@libs/ndk/provider';
import { useStorage } from '@libs/storage/provider';
import { CheckCircleIcon, LoaderIcon } from '@shared/icons';
import { useOnboarding } from '@stores/onboarding';
export function Circle() {
const { db } = useStorage();
const { ndk } = useNDK();
const [circle, setCircle] = useOnboarding((state) => [
state.circle,
state.toggleCircle,
]);
const [loading, setLoading] = useState(false);
const enableLinks = async () => {
setLoading(true);
const users = ndk.getUser({ pubkey: db.account.pubkey });
const follows = await users.follows();
if (follows.size === 0) {
setLoading(false);
return toast('You need to follow at least 1 account');
}
const lru = new LRUCache<string, string, void>({ max: 300 });
const followsAsArr = [];
// add user's follows to lru
follows.forEach((user) => {
lru.set(user.pubkey, user.pubkey);
followsAsArr.push(user.pubkey);
});
// get follows from follows
const events = await ndk.fetchEvents({
kinds: [NDKKind.Contacts],
authors: followsAsArr,
limit: 300,
});
events.forEach((event: NDKEvent) => {
event.tags.forEach((tag) => {
if (tag[0] === 'p') lru.set(tag[1], tag[1]);
});
});
// get lru values
const circleList = [...lru.values()] as string[];
// update db
await db.updateAccount('follows', JSON.stringify(followsAsArr));
await db.updateAccount('circles', JSON.stringify(circleList));
db.account.follows = followsAsArr;
db.account.circles = circleList;
// clear lru
lru.clear();
// done
await db.createSetting('circles', '1');
setCircle();
};
return (
<div className="rounded-xl bg-neutral-100 p-3 text-neutral-800 dark:bg-neutral-900 dark:text-neutral-200">
<div className="flex items-start justify-between gap-2">
<div>
<h5 className="font-semibold">Enable Circle</h5>
<p className="text-sm">
Beside newsfeed from your follows, you will see more content from all people
that followed by your follows.
</p>
</div>
{circle ? (
<div className="mt-1 inline-flex h-9 w-24 shrink-0 items-center justify-center rounded-lg bg-teal-500 text-white">
<CheckCircleIcon className="h-4 w-4" />
</div>
) : (
<button
type="button"
onClick={enableLinks}
className="mt-1 inline-flex h-9 w-24 shrink-0 items-center justify-center rounded-lg bg-neutral-200 font-medium hover:bg-blue-500 hover:text-white dark:bg-neutral-800"
>
{loading ? <LoaderIcon className="h-4 w-4 animate-spin" /> : 'Enable'}
</button>
)}
</div>
</div>
);
}
@@ -0,0 +1,47 @@
import { useStorage } from '@libs/storage/provider';
import { CheckCircleIcon } from '@shared/icons';
import { useOnboarding } from '@stores/onboarding';
export function OutboxModel() {
const { db } = useStorage();
const [outbox, setOutbox] = useOnboarding((state) => [
state.outbox,
state.toggleOutbox,
]);
const enableOutbox = async () => {
await db.createSetting('outbox', '1');
setOutbox();
};
return (
<div className="rounded-xl bg-neutral-100 p-3 text-neutral-800 dark:bg-neutral-900 dark:text-neutral-200">
<div className="flex items-start justify-between gap-2">
<div>
<h5 className="font-semibold">Enable Outbox</h5>
<p className="text-sm">
When you request information about a user, Lume will automatically query the
user&apos;s outbox relays and subsequent queries will favour using those
relays for queries with that user&apos;s pubkey.
</p>
</div>
{outbox ? (
<div className="mt-1 inline-flex h-9 w-24 shrink-0 items-center justify-center rounded-lg bg-teal-500 text-white">
<CheckCircleIcon className="h-4 w-4" />
</div>
) : (
<button
type="button"
onClick={enableOutbox}
className="mt-1 inline-flex h-9 w-24 shrink-0 items-center justify-center rounded-lg bg-neutral-200 font-medium hover:bg-blue-500 hover:text-white dark:bg-neutral-800"
>
Enable
</button>
)}
</div>
</div>
);
}
@@ -0,0 +1,35 @@
import { Link } from 'react-router-dom';
import { CheckCircleIcon } from '@shared/icons';
import { useOnboarding } from '@stores/onboarding';
export function FavoriteHashtag() {
const hashtag = useOnboarding((state) => state.hashtag);
return (
<div className="rounded-xl bg-neutral-100 p-3 text-neutral-800 dark:bg-neutral-900 dark:text-neutral-200">
<div className="flex items-start justify-between">
<div>
<h5 className="font-semibold">Favorite topic</h5>
<p className="text-sm">
By adding favorite topic, Lume will display all contents related to this topic
for you
</p>
</div>
{hashtag ? (
<div className="mt-1 inline-flex h-9 w-24 shrink-0 items-center justify-center rounded-lg bg-teal-500 text-white">
<CheckCircleIcon className="h-4 w-4" />
</div>
) : (
<Link
to="/auth/onboarding/hashtag"
className="mt-1 inline-flex h-9 w-24 shrink-0 items-center justify-center rounded-lg bg-neutral-200 font-medium hover:bg-blue-500 hover:text-white dark:bg-neutral-800"
>
Add
</Link>
)}
</div>
</div>
);
}

Some files were not shown because too many files have changed in this diff Show More