Compare commits

...

873 Commits

Author SHA1 Message Date
8398ae80d3 chore: bump version 2024-10-03 10:43:16 +07:00
fe60f75e96 chore: upgrade to tauri v2 stable 2024-10-03 09:00:48 +07:00
雨宮蓮
e098743d43 feat: new flow (#235)
* feat: redesign initial screen

* feat: improve login process
2024-10-02 14:56:26 +07:00
0c19ada1ab chore: bump version 2024-09-30 05:57:42 +07:00
09db39fce1 chore: add some small improvements 2024-09-30 04:49:17 +07:00
雨宮蓮
f0fc89724d feat: improve performance (#234)
* feat: use negentropy as much as possible

* update

* update
2024-09-29 16:53:39 +07:00
afa9327bb7 feat: add content parser to reply 2024-09-27 09:58:02 +07:00
5c3644f977 feat: update general settings 2024-09-27 09:12:38 +07:00
0a8eed9a46 feat: new post editor 2024-09-26 10:57:58 +07:00
bacfaed48a wip: local relay 2024-09-25 09:59:54 +07:00
3d5085785b feat: pow by default 2024-09-23 17:18:41 +07:00
9152c3e122 feat: add basic web of trust 2024-09-23 13:24:33 +07:00
a5574bef6c feat: add notification for nip42 2024-09-22 09:40:07 +07:00
2c7f3685b6 fix: build on macos 2024-09-20 09:26:48 +07:00
be0abc4075 chore: update deps 2024-09-20 08:42:08 +07:00
dafe35cd1f feat: add client tag 2024-09-20 08:05:32 +07:00
b23903240b fix: wrong menu item in repost button 2024-09-20 08:05:22 +07:00
872a6cee36 fix: missing context menu in user's avatar 2024-09-20 07:25:07 +07:00
雨宮蓮
ac7ce726c5 feat: Add gossip model (#232)
* feat: enable gossip

* chore: remove deprecated functions

* chore: use upstream rust nostr

* fix
2024-09-11 11:10:11 +07:00
Andrew
e5e290c0c3 fix: Improved text legibility on login/create account screens (#230)
* style: standardized placeholder text to be color neutral-400

* fix: changed dark:text-neutral-600 to dark:text-neutral-200 as in dark mode text was not visible
2024-08-30 20:04:44 +07:00
2eab6f04c7 chore: bump version 2024-08-30 13:30:29 +07:00
reya
e06b0334a5 chore: bump version 2024-08-29 08:00:58 +07:00
reya
74d8bf2ead fix: cannot import ncryptsec 2024-08-29 07:48:26 +07:00
reya
d128af1db8 chore: clean up 2024-08-28 08:48:17 +07:00
reya
f6eb5eea44 chore: update ci 2024-08-27 19:43:51 +07:00
reya
bca2e0b7b7 chore: bump version 2024-08-27 19:42:35 +07:00
雨宮蓮
61ad96ca63 Release v4.1 (#229)
* refactor: remove custom icon packs

* fix: command not work on windows

* fix: make open_window command async

* feat: improve commands

* feat: improve

* refactor: column

* feat: improve thread column

* feat: improve

* feat: add stories column

* feat: improve

* feat: add search column

* feat: add reset password

* feat: add subscription

* refactor: settings

* chore: improve commands

* fix: crash on production

* feat: use tauri store plugin for cache

* feat: new icon

* chore: update icon for windows

* chore: improve some columns

* chore: polish code
2024-08-27 19:37:30 +07:00
reya
26ae473521 fix: disable some default webview behaviors 2024-08-19 13:46:22 +07:00
reya
bcc5e18082 fix: adjust window controls position 2024-08-19 10:48:29 +07:00
reya
307fff7a53 fix: titlebar on windows 2024-08-19 10:28:38 +07:00
reya
ce7828310b chore: add some improvements and remove linux support 2024-08-19 09:58:29 +07:00
reya
beac1a189e chore: update deps 2024-08-18 15:51:34 +07:00
reya
4cb49d44c7 feat: improve account management 2024-08-13 10:33:21 +07:00
reya
be16d5c21d chore: upgrade to react 19 rc 2024-08-12 10:32:20 +07:00
reya
da8162069b refactor: remove turborepo 2024-08-12 09:07:11 +07:00
reya
e2103ae23a feat: upgrade to tauri v2 rc 2024-08-10 16:45:56 +07:00
XIAO YU
4c6d1c768a Handle errors when adding and connecting relays in init_nip65 (#227) 2024-08-03 08:56:38 +07:00
reya
9b75a04f91 chore: update deps 2024-07-31 13:03:27 +07:00
reya
a5255fa503 chore: bump version 2024-07-31 12:51:41 +07:00
reya
954a17b541 fix: build on linux 2024-07-31 12:51:17 +07:00
reya
a55b31b0e6 feat: add keyring support for linux and windows 2024-07-31 10:59:54 +07:00
reya
bdf3ffd7bf fix: tray panel is missing 2024-07-19 13:58:32 +07:00
reya
07ce253f5b fix: child webview is not reposition after scroll 2024-07-19 13:10:29 +07:00
reya
f3db010c74 chore: update tauri config 2024-07-19 10:01:20 +07:00
reya
dcf2791fe5 fix: build 2024-07-19 09:28:03 +07:00
reya
8fcf3551d8 chore: bump version 2024-07-19 08:33:46 +07:00
reya
2d987849d8 feat: use native border in macos 2024-07-19 08:33:16 +07:00
reya
3b99926f3b feat: adapt latest changes in tauri v2 2024-07-19 08:25:36 +07:00
reya
113d69a4df chore: update deps 2024-07-18 18:57:28 +07:00
reya
5d12ba7216 fix: some screen too large 2024-07-03 14:36:54 +07:00
reya
72b59020b4 fix: build on linux and windows 2024-07-03 14:09:07 +07:00
XIAO YU
4c323b9daa chore: Refactor code to use HashSet for account search results (#222) 2024-07-03 07:33:16 +07:00
reya
72da83d648 feat: add force quit command 2024-07-02 17:24:55 +07:00
reya
783a4538a4 Revert "chore: update ci"
This reverts commit 04706a6d7c.
2024-07-02 15:54:00 +07:00
reya
15e62cad11 fix: temporary include devtools in release build 2024-07-02 14:58:00 +07:00
reya
c52b20ca80 chore: bump version 2024-07-02 14:36:16 +07:00
reya
04706a6d7c chore: update ci 2024-07-02 14:07:12 +07:00
reya
0755cbeb6c chore: bump version 2024-07-02 13:03:45 +07:00
雨宮蓮
8eb01c8bbf Improve column management (#221)
* wip: redesign store

* feat: update trending column

* feat: add more functions
2024-07-02 12:51:50 +07:00
reya
ed4f89ff66 feat: add option to toggle window transparent 2024-07-02 08:49:52 +07:00
reya
d9fe647f8e feat: few improvements 2024-07-01 14:41:33 +07:00
reya
843c2d52e7 refactor: tray panel 2024-07-01 13:04:32 +07:00
reya
017a3676a4 feat: optimize spawn thread 2024-06-30 21:06:04 +07:00
reya
fcb70c0e9a chore: update deps 2024-06-30 14:37:26 +07:00
雨宮蓮
0fec21b9ce Some improments and Negentropy (#219)
* feat: adjust default window size

* feat: save window state

* feat: add window state plugin

* feat: add search

* feat: use negentropy for newsfeed

* feat: live feeds

* feat: add search user
2024-06-30 14:26:02 +07:00
XIAO YU
968b1ada94 refactor: improve relay management code structure (#220) 2024-06-29 07:41:16 +07:00
reya
5c9b599b1e feat: use memo for some components 2024-06-26 17:49:36 +07:00
雨宮蓮
717c3e17df Event Subscriptions (#218)
* feat: improve create column command

* refactor: thread

* feat: add window virtualized to event screen

* chore: update deps

* fix: window decoration

* feat: improve mention ntoe

* feat: add subscription to event screen
2024-06-26 14:51:50 +07:00
XIAO YU
a4540a0802 refactor: improve error handling in event.rs (#217) 2024-06-26 07:57:53 +07:00
reya
31bacc2646 chore: remove unused code 2024-06-24 11:09:32 +07:00
reya
6e5d0f0e76 chore: bump version 2024-06-24 10:06:12 +07:00
XIAO YU
f0712e5961 refactor: improve error handling (#216) 2024-06-24 07:19:36 +07:00
雨宮蓮
3fbd66dece Add bitcoin connect (#215)
* feat: add bitcoin connect

* feat: improve zap screen
2024-06-21 14:56:10 +07:00
reya
1283432632 feat: use native feature instead of react 2024-06-21 10:24:09 +07:00
reya
59eaaec903 feat: support content warning 2024-06-21 08:57:49 +07:00
雨宮蓮
4f0f210076 Add lazy carousel (#214)
* refactor: carousel

* feat: improve image carousel
2024-06-21 07:51:11 +07:00
reya
e4a317f038 chore: bump version 2024-06-20 13:23:05 +07:00
reya
9779d020c7 feat: improve list virtualization 2024-06-20 13:22:28 +07:00
雨宮蓮
f8280ec8ee fix: get replies function (#213) 2024-06-19 21:02:33 +07:00
XIAO YU
6c26f8967b chore: Refactor code for better performance and reliability (#212) 2024-06-19 14:36:59 +07:00
reya
e1424b851c fix: routes 2024-06-19 14:22:45 +07:00
reya
d14e609579 chore: bump version 2024-06-19 14:14:34 +07:00
reya
8c0627ff27 fix: crash on startup 2024-06-19 14:14:03 +07:00
雨宮蓮
18c133d096 Settings Manager (#211)
* refactor: landing screen

* fix: code debt

* feat: add settings screen

* chore: clean up

* feat: settings

* feat: small updates
2024-06-19 14:00:58 +07:00
reya
0061ecea78 feat: use native context menu in tray panel 2024-06-18 09:07:58 +07:00
reya
d01cf8319d feat: native context menu 2024-06-17 15:31:59 +07:00
雨宮蓮
843895d876 Make Lume Faster (#208)
* chore: fix some lint issues

* feat: refactor contact list

* feat: refactor relay hint

* feat: add missing commands

* feat: use new cache layer for react query

* feat: refactor column

* feat: improve relay hint

* fix: replace break with continue in parser

* refactor: publish function

* feat: add reply command

* feat: improve editor

* fix: quote

* chore: update deps

* refactor: note component

* feat: improve repost

* feat: improve cache

* fix: backup screen

* refactor: column manager
2024-06-17 13:52:06 +07:00
XIAO YU
7c99ed39e4 chore: handle unwrap err (#210) 2024-06-16 08:11:48 +07:00
雨宮蓮
71be59b2e9 Move the event parser and dedup functions to Rust (#206)
* feat: improve js parser

* feat: move parser and dedup to rust

* fix: parser

* fix: get event function

* feat: improve parser performance (#207)

* feat: improve parser performance

* feat: add test for video parsing

* feat: finish new parser

---------

Co-authored-by: XIAO YU <xyzmhx@gmail.com>
2024-06-12 08:27:53 +07:00
reya
1c20512ecc chore: update deps 2024-06-10 13:15:57 +07:00
雨宮蓮
90342c552f Customize Bootstrap Relays (#205)
* feat: add bootstrap relays file

* feat: add save bootstrap relays command

* feat: add customize bootstrap relays screen
2024-06-10 10:48:39 +07:00
reya
b396c8a695 feat: upgrade to rust-nostr 0.32 2024-06-08 08:00:02 +07:00
reya
6996e30889 chore: update github ci 2024-06-07 11:26:20 +07:00
reya
7ba793fad8 chore: bump version 2024-06-07 10:03:04 +07:00
reya
f11f836518 chore: update tray icon 2024-06-07 09:56:57 +07:00
reya
04fe0fcec8 feat: respect the relay hint 2024-06-07 09:07:33 +07:00
雨宮蓮
799835a629 Notification Panel (#200)
* feat: add tauri nspanel

* feat: add notification panel

* feat: move notification service to backend

* feat: add sync notification job

* feat: enable panel to join all spaces including fullscreen (#203)

* feat: fetch notification

* feat: listen for new notification

* feat: finish panel

---------

Co-authored-by: Victor Aremu <me@victorare.mu>
2024-06-06 14:32:30 +07:00
XIAO YU
4e7da4108b feat: Add get user following function (#202)
* feat: Add get user following function

* refactor: Refactor get_following function to use state and string public key

* feat: Update get_following function to use timeout duration

* feat: Fix connect_remote_account function to return remote_npub without conversion

* feat: Refactor get_following function to handle public key parsing errors

* Refactor get_followers function to handle public key parsing errors and use timeout duration
2024-06-05 13:24:32 +07:00
reya
7c7b082b3a fix: memory leak in image component 2024-06-03 07:32:34 +07:00
reya
38d6c51921 feat: use nostrdb for unix and rocksdb for windows 2024-06-02 08:16:59 +07:00
reya
1738cbdd97 chore: upgrade tauri 2024-06-01 14:54:35 +07:00
reya
2e885b76a1 feat: improve text wrap 2024-06-01 08:27:22 +07:00
reya
f94680e487 fix: column overlapped after change account 2024-05-31 15:25:47 +07:00
XIAO YU
c682a58842 chore: Remove unused modules and update metadata.rs (#199) 2024-05-31 12:53:35 +07:00
reya
921cf871ee chore: bump version 2024-05-31 08:54:53 +07:00
reya
d5b1593aca feat: improve nostr connect flow 2024-05-31 08:54:17 +07:00
reya
6676b4e2a4 Revert "chore: Update dependencies and add thiserror crate (#196)"
This reverts commit e254ee3203.
2024-05-30 15:40:44 +07:00
reya
5f30ddcfca Merge branch 'main' of github.com:lumehq/lume 2024-05-30 15:23:11 +07:00
reya
41d0de539d feat: revamp nostr connect flow 2024-05-30 15:21:33 +07:00
XIAO YU
e254ee3203 chore: Update dependencies and add thiserror crate (#196) 2024-05-30 07:12:46 +07:00
reya
6d42360549 chore: bump version 2024-05-29 14:47:22 +07:00
reya
70c5143445 feat: redirect to index after add account 2024-05-29 14:41:33 +07:00
reya
41b66b18f5 feat: lazy load onboarding videos 2024-05-29 14:11:30 +07:00
雨宮蓮
dda0720ed4 chore: update deps (#195) 2024-05-29 12:54:58 +07:00
reya
4b60b39119 chore: bump version 2024-05-29 10:34:32 +07:00
reya
d2e5122d5a feat: improve splash screen and notification service 2024-05-29 10:33:38 +07:00
reya
32f3315344 fix: editor crash on open 2024-05-28 14:43:34 +07:00
reya
5ca9444358 feat: add theme switcher 2024-05-26 16:11:27 +07:00
reya
4dc13385a5 feat: add option for relay hint 2024-05-26 08:23:29 +07:00
XIAO YU
b90ad1421f chore: update keys.rs and relay.rs (#193) 2024-05-26 07:28:16 +07:00
雨宮蓮
bba324ea53 refactor: use specta for commands (#192)
* feat: add tauri-specta

* refactor: system library

* chore: format
2024-05-25 15:21:40 +07:00
reya
7449000f5f chore: bump version 2024-05-23 08:01:04 +07:00
reya
dc7762ca11 fix: column lose state when navigate back 2024-05-23 08:00:33 +07:00
XIAO YU
3a3f960dde refactor: use borrowed references for adding and connecting relays (#191) 2024-05-23 07:08:39 +07:00
reya
12e066ff2e fix: web 2024-05-22 15:36:41 +07:00
reya
fe4f965ed5 chore: update website 2024-05-22 15:35:41 +07:00
reya
5d3f2264e9 chore: bump version 2024-05-22 13:26:08 +07:00
雨宮蓮
407fe40b67 refactor: account managements (#190)
* feat: add keyring-search

* feat: improve nostr connect
2024-05-22 13:24:58 +07:00
雨宮蓮
1f38eba2cc feat: immersive onboarding (#189)
* feat: change the default onboarding column

* feat: add newsfeed onboarding

* feat: add topic onboarding

* feat: add group onboarding

* chore: polish and format

* feat: rename foryou to topic

* fix: array
2024-05-22 10:44:19 +07:00
reya
9b5867f80c feat: improve tauri commands 2024-05-20 07:05:30 +07:00
reya
cac774a0c1 feat: small ui improve 2024-05-19 08:48:29 +07:00
reya
82689bf3c3 feat: add windows support for v4 2024-05-18 21:02:04 +07:00
reya
f60e438a64 feat: add custom titlebar 2024-05-18 19:07:34 +07:00
reya
ca06f2b6ed chore: clean up tauri commands 2024-05-18 14:59:34 +07:00
reya
99d9c70826 feat: improve event discovery 2024-05-18 08:16:05 +07:00
reya
60afbf090b chore: update to rust-nostr 0.31 2024-05-18 07:52:28 +07:00
reya
10ca4e6ff4 chore: bump version 2024-05-17 15:32:14 +07:00
reya
b0f387d029 fix: wrong permissions for dialog 2024-05-17 15:31:35 +07:00
reya
1a8f750640 fix: profile is not show on edit screen 2024-05-17 14:45:17 +07:00
reya
25523229a2 fix: copy to clipboard is not working properly 2024-05-16 14:24:55 +07:00
雨宮蓮
47835ed857 feat: improve ui for multi-account (#188) 2024-05-16 14:13:07 +07:00
reya
d84647bc6b chore: bump version 2024-05-15 13:58:39 +07:00
reya
7724eccd72 feat: improve tauri commands 2024-05-15 13:58:03 +07:00
reya
8ea2335225 chore: update deps 2024-05-15 10:50:35 +07:00
reya
b60d4db0df feat: improve multi-account switching 2024-05-15 10:14:21 +07:00
reya
f1e17ff3c4 fix: allow app auto restart after update 2024-05-13 15:36:47 +07:00
reya
32954f17b6 chore: bump version and update readme 2024-05-13 15:21:05 +07:00
雨宮蓮
cf70b0f882 fix: context issue in production (#187) 2024-05-13 15:18:23 +07:00
reya
135d0918b3 feat: add check for updates 2024-05-12 15:07:53 +07:00
reya
e1fbcf0460 chore: fix ci again 2024-05-12 08:57:57 +07:00
reya
99aaf3da82 fix: misconfigure in github actions 2024-05-12 08:54:24 +07:00
reya
3ef13e43f1 chore: update github ci 2024-05-12 08:38:23 +07:00
reya
8939196ae4 chore: bump version to 4.0 2024-05-12 08:20:52 +07:00
reya
571d4b4004 feat: improve search 2024-05-12 08:18:25 +07:00
reya
73f80f27fb feat: add basic relay management in rust 2024-05-11 12:28:07 +07:00
雨宮蓮
b46a5cf68f Merge pull request #186 from kasugamirai/chore
feat: Refactor code to improve error handling and readability
2024-05-10 07:13:32 +07:00
xy
8c0d03aed0 feat: Refactor code to improve error handling and readability 2024-05-09 19:09:55 +09:00
reya
777eb15b4f feat: onboarding 2024-05-09 15:06:42 +07:00
reya
c8e1b8b8bd feat: add unread notification badge to dock icon 2024-05-07 14:38:00 +07:00
reya
437cd71f7e feat: improve editor 2024-05-07 14:14:21 +07:00
reya
afb7c87fa3 feat: add bell 2024-05-07 08:29:58 +07:00
reya
c843626bca feat: add notification screen 2024-05-06 15:17:34 +07:00
reya
28337e5915 feat: improve dedup events 2024-05-04 08:29:52 +07:00
雨宮蓮
a4aef25adb final design (#184)
* feat: redesign

* feat: update other columns to new design

* chore: small fixes

* fix: better manage external webview

* feat: redesign note

* feat: update ui

* chore: update

* chore: update

* chore: polish ui

* chore: update auth ui

* feat: finalize note design

* chore: small fixes

* feat: add window management in rust

* chore: format

* feat: update ui for event screen

* feat: update event screen

* feat: final
2024-05-03 15:15:48 +07:00
reya
61d1f095d4 chore: clean up 2024-04-24 15:21:13 +07:00
雨宮蓮
f027eae52d feat: use negentropy (#182)
* feat: use negentropy

* chore: polish
2024-04-24 10:18:51 +07:00
雨宮蓮
174a3cc74e feat: add search window (NIP-50) (#181)
* feat: add search window
* chore: improve search ui
2024-04-23 15:34:08 +07:00
reya
c00a7749b4 feat: use nip44 to encrypt key-value store 2024-04-23 08:04:42 +07:00
Ren Amamiya
c755b8d137 feat: add ability change column name on the fly (#180)
Co-authored-by: reya <reya@lume.nu>
2024-04-22 14:33:14 +07:00
17766d29d6 chore: update deps 2024-04-22 13:18:34 +07:00
3b13dfeed8 chore: update github action 2024-04-20 18:13:36 +07:00
17ba79e01b chore: update app icon 2024-04-20 08:58:00 +07:00
bafad544e9 chore: update deps and bump version 2024-04-19 14:21:12 +07:00
89c36423ae feat: add nip46 2024-04-18 15:09:33 +07:00
cd31b99559 feat: improve official columns 2024-04-18 07:50:46 +07:00
f3c52237fa fix: privacy setting is not working 2024-04-17 13:50:50 +07:00
413d8d82df feat: finish settings screen 2024-04-16 15:28:38 +07:00
2eb2010d43 chore: upgrade deps 2024-04-16 08:55:36 +07:00
94d400cab2 feat: support nip-36 2024-04-16 07:49:44 +07:00
09b143cb08 feat: auto resize mini webview when main webview resized 2024-04-15 13:30:55 +07:00
e3ede34108 feat: revert to sqlite 2024-04-14 09:05:46 +07:00
ed6aca41ea feat: add new spinner component 2024-04-13 15:01:27 +07:00
89f577fbef feat: upgrade to rust nostr 0.30.0 and migrate to nostrdb 2024-04-13 08:53:31 +07:00
a14aeaeb55 feat: add empty state and polish trending column 2024-04-13 08:30:58 +07:00
reya
35cf0abda4 fix: support windows 2024-04-12 18:35:19 +07:00
8a7b246315 chore: update deps 2024-04-11 07:47:37 +07:00
Ren Amamiya
d98c6d0709 Merge pull request #175 from lumehq/v4/beta
Prepare for v4 - beta
2024-04-11 07:45:43 +07:00
bda20e8fe8 chore: small updates 2024-04-11 07:44:41 +07:00
c342daecc8 feat: improve 2024-04-10 14:11:05 +07:00
5e6692cd6d feat: re add group column 2024-04-09 14:05:50 +07:00
420be77b5c feat: add nstore 2024-04-07 15:11:20 +07:00
999073f84c feat: readd for you column 2024-04-04 13:47:15 +07:00
174b28f1a7 chore: update deps 2024-04-03 08:01:40 +07:00
763cb10e85 chore: clean up 2024-04-03 07:29:46 +07:00
89bb8d88f6 feat: settings screens 2024-04-02 13:19:26 +07:00
09aa2ecafc feat: re-add trending column 2024-03-30 10:50:45 +07:00
7271e9ea87 feat: add custom traffic light inset for macos 2024-03-29 13:26:35 +07:00
a02e496b29 chore: update tauri 2024-03-29 07:45:37 +07:00
cbbf5eaf50 feat: add create account flow 2024-03-28 15:12:43 +07:00
d3fa59d2b1 chore: polish 2024-03-27 08:36:34 +07:00
aa23e39334 feat: update new icons 2024-03-26 14:58:06 +07:00
c8e2018fd0 feat: update tray icon 2024-03-26 13:08:03 +07:00
6e489f1c49 wip: onboarding 2024-03-25 14:22:06 +07:00
a49b88ab35 Merge branch 'main' into v4/beta 2024-03-23 07:24:58 +07:00
31839531ea feat: improve open store column 2024-03-22 15:25:53 +07:00
ec0f3fabc0 feat: improve column management 2024-03-22 11:28:54 +07:00
dd7155a3a6 feat: update default column informations 2024-03-21 14:53:08 +07:00
cb565ff35b feat: readd default columns 2024-03-20 15:12:54 +07:00
5d59040224 chore: follow up 2024-03-19 15:36:20 +07:00
7fabf949c6 feat: move column manager to rust 2024-03-19 14:56:24 +07:00
ea5120e2f0 chore: upgrade tauri and bump version 2024-03-19 12:46:19 +07:00
14f07dfea8 feat: add lume store screen 2024-03-19 08:21:16 +07:00
Ren Amamiya
1de48cc640 Merge pull request #174 from fernandolguevara/minors/styling-scrollbar
feature: make scrollbar nicer
2024-03-19 07:10:28 +07:00
Fernando López Guevara
f72eb456e8 feature: make scrollbar nicer 2024-03-18 09:42:25 -03:00
05b52564e0 feat: column manager 2024-03-18 10:50:08 +07:00
c8e014f33e chore: clean up 2024-03-16 18:45:54 +07:00
46cc01e0ee feat: child webview 2024-03-16 15:05:06 +07:00
16e6d234e5 feat: space 2024-03-14 14:22:41 +07:00
3005d27403 feat: update fetch opg function 2024-03-13 10:24:45 +07:00
1be84f3139 chore: release v4.0.0-alpha+2 2024-03-13 09:40:30 +07:00
Ren Amamiya
04bde7dd43 Merge pull request #172 from lumehq/v4/functions
Some polish for v4
2024-03-13 09:39:57 +07:00
f1504d99ac feat: add mock tray menu 2024-03-13 09:19:25 +07:00
e928f2ee37 feat: polish 2024-03-13 08:40:18 +07:00
Ren Amamiya
ccab78ca11 Merge pull request #171 from lumehq/v4/zap
Add zap to v4
2024-03-11 15:39:35 +07:00
5b13c3e45c feat: auto close window if zapp successfully 2024-03-11 15:38:54 +07:00
e6b97ab9ae feat: add zap 2024-03-11 15:36:17 +07:00
bb6badfed6 feat: add zap setup screen 2024-03-10 16:39:23 +07:00
Ren Amamiya
0c4b309a11 Merge pull request #170 from lumehq/v4/home-screen
v4/home-screen
2024-03-09 10:09:29 +07:00
f4400d711f feat: improve home screen 2024-03-09 10:08:50 +07:00
a3e46aa96b fix: crash when database is not exist 2024-03-08 14:47:36 +07:00
a4fdcfdf0b feat: add local and global newsfeeds 2024-03-07 15:39:43 +07:00
25d07303a3 fix: build error in windows and linux 2024-03-06 15:32:51 +07:00
0e1e7524c9 chore: bump version 2024-03-06 15:05:17 +07:00
Ren Amamiya
32d770eb91 Merge pull request #169 from lumehq/v4/onboarding
Add basic onboarding dialog to v4
2024-03-06 15:00:07 +07:00
e93cbf78d5 feat: add npub to file associations 2024-03-06 14:40:55 +07:00
71a2290b8f feat: add backup dialog 2024-03-06 14:40:00 +07:00
95294a80cb feat: simplify account management 2024-03-06 11:11:24 +07:00
8eaf47f6d2 feat: add login dialog 2024-03-06 09:42:44 +07:00
86183d799a fix: package version in windows 2024-03-02 17:59:36 +07:00
2dbfff3c17 chore: release v4.0.0-alpha.0 2024-03-02 16:08:01 +07:00
Ren Amamiya
d1f5c372ae Merge pull request #166 from lumehq/feat/rust-nostr
Rust Nostr
2024-03-02 15:32:13 +07:00
13281455ed chore: refer old branch in readme 2024-03-02 15:31:41 +07:00
9cfb32be4d feat: update readme 2024-03-02 15:29:45 +07:00
cb0672c22a Merge branch 'main' into feat/rust-nostr 2024-03-02 15:22:11 +07:00
ca0e041731 feat: improve 2024-03-02 15:21:28 +07:00
cfcb9bc6ed feat: improve ui 2024-02-29 13:02:16 +07:00
09df8672d0 feat: add zap command 2024-02-27 15:37:49 +07:00
2403231ac4 feat: add user screen 2024-02-27 13:42:59 +07:00
98ef1927f2 feat: editor 2024-02-26 15:10:42 +07:00
63db8b1423 chore: clean up 2024-02-25 15:52:47 +07:00
2c8dd71792 feat: add simple tray icon 2024-02-25 09:06:23 +07:00
reya
fe73e1428b feat: upgrade tauri 2024-02-24 18:26:20 +07:00
88a6c3c81f feat: account switcher 2024-02-24 14:41:57 +07:00
84584a4d1f feat: add editor screen 2024-02-23 14:56:24 +07:00
64286aa354 wip 2024-02-22 14:01:29 +07:00
e9ce932646 chore: remove storage layer 2024-02-22 08:58:45 +07:00
Ren Amamiya
4c28b4879c chore: update readme 2024-02-21 15:04:30 +07:00
9127d5c5ea feat: add more metadata commands 2024-02-21 14:29:54 +07:00
090e54ec5a feat: add contact list commands 2024-02-20 14:46:21 +07:00
d0c9f93ebb wip: small updates 2024-02-20 10:26:19 +07:00
e2cdc5b576 feat: account selection screen 2024-02-19 14:13:33 +07:00
bfe35ad885 wip: multi accounts 2024-02-19 09:58:27 +07:00
0f06522c28 wip: refactor 2024-02-17 16:01:53 +07:00
f47eba5af7 feat: upgrade to rust nostr 0.28 2024-02-17 09:29:37 +07:00
f28a7ae82f wip: update design 2024-02-16 14:11:49 +07:00
296b11b7b8 wip: basic support multi windows 2024-02-16 09:58:07 +07:00
a0d9a729dd feat: add tauri devtools 2024-02-15 14:41:32 +07:00
1de8c7240d wip: desktop2 2024-02-15 14:32:40 +07:00
70126ef1b3 Merge branch 'main' into feat/rust-nostr 2024-02-15 12:48:20 +07:00
cdf29f8a54 wip: update 2024-02-15 12:47:15 +07:00
6171b9bed1 wip: tired... 2024-02-14 15:51:06 +07:00
60fd09000b wip: new design 2024-02-14 08:29:24 +07:00
4292def206 feat: add more nostr commands 2024-02-13 09:36:11 +07:00
90f149b09c chore: clean up 2024-02-13 08:57:24 +07:00
ed52105c02 wip: migrate to desktop2 2024-02-12 20:04:45 +07:00
1950cb59a2 wip: migrate to desktop2 2024-02-12 09:08:35 +07:00
Ren Amamiya
9753e6d6b4 Merge pull request #167 from anthony-robin/french-translations
Add french translations 🇫🇷
2024-02-12 07:55:46 +07:00
Anthony Robin
3488f05960 Add french translations 🇫🇷
This PR adds support for french translations into Lume.
2024-02-11 17:09:59 +01:00
c809ab6b4e feat: add desktop2 2024-02-11 09:30:18 +07:00
Ren Amamiya
c6674c4a2d Merge pull request #165 from higedamc/main
Update ja.json
2024-02-11 08:10:36 +07:00
35c5b5fb78 chore: fix build 2024-02-10 11:19:18 +07:00
739ba63e6c wip: migrate frontend to new backend 2024-02-09 15:33:27 +07:00
ec78cf8bf7 feat: migrate frontend to new backend 2024-02-08 21:24:08 +07:00
17052aeeaa feat: add new account management 2024-02-08 17:17:45 +07:00
d7bbda6e7b fix: remove native db 2024-02-07 14:26:58 +07:00
6a08c1de10 feat: add all nostr events command 2024-02-07 14:04:57 +07:00
3c4bd39384 feat: update rust nostr 2024-02-06 19:28:46 +07:00
a4069dae99 chore: clean up 2024-02-06 09:15:20 +07:00
HigeMan
55cd556cd6 Update ja.json 2024-02-06 08:45:17 +09:00
a21da11a91 feat: add desktop2 2024-02-05 14:18:27 +07:00
08fa7de01d feat: add check active account before init client 2024-02-05 13:36:10 +07:00
2a58326cd1 chore: update dependencies 2024-02-05 08:30:06 +07:00
8a17c36a5b feat: upgrade to tauri beta 2024-02-05 08:14:58 +07:00
7bd6f6a8db fix: remove surrealdb and clean up 2024-02-05 07:46:41 +07:00
3ba870be4b feat: add verify signer 2024-02-04 10:46:50 +07:00
bd2b6a3759 feat: add surreal db 2024-02-03 11:24:08 +07:00
a3a8f57bfc feat: add more nostr commands 2024-02-03 09:13:17 +07:00
fd393a4d30 feat: add basic nostr connection 2024-02-02 09:09:14 +07:00
e8bd48e51b feat: add rust nostr 2024-02-01 12:54:25 +07:00
0191180f31 chore: rename 2024-02-01 09:15:25 +07:00
60ed56b1b9 chore: bump version 2024-02-01 08:40:27 +07:00
Ren Amamiya
da722afed3 Merge pull request #154 from luminous-devs/next
v3.0.1
2024-02-01 08:36:21 +07:00
d8eb51e49c Revert "chore: update dependencies"
This reverts commit c700a45ab6.
2024-02-01 08:18:51 +07:00
c700a45ab6 chore: update dependencies 2024-02-01 07:59:25 +07:00
b806a34edb chore: remove submodule and clean up flatpak 2024-01-31 14:31:16 +07:00
21989e6fa5 fix: minor improves 2024-01-31 14:20:03 +07:00
0539c5649d feat: add waifu column and fix wrong package 2024-01-31 11:04:47 +07:00
ad488ff72d feat: add global column 2024-01-31 09:12:26 +07:00
02e0309a41 feat: refactor rust commands 2024-01-31 08:20:39 +07:00
b7f4af7883 fix: respect NIP spec 2024-01-31 07:29:47 +07:00
cc48a4f36b chore: update dependencies 2024-01-30 15:33:24 +07:00
46ed3330fc feat: add hover card to user 2024-01-30 14:45:46 +07:00
1fa1872ca6 feat: add trending notes column 2024-01-30 14:22:56 +07:00
Ren Amamiya
c389a23365 Merge pull request #153 from luminous-devs/feat/improve-updater
feat: Add new update bubble to navigation
2024-01-30 13:18:52 +07:00
eaf9bda077 feat: add new update notify to navigation 2024-01-30 13:16:39 +07:00
84a248a5a9 chore: fix typos 2024-01-30 10:01:45 +07:00
Ren Amamiya
711c1d561a Merge pull request #151 from luminous-devs/feat/multi-lang
Add support for multi-languages
2024-01-30 09:12:06 +07:00
21210b4336 feat: migrate activity screen to i18n 2024-01-30 09:10:26 +07:00
3bd480b75e feat: optimize locale loader 2024-01-30 08:55:49 +07:00
2b19650e46 feat: migrate onboarding to i18n 2024-01-30 08:13:12 +07:00
23482531c5 feat: migrate settings screen to i18n 2024-01-29 14:57:00 +07:00
cfda9ba899 feat: migrate ui components to i18n 2024-01-29 13:38:22 +07:00
698bd78684 feat: migrate note component to i18n 2024-01-29 10:22:55 +07:00
b97676dd3e feat: add translation to relay screen 2024-01-29 09:30:33 +07:00
25ae4f2201 feat: add multi-lang 2024-01-29 09:12:44 +07:00
Ren Amamiya
59435ccd13 Merge pull request #150 from jurraca/add-libappindicator
add libappindicator to runtime libs in nix shell
2024-01-28 17:35:40 +07:00
jurraca
e81912c5e9 add libappindicator to runtime libs in nix shell 2024-01-28 08:24:25 +00:00
af1b4e60d3 web: update download link 2024-01-28 08:45:04 +07:00
648cbf6f80 chore: fix ci 2024-01-28 08:05:36 +07:00
7b06a82ee7 chore: bump version and fix gh action 2024-01-28 07:40:08 +07:00
Ren Amamiya
d18de93c60 Merge pull request #148 from luminous-devs/feat/improve-perf
Improve overall performance
2024-01-27 20:01:55 +07:00
df15eb7a03 Merge branch 'main' into feat/improve-perf 2024-01-27 17:56:50 +07:00
Ren Amamiya
06674df6cc Merge pull request #137 from kogeletey/feat/package-flatpak
Package lume in flatpak
2024-01-27 17:34:47 +07:00
reya
8295625a44 feat: polish on windows 2024-01-27 15:53:19 +07:00
b11e2a4291 fix: update mention popup style 2024-01-27 11:16:17 +07:00
353c18bb76 feat: update ark provider 2024-01-27 09:08:41 +07:00
kogeletey
02b0c9e48a merge remote-tracking branch 'origin/main' into feat/package-flatpak 2024-01-26 19:49:27 +03:00
kogeletey
ff73c8ac88 feat: supporting hash of github actions cache 2024-01-26 19:37:12 +03:00
Ren Amamiya
bc48391a1a Merge pull request #147 from luminous-devs/feat/improve-design
Improve overal design
2024-01-26 14:21:27 +07:00
b0a443c002 feat: polish 2024-01-26 14:15:25 +07:00
bef1f136ad chore: bump version 2024-01-26 12:43:19 +07:00
9ba584bf14 feat: improve onboarding 2024-01-26 10:17:23 +07:00
kogeletey
43509fc943 feat: supported flatpak version v3 2024-01-25 15:00:08 +03:00
kogeletey
4a99eb94e2 feat: supported flatpak 2024-01-25 14:59:48 +03:00
74426e13c8 wip: improve onboarding 2024-01-25 15:25:40 +07:00
bd45c36072 feat: fix typos and other stuffs 2024-01-25 09:49:04 +07:00
c13aefcd15 feat: update dependencies 2024-01-25 08:35:17 +07:00
167caee8bc feat: improve ui contrast 2024-01-25 08:14:25 +07:00
d527078d5c feat: redesign column header 2024-01-24 15:08:55 +07:00
Ren Amamiya
763ace5ddf Merge pull request #145 from luminous-devs/feat/search
feat: add search based on NIP-50
2024-01-24 13:36:17 +07:00
057c57b70f feat: add empty state to search dialog 2024-01-24 13:34:27 +07:00
cb71786ac1 feat: add basic search dialog 2024-01-23 13:07:24 +07:00
Ren Amamiya
67afeac198 Merge pull request #143 from luminous-devs/apps/web
Add landing page
2024-01-22 14:41:24 +07:00
f4ee25de8e feat: add landing page 2024-01-22 14:40:39 +07:00
445a218a9e Merge branch 'main' into next 2024-01-21 09:54:47 +07:00
f09139ffbe final 2024-01-21 09:43:46 +07:00
446721729b feat: polish 2024-01-20 20:14:26 +07:00
reya
e0250d7f5c chore: fix some issues on windows 2024-01-20 10:15:27 +07:00
9fcdac4edb feat: add suggest screen 2024-01-20 14:51:13 +07:00
b726ae3c7c feat: add for you column 2024-01-20 09:06:00 +07:00
a3460418f6 feat: add interest screen to onboarding 2024-01-19 14:53:26 +07:00
f65175f11e feat: polish 2024-01-19 08:24:13 +07:00
16efd495a0 chore: clean up 2024-01-19 07:45:28 +07:00
ed6423e4aa feat: polish 2024-01-18 15:09:16 +07:00
0e9418949b feat: add instant zap 2024-01-18 13:56:35 +07:00
240fe8bc7c feat: fix relay manager 2024-01-18 09:41:53 +07:00
c3482cddd8 feat: improve zap 2024-01-18 08:22:35 +07:00
d13e7b3ef6 feat: polish 2024-01-18 07:37:40 +07:00
47800bd2ff chore: upgrade tauri 2024-01-17 13:07:01 +07:00
c0305db5fc chore: update and fix dependencies 2024-01-17 12:39:04 +07:00
0b745cb40e feat: add reply form 2024-01-17 12:24:04 +07:00
a20f5ca15d feat: polish 2024-01-17 09:30:32 +07:00
c29b4e173e feat: polish 2024-01-17 08:50:43 +07:00
33dd8b1d8a feat: better error handler 2024-01-16 19:56:07 +07:00
1503d90bd5 fix: tauri cache 2024-01-16 14:51:06 +07:00
6581ffb92b feat: polish 2024-01-16 14:49:00 +07:00
939dfd9cc1 feat: fix errros 2024-01-16 08:37:42 +07:00
7744a5e17c feat: update translation 2024-01-15 20:01:06 +07:00
3301af5cbb feat: move nwc to settings 2024-01-15 15:33:05 +07:00
3f1218e7bc feat: add tutorial 2024-01-15 14:06:11 +07:00
fbcb3ae6dc feat: add register translate api 2024-01-15 09:51:49 +07:00
e93aedb703 feat: update default column list 2024-01-15 08:36:23 +07:00
dae4b1d52b feat: redesign relay screen 2024-01-14 18:05:36 +07:00
f908c46a19 feat: polish 2024-01-14 09:39:56 +07:00
ab27bd5f44 feat: polish 2024-01-13 20:24:52 +07:00
72870bb131 feat: add activity screen 2024-01-13 17:12:44 +07:00
1822eac488 feat(ark): add user component 2024-01-13 08:21:49 +07:00
0487b8a801 feat: refactor 2024-01-12 20:32:45 +07:00
67c6177291 chore: update 2024-01-12 15:14:49 +07:00
ad6ae6745d chore: fixed circular import 2024-01-12 14:46:50 +07:00
a9d10ff93b feat: polish note component 2024-01-12 13:56:20 +07:00
e0d4c53098 feat: update onboarding flow 2024-01-12 10:12:06 +07:00
2c8571ecc7 wip: new activity sidebar 2024-01-11 21:00:42 +07:00
a8cd34d998 chore: small fixes 2024-01-11 07:56:28 +07:00
a5ad4fe05c feat: redesign navigation bar 2024-01-10 13:57:44 +07:00
f2504071cd feat: update login flow 2024-01-10 09:22:13 +07:00
73f90ebaf9 chore: minor fixes and updates 2024-01-09 08:35:30 +07:00
c172c0f80f feat: add onboarding modal 2024-01-08 20:18:07 +07:00
aa80301778 refactor: add event and user routes to default ui 2024-01-08 09:30:04 +07:00
c04ca3a1ab fix: migarate to virtua 0.2.0 2024-01-08 08:03:19 +07:00
3eae38e1cb chore: update dependencies 2024-01-07 20:47:48 +07:00
87099c6388 feat: update create account flow 2024-01-07 16:39:05 +07:00
7554a35c31 chore: update config 2024-01-07 07:44:37 +07:00
70707f69c8 feat: update create account screen 2024-01-07 07:42:08 +07:00
Ren Amamiya
a98ffd4887 Merge pull request #135 from fernandolguevara/feat-open-notes-edit-rail-title
feat(rail): edit title & open user notes
2024-01-07 07:39:18 +07:00
Fernando López Guevara
2e23b3ae06 feat(rail): edit title & open user notes 2024-01-06 11:38:34 -03:00
8e8e6fe244 chore: restructure 2024-01-05 07:31:08 +07:00
2726bfd595 feat: support nip 89 2024-01-04 15:10:52 +07:00
542b6033c2 refactor(note): only support kind 1 2024-01-04 12:35:21 +07:00
fcde669685 feat(editor): add hot key and update function 2024-01-04 10:44:00 +07:00
f4cbcee8b4 feat: add editor 2024-01-04 08:52:45 +07:00
ba13ac7535 chore: restructure packages 2024-01-03 11:12:36 +07:00
9f27d68533 chore: clean up 2024-01-03 11:03:56 +07:00
698f5a5d6d feat(columns): add default column 2024-01-02 12:28:48 +07:00
7856d6d49d feat(columns): add antenas column 2024-01-02 09:02:11 +07:00
a52fb3c437 feat(columns): add group column 2024-01-01 17:32:57 +07:00
499765c10a chore: update dependencies 2024-01-01 08:19:43 +07:00
56fab1dda6 feat: the last commit of year 2023-12-31 20:53:51 +07:00
b1d2496f8e feat(column): add hashtag column 2023-12-30 17:33:04 +07:00
ddbbcf41b5 chore: polish some components 2023-12-30 09:02:39 +07:00
55d6318614 refactor(ark): update note component 2023-12-29 14:14:39 +07:00
be333260f2 refactor(column): use context for manage column 2023-12-29 13:12:37 +07:00
e1edba8a78 chore: update dependencies 2023-12-29 08:26:13 +07:00
4fc3cc8a80 feat(column): add thread and user columns 2023-12-28 11:31:47 +07:00
893f3f7181 feat(icon): update navigation icons 2023-12-28 09:38:59 +07:00
4103b509d4 feat(parser): improve media parser 2023-12-28 08:44:55 +07:00
ed538c91c6 feat(columns): update timeline column 2023-12-27 15:01:40 +07:00
b4dac2d477 refactor(ark): add note provider 2023-12-27 10:52:13 +07:00
3956ed622d chore: fix build 2023-12-26 15:21:51 +07:00
e1db873bd5 refactor(ark): rename widget to column 2023-12-26 13:44:38 +07:00
227c2ddefa chore: monorepo 2023-12-25 14:28:39 +07:00
a6da07cd3f refactor: everything 2023-12-24 19:14:46 +07:00
9591d8626d chore: update dependencies 2023-12-23 09:05:52 +07:00
ee4e6b1ee6 chore: remove signal 2023-12-22 14:49:00 +07:00
a882ead649 chore: update icon 2023-12-22 14:10:23 +07:00
0522611669 feat(icon): update app and tray icons 2023-12-22 10:13:21 +07:00
2536630ff7 update dependencies 2023-12-22 07:52:24 +07:00
4670778181 feat(depot): update screens 2023-12-21 15:29:07 +07:00
a6ca2589ab feat(depot): update onboarding screen 2023-12-19 15:43:32 +07:00
d9e8d05db7 feat(ui): update ui consistent 2023-12-19 10:13:52 +07:00
ec2ac2dce3 feat(ark): add note component to ark 2023-12-19 08:06:10 +07:00
55298515af refactor(widget): migrate widget component to ark lib 2023-12-18 13:39:03 +07:00
344bdc0c66 feat(depot): add setting run depot at launch 2023-12-17 08:07:44 +07:00
ba88a4e0f2 feat(ark): update screen 2023-12-16 10:53:16 +07:00
17c64ee357 feat(ark): refactor 2023-12-16 07:47:00 +07:00
ba93bdbb91 feat(depot): initial work for depot 2023-12-15 09:15:30 +07:00
591373fd52 fix(layout): fix flickering on home layout 2023-12-14 14:30:49 +07:00
2fcc4dead1 feat(router): restructure 2023-12-14 13:22:03 +07:00
d9ab7893e0 feat: update format 2023-12-14 13:11:21 +07:00
Ren Amamiya
a93ebd3861 Merge pull request #132 from luminous-devs/feat/universal-titlebar
feat: add window titlebar
2023-12-11 08:57:31 +07:00
7c4ec71089 feat: add window titlebar 2023-12-11 08:56:00 +07:00
Ren Amamiya
e9d845cf25 Merge pull request #131 from luminous-devs/wip/cleanup
Clean up
2023-12-11 07:34:24 +07:00
8883be7ed6 upgrade to vite 5 2023-12-10 17:00:04 +07:00
132ea7f887 clean up 2023-12-10 16:53:07 +07:00
Ren Amamiya
f9402f5c4f Merge pull request #130 from luminous-devs/feat/ark
Introduction Ark
2023-12-10 11:19:04 +07:00
72a38e3aa7 polish 2023-12-10 08:39:40 +07:00
38e82a4feb prefetch data 2023-12-09 18:11:02 +07:00
6440680898 fix ark 2023-12-09 09:34:20 +07:00
e507187044 wip: fully migrate to ark 2023-12-08 12:39:15 +07:00
Ren Amamiya
feeb92b6ef Merge pull request #129 from vivganes/patch-2
Grammar touch-up + 1 more tip 🚀
2023-12-08 11:20:04 +07:00
Vivek Ganesan
2d4a77e8ed Grammar touch-up + 1 more tip 🚀 2023-12-08 08:47:54 +05:30
6f5ea1229d Merge branch 'main' into feat/ark 2023-12-08 09:43:35 +07:00
68886ad584 wip: migrate to ark 2023-12-08 09:32:48 +07:00
5f90bd0d22 update dependencies 2023-12-08 08:18:47 +07:00
8b434d577f fix nip-05 verification 2023-12-08 08:01:06 +07:00
f2b1458bd2 bump version & fix using nsecbunker with token 2023-12-07 18:49:55 +07:00
7507cd9ba1 wip: migrate to ark 2023-12-07 18:09:00 +07:00
0d43c13928 bump version 2023-12-07 11:55:49 +07:00
95124e5ded wip: ark 2023-12-07 11:50:25 +07:00
a42a2788ea fix nip-05 2023-12-06 10:15:41 +07:00
e30274dab3 fix typo 2023-12-06 09:07:32 +07:00
Ren Amamiya
740b7588bc Merge pull request #127 from luminous-devs/hotfix/2.2.1
v2.2.1
2023-12-06 08:09:44 +07:00
24c2ed4eb2 update 2023-12-06 08:08:11 +07:00
4006c0010e polish 2023-12-05 15:31:45 +07:00
7decf264d7 polish nsecbunker 2023-12-05 14:25:44 +07:00
482b218f74 improve error handling for useevent hook 2023-12-05 09:42:08 +07:00
e06b760e41 bump version 2023-12-04 14:14:50 +07:00
7efc35f622 replace media chrome with vidstack 2023-12-04 14:02:07 +07:00
8795923443 update 2023-12-04 13:36:16 +07:00
4093821fd0 clean up 2023-12-04 12:47:29 +07:00
b19637bdb7 remove misconfigure in react query 2023-12-04 12:17:16 +07:00
21e758ec13 update user component 2023-12-04 11:49:52 +07:00
48ab123850 improve relay screen 2023-12-04 09:26:19 +07:00
a401070031 update dependencies 2023-12-04 08:46:42 +07:00
e5e4109e79 bump version 2023-12-03 08:38:32 +07:00
Ren Amamiya
d62c814f33 Merge pull request #125 from luminous-devs/next
Lume v2.2.0
2023-12-03 08:37:37 +07:00
2a92b7c202 polish 2023-12-03 08:34:44 +07:00
255dcb43fe improve relay form 2023-12-02 17:53:45 +07:00
a528b646e3 add finish step to tutorial 2023-12-02 08:33:23 +07:00
fc35745c0d wip: tutorial 2023-12-01 15:45:43 +07:00
9ddf3471ce fix nsecbunker 2023-12-01 08:23:46 +07:00
8355ad6863 auto connect user relays 2023-11-30 20:15:54 +07:00
217ac490b1 fix outbox 2023-11-30 19:22:00 +07:00
092cf49227 improve relay connection 2023-11-30 18:19:24 +07:00
5318f6c4cb clean up 2023-11-30 17:24:07 +07:00
80f675cb54 improve notification and performance 2023-11-30 16:02:28 +07:00
6f68c2762b add prefetch data 2023-11-30 10:35:08 +07:00
f4390b29e2 revamp onboarding and launching process 2023-11-30 09:38:58 +07:00
00e4f9d357 clean up dependencies 2023-11-28 15:36:57 +07:00
d28d183620 Merge branch 'main' into next 2023-11-28 09:07:14 +07:00
3c6c9c86d1 2.1.7 2023-11-28 09:00:46 +07:00
bcd079c88e update dependencies 2023-11-28 08:34:21 +07:00
Ren Amamiya
d989d6ffad Merge pull request #123 from luminous-devs/feat/v2.1.6
Feat/v2.1.6
2023-11-27 12:01:25 +07:00
5229458746 bump version 2023-11-27 09:56:43 +07:00
2bfa1db816 update 2023-11-27 09:48:51 +07:00
8439428ce1 fix crash on settings screen 2023-11-26 15:01:13 +07:00
34dceef4a3 fix mention popup 2023-11-26 07:48:28 +07:00
Ren Amamiya
619bfb8dff Merge pull request #122 from luminous-devs/v2.1.4
v2.1.4
2023-11-26 07:22:13 +07:00
7759851541 clean up 2023-11-26 07:21:24 +07:00
9112c1c24a improve connection 2023-11-25 17:56:45 +07:00
24b21a9451 update 2023-11-25 16:03:05 +07:00
31a53b9c48 add @ suggestion popup 2023-11-25 15:41:18 +07:00
dc229f40cb fix new article layout 2023-11-25 11:07:31 +07:00
54ad1e6e1d fix new post layout 2023-11-25 09:22:15 +07:00
Ren Amamiya
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
74738c36cd disable blockUntilReady 2023-11-23 15:12:46 +07:00
Ren Amamiya
2fdf437789 Merge pull request #120 from luminous-devs/fix/logout
Fix logout function and other issues
2023-11-23 08:54:24 +07:00
731c72535c bump version 2023-11-23 08:52:47 +07:00
628102087e fix total account count function 2023-11-23 08:52:04 +07:00
536ea30ed2 fix logout function 2023-11-23 08:49:05 +07:00
8ee38cdb42 temp disable single-instance plugin 2023-11-22 17:27:09 +07:00
Ren Amamiya
a896300f23 Merge pull request #118 from luminous-devs/v2.1.2
v2.1.2
2023-11-22 16:18:02 +07:00
d3cf1200ba bump version 2023-11-22 16:13:06 +07:00
b5ac3df090 fix package 2023-11-22 16:10:20 +07:00
3b40dd6903 update dependencies 2023-11-22 15:27:19 +07:00
Ren Amamiya
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 Amamiya
05fb56e5fc Merge pull request #116 from vivganes/patch-1
Little grammar corrections
2023-11-22 10:32:47 +07:00
Vivek Ganesan
59d9646e9f Little grammar corrections 2023-11-22 08:43:31 +05:30
b73d84fccb update storage provider 2023-11-22 09:05:10 +07:00
1929ceb72d add toast message 2023-11-22 08:31:58 +07:00
a1d22c1daf make auto update is optional 2023-11-22 08:30:43 +07:00
cf7af1ba64 fix ci again again 2023-11-20 08:47:16 +07:00
933ca758ee fix ci again 2023-11-20 08:27:37 +07:00
f537209b92 fix ci 2023-11-20 08:16:39 +07:00
6777610b07 update dependencies 2023-11-20 08:02:09 +07:00
88803cd3cd bump version 2023-11-19 19:51:00 +07:00
Ren Amamiya
6adf5933b0 Merge pull request #113 from luminous-devs/hotfix/themes
Add support dark mode for toaster
2023-11-19 19:49:59 +07:00
9521a49fff support dark mode for toaster 2023-11-19 19:49:26 +07:00
Ren Amamiya
5789a105f5 Merge pull request #112 from luminous-devs/hotfix/settings
Fix settings screen
2023-11-19 15:15:11 +07:00
b7a18bea34 respect user settings 2023-11-19 14:50:59 +07:00
7117ed05a9 update settings screen 2023-11-19 08:48:01 +07:00
c53bdb68e5 add change theme function 2023-11-18 21:17:37 +07:00
6725dca807 fix all dms bugs 2023-11-17 16:03:12 +07:00
Ren Amamiya
077712cf43 Merge pull request #105 from luminous-devs/feat/v2.1.0
v2.1.0
2023-11-17 10:06:58 +07:00
2794c78ee1 add new private key screen 2023-11-17 09:24:21 +07:00
21574023db update dark mode 2023-11-17 08:16:25 +07:00
954b729dc9 wip: settings screen 2023-11-16 17:48:29 +07:00
6dc4e1cde6 bump version 2023-11-16 08:38:23 +07:00
efbdf26706 add window state plugin 2023-11-16 08:25:08 +07:00
b41ec353c6 improve relay connection 2023-11-16 07:59:29 +07:00
875225591a wip: settings screen 2023-11-15 14:20:45 +07:00
04c1223f2e update article screen 2023-11-15 13:32:23 +07:00
773e49afa2 wip 2023-11-15 13:13:11 +07:00
025d7a623b polish 2023-11-15 10:27:47 +07:00
b6caab15e1 update tauri controls 2023-11-15 09:26:59 +07:00
1d3d0a17dc fix updater 2023-11-15 08:32:40 +07:00
1cbe781698 update error screen 2023-11-14 16:14:40 +07:00
dc5b4f8ac1 refactor publish event 2023-11-14 15:15:13 +07:00
fee4ad7b98 smal fixes and update article layout 2023-11-13 15:44:58 +07:00
d5647d7452 redesign loading screen 2023-11-13 08:16:36 +07:00
0a5076f06c polish 2023-11-12 15:43:14 +07:00
a3632571ff polish 2023-11-12 08:41:47 +07:00
5c48ebe103 improve spacing 2023-11-11 16:12:50 +07:00
1c3119577f update widget list 2023-11-11 09:14:23 +07:00
0710996a0d wip: update widget list 2023-11-10 16:05:20 +07:00
0cdf199cb5 wip: rework widget 2023-11-09 18:02:25 +07:00
cb9006abb2 add topic widget 2023-11-09 09:12:42 +07:00
108ecafab7 update widgets 2023-11-08 16:17:47 +07:00
6b030f2902 polish 2023-11-08 08:21:52 +07:00
ce864c8990 wip 2023-11-07 16:23:01 +07:00
ee3e8eb105 wip 2023-11-07 09:35:13 +07:00
701712e7b8 polish 2023-11-05 15:19:51 +07:00
dad388c6ab new parser 2023-11-04 14:18:29 +07:00
Ren Amamiya
912c740c51 Merge pull request #103 from luminous-devs/feat/personal-dashboard
Add personal dashboard
2023-11-03 15:41:28 +07:00
da0b48c5df update personal dashboard screen 2023-11-03 15:38:58 +07:00
64b4745993 update personal screen 2023-11-03 08:45:25 +07:00
8aa2ef39c5 update nip-05 and user profile component styles 2023-11-02 13:47:44 +07:00
a945f04959 update dependencies 2023-11-02 13:09:52 +07:00
c93989237a fix app crash issue 2023-11-01 16:59:13 +07:00
95cf3f60f3 readd updater pubkey 2023-11-01 16:42:20 +07:00
Ren Amamiya
dd21633624 Merge pull request #102 from luminous-devs/feat/v2.0.1
v2.0.1
2023-11-01 15:38:39 +07:00
f01074ea9f fix article 2023-11-01 15:37:50 +07:00
c8d04f4695 support tiff image 2023-11-01 15:24:46 +07:00
2f8aa66ff6 bump version 2023-11-01 15:08:22 +07:00
3ad6830bfb update title bar 2023-11-01 14:58:20 +07:00
f2dddf97f5 polish 2023-11-01 13:01:52 +07:00
e218ebee89 refactor text parser 2023-11-01 10:05:08 +07:00
fd5ecc18a9 refactor all widgets 2023-11-01 08:07:49 +07:00
e7738fb128 refactor newsfeed widget 2023-10-30 16:29:49 +07:00
0b25a4a04b add ndk cache tauri 2023-10-29 11:07:05 +07:00
ace58ecdd5 refactor text parser 2023-10-28 14:36:12 +07:00
6685d9af38 update user component 2023-10-28 08:29:38 +07:00
60b803f419 unify upload function 2023-10-28 07:51:42 +07:00
555c8ec08a migrate to tanstack query v5 2023-10-28 07:35:39 +07:00
42eb882f52 update dependencies 2023-10-27 17:45:08 +07:00
b6784aa979 add missing deps to gh ci 2023-10-26 13:39:11 +07:00
08a7bdc6d5 fix ci again 2023-10-26 13:30:43 +07:00
6fac37a0ca improve follow/unfollow, support petname 2023-10-26 13:29:13 +07:00
37ed0f4892 fix ci 2023-10-26 13:11:06 +07:00
1cb2d8cb41 small fixes 2023-10-26 12:32:03 +07:00
3abce5e6d6 update appicon and tauri config 2023-10-26 12:24:32 +07:00
842f9e14e0 add updater v2 2023-10-26 10:33:27 +07:00
0c8dcef937 ready for alpha 2023-10-26 09:29:33 +07:00
Ren Amamiya
50f81a7d0b Merge pull request #98 from sectore/feat/flake-nix
Add Nix dev environment
2023-10-25 09:23:45 +07:00
dcacf23625 add notification widget 2023-10-25 09:23:20 +07:00
jk
b01af39445 typo + cleanup 2023-10-24 17:26:50 +02:00
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
854a47f266 wip 2023-10-24 13:11:10 +07:00
b1a44f2cbf wip: new composer 2023-10-22 15:48:06 +07:00
cade8c8b4c wip: multi-type composer 2023-10-21 15:58:39 +07:00
de88ca51fe update 2023-10-20 15:15:30 +07:00
7c8d8a09fd wip: nsecbunker 2023-10-20 09:36:49 +07:00
e1e54c1a98 update thread widget 2023-10-19 14:45:41 +07:00
0de72eb009 polish 2023-10-19 08:59:50 +07:00
823fb0f239 bump version 2023-10-18 14:59:33 +07:00
Ren Amamiya
3660db4887 Merge pull request #94 from luminous-devs/feat/v2
v2.0.0
2023-10-18 14:55:05 +07:00
b18ae56c36 Merge branch 'main' into feat/v2 2023-10-18 14:53:11 +07:00
939a72f945 ok fine 2023-10-18 14:49:20 +07:00
489ab6bd0b wip: polish 2023-10-18 08:43:31 +07:00
7fa1e89dc8 wip: complete new onboarding 2023-10-17 16:33:41 +07:00
3aa4f294f9 wip: new onboarding 2023-10-16 14:42:19 +07:00
cd3b9ada5a wip: new import account 2023-10-15 16:10:16 +07:00
620e763380 wip: new onboarding 2023-10-14 15:19:49 +07:00
0777c483e5 wip: fix ui for macos 2023-10-13 09:12:30 +07:00
893663561d wip: fix light mode 2023-10-13 08:35:07 +07:00
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
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 Amamiya
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 Amamiya
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
Ren Amamiya
69a3e85cb3 small updates and bump version 2023-09-05 17:25:00 +07:00
Ren Amamiya
224439f62b support drag and drop upload in composer 2023-09-05 13:07:21 +07:00
Ren Amamiya
2389ad5fdc replace void.cat with nostr.build 2023-09-05 12:46:00 +07:00
Ren Amamiya
4019623d99 small updates 2023-09-05 08:50:13 +07:00
Ren Amamiya
57c17ffbf9 use nostr.com to display unfound event 2023-09-04 18:09:41 +07:00
Ren Amamiya
98d2ccfc86 small fixes 2023-09-04 17:18:28 +07:00
Ren Amamiya
c74a81cfdb re-add link preview 2023-09-04 14:35:57 +07:00
Ren Amamiya
3ebcf4a981 new parser, faster than before 50% 2023-09-04 14:05:04 +07:00
Ren Amamiya
5d45027776 fix build issue 2023-09-04 07:44:57 +07:00
Ren Amamiya
21ea8309c7 fix ci (final) 2023-09-03 12:02:59 +07:00
Ren Amamiya
431331174a fix ci again 2023-09-03 11:30:45 +07:00
Ren Amamiya
c26cfc038d fix ci 2023-09-03 11:08:13 +07:00
Ren Amamiya
39b7b34bb7 new mention popup in composer 2023-09-03 08:43:08 +07:00
Ren Amamiya
a4cf65e7c2 update ui consistent for cross platform 2023-09-03 07:43:38 +07:00
Ren Amamiya
37668393f1 expt: disable note metadata 2023-09-02 17:28:05 +07:00
Ren Amamiya
4309f734b6 Merge pull request #80 from luminous-devs/revert-to-tauri-v1
Revert to Tauri v1.4.0
2023-09-02 12:49:51 +07:00
Ren Amamiya
b4957bae1f native fetch and shadow 2023-09-02 12:49:04 +07:00
Ren Amamiya
7a3b19bf7b revert to tauri v1 2023-09-02 12:15:48 +07:00
Ren Amamiya
1931373515 update composer 2023-09-02 08:50:54 +07:00
Ren Amamiya
28939d1733 improve hashtag parser 2023-09-01 18:26:22 +07:00
Ren Amamiya
e6d35bc635 fix mention in composer and improve error handling 2023-09-01 15:57:31 +07:00
Ren Amamiya
cc315a190a fully support nip05 2023-09-01 08:58:33 +07:00
Ren Amamiya
0d207d471c fix nip94 widget 2023-08-31 09:04:09 +07:00
Ren Amamiya
f2eb7a90ad update settings screen 2023-08-31 08:51:23 +07:00
Ren Amamiya
c29ed9669e bump version 2023-08-30 16:23:38 +07:00
Ren Amamiya
aced6077bd refactor widget 2023-08-30 16:21:42 +07:00
Ren Amamiya
abe4d11498 clean up & polish 2023-08-30 09:03:02 +07:00
Ren Amamiya
91e50efb1a yup, lume is very solid now 2023-08-29 16:11:17 +07:00
Ren Amamiya
2914c54a47 Merge pull request #78 from luminous-devs/wip/ui
Update for UI consistent
2023-08-29 12:15:19 +07:00
Ren Amamiya
d1701eff20 add focus button to note actionbar 2023-08-29 12:14:45 +07:00
Ren Amamiya
d4eb237e40 expandable composer 2023-08-29 11:13:36 +07:00
Ren Amamiya
f4b2458417 ui consistent 2023-08-29 08:24:18 +07:00
Ren Amamiya
c89e7e48ee wip: cross platform ui 2023-08-28 16:00:11 +07:00
Ren Amamiya
5a3207f878 tauri config per platform 2023-08-28 12:19:40 +07:00
Ren Amamiya
3d4afb40bc temporary using custom tauri build 2023-08-28 10:39:18 +07:00
Ren Amamiya
bf91187c1f update notification screen 2023-08-27 14:46:48 +07:00
Ren Amamiya
963328e064 update notification screen 2023-08-27 10:38:32 +07:00
Ren Amamiya
53227c7050 clean up & update edit profile modal 2023-08-27 08:19:42 +07:00
Ren Amamiya
fe28cd95bd clean up & small fixes 2023-08-26 14:52:02 +07:00
Ren Amamiya
0f212828a7 update note replies component 2023-08-26 10:54:06 +07:00
Ren Amamiya
bfb7d7915f update single note screen 2023-08-26 09:45:39 +07:00
Ren Amamiya
92d49c306b update user screen 2023-08-25 09:50:04 +07:00
Ren Amamiya
b2df8ae320 update widgets 2023-08-24 16:44:55 +07:00
Ren Amamiya
98687bd78b fix small issues 2023-08-24 15:23:54 +07:00
Ren Amamiya
970115d059 update message form 2023-08-24 11:20:27 +07:00
Ren Amamiya
4893ebd932 re-enable nip-04 with more polish, prepare for nip-44 2023-08-24 09:05:34 +07:00
Ren Amamiya
3455eb701f rename some files and add nip 94 widget 2023-08-23 15:18:59 +07:00
Ren Amamiya
c97c685149 refactor note component & add support for kind 30023 2023-08-23 09:48:22 +07:00
Ren Amamiya
0912948b31 add notifications screen 2023-08-22 16:34:47 +07:00
Ren Amamiya
4830f0b236 update space screen 2023-08-22 09:10:04 +07:00
Ren Amamiya
917e49b25d Merge pull request #75 from luminous-devs/wip/optimize
[WIP]: Refactor DB and optimize codebase
2023-08-20 15:59:36 +07:00
Ren Amamiya
fe8c2fd2c6 update depedencies 2023-08-20 15:59:07 +07:00
Ren Amamiya
c4a7ef8867 update space screen 2023-08-20 15:55:31 +07:00
Ren Amamiya
bac70b19ec polish 2023-08-19 15:27:10 +07:00
Ren Amamiya
08e3a66ece update default avatar 2023-08-19 11:18:27 +07:00
Ren Amamiya
eda18f8c34 fix some errors cause app crash 2023-08-19 08:56:19 +07:00
Ren Amamiya
c85502e427 small fixes 2023-08-18 17:42:25 +07:00
Ren Amamiya
5626579b3f wip: refactor 2023-08-18 07:37:11 +07:00
Ren Amamiya
414dd50a5c wip: refactor 2023-08-17 15:11:40 +07:00
Ren Amamiya
ab61bfb2cd wip: clean up & refactor 2023-08-16 20:52:09 +07:00
Ren Amamiya
c05bb54976 wip: refactor 2023-08-16 11:43:04 +07:00
Ren Amamiya
2d53019c10 wip: refactor 2023-08-15 21:13:58 +07:00
Ren Amamiya
6e28bcdb96 wip: use new storage layer 2023-08-15 08:29:04 +07:00
Ren Amamiya
adca37223c refactor storage layer 2023-08-14 18:15:58 +07:00
Ren Amamiya
823b203b73 update useNostr hook 2023-08-14 14:12:54 +07:00
Ren Amamiya
6c6f50444e polish splash screen 2023-08-14 09:34:38 +07:00
Ren Amamiya
c42c78fc98 clean up and refactor open graph 2023-08-14 09:03:58 +07:00
Ren Amamiya
33fd7512e7 update zap modal to match new ui 2023-08-13 15:30:33 +07:00
Ren Amamiya
3b02b3f554 update build config for linux 2023-08-13 14:31:10 +07:00
Ren Amamiya
a02577bb55 fix build errors again 2023-08-13 12:28:10 +07:00
Ren Amamiya
f8753eca90 fix build errors 2023-08-13 12:03:00 +07:00
Ren Amamiya
4a0f2c9a67 fix z-index issue 2023-08-13 09:07:59 +07:00
Ren Amamiya
9e5f15e9d5 small updates 2023-08-12 15:43:50 +07:00
Ren Amamiya
bb089bb259 polish 2023-08-12 11:18:10 +07:00
Ren Amamiya
36b2acba6a rename blocks to widgets 2023-08-11 15:25:33 +07:00
Ren Amamiya
0cfc3a48d8 update splash screen 2023-08-11 11:55:31 +07:00
Ren Amamiya
f2fc41018d update settings screen 2023-08-10 17:18:53 +07:00
Ren Amamiya
8024c09642 fixes 2023-08-10 17:03:50 +07:00
Ren Amamiya
e6d8f084ae clean up & save onboarding process as state 2023-08-10 12:34:11 +07:00
Ren Amamiya
d63690e9d0 small updates and bump version 2023-08-09 19:04:32 +07:00
Ren Amamiya
edf56bc97b fix bugs 2023-08-09 13:17:07 +07:00
Ren Amamiya
d1d0a462f4 support nip94 and fix some bugs 2023-08-09 09:04:16 +07:00
Ren Amamiya
e6c6793f6e wip: add relay discover to onboarding 2023-08-08 18:52:46 +07:00
Ren Amamiya
9c7b58ee99 wip: new onboarding process 2023-08-07 15:09:04 +07:00
Ren Amamiya
ed759086c9 Merge pull request #66 from luminous-devs/v1.2.0
prepare for v1.2.0
2023-08-07 09:08:56 +07:00
Ren Amamiya
aa2a9851c3 small fixes 2023-08-07 09:07:53 +07:00
Ren Amamiya
02ff9e3b68 polish 2023-08-06 15:11:58 +07:00
Ren Amamiya
71338b3b07 wip: network 2023-08-06 07:59:43 +07:00
Ren Amamiya
373a0f0608 add network to account 2023-08-04 15:38:38 +07:00
Ren Amamiya
4c7826bbb3 add more actions to note 2023-08-04 11:09:32 +07:00
Ren Amamiya
ac50cd1373 polish 2023-08-04 08:51:26 +07:00
Ren Amamiya
2e47415160 update trending screen and add tauri shell plugin 2023-08-03 16:12:27 +07:00
Ren Amamiya
3432005ade polish 2023-08-03 15:17:28 +07:00
Ren Amamiya
d10462cd4a wip: update chats to new ui 2023-08-03 14:09:12 +07:00
Ren Amamiya
ae1e84655a polish 2023-08-03 08:56:36 +07:00
Ren Amamiya
babcd8698e wip: port more component to new ui 2023-08-02 14:48:51 +07:00
Ren Amamiya
a85bcf917b wip: convert more components to new ui 2023-08-02 08:28:43 +07:00
Ren Amamiya
1ddcbf1654 wip: new ui 2023-08-01 15:34:09 +07:00
Ren Amamiya
e97d0281e2 redesign sidebar 2023-08-01 14:26:16 +07:00
Ren Amamiya
9941305998 fix ndk cache 2023-08-01 07:53:58 +07:00
Ren Amamiya
a898e3013f updated 2023-07-30 21:11:44 +07:00
Ren Amamiya
c80d554630 add ndk cache 2023-07-30 08:13:24 +07:00
Ren Amamiya
996ba3f82d add tauri controls 2023-07-29 15:42:44 +07:00
Ren Amamiya
aca17f104e fully support tauri v2 2023-07-29 09:28:15 +07:00
Ren Amamiya
a1a5544789 upgrade to tauri v2 2023-07-29 08:13:53 +07:00
Ren Amamiya
a17efcf4d3 update deps 2023-07-29 07:26:51 +07:00
Ren Amamiya
15514887a4 bump version 2023-07-27 09:25:47 +07:00
Ren Amamiya
343e1a12d6 v1.1.1 2023-07-27 09:02:04 +07:00
Ren Amamiya
f52ea04541 polish 2023-07-26 09:26:40 +07:00
Ren Amamiya
89dd4f5c9d fix small issues 2023-07-26 08:25:08 +07:00
Ren Amamiya
e30ca0ff82 add hashtag support in composer 2023-07-25 17:45:32 +07:00
Ren Amamiya
8d761caf3e add hashtag block modal 2023-07-25 17:06:18 +07:00
Ren Amamiya
a4e03a59eb add unknown chats modal 2023-07-25 16:12:52 +07:00
Ren Amamiya
1362dfadda update urls and user page 2023-07-25 13:25:14 +07:00
Ren Amamiya
7a245cd375 update icons 2023-07-25 10:39:32 +07:00
Ren Amamiya
a1b93cdb72 polish 2023-07-25 08:09:26 +07:00
Ren Amamiya
d30be10568 fix zap 2023-07-24 10:12:39 +07:00
Ren Amamiya
515fda5e97 wip: zap (done) 2023-07-24 09:30:57 +07:00
Ren Amamiya
22a678ec08 wip: zap 2023-07-23 21:39:04 +07:00
Ren Amamiya
71c4f3db22 add download button to image 2023-07-23 17:27:51 +07:00
Ren Amamiya
13ca8a2c54 update notification 2023-07-23 15:54:34 +07:00
Ren Amamiya
f0fb1bee1e minor updates 2023-07-23 09:16:29 +07:00
Ren Amamiya
b66e11433f Merge pull request #58 from luminous-devs/v1.1.0
prepare v1.1.0
2023-07-22 17:35:37 +07:00
Ren Amamiya
6d20f84489 fix small errors 2023-07-22 17:35:04 +07:00
Ren Amamiya
20a8ce9cba update composer with image upload 2023-07-22 15:32:34 +07:00
Ren Amamiya
17d2a8cb56 add mention to composer 2023-07-21 18:07:17 +07:00
Ren Amamiya
64cd17389d wip: tiptap editor 2023-07-21 16:16:41 +07:00
Ren Amamiya
8f4cf7e948 fix errors 2023-07-20 17:14:32 +07:00
Ren Amamiya
bbfdb139c6 update stronghold 2023-07-20 08:57:58 +07:00
Ren Amamiya
a80477b40e update useProfile hook 2023-07-19 17:37:10 +07:00
Ren Amamiya
29d40ed406 render reply and sub reply accordingly 2023-07-19 17:07:25 +07:00
Ren Amamiya
22c1eaa541 add useBlock hook 2023-07-19 12:47:45 +07:00
Ren Amamiya
6307e8d1e4 add download keys button to onboarding process 2023-07-19 07:57:25 +07:00
Ren Amamiya
12bfa2fca1 clean up database and update depedencies 2023-07-18 14:37:03 +07:00
Ren Amamiya
100204b267 add user block 2023-07-17 17:00:01 +07:00
Ren Amamiya
7d38fa5d85 update depedencies 2023-07-17 15:21:56 +07:00
Ren Amamiya
5606dcb32f update replies 2023-07-17 13:37:01 +07:00
Ren Amamiya
b3b790588a add hashtag block 2023-07-17 08:54:17 +07:00
Ren Amamiya
4f41022b30 update 2023-07-17 07:51:00 +07:00
Ren Amamiya
9a09a04a5d add strangers section to chats sidebar 2023-07-16 18:25:58 +07:00
Ren Amamiya
5ce9fa515a add reaction 2023-07-16 15:46:01 +07:00
Ren Amamiya
abc53a0d9a update note actions component 2023-07-16 14:24:19 +07:00
Ren Amamiya
e0a14ce6cf update markdown 2023-07-15 21:01:27 +07:00
Ren Amamiya
f154d8f5f4 use markdown 2023-07-15 16:03:31 +07:00
Ren Amamiya
1f18d8bb44 refactor note component 2023-07-15 12:20:09 +07:00
Ren Amamiya
41460436df add nostr-fetch 2023-07-11 14:27:14 +07:00
Ren Amamiya
339783a1a4 update set password flow 2023-07-10 17:16:43 +07:00
Ren Amamiya
c664b3e4a4 update gh action and fix migrate page 2023-07-10 15:30:15 +07:00
412 changed files with 35207 additions and 20320 deletions

View File

@@ -1,49 +0,0 @@
module.exports = {
root: true,
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
ecmaFeatures: {
jsx: true,
},
},
settings: {
react: {
version: 'detect',
},
'import/resolver': {
node: {
paths: ['src'],
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
},
},
env: {
browser: true,
amd: true,
node: true,
},
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:react/recommended',
'plugin:jsx-a11y/recommended',
'prettier'
],
plugins: [],
rules: {
'react/react-in-jsx-scope': 'off',
'jsx-a11y/accessible-emoji': 'off',
'react/prop-types': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'jsx-a11y/anchor-is-valid': [
'error',
{
components: ['Link'],
specialLink: ['hrefLeft', 'hrefRight'],
aspects: ['invalidHref', 'preferButton'],
},
],
},
};

View File

@@ -1,77 +1,71 @@
name: 'publish'
on:
push:
branches:
- release
name: "Publish"
on: workflow_dispatch
env:
CARGO_INCREMENTAL: 0
RUST_BACKTRACE: short
RUSTFLAGS: '-W unreachable-pub -W rust-2021-compatibility'
RUSTFLAGS: "-W unreachable-pub -W rust-2021-compatibility"
jobs:
publish-tauri:
strategy:
fail-fast: false
matrix:
settings:
- platform: 'macos-latest'
args: '--target universal-apple-darwin'
- platform: 'macos-latest'
args: '--target x86_64-apple-darwin'
- platform: 'macos-latest'
args: '--target aarch64-apple-darwin'
- platform: 'ubuntu-20.04'
args: ''
include:
- platform: "macos-latest" # for Arm based macs (M1 and above).
args: "--target aarch64-apple-darwin"
- platform: "macos-latest" # for Intel based macs.
args: "--target x86_64-apple-darwin"
- platform: "macos-latest" # for Intel & Arm based macs.
args: "--target universal-apple-darwin"
- platform: 'windows-latest'
args: '--target x86_64-pc-windows-msvc'
- platform: 'windows-latest'
args: '--target i686-pc-windows-msvc'
runs-on: ${{ matrix.settings.platform }}
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v3
- name: setup node
uses: actions/setup-node@v3
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 18
- uses: dtolnay/rust-toolchain@stable
with:
targets: aarch64-apple-darwin
- name: install dependencies (ubuntu only)
if: matrix.settings.platform == 'ubuntu-20.04'
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf
- name: Install pnpm
node-version: "lts/*"
- name: Install PNPM
uses: pnpm/action-setup@v2
with:
version: 7.x.x
version: 8.x.x
run_install: false
- name: Setup node and cache for package data
uses: actions/setup-node@v3
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
node-version: 'lts/*'
cache: 'pnpm'
cache-dependency-path: pnpm-lock.yaml
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- run: pnpm install
targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}
- name: Install dependencies (ubuntu only)
if: matrix.platform == 'ubuntu-22.04'
run: |
sudo apt-get update
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 frontend dependencies
run: pnpm install
- uses: tauri-apps/tauri-action@dev
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
with:
tagName: v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version
releaseName: 'App v__VERSION__'
releaseBody: 'See the assets to download this version and install.'
tagName: v__VERSION__
releaseName: "v__VERSION__"
releaseBody: "See the assets to download this version and install."
releaseDraft: true
prerelease: false
args: ${{ matrix.settings.args }}
args: ${{ matrix.args }}
includeDebug: false

10
.gitignore vendored
View File

@@ -10,13 +10,7 @@ lerna-debug.log*
node_modules
dist
dist-ssr
out
*.local
.next
.vscode
pnpm-lock.yaml
*.db
*.db-journal
# Editor directories and files
.vscode/*
@@ -28,4 +22,6 @@ pnpm-lock.yaml
*.njsproj
*.sln
*.sw?
/.gtm/
src/routes.gen.ts
src/commands.gen.ts

View File

@@ -1,4 +0,0 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
pnpm exec lint-staged

View File

@@ -1,9 +0,0 @@
.tmp
.cache/
coverage/
.nyc_output/
**/.yarn/**
**/.pnp.*
/dist*/
node_modules/
src-tauri/

View File

@@ -1,22 +0,0 @@
{
"semi": true,
"trailingComma": "es5",
"singleQuote": true,
"tabWidth": 2,
"printWidth": 90,
"useTabs": false,
"bracketSpacing": true,
"bracketSameLine": false,
"importOrder": [
"^@app/(.*)$",
"^@libs/(.*)$",
"^@shared/(.*)$",
"^@stores/(.*)$",
"^@utils/(.*)$",
"^[./]"
],
"importOrderSeparation": true,
"importOrderSortSpecifiers": true,
"plugins": ["@trivago/prettier-plugin-sort-imports", "prettier-plugin-tailwindcss"],
"pluginSearchDirs": false
}

View File

@@ -1,19 +1,31 @@
### Introduction
## Introduction
Lume is a nostr client
Lume is a Nostr client for desktop include Linux, Windows and macOS. It is free and open source, you can look at source code on Github. Lume is actively improving the app and adding new features, you can expect new update every month.
### Usage
## Usage
Download Lume for your platform here: [https://github.com/luminous-devs/lume/releases](https://github.com/luminous-devs/lume/releases)
Download Lume v4 for your platform here: [https://github.com/lumehq/lume/releases](https://github.com/lumehq/lume/releases)
Supported platform: macOS, Windows and Linux
Supported platform: macOS. Windows and Linux are coming soon.
### Develop
Windows and Linux are availabel on v3 and below.
## Prerequisites
- Node.js >= 18: https://nodejs.org/en
- Rust: https://rustup.rs/
- PNPM: https://pnpm.io
- Tauri v2: https://beta.tauri.app/guides/prerequisites/
## Develop
Clone project
```
git clone https://github.com/luminous-devs/lume.git && cd lume
git clone https://github.com/lumehq/lume.git && cd lume
```
Install packages
@@ -22,20 +34,33 @@ Install packages
pnpm install
```
Run dev
Run dev build
```
pnpm tauri dev
```
Build
Generate production build
```
pnpm tauri build
```
(Advance) - Generate SQLite migration
## Nix
```
pnpm add-migrate <migrate_name>
```
Requirements:
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.
## License
Copyright (C) 2023-2024 Ren Amamiya & other Lume contributors (see AUTHORS.md)
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.

31
biome.json Normal file
View File

@@ -0,0 +1,31 @@
{
"$schema": "https://biomejs.dev/schemas/1.4.1/schema.json",
"organizeImports": {
"enabled": true
},
"files": {
"ignore": [
"./src/routes.gen.ts",
"./src/commands.gen.ts"
]
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"style": {
"noNonNullAssertion": "warn",
"noUselessElse": "off"
},
"correctness": {
"useExhaustiveDependencies": "off"
},
"a11y": {
"noSvgWithoutTitle": "off"
},
"complexity": {
"noStaticOnlyClass": "off"
}
}
}
}

View File

@@ -1,11 +1,14 @@
<html lang="en" class="dark">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Lume</title>
</head>
<body class="cursor-default select-none overflow-hidden font-sans antialiased h-screen w-screen dark:bg-black dark:text-zinc-100">
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Lume Desktop</title>
</head>
<body
class="relative h-screen w-screen cursor-default select-none overflow-hidden font-sans text-black antialiased dark:text-white"
>
<div id="root" class="h-full w-full"></div>
<script type="module" src="/src/app.tsx"></script>
</body>
</html>

View File

@@ -1,84 +1,87 @@
{
"name": "lume",
"private": true,
"version": "1.0.1",
"scripts": {
"dev": "vite",
"build": "vite build",
"tauri": "tauri",
"add-migrate": "cd src-tauri/ && sqlx migrate add",
"prepare": "husky install",
"lint": "eslint ./src --fix",
"format": "prettier ./src --write"
},
"lint-staged": {
"**/*.{ts, tsx}": "eslint --fix",
"**/*.{ts, tsx, css, md, html, json}": "prettier --cache --write"
},
"dependencies": {
"@headlessui/react": "^1.7.15",
"@nostr-dev-kit/ndk": "^0.7.5",
"@radix-ui/react-popover": "^1.0.6",
"@radix-ui/react-tooltip": "^1.0.6",
"@tanstack/react-query": "^4.29.19",
"@tanstack/react-query-devtools": "^4.29.19",
"@tanstack/react-virtual": "3.0.0-beta.54",
"@tauri-apps/api": "^1.4.0",
"cheerio": "1.0.0-rc.12",
"dayjs": "^1.11.9",
"destr": "^1.2.2",
"framer-motion": "^10.12.18",
"get-urls": "^11.0.0",
"immer": "^10.0.2",
"light-bolt11-decoder": "^3.0.0",
"nostr-tools": "^1.12.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-hook-form": "^7.45.1",
"react-hotkeys-hook": "^4.4.1",
"react-player": "^2.12.0",
"react-router-dom": "^6.14.1",
"react-string-replace": "^1.1.1",
"react-virtuoso": "^4.3.11",
"slate": "^0.94.1",
"slate-history": "^0.93.0",
"slate-react": "^0.94.2",
"tailwind-merge": "^1.13.2",
"tauri-plugin-autostart-api": "github:tauri-apps/tauri-plugin-autostart#v1",
"tauri-plugin-sql-api": "github:tauri-apps/tauri-plugin-sql",
"tauri-plugin-stronghold-api": "github:tauri-apps/tauri-plugin-stronghold#v1",
"zustand": "^4.3.9"
},
"devDependencies": {
"@tailwindcss/typography": "^0.5.9",
"@tauri-apps/cli": "^1.4.0",
"@trivago/prettier-plugin-sort-imports": "^4.1.1",
"@types/node": "^18.16.19",
"@types/react": "^18.2.14",
"@types/react-dom": "^18.2.6",
"@types/youtube-player": "^5.5.7",
"@typescript-eslint/eslint-plugin": "^5.61.0",
"@typescript-eslint/parser": "^5.61.0",
"@vitejs/plugin-react-swc": "^3.3.2",
"autoprefixer": "^10.4.14",
"cross-env": "^7.0.3",
"csstype": "^3.1.2",
"encoding": "^0.1.13",
"eslint": "^8.44.0",
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-jsx-a11y": "^6.7.1",
"eslint-plugin-react": "^7.32.2",
"eslint-plugin-simple-import-sort": "^10.0.0",
"husky": "^8.0.3",
"lint-staged": "^13.2.3",
"postcss": "^8.4.25",
"prettier": "^2.8.8",
"prettier-plugin-tailwindcss": "^0.3.0",
"prop-types": "^15.8.1",
"tailwindcss": "^3.3.2",
"typescript": "^4.9.5",
"vite": "^4.4.2",
"vite-plugin-top-level-await": "^1.3.1",
"vite-tsconfig-paths": "^4.2.0"
}
"name": "lume",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"tauri": "tauri"
},
"dependencies": {
"@getalby/bitcoin-connect-react": "^3.6.2",
"@phosphor-icons/react": "^2.1.7",
"@radix-ui/react-avatar": "^1.1.1",
"@radix-ui/react-checkbox": "^1.1.2",
"@radix-ui/react-popover": "^1.1.2",
"@radix-ui/react-scroll-area": "^1.2.0",
"@radix-ui/react-switch": "^1.1.1",
"@radix-ui/react-tabs": "^1.1.1",
"@radix-ui/react-tooltip": "^1.1.3",
"@tanstack/query-persist-client-core": "^5.59.0",
"@tanstack/react-query": "^5.59.0",
"@tanstack/react-router": "^1.58.16",
"@tanstack/react-store": "^0.5.5",
"@tanstack/store": "^0.5.5",
"@tauri-apps/api": "^2.0.1",
"@tauri-apps/plugin-clipboard-manager": "^2.0.0",
"@tauri-apps/plugin-dialog": "^2.0.0",
"@tauri-apps/plugin-fs": "^2.0.0",
"@tauri-apps/plugin-http": "^2.0.0",
"@tauri-apps/plugin-os": "^2.0.0",
"@tauri-apps/plugin-process": "^2.0.0",
"@tauri-apps/plugin-shell": "^2.0.0",
"@tauri-apps/plugin-store": "^2.0.0",
"@tauri-apps/plugin-updater": "^2.0.0",
"@tauri-apps/plugin-upload": "^2.0.0",
"@tauri-apps/plugin-window-state": "^2.0.0",
"bitcoin-units": "^1.0.0",
"boring-avatars": "^1.11.2",
"dayjs": "^1.11.13",
"embla-carousel-react": "^8.3.0",
"i18next": "^23.15.1",
"i18next-resources-to-backend": "^1.2.1",
"light-bolt11-decoder": "^3.2.0",
"minidenticons": "^4.2.1",
"nanoid": "^5.0.7",
"nostr-tools": "^2.7.2",
"react": "19.0.0-rc-d025ddd3-20240722",
"react-currency-input-field": "^3.8.0",
"react-dom": "19.0.0-rc-d025ddd3-20240722",
"react-hook-form": "^7.53.0",
"react-i18next": "^15.0.2",
"react-string-replace": "^1.1.1",
"rich-textarea": "^0.26.3",
"use-debounce": "^10.0.3",
"virtua": "^0.34.2"
},
"devDependencies": {
"@biomejs/biome": "^1.9.3",
"@evilmartians/harmony": "^1.2.0",
"@tailwindcss/forms": "^0.5.9",
"@tailwindcss/typography": "^0.5.15",
"@tanstack/router-devtools": "^1.58.16",
"@tanstack/router-plugin": "^1.58.12",
"@tauri-apps/cli": "^2.0.0",
"@types/react": "npm:types-react@19.0.0-rc.1",
"@types/react-dom": "npm:types-react-dom@19.0.0-rc.1",
"@vitejs/plugin-react": "^4.3.2",
"autoprefixer": "^10.4.20",
"babel-plugin-react-compiler": "0.0.0-experimental-b4db8c3-20241001",
"clsx": "^2.1.1",
"postcss": "^8.4.47",
"tailwind-gradient-mask-image": "^1.2.0",
"tailwind-merge": "^2.5.2",
"tailwind-scrollbar": "^3.1.0",
"tailwindcss": "^3.4.13",
"tailwindcss-content-visibility": "^1.0.0",
"typescript": "^5.6.2",
"vite": "^5.4.8",
"vite-tsconfig-paths": "^5.0.1"
},
"overrides": {
"@types/react": "npm:types-react@rc",
"@types/react-dom": "npm:types-react-dom@rc"
}
}

8878
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

0
public/.keep Normal file
View File

BIN
public/404.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
public/nosta.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

3
public/nsec_app.svg Normal file
View File

@@ -0,0 +1,3 @@
<svg width="32" height="36" viewBox="0 0 32 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M28.2711 21.2958C27.1084 21.2958 26.0749 21.8372 25.4037 22.6797L21.8702 20.6405C22.2577 19.8106 22.4755 18.8846 22.4755 17.908C22.4755 16.9314 22.2577 16.0053 21.8702 15.1755L25.3404 13.1742C26.0091 14.0648 27.0704 14.6442 28.2711 14.6442C30.2949 14.6442 31.9363 13.0047 31.9363 10.9831C31.9363 8.96158 30.2949 7.32208 28.2711 7.32208C26.2472 7.32208 24.6058 8.96158 24.6058 10.9831C24.6058 11.4006 24.6793 11.8003 24.8084 12.1748L21.3028 14.1963C20.2338 12.6732 18.5241 11.6333 16.5635 11.4638V7.274C18.3189 7.00076 19.6639 5.49029 19.6639 3.66104C19.6639 1.6395 18.0225 0 15.9987 0C13.9748 0 12.3334 1.6395 12.3334 3.66104C12.3334 5.49029 13.6784 7.00329 15.4338 7.274V11.4638C13.4733 11.6333 11.7635 12.6732 10.6946 14.1963L7.1889 12.1748C7.31808 11.8003 7.39154 11.4006 7.39154 10.9831C7.39154 8.96158 5.75015 7.32208 3.72629 7.32208C1.70242 7.32208 0.0610352 8.96158 0.0610352 10.9831C0.0610352 13.0047 1.70242 14.6442 3.72629 14.6442C4.92693 14.6442 5.98825 14.0648 6.65697 13.1742L10.1272 15.1755C9.73963 16.0053 9.52179 16.9314 9.52179 17.908C9.52179 18.8846 9.73963 19.8106 10.1272 20.643L6.59364 22.6822C5.9224 21.8397 4.88893 21.2983 3.72629 21.2983C1.70242 21.2983 0.0610352 22.9378 0.0610352 24.9593C0.0610352 26.9809 1.70242 28.6204 3.72629 28.6204C5.75015 28.6204 7.39154 26.9809 7.39154 24.9593C7.39154 24.5039 7.30542 24.0687 7.1509 23.6639L10.6946 21.6196C11.3329 22.5279 12.1992 23.2667 13.2098 23.7499V32.3497C13.2098 32.9721 13.5569 33.8551 13.9799 34.3131L15.2286 35.6565C15.6516 36.1145 16.3457 36.1145 16.7712 35.6565L18.02 34.3131C18.443 33.8551 18.79 32.9721 18.79 32.3497V23.7499C19.8007 23.2667 20.667 22.5304 21.3053 21.6196L24.849 23.6639C24.697 24.0662 24.6083 24.5014 24.6083 24.9593C24.6083 26.9809 26.2497 28.6204 28.2736 28.6204C30.2975 28.6204 31.9388 26.9809 31.9388 24.9593C31.9388 22.9378 30.2975 21.2983 28.2736 21.2983L28.2711 21.2958Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
public/poster_1.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

BIN
public/poster_2.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

BIN
public/poster_3.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

BIN
public/poster_4.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

View File

@@ -1,3 +1,10 @@
# Generated by Cargo
# will have compiled files and executables
/target/
# Generated by Tauri
# will have schema files for capabilities auto-completion
/gen/schemas
# Config
.cargo

View File

@@ -1 +0,0 @@
tab_spaces=2

6176
src-tauri/Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,51 +1,71 @@
[package]
name = "lume"
version = "1.0.1"
name = "Lume"
version = "4.0.0"
description = "nostr client"
authors = ["Ren Amamiya"]
license = ""
repository = ""
authors = ["npub1zfss807aer0j26mwp2la0ume0jqde3823rmu97ra6sgyyg956e0s6xw445"]
repository = "https://github.com/lumehq/lume"
edition = "2021"
rust-version = "1.57"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
rust-version = "1.70"
[build-dependencies]
tauri-build = { version = "1.2", features = [] }
tauri-build = { version = "2.0.0", features = [] }
[dependencies]
tauri = { version = "2.0.0", features = [
"unstable",
"tray-icon",
"macos-private-api",
"protocol-asset",
] }
tauri-plugin-window-state = "2.0.0"
tauri-plugin-clipboard-manager = "2.0.0"
tauri-plugin-dialog = "2.0.0"
tauri-plugin-fs = "2.0.0"
tauri-plugin-http = "2.0.0"
tauri-plugin-notification = "2.0.0"
tauri-plugin-os = "2.0.0"
tauri-plugin-process = "2.0.0"
tauri-plugin-shell = "2.0.0"
tauri-plugin-updater = "2.0.0"
tauri-plugin-upload = "2.0.0"
tauri-plugin-store = "2.0.0"
tauri-plugin-decorum = { git = "https://github.com/clearlysid/tauri-plugin-decorum.git" }
tauri-plugin-prevent-default = "0.6"
tauri-specta = { version = "2.0.0-rc.15", features = ["derive", "typescript"] }
nostr-sdk = { git = "https://github.com/rust-nostr/nostr", features = ["lmdb"] }
nostr-relay-builder = { git = "https://github.com/rust-nostr/nostr" }
specta = "^2.0.0-rc.20"
specta-typescript = "0.0.7"
tokio = { version = "1", features = ["full"] }
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
tauri = { version = "1.2", features = [ "path-all", "fs-read-dir", "fs-read-file", "clipboard-read-text", "clipboard-write-text", "dialog-open", "http-all", "http-multipart", "notification-all", "os-all", "process-relaunch", "shell-open", "system-tray", "updater", "window-close", "window-start-dragging"] }
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" }
sqlx-cli = {version = "0.7.0", default-features = false, features = ["sqlite"] }
rust-argon2 = "1.0"
rand = "0.8.5"
[dependencies.tauri-plugin-sql]
git = "https://github.com/tauri-apps/plugins-workspace"
branch = "v1"
features = ["sqlite"]
reqwest = "0.12.4"
url = "2.5.0"
futures = "0.3.30"
linkify = "0.10.0"
regex = "1.10.4"
keyring = { version = "3", features = ["apple-native", "windows-native"] }
keyring-search = "1.2.0"
tracing-subscriber = "0.3.18"
[target.'cfg(target_os = "macos")'.dependencies]
cocoa = "0.25.0"
objc = "0.2.7"
cocoa = "0.24.1"
rand = "0.8.5"
monitor = { git = "https://github.com/ahkohd/tauri-toolkit", branch = "v2" }
tauri-nspanel = { git = "https://github.com/ahkohd/tauri-nspanel", branch = "v2" }
border = { git = "https://github.com/ahkohd/tauri-toolkit", branch = "v2" }
[features]
# by default Tauri runs in production mode
# 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"]
# Optimized for bundle size. If you want faster builds comment out/delete this section.
[profile.release]
lto = true # Enable Link Time Optimization
opt-level = "z" # Optimize for size.
codegen-units = 1 # Reduce number of codegen units to increase optimizations.
panic = "abort" # Abort on panic
strip = true # Automatically strip symbols from the binary.
codegen-units = 1
lto = true
panic = "abort"
incremental = false
opt-level = "z"
strip = true
rpath = false
debug = false
debug-assertions = false
overflow-checks = false

View File

@@ -0,0 +1,54 @@
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "column",
"description": "Capability for the column",
"platforms": [
"linux",
"macOS",
"windows"
],
"windows": [
"column-*"
],
"permissions": [
"core:resources:default",
"core:tray:default",
"os:allow-locale",
"os:allow-os-type",
"clipboard-manager:allow-write-text",
"dialog:allow-open",
"dialog:allow-ask",
"dialog:allow-message",
"fs:allow-read-file",
"core:menu:default",
"core:menu:allow-new",
"core:menu:allow-popup",
"http:default",
"shell:allow-open",
"store:allow-get",
"store:allow-set",
"store:allow-delete",
{
"identifier": "http:default",
"allow": [
{
"url": "http://**/"
},
{
"url": "https://**/"
}
]
},
{
"identifier": "fs:allow-read-text-file",
"allow": [
{
"path": "$RESOURCE/locales/*"
},
{
"path": "$RESOURCE/resources/*"
}
]
}
]
}

View File

@@ -0,0 +1,88 @@
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "window",
"description": "Capability for the desktop",
"platforms": [
"macOS",
"windows"
],
"windows": [
"main",
"panel",
"settings",
"search-*",
"zap-*",
"event-*",
"user-*",
"editor-*"
],
"permissions": [
"core:path:default",
"core:event:default",
"core:window:default",
"core:app:default",
"core:resources:default",
"core:menu:default",
"core:tray:default",
"notification:allow-is-permission-granted",
"notification:allow-request-permission",
"notification:default",
"os:allow-locale",
"os:allow-platform",
"os:allow-os-type",
"updater:default",
"updater:allow-check",
"updater:allow-download-and-install",
"core:window:allow-create",
"core:window:allow-close",
"core:window:allow-destroy",
"core:window:allow-set-focus",
"core:window:allow-center",
"core:window:allow-minimize",
"core:window:allow-maximize",
"core:window:allow-set-size",
"core:window:allow-start-dragging",
"core:window:allow-toggle-maximize",
"decorum:allow-show-snap-overlay",
"clipboard-manager:allow-write-text",
"clipboard-manager:allow-read-text",
"core:webview:allow-create-webview-window",
"core:webview:allow-create-webview",
"core:webview:allow-set-webview-size",
"core:webview:allow-set-webview-position",
"core:webview:allow-webview-close",
"dialog:allow-open",
"dialog:allow-ask",
"dialog:allow-message",
"process:allow-restart",
"process:allow-exit",
"fs:allow-read-file",
"core:menu:allow-new",
"core:menu:allow-popup",
"shell:allow-open",
"store:default",
"prevent-default:default",
{
"identifier": "http:default",
"allow": [
{
"url": "http://**/"
},
{
"url": "https://**/"
}
]
},
{
"identifier": "fs:allow-read-text-file",
"allow": [
{
"path": "$RESOURCE/locales/*"
},
{
"path": "$RESOURCE/resources/*"
}
]
}
]
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"column":{"identifier":"column","description":"Capability for the column","local":true,"windows":["column-*"],"permissions":["core:resources:default","core:tray:default","os:allow-locale","os:allow-os-type","clipboard-manager:allow-write-text","dialog:allow-open","dialog:allow-ask","dialog:allow-message","fs:allow-read-file","core:menu:default","core:menu:allow-new","core:menu:allow-popup","http:default","shell:allow-open","store:allow-get","store:allow-set","store:allow-delete",{"identifier":"http:default","allow":[{"url":"http://**/"},{"url":"https://**/"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"$RESOURCE/locales/*"},{"path":"$RESOURCE/resources/*"}]}],"platforms":["linux","macOS","windows"]},"window":{"identifier":"window","description":"Capability for the desktop","local":true,"windows":["main","panel","settings","search-*","zap-*","event-*","user-*","editor-*"],"permissions":["core:path:default","core:event:default","core:window:default","core:app:default","core:resources:default","core:menu:default","core:tray:default","notification:allow-is-permission-granted","notification:allow-request-permission","notification:default","os:allow-locale","os:allow-platform","os:allow-os-type","updater:default","updater:allow-check","updater:allow-download-and-install","core:window:allow-create","core:window:allow-close","core:window:allow-destroy","core:window:allow-set-focus","core:window:allow-center","core:window:allow-minimize","core:window:allow-maximize","core:window:allow-set-size","core:window:allow-start-dragging","core:window:allow-toggle-maximize","decorum:allow-show-snap-overlay","clipboard-manager:allow-write-text","clipboard-manager:allow-read-text","core:webview:allow-create-webview-window","core:webview:allow-create-webview","core:webview:allow-set-webview-size","core:webview:allow-set-webview-position","core:webview:allow-webview-close","dialog:allow-open","dialog:allow-ask","dialog:allow-message","process:allow-restart","process:allow-exit","fs:allow-read-file","core:menu:allow-new","core:menu:allow-popup","shell:allow-open","store:default","prevent-default:default",{"identifier":"http:default","allow":[{"url":"http://**/"},{"url":"https://**/"}]},{"identifier":"fs:allow-read-text-file","allow":[{"path":"$RESOURCE/locales/*"},{"path":"$RESOURCE/resources/*"}]}],"platforms":["macOS","windows"]}}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 447 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 984 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 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: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

295
src-tauri/locales/cn.json Normal file
View File

@@ -0,0 +1,295 @@
{
"global": {
"relay": "Relay",
"back": "Back",
"continue": "Continue",
"loading": "Loading",
"error": "Error",
"moveLeft": "Move Left",
"moveRight": "Move Right",
"newColumn": "New Column",
"inspect": "Inspect",
"loadMore": "Load more",
"delete": "Delete",
"refresh": "Refresh",
"cancel": "Cancel",
"save": "Save",
"post": "Post",
"update": "Update",
"noResult": "No results found.",
"emptyFeedTitle": "This feed is empty",
"emptyFeedSubtitle": "You can follow more users to build up your timeline",
"apiKey": "API Key",
"skip": "Skip",
"close": "Close"
},
"nip89": {
"unsupported": "Lume isn't support this event",
"openWith": "Open with"
},
"note": {
"showThread": "Show thread",
"showMore": "Show more",
"error": "Failed to fetch event.",
"posted": "posted",
"replied": "replied",
"reposted": "reposted",
"menu": {
"viewThread": "View thread",
"copyLink": "Copy shareable link",
"copyNoteId": "Copy note ID",
"copyAuthorId": "Copy author ID",
"viewAuthor": "View author",
"pinAuthor": "Pin author",
"copyRaw": "Copy raw event",
"mute": "Mute"
},
"buttons": {
"pin": "Pin",
"pinTooltip": "Pin Note",
"repost": "Repost",
"quote": "Quote",
"viewProfile": "View profile"
},
"zap": {
"zap": "Zap",
"tooltip": "Send zap",
"modalTitle": "Send zap to",
"messagePlaceholder": "Enter message (optional)",
"buttonFinish": "Zapped",
"buttonLoading": "Processing...",
"invoiceButton": "Scan to zap",
"invoiceFooter": "You must use Bitcoin wallet which support Lightning\nsuch as: Blue Wallet, Bitkit, Phoenix,..."
},
"reply": {
"single": "reply",
"plural": "replies",
"empty": "Be the first to Reply!"
}
},
"user": {
"avatar": "Avatar",
"displayName": "Display Name",
"name": "Name",
"bio": "Bio",
"lna": "Lightning address",
"website": "Website",
"verified": "Verified",
"unverified": "Unverified",
"follow": "Follow",
"unfollow": "Unfollow",
"latestPosts": "Latest posts",
"avatarButton": "Change avatar",
"coverButton": "Change cover",
"editProfile": "Edit profile",
"settings": "Settings",
"logout": "Log out",
"logoutConfirmTitle": "Are you sure!",
"logoutConfirmSubtitle": "You can always log back in at any time. If you just want to switch accounts, you can do that by adding an existing account."
},
"editor": {
"title": "New Post",
"placeholder": "What are you up to?",
"successMessage": "Your note has been published successfully.",
"replyPlaceholder": "Post your reply"
},
"search": {
"placeholder": "Type something to search...",
"empty": "Try searching for people, notes, or keywords"
},
"welcome": {
"title": "Lume is a magnificent client for Nostr to meet, explore\nand freely share your thoughts with everyone.",
"signup": "Join Nostr",
"login": "Login",
"footer": "Before joining Nostr, you can take time to learn more about Nostr"
},
"login": {
"title": "Welcome back, anon!",
"footer": "Lume will put your Private Key in Secure Storage depended on your OS Platform. It will be secured by Password or Biometric ID",
"loginWithAddress": "Login with Nostr Address",
"loginWithBunker": "Login with nsecBunker",
"or": "Or continue with",
"loginWithPrivkey": "Login with Private Key"
},
"loginWithAddress": {
"title": "Enter your Nostr Address"
},
"loginWithBunker": {
"title": "Enter your nsecbunker token"
},
"loginWithPrivkey": {
"title": "Enter your Private Key",
"subtitle": "Lume will put your private key to <1>{{service}}</1>.\nIt will be secured by your OS."
},
"signup": {
"title": "Let's Get Started",
"subtitle": "Choose one of methods below to create your account",
"selfManageMethod": "Self-Managed",
"selfManageMethodDescription": "You create your keys and keep them safe.",
"providerMethod": "Managed by Provider",
"providerMethodDescription": "A 3rd party provider will handle your sign in keys for you."
},
"signupWithSelfManage": {
"title": "This is your new Account Key",
"subtitle": "Keep your key in safe place. If you lose this key, you will lose access to your account.",
"confirm1": "I understand the risk of lost private key.",
"confirm2": "I will make sure keep it safe and not sharing with anyone.",
"confirm3": "I understand I cannot recover private key.",
"button": "Save key & Continue"
},
"signupWithProvider": {
"title": "Let's set up your account on Nostr",
"username": "Username *",
"chooseProvider": "Choose a Provider",
"usernameFooter": "Use to login to Lume and other Nostr apps. You can choose provider you trust to manage your account",
"email": "Backup Email (optional)",
"emailFooter": "Use for recover your account if you lose your password"
},
"onboardingSettings": {
"title": "You're almost ready to use Lume.",
"subtitle": "Let's start personalizing your experience.",
"notification": {
"title": "Push notification",
"subtitle": "Enabling push notifications will allow you to receive notifications from Lume."
},
"lowPower": {
"title": "Low Power Mode",
"subtitle": "Limited relay connection and hide all media, sustainable for low network environment."
},
"translation": {
"title": "Translation (nostr.wine)",
"subtitle": "Translate text to your preferred language, powered by Nostr Wine."
},
"footer": "There are many more settings you can configure from the 'Settings' Screen. Be sure to visit it later."
},
"relays": {
"global": "Global",
"follows": "Follows",
"sidebar": {
"title": "Connected relays",
"empty": "Empty."
},
"relayView": {
"empty": "Could not load relay information 😬",
"owner": "Owner",
"contact": "Contact",
"software": "Software",
"nips": "Supported NIPs",
"limit": "Limitation",
"payment": "Open payment website",
"paymentNote": "You need to make a payment to connect this relay"
}
},
"suggestion": {
"title": "Suggested Follows",
"error": "Error. Cannot get trending users",
"button": "Save & Go back"
},
"interests": {
"title": "Interests",
"subtitle": "Pick things you'd like to see in your home feed.",
"edit": "Edit Interest",
"followAll": "Follow All",
"unfollowAll": "Unfollow All"
},
"settings": {
"general": {
"title": "General",
"update": {
"title": "Update",
"subtitle": "Automatically download new update"
},
"lowPower": {
"title": "Low Power",
"subtitle": "Sustainable for low network environment"
},
"startup": {
"title": "Startup",
"subtitle": "Launch Lume at Login"
},
"media": {
"title": "Media",
"subtitle": "Automatically load media"
},
"hashtag": {
"title": "Hashtag",
"subtitle": "Show all hashtags in content"
},
"notification": {
"title": "Notification",
"subtitle": "Automatically send notification"
},
"translation": {
"title": "Translation",
"subtitle": "Translate text to your language"
},
"appearance": {
"title": "Appearance",
"light": "Light",
"dark": "Dark",
"system": "System"
}
},
"user": {
"title": "User"
},
"zap": {
"title": "Zap",
"nwc": "Connection String"
},
"backup": {
"title": "Backup",
"privkey": {
"title": "Private key",
"button": "Remove private key"
}
},
"advanced": {
"title": "Advanced",
"cache": {
"title": "Cache",
"subtitle": "Use for boost up nostr connection",
"button": "Clear"
},
"instant": {
"title": "Instant Zap",
"subtitle": "Zap with default amount, no confirmation"
},
"defaultAmount": "Default amount"
},
"about": {
"title": "About",
"version": "Version",
"checkUpdate": "Check for update",
"installUpdate": "Install"
}
},
"onboarding": {
"home": {
"title": "Your account was successfully created!",
"subtitle": "For starters, let's set up your profile.",
"profileSettings": "Profile Settings"
},
"profile": {
"title": "About you",
"subtitle": "Tell Lume about yourself to start building your home feed."
},
"finish": {
"title": "Profile setup complete!",
"subtitle": "You can exit the setup here and start using Lume.",
"report": "Report a issue"
}
},
"activity": {
"title": "Activity",
"empty": "Yo! Nothing new yet.",
"mention": "mention you",
"repost": "reposted",
"zap": "zapped",
"newReply": "New reply",
"boost": "Boost",
"boostSubtitle": "@ Someone has reposted to your note",
"conversation": "Conversation",
"conversationSubtitle": "@ Someone has replied to your note"
}
}

298
src-tauri/locales/en.json Normal file
View File

@@ -0,0 +1,298 @@
{
"global": {
"relay": "Relay",
"back": "Back",
"continue": "Continue",
"loading": "Loading",
"error": "Error",
"moveLeft": "Move Left",
"moveRight": "Move Right",
"newColumn": "New Column",
"inspect": "Inspect",
"loadMore": "Load more",
"delete": "Delete",
"refresh": "Refresh",
"cancel": "Cancel",
"save": "Save",
"post": "Post",
"update": "Update",
"noResult": "No results found.",
"emptyFeedTitle": "This feed is empty",
"emptyFeedSubtitle": "You can follow more users to build up your timeline",
"apiKey": "API Key",
"skip": "Skip",
"close": "Close"
},
"nip89": {
"unsupported": "Lume isn't support this event",
"openWith": "Open with"
},
"note": {
"showThread": "Show thread",
"showMore": "Show more",
"error": "Failed to fetch event.",
"posted": "posted",
"replied": "replied",
"reposted": "reposted",
"menu": {
"viewThread": "View thread",
"copyLink": "Copy shareable link",
"copyNoteId": "Copy note ID",
"copyAuthorId": "Copy author ID",
"viewAuthor": "View author",
"pinAuthor": "Pin author",
"copyRaw": "Copy raw event",
"mute": "Mute"
},
"buttons": {
"pin": "Pin",
"pinTooltip": "Pin Note",
"repost": "Repost",
"quote": "Quote",
"viewProfile": "View profile",
"reply": "Reply this note",
"open": "Open in new window"
},
"zap": {
"zap": "Zap",
"tooltip": "Send zap",
"modalTitle": "Send zap to",
"messagePlaceholder": "Enter message (optional)",
"buttonFinish": "Zapped",
"buttonLoading": "Processing...",
"invoiceButton": "Scan to zap",
"invoiceFooter": "You must use Bitcoin wallet which support Lightning\nsuch as: Blue Wallet, Bitkit, Phoenix,..."
},
"reply": {
"single": "reply",
"plural": "replies",
"empty": "Be the first to Reply!"
}
},
"user": {
"avatar": "Avatar",
"displayName": "Display Name",
"name": "Name",
"bio": "Bio",
"lna": "Lightning address",
"website": "Website",
"verified": "Verified",
"unverified": "Unverified",
"follow": "Follow",
"unfollow": "Unfollow",
"latestPosts": "Latest posts",
"avatarButton": "Change avatar",
"coverButton": "Change cover",
"editProfile": "Edit profile",
"settings": "Settings",
"logout": "Log out",
"logoutConfirmTitle": "Are you sure!",
"logoutConfirmSubtitle": "You can always log back in at any time. If you just want to switch accounts, you can do that by adding an existing account."
},
"editor": {
"title": "New Post",
"placeholder": "What are you up to?",
"successMessage": "Your note has been published successfully.",
"replyPlaceholder": "Post your reply"
},
"search": {
"placeholder": "Type something to search...",
"empty": "Try searching for people, notes, or keywords"
},
"welcome": {
"title": "Lume is a magnificent client for Nostr to meet, explore\nand freely share your thoughts with everyone.",
"signup": "Join Nostr",
"login": "Login",
"footer": "Before joining Nostr, you can take time to learn more about Nostr"
},
"login": {
"title": "Welcome back, anon!",
"subtitle": "We're so excited to see you again!",
"footer": "Lume will put your Private Key in Secure Storage depended on your OS Platform. It will be secured by Password or Biometric ID",
"loginWithAddress": "Login with Nostr Address",
"loginWithBunker": "Login with nsecBunker",
"or": "Or continue with",
"loginWithPrivkey": "Login with Private Key"
},
"loginWithAddress": {
"title": "Enter your Nostr Address"
},
"loginWithBunker": {
"title": "Enter your nsecbunker token"
},
"loginWithPrivkey": {
"title": "Enter your Private Key",
"subtitle": "Lume will put your private key to <1>{{service}}</1>.\nIt will be secured by your OS."
},
"signup": {
"title": "Let's Get Started",
"subtitle": "Choose one of methods below to create your account",
"selfManageMethod": "Self-Managed",
"selfManageMethodDescription": "You create your keys and keep them safe.",
"providerMethod": "Managed by Provider",
"providerMethodDescription": "A 3rd party provider will handle your sign in keys for you."
},
"backup": {
"title": "This is your new sign in key",
"subtitle": "Keep your key in safe place. If you lose this key, you will lose access to your account.",
"confirm1": "I understand the risk of lost private key.",
"confirm2": "I will make sure keep it safe and not sharing with anyone.",
"confirm3": "I understand I cannot recover private key.",
"button": "Save & Continue"
},
"signupWithProvider": {
"title": "Let's set up your account on Nostr",
"username": "Username *",
"chooseProvider": "Choose a Provider",
"usernameFooter": "Use to login to Lume and other Nostr apps. You can choose provider you trust to manage your account",
"email": "Backup Email (optional)",
"emailFooter": "Use for recover your account if you lose your password"
},
"onboardingSettings": {
"title": "You're almost ready to use Lume.",
"subtitle": "Let's start personalizing your experience.",
"notification": {
"title": "Push notification",
"subtitle": "Enabling push notifications will allow you to receive notifications from Lume."
},
"lowPower": {
"title": "Low Power Mode",
"subtitle": "Limited relay connection and hide all media, sustainable for low network environment."
},
"translation": {
"title": "Translation (nostr.wine)",
"subtitle": "Translate text to your preferred language, powered by Nostr Wine."
},
"footer": "There are many more settings you can configure from the 'Settings' Screen. Be sure to visit it later."
},
"relays": {
"global": "Global",
"follows": "Follows",
"sidebar": {
"title": "Connected relays",
"empty": "Empty."
},
"relayView": {
"empty": "Could not load relay information 😬",
"owner": "Owner",
"contact": "Contact",
"software": "Software",
"nips": "Supported NIPs",
"limit": "Limitation",
"payment": "Open payment website",
"paymentNote": "You need to make a payment to connect this relay"
}
},
"suggestion": {
"title": "Suggested Follows",
"error": "Error. Cannot get trending users",
"button": "Save & Go back"
},
"interests": {
"title": "Interests",
"subtitle": "Pick things you'd like to see in your home feed.",
"edit": "Edit Interest",
"followAll": "Follow All",
"unfollowAll": "Unfollow All"
},
"settings": {
"general": {
"title": "General",
"update": {
"title": "Update",
"subtitle": "Automatically download new update"
},
"lowPower": {
"title": "Low Power",
"subtitle": "Sustainable for low network environment"
},
"startup": {
"title": "Startup",
"subtitle": "Launch Lume at Login"
},
"media": {
"title": "Media",
"subtitle": "Automatically load media"
},
"hashtag": {
"title": "Hashtag",
"subtitle": "Show all hashtags in content"
},
"notification": {
"title": "Notification",
"subtitle": "Automatically send notification"
},
"translation": {
"title": "Translation",
"subtitle": "Translate text to your language"
},
"appearance": {
"title": "Appearance",
"light": "Light",
"dark": "Dark",
"system": "System"
}
},
"user": {
"title": "Account"
},
"zap": {
"title": "Zap",
"nwc": "Connection String"
},
"backup": {
"title": "Backup",
"privkey": {
"title": "Private key",
"button": "Remove private key"
}
},
"advanced": {
"title": "Advanced",
"cache": {
"title": "Cache",
"subtitle": "Use for boost up nostr connection",
"button": "Clear"
},
"instant": {
"title": "Instant Zap",
"subtitle": "Zap with default amount, no confirmation"
},
"defaultAmount": "Default amount"
},
"about": {
"title": "About",
"version": "Version",
"checkUpdate": "Check for update",
"installUpdate": "Install"
}
},
"onboarding": {
"home": {
"title": "Your account was successfully created!",
"subtitle": "For starters, let's set up your profile.",
"profileSettings": "Profile Settings"
},
"profile": {
"title": "About you",
"subtitle": "Tell Lume about yourself to start building your home feed."
},
"finish": {
"title": "Profile setup complete!",
"subtitle": "You can exit the setup here and start using Lume.",
"report": "Report a issue"
}
},
"activity": {
"title": "Activity",
"empty": "Yo! Nothing new yet.",
"mention": "mention you",
"repost": "reposted",
"zap": "zapped",
"newReply": "New reply",
"boost": "Boost",
"boostSubtitle": "@ Someone has reposted to your note",
"conversation": "Conversation",
"conversationSubtitle": "@ Someone has replied to your note"
}
}

295
src-tauri/locales/fr.json Normal file
View File

@@ -0,0 +1,295 @@
{
"global": {
"relay": "Relais",
"back": "Retour",
"continue": "Continuer",
"loading": "Chargement",
"error": "Erreur",
"moveLeft": "Déplacer à Gauche",
"moveRight": "Déplacer à Droite",
"newColumn": "Nouvelle Colonne",
"inspect": "Inspecter",
"loadMore": "Charger plus",
"delete": "Supprimer",
"refresh": "Rafraîchir",
"cancel": "Annuler",
"save": "Enregistrer",
"post": "Poster",
"update": "Mettre à jour",
"noResult": "Aucun résultat correspondant.",
"emptyFeedTitle": "Ce flux est vide",
"emptyFeedSubtitle": "Vous pouvez suivre plus d'utilisateurs pour construire votre flux de messages",
"apiKey": "Clé d'API",
"skip": "Passer",
"close": "Fermer"
},
"nip89": {
"unsupported": "Lume ne supporte pas encore cet événement",
"openWith": "Ouvrir avec"
},
"note": {
"showThread": "Voir le fil",
"showMore": "Voir plus",
"error": "Echec de la récupération de l'événement.",
"posted": "posté",
"replied": "répondu",
"reposted": "reposté",
"menu": {
"viewThread": "Voir le fil",
"copyLink": "Copier le lien à partager",
"copyNoteId": "Copier l'ID de la note",
"copyAuthorId": "Copier l'ID de l'auteur",
"viewAuthor": "Voir l'auteur",
"pinAuthor": "Epingler l'auteur",
"copyRaw": "Copier le contenu brut de l'événement",
"mute": "Mettre en silencieux"
},
"buttons": {
"pin": "Epingler",
"pinTooltip": "Epingler la Note",
"repost": "Reposter",
"quote": "Citer",
"viewProfile": "Voir le profil"
},
"zap": {
"zap": "Zap",
"tooltip": "Envoyer zap",
"modalTitle": "Envoyer zap à",
"messagePlaceholder": "Entrer un message (optionnel)",
"buttonFinish": "Zappé",
"buttonLoading": "En cours...",
"invoiceButton": "Scanner pour zapper",
"invoiceFooter": "Vous devez utiliser un portefeuille Bitcoin qui prend en charge Lightning\ncomme par exemple : Blue Wallet, Bitkit, Phoenix, ..."
},
"reply": {
"single": "réponse",
"plural": "réponses",
"empty": "Soyez le premier à répondre !"
}
},
"user": {
"avatar": "Avatar",
"displayName": "Nom Affiché",
"name": "Nom",
"bio": "Bio",
"lna": "Adresse Lightning",
"website": "Site Internet",
"verified": "Vérifié",
"unverified": "Non vérifié",
"follow": "Suivre",
"unfollow": "Ne plus suivre",
"latestPosts": "Derniers posts",
"avatarButton": "Changer d'avatar",
"coverButton": "Changer de bannière",
"editProfile": "Modifier profil",
"settings": "Paramètres",
"logout": "Déconnexion",
"logoutConfirmTitle": "Etes-vous sûr ?",
"logoutConfirmSubtitle": "Vous pouvez toujours vous reconnecter à tout moment. Si vous souhaitez simplement changer de compte, vous pouvez le faire en ajoutant un compte existant."
},
"editor": {
"title": "Nouveau Post",
"placeholder": "Que faites-vous ?",
"successMessage": "Votre note a été publiée avec succès.",
"replyPlaceholder": "Poster votre réponse"
},
"search": {
"placeholder": "Saisissez quelque chose à rechercher...",
"empty": "Essayez de rechercher des personnes, des notes ou des mots-clés"
},
"welcome": {
"title": "Lume est un magnifique client Nostr qui permet de se rencontrer, d'explorer\net de partager librement ses pensées avec tout le monde.",
"signup": "Rejoindre Nostr",
"login": "Se connecter",
"footer": "Avant de rejoindre Nostr, vous pouvez prendre le temps d'en savoir plus sur Nostr"
},
"login": {
"title": "Re-Bienvenue, anon !",
"footer": "Lume placera votre clé privée dans un espace de stockage sécurisé en fonction de la plateforme de votre système d'exploitation. Elle sera sécurisée par un mot de passe ou un identifiant biométrique.",
"loginWithAddress": "Se connecter avec une Adresse Nostr",
"loginWithBunker": "Se connecter avec nsecBunker",
"or": "Ou continuer avec",
"loginWithPrivkey": "Se connecter avec une Clé Privée"
},
"loginWithAddress": {
"title": "Saisissez votre Adresse Nostr"
},
"loginWithBunker": {
"title": "Saisissez votre jeton nsecbunker"
},
"loginWithPrivkey": {
"title": "Saisissez votre Clé Privée",
"subtitle": "Lume placera votre clé privée dans <1>{{service}}</1>.\nElle sera sécurisée par votre système d'exploitation."
},
"signup": {
"title": "Commençons",
"subtitle": "Choisissez l'une des méthodes ci-dessous pour créer votre compte",
"selfManageMethod": "Autogéré",
"selfManageMethodDescription": "Vous créez vos clés et vous les conservez en toute sécurité.",
"providerMethod": "Géré par le Prestataire",
"providerMethodDescription": "Un fournisseur tiers s'occupera de vos clés de connexion pour vous."
},
"signupWithSelfManage": {
"title": "Il s'agit de votre nouvelle Clé de Compte",
"subtitle": "Conservez votre clé en lieu sûr. Si vous perdez cette clé, vous perdrez l'accès à votre compte.",
"confirm1": "Je comprends le risque de perte de la clé privée.",
"confirm2": "Je veillerai à ce qu'elle soit conservée en toute sécurité et à ce qu'elle ne soit partagée avec personne.",
"confirm3": "Je comprends que je ne peux pas récupérer la clé privée.",
"button": "Enregistrer la clé et Continuer"
},
"signupWithProvider": {
"title": "Commençons la préparation de votre compte Nostr",
"username": "Nom d'utilisateur *",
"chooseProvider": "Choisissez un Fournisseur",
"usernameFooter": "A utiliser pour vous connecter à Lume et aux autres applications Nostr. Vous pouvez choisir un fournisseur de confiance pour gérer votre compte.",
"email": "Email de sauvegarde (optionnel)",
"emailFooter": "A utiliser pour récupérer votre compte si vous perdez votre mot de passe"
},
"onboardingSettings": {
"title": "Vous êtes presque prêt à utiliser Lume.",
"subtitle": "Commençons par personnaliser votre expérience.",
"notification": {
"title": "Notifications Push",
"subtitle": "L'activation des notifications push vous permettra de recevoir des notifications de Lume."
},
"lowPower": {
"title": "Mode Basse Consommation",
"subtitle": "Connexion relais limitée et dissimulation de tous les médias, compatible avec les environnements avec peu de réseau."
},
"translation": {
"title": "Traductions (nostr.wine)",
"subtitle": "Traduisez votre texte dans la langue de votre choix, grâce à Nostr Wine."
},
"footer": "Vous pouvez configurer de nombreux autres paramètres à partir de l'écran 'Paramètres'. Ne manquez pas de les consulter ultérieurement."
},
"relays": {
"global": "Général",
"follows": "Suivis",
"sidebar": {
"title": "Relais connectés",
"empty": "Vide."
},
"relayView": {
"empty": "Impossible de charger les informations du relais 😬",
"owner": "Propriétaire",
"contact": "Contact",
"software": "Logiciel",
"nips": "NIPs supportés",
"limit": "Limitation",
"payment": "Ouvrir le site de paiement",
"paymentNote": "Vous devez effectuer un paiement pour vous connecter à ce relais."
}
},
"suggestion": {
"title": "Suivis Suggérés",
"error": "Erreur. Impossible d'obtenir les utilisateurs en tendance",
"button": "Enregistrer & Retour"
},
"interests": {
"title": "Intérêts",
"subtitle": "Choisissez les éléments que vous aimeriez voir apparaître dans votre flux d'accueil.",
"edit": "Modifier vos Intérêts",
"followAll": "Suivre tout le monde",
"unfollowAll": "Ne plus suivre personne"
},
"settings": {
"general": {
"title": "Général",
"update": {
"title": "Mises à jour",
"subtitle": "Téléchargement automatique des nouvelles mises à jour"
},
"lowPower": {
"title": "Faible Consommation",
"subtitle": "Recommandé pour un environnement avec peu de réseau"
},
"startup": {
"title": "Démarrage",
"subtitle": "Lancer Lume au Démarrage"
},
"media": {
"title": "Média",
"subtitle": "Chargement automatique des médias"
},
"hashtag": {
"title": "Hashtag",
"subtitle": "Afficher tous les hashtags dans les contenus"
},
"notification": {
"title": "Notification",
"subtitle": "Envoi automatique des notifications"
},
"translation": {
"title": "Traduction",
"subtitle": "Traduire les textes dans votre langue"
},
"appearance": {
"title": "Apparence",
"light": "Clair",
"dark": "Sombre",
"system": "Système"
}
},
"user": {
"title": "Utilisateur"
},
"zap": {
"title": "Zap",
"nwc": "Chaîne de connexion NWC"
},
"backup": {
"title": "Sauvegarde",
"privkey": {
"title": "Clé Privée",
"button": "Supprimer la clé privée"
}
},
"advanced": {
"title": "Avancé",
"cache": {
"title": "Cache",
"subtitle": "A utiliser pour accélérer la connexion nostr",
"button": "Vider"
},
"instant": {
"title": "Zap instantané",
"subtitle": "Zap avec montant par défaut, sans confirmation"
},
"defaultAmount": "Montant par défaut"
},
"about": {
"title": "A propos",
"version": "Version",
"checkUpdate": "Rechercher des mises à jour",
"installUpdate": "Installer"
}
},
"onboarding": {
"home": {
"title": "Votre compte a été créé avec succès !",
"subtitle": "Pour commencer, configurons votre profil.",
"profileSettings": "Paramètres du Profil"
},
"profile": {
"title": "A propos de vous",
"subtitle": "Parlez de vous à Lume pour commencer à construire votre flux d'accueil."
},
"finish": {
"title": "Configuration du profil terminée !",
"subtitle": "Vous pouvez quitter la configuration ici et commencer à utiliser Lume.",
"report": "Signaler un problème"
}
},
"activity": {
"title": "Activité",
"empty": "Hey ! Rien de nouveau pour l'instant.",
"mention": "vous a mentionné",
"repost": "reposté",
"zap": "zappé",
"newReply": "Nouvelle réponse",
"boost": "Booster",
"boostSubtitle": "@ Quelqu'un a reposté votre note",
"conversation": "Conversation",
"conversationSubtitle": "@ Quelqu'un a répondu à votre note"
}
}

295
src-tauri/locales/ja.json Normal file
View File

@@ -0,0 +1,295 @@
{
"global": {
"relay": "リレー",
"back": "戻る",
"continue": "続行",
"loading": "ロード中",
"error": "エラー",
"moveLeft": "左に移動",
"moveRight": "右に移動",
"newColumn": "新規カラム",
"inspect": "のぞき見",
"loadMore": "詳細",
"delete": "削除",
"refresh": "更新",
"cancel": "キャンセル",
"save": "保存",
"post": "投稿",
"update": "更新",
"noResult": "結果が見つかりません",
"emptyFeedTitle": "このフィードは空です",
"emptyFeedSubtitle": "ユーザーをフォローしてタイムラインを構築しましょう",
"apiKey": "API キー",
"skip": "スキップ",
"close": "閉じる"
},
"nip89": {
"unsupported": "このイベントは非対応です",
"openWith": "で開く"
},
"note": {
"showThread": "スレッドの表示",
"showMore": "さらに表示",
"error": "イベントの取得に失敗しました",
"posted": "が投稿しました",
"replied": "が返信しました",
"reposted": "がリポストしました",
"menu": {
"viewThread": "スレッドを見る",
"copyLink": "シェアリンクをコピー",
"copyNoteId": "投稿 ID をコピー",
"copyAuthorId": "投稿者 ID をコピー",
"viewAuthor": "投稿者を表示",
"pinAuthor": "投稿者をピン留め",
"copyRaw": "生イベントをコピー",
"mute": "ミュート"
},
"buttons": {
"pin": "ピン留め",
"pinTooltip": "投稿をピン留めする",
"repost": "リポスト",
"quote": "引用",
"viewProfile": "プロフィールの表示"
},
"zap": {
"zap": "Zap",
"tooltip": "zap する",
"modalTitle": "に zap する",
"messagePlaceholder": "メッセージを入力 (任意)",
"buttonFinish": "Zap しました",
"buttonLoading": "処理中...",
"invoiceButton": "スキャンして zap",
"invoiceFooter": "Blue Wallet、Bitkit、Phoenix などの\nBitcoin Lightningに対応したウォレットが必要です。"
},
"reply": {
"single": "リプライ",
"plural": "複数リプライ",
"empty": "リプライしてみましょう!"
}
},
"user": {
"avatar": "アバター",
"displayName": "表示名",
"name": "名前",
"bio": "経歴",
"lna": "ライトニングアドレス",
"website": "Web サイト",
"verified": "認証済",
"unverified": "未認証",
"follow": "フォロー",
"unfollow": "アンフォロー",
"latestPosts": "最新投稿",
"avatarButton": "アバターの変更",
"coverButton": "カバーの変更",
"editProfile": "プロフィールの編集",
"settings": "設定",
"logout": "ログアウト",
"logoutConfirmTitle": "本当にログアウトしてもよろしいですか?",
"logoutConfirmSubtitle": "いつでも再ログインすることができます。アカウントを切り替えたいだけの場合は、既存のアカウントを追加することで切り替えられます。"
},
"editor": {
"title": "新規投稿",
"placeholder": "今何してる?",
"successMessage": "投稿が正常に公開されました",
"replyPlaceholder": "リプライを投稿する"
},
"search": {
"placeholder": "入力して検索...",
"empty": "人、投稿、キーワードなどを入力して検索しましょう"
},
"welcome": {
"title": "Lume は、Nostr を通じて人々と出会い、探索し、\n自由に思いを共有するために作られた全く新しいクライアントです。",
"signup": "Nostr を始める",
"login": "ログイン",
"footer": "Nostr を始める前に、Nostrについて学ぶ"
},
"login": {
"title": "おかえりなさい、名無しさん!",
"footer": "Lume は、秘密鍵をそれぞれの OS に対応したセキュア・ストレージ内に保管します。また、入力された秘密鍵は、パスワードや生体認証 ID によって保護されます。",
"loginWithAddress": "Nostr アドレスでログイン",
"loginWithBunker": "nsecBunker でログイン",
"or": "または、",
"loginWithPrivkey": "秘密鍵でログイン"
},
"loginWithAddress": {
"title": "Nostr アドレスを入力"
},
"loginWithBunker": {
"title": "nsecBunker のトークンを入力"
},
"loginWithPrivkey": {
"title": "秘密鍵を入力",
"subtitle": "秘密鍵は <1>{{service}}</1> 内に保管されます。\nまた、OSによって秘密鍵は保護されます。"
},
"signup": {
"title": "さぁ、はじめましょう",
"subtitle": "以下からアカウント作成の方法を 1 つ選択してください",
"selfManageMethod": "自己管理",
"selfManageMethodDescription": "自分で秘密鍵を作成し安全に保管する",
"providerMethod": "プロバイダー管理",
"providerMethodDescription": "サードパーティプロバイダーに鍵管理を委任する"
},
"signupWithSelfManage": {
"title": "これが新しいアカウント用の鍵です",
"subtitle": "秘密鍵は安全な場所に保管してください。紛失してしまった場合は、永遠にアカウントにアクセスできなくなります。",
"confirm1": "秘密鍵を紛失した場合のリスクを理解しました。",
"confirm2": "秘密鍵を安全な場所に保管し、誰にも共有しないことを承諾しました。",
"confirm3": "秘密鍵の復元ができないことを理解しました。",
"button": "鍵を保存して続行"
},
"signupWithProvider": {
"title": "さぁ、Nostr のアカウントを設定しましょう",
"username": "ユーザー名 *",
"chooseProvider": "プロバイダーを選択",
"usernameFooter": "Lume や、他の Nostr アプリにログインする場合に使用されます。アカウントを管理するプロバイダーは慎重に選択してください",
"email": "E メールでバックアップ (任意)",
"emailFooter": "パスワードを紛失した場合に使用されます"
},
"onboardingSettings": {
"title": "あともう少しです",
"subtitle": "Lume の体験を最適化しましょう",
"notification": {
"title": "プッシュ通知",
"subtitle": "プッシュ通知を有効化すると Lume から通知を受け取ることができるようになります。"
},
"lowPower": {
"title": "低電力モード",
"subtitle": "リレーの接続を制限し、すべてのメディアを非表示にします。ネットワーク環境が悪い場合などにも有効です。"
},
"translation": {
"title": "翻訳 (nostr.wine)",
"subtitle": "Nostr Wine を使用し、希望の言語に自動翻訳することができます。"
},
"footer": "「設定」画面からさらに細かくカスタマイズすることができます。 後で確認するのを忘れずに。"
},
"relays": {
"global": "グローバル",
"follows": "フォロー",
"sidebar": {
"title": "接続済リレー",
"empty": "空"
},
"relayView": {
"empty": "リレー情報がロードできませんでした 😬",
"owner": "オーナー",
"contact": "連絡先",
"software": "ソフトウェア",
"nips": "対応 NIPs",
"limit": "制限",
"payment": "決済用 Web サイトを開く",
"paymentNote": "このリレーへの接続には支払いが必要です"
}
},
"suggestion": {
"title": "フォロー推奨 Nostrich",
"error": "エラーが発生しています。人気の Nostrich 情報が取得ができませんでした",
"button": "保存して戻る"
},
"interests": {
"title": "興味",
"subtitle": "ホーム・フィードに表示したい内容を選択",
"edit": "興味を編集",
"followAll": "全てフォローする",
"unfollowAll": "全てアンフォローする"
},
"settings": {
"general": {
"title": "一般",
"update": {
"title": "アップデート",
"subtitle": "自動で新規アップデートをダウンロードする"
},
"lowPower": {
"title": "低電力モード",
"subtitle": "ネットワーク環境が悪い場合などにオススメ"
},
"startup": {
"title": "起動時",
"subtitle": "ログイン時に Lume を起動する"
},
"media": {
"title": "メディア",
"subtitle": "自動的にメディアをロードする"
},
"hashtag": {
"title": "ハッシュタグ",
"subtitle": "コンテンツ内のハッシュタグを全て表示する"
},
"notification": {
"title": "通知",
"subtitle": "プッシュ通知の自動化"
},
"translation": {
"title": "翻訳",
"subtitle": "好みの言語に自動翻訳"
},
"appearance": {
"title": "外観",
"light": "ライト",
"dark": "ダーク",
"system": "システム"
}
},
"user": {
"title": "ユーザー"
},
"zap": {
"title": "Zap",
"nwc": "接続文字列"
},
"backup": {
"title": "バックアップ",
"privkey": {
"title": "秘密鍵",
"button": "秘密鍵の削除"
}
},
"advanced": {
"title": "高度な設定",
"cache": {
"title": "キャッシュ",
"subtitle": "接続を高速化する際に使用",
"button": "クリア"
},
"instant": {
"title": "即 Zap",
"subtitle": "確認なしで設定されたデフォルト枚数を zap する"
},
"defaultAmount": "デフォルト枚数"
},
"about": {
"title": "概要",
"version": "バージョン",
"checkUpdate": "アップデートの確認",
"installUpdate": "インストール"
}
},
"onboarding": {
"home": {
"title": "アカウントが正常に作成されました!",
"subtitle": "初めての方はプロフィールの設定をしましょう。",
"profileSettings": "プロフィール設定"
},
"profile": {
"title": "あなたについて",
"subtitle": "ホーム・フィードを作成するためにあなたについてもう少し教えてください。"
},
"finish": {
"title": "プロフィールの設定が完了しました!",
"subtitle": "お疲れ様でした!設定はここで終了です。 Lume を開始できます",
"report": "問題を報告する"
}
},
"activity": {
"title": "アクティビティ",
"empty": "オッ! まだ何もないようですネ!",
"mention": "にメンションされました",
"repost": "にリポストされました",
"zap": "に Zapされました",
"newReply": "新規リプライ",
"boost": "ブースト",
"boostSubtitle": "@ 誰かがあなたの投稿をリポストしました",
"conversation": "会話",
"conversationSubtitle": "@ 誰かがあなたの投稿にリプライしました"
}
}

295
src-tauri/locales/ru.json Normal file
View File

@@ -0,0 +1,295 @@
{
"global": {
"relay": "Relay",
"back": "Back",
"continue": "Continue",
"loading": "Loading",
"error": "Error",
"moveLeft": "Move Left",
"moveRight": "Move Right",
"newColumn": "New Column",
"inspect": "Inspect",
"loadMore": "Load more",
"delete": "Delete",
"refresh": "Refresh",
"cancel": "Cancel",
"save": "Save",
"post": "Post",
"update": "Update",
"noResult": "No results found.",
"emptyFeedTitle": "This feed is empty",
"emptyFeedSubtitle": "You can follow more users to build up your timeline",
"apiKey": "API Key",
"skip": "Skip",
"close": "Close"
},
"nip89": {
"unsupported": "Lume isn't support this event",
"openWith": "Open with"
},
"note": {
"showThread": "Show thread",
"showMore": "Show more",
"error": "Failed to fetch event.",
"posted": "posted",
"replied": "replied",
"reposted": "reposted",
"menu": {
"viewThread": "View thread",
"copyLink": "Copy shareable link",
"copyNoteId": "Copy note ID",
"copyAuthorId": "Copy author ID",
"viewAuthor": "View author",
"pinAuthor": "Pin author",
"copyRaw": "Copy raw event",
"mute": "Mute"
},
"buttons": {
"pin": "Pin",
"pinTooltip": "Pin Note",
"repost": "Repost",
"quote": "Quote",
"viewProfile": "View profile"
},
"zap": {
"zap": "Zap",
"tooltip": "Send zap",
"modalTitle": "Send zap to",
"messagePlaceholder": "Enter message (optional)",
"buttonFinish": "Zapped",
"buttonLoading": "Processing...",
"invoiceButton": "Scan to zap",
"invoiceFooter": "You must use Bitcoin wallet which support Lightning\nsuch as: Blue Wallet, Bitkit, Phoenix,..."
},
"reply": {
"single": "reply",
"plural": "replies",
"empty": "Be the first to Reply!"
}
},
"user": {
"avatar": "Avatar",
"displayName": "Display Name",
"name": "Name",
"bio": "Bio",
"lna": "Lightning address",
"website": "Website",
"verified": "Verified",
"unverified": "Unverified",
"follow": "Follow",
"unfollow": "Unfollow",
"latestPosts": "Latest posts",
"avatarButton": "Change avatar",
"coverButton": "Change cover",
"editProfile": "Edit profile",
"settings": "Settings",
"logout": "Log out",
"logoutConfirmTitle": "Are you sure!",
"logoutConfirmSubtitle": "You can always log back in at any time. If you just want to switch accounts, you can do that by adding an existing account."
},
"editor": {
"title": "New Post",
"placeholder": "What are you up to?",
"successMessage": "Your note has been published successfully.",
"replyPlaceholder": "Post your reply"
},
"search": {
"placeholder": "Type something to search...",
"empty": "Try searching for people, notes, or keywords"
},
"welcome": {
"title": "Lume is a magnificent client for Nostr to meet, explore\nand freely share your thoughts with everyone.",
"signup": "Join Nostr",
"login": "Login",
"footer": "Before joining Nostr, you can take time to learn more about Nostr"
},
"login": {
"title": "Welcome back, anon!",
"footer": "Lume will put your Private Key in Secure Storage depended on your OS Platform. It will be secured by Password or Biometric ID",
"loginWithAddress": "Login with Nostr Address",
"loginWithBunker": "Login with nsecBunker",
"or": "Or continue with",
"loginWithPrivkey": "Login with Private Key"
},
"loginWithAddress": {
"title": "Enter your Nostr Address"
},
"loginWithBunker": {
"title": "Enter your nsecbunker token"
},
"loginWithPrivkey": {
"title": "Enter your Private Key",
"subtitle": "Lume will put your private key to <1>{{service}}</1>.\nIt will be secured by your OS."
},
"signup": {
"title": "Let's Get Started",
"subtitle": "Choose one of methods below to create your account",
"selfManageMethod": "Self-Managed",
"selfManageMethodDescription": "You create your keys and keep them safe.",
"providerMethod": "Managed by Provider",
"providerMethodDescription": "A 3rd party provider will handle your sign in keys for you."
},
"signupWithSelfManage": {
"title": "This is your new Account Key",
"subtitle": "Keep your key in safe place. If you lose this key, you will lose access to your account.",
"confirm1": "I understand the risk of lost private key.",
"confirm2": "I will make sure keep it safe and not sharing with anyone.",
"confirm3": "I understand I cannot recover private key.",
"button": "Save key & Continue"
},
"signupWithProvider": {
"title": "Let's set up your account on Nostr",
"username": "Username *",
"chooseProvider": "Choose a Provider",
"usernameFooter": "Use to login to Lume and other Nostr apps. You can choose provider you trust to manage your account",
"email": "Backup Email (optional)",
"emailFooter": "Use for recover your account if you lose your password"
},
"onboardingSettings": {
"title": "You're almost ready to use Lume.",
"subtitle": "Let's start personalizing your experience.",
"notification": {
"title": "Push notification",
"subtitle": "Enabling push notifications will allow you to receive notifications from Lume."
},
"lowPower": {
"title": "Low Power Mode",
"subtitle": "Limited relay connection and hide all media, sustainable for low network environment."
},
"translation": {
"title": "Translation (nostr.wine)",
"subtitle": "Translate text to your preferred language, powered by Nostr Wine."
},
"footer": "There are many more settings you can configure from the 'Settings' Screen. Be sure to visit it later."
},
"relays": {
"global": "Global",
"follows": "Follows",
"sidebar": {
"title": "Connected relays",
"empty": "Empty."
},
"relayView": {
"empty": "Could not load relay information 😬",
"owner": "Owner",
"contact": "Contact",
"software": "Software",
"nips": "Supported NIPs",
"limit": "Limitation",
"payment": "Open payment website",
"paymentNote": "You need to make a payment to connect this relay"
}
},
"suggestion": {
"title": "Suggested Follows",
"error": "Error. Cannot get trending users",
"button": "Save & Go back"
},
"interests": {
"title": "Interests",
"subtitle": "Pick things you'd like to see in your home feed.",
"edit": "Edit Interest",
"followAll": "Follow All",
"unfollowAll": "Unfollow All"
},
"settings": {
"general": {
"title": "General",
"update": {
"title": "Update",
"subtitle": "Automatically download new update"
},
"lowPower": {
"title": "Low Power",
"subtitle": "Sustainable for low network environment"
},
"startup": {
"title": "Startup",
"subtitle": "Launch Lume at Login"
},
"media": {
"title": "Media",
"subtitle": "Automatically load media"
},
"hashtag": {
"title": "Hashtag",
"subtitle": "Show all hashtags in content"
},
"notification": {
"title": "Notification",
"subtitle": "Automatically send notification"
},
"translation": {
"title": "Translation",
"subtitle": "Translate text to your language"
},
"appearance": {
"title": "Appearance",
"light": "Light",
"dark": "Dark",
"system": "System"
}
},
"user": {
"title": "User"
},
"zap": {
"title": "Zap",
"nwc": "Connection String"
},
"backup": {
"title": "Backup",
"privkey": {
"title": "Private key",
"button": "Remove private key"
}
},
"advanced": {
"title": "Advanced",
"cache": {
"title": "Cache",
"subtitle": "Use for boost up nostr connection",
"button": "Clear"
},
"instant": {
"title": "Instant Zap",
"subtitle": "Zap with default amount, no confirmation"
},
"defaultAmount": "Default amount"
},
"about": {
"title": "About",
"version": "Version",
"checkUpdate": "Check for update",
"installUpdate": "Install"
}
},
"onboarding": {
"home": {
"title": "Your account was successfully created!",
"subtitle": "For starters, let's set up your profile.",
"profileSettings": "Profile Settings"
},
"profile": {
"title": "About you",
"subtitle": "Tell Lume about yourself to start building your home feed."
},
"finish": {
"title": "Profile setup complete!",
"subtitle": "You can exit the setup here and start using Lume.",
"report": "Report a issue"
}
},
"activity": {
"title": "Activity",
"empty": "Yo! Nothing new yet.",
"mention": "mention you",
"repost": "reposted",
"zap": "zapped",
"newReply": "New reply",
"boost": "Boost",
"boostSubtitle": "@ Someone has reposted to your note",
"conversation": "Conversation",
"conversationSubtitle": "@ Someone has replied to your note"
}
}

295
src-tauri/locales/vi.json Normal file
View File

@@ -0,0 +1,295 @@
{
"global": {
"relay": "Relay",
"back": "Back",
"continue": "Continue",
"loading": "Loading",
"error": "Error",
"moveLeft": "Move Left",
"moveRight": "Move Right",
"newColumn": "New Column",
"inspect": "Inspect",
"loadMore": "Load more",
"delete": "Delete",
"refresh": "Refresh",
"cancel": "Cancel",
"save": "Save",
"post": "Post",
"update": "Update",
"noResult": "No results found.",
"emptyFeedTitle": "This feed is empty",
"emptyFeedSubtitle": "You can follow more users to build up your timeline",
"apiKey": "API Key",
"skip": "Skip",
"close": "Close"
},
"nip89": {
"unsupported": "Lume isn't support this event",
"openWith": "Open with"
},
"note": {
"showThread": "Show thread",
"showMore": "Show more",
"error": "Failed to fetch event.",
"posted": "posted",
"replied": "replied",
"reposted": "reposted",
"menu": {
"viewThread": "View thread",
"copyLink": "Copy shareable link",
"copyNoteId": "Copy note ID",
"copyAuthorId": "Copy author ID",
"viewAuthor": "View author",
"pinAuthor": "Pin author",
"copyRaw": "Copy raw event",
"mute": "Mute"
},
"buttons": {
"pin": "Pin",
"pinTooltip": "Pin Note",
"repost": "Repost",
"quote": "Quote",
"viewProfile": "View profile"
},
"zap": {
"zap": "Zap",
"tooltip": "Send zap",
"modalTitle": "Send zap to",
"messagePlaceholder": "Enter message (optional)",
"buttonFinish": "Zapped",
"buttonLoading": "Processing...",
"invoiceButton": "Scan to zap",
"invoiceFooter": "You must use Bitcoin wallet which support Lightning\nsuch as: Blue Wallet, Bitkit, Phoenix,..."
},
"reply": {
"single": "reply",
"plural": "replies",
"empty": "Be the first to Reply!"
}
},
"user": {
"avatar": "Avatar",
"displayName": "Display Name",
"name": "Name",
"bio": "Bio",
"lna": "Lightning address",
"website": "Website",
"verified": "Verified",
"unverified": "Unverified",
"follow": "Follow",
"unfollow": "Unfollow",
"latestPosts": "Latest posts",
"avatarButton": "Change avatar",
"coverButton": "Change cover",
"editProfile": "Edit profile",
"settings": "Settings",
"logout": "Log out",
"logoutConfirmTitle": "Are you sure!",
"logoutConfirmSubtitle": "You can always log back in at any time. If you just want to switch accounts, you can do that by adding an existing account."
},
"editor": {
"title": "New Post",
"placeholder": "What are you up to?",
"successMessage": "Your note has been published successfully.",
"replyPlaceholder": "Post your reply"
},
"search": {
"placeholder": "Type something to search...",
"empty": "Try searching for people, notes, or keywords"
},
"welcome": {
"title": "Lume is a magnificent client for Nostr to meet, explore\nand freely share your thoughts with everyone.",
"signup": "Join Nostr",
"login": "Login",
"footer": "Before joining Nostr, you can take time to learn more about Nostr"
},
"login": {
"title": "Welcome back, anon!",
"footer": "Lume will put your Private Key in Secure Storage depended on your OS Platform. It will be secured by Password or Biometric ID",
"loginWithAddress": "Login with Nostr Address",
"loginWithBunker": "Login with nsecBunker",
"or": "Or continue with",
"loginWithPrivkey": "Login with Private Key"
},
"loginWithAddress": {
"title": "Enter your Nostr Address"
},
"loginWithBunker": {
"title": "Enter your nsecbunker token"
},
"loginWithPrivkey": {
"title": "Enter your Private Key",
"subtitle": "Lume will put your private key to <1>{{service}}</1>.\nIt will be secured by your OS."
},
"signup": {
"title": "Let's Get Started",
"subtitle": "Choose one of methods below to create your account",
"selfManageMethod": "Self-Managed",
"selfManageMethodDescription": "You create your keys and keep them safe.",
"providerMethod": "Managed by Provider",
"providerMethodDescription": "A 3rd party provider will handle your sign in keys for you."
},
"signupWithSelfManage": {
"title": "This is your new Account Key",
"subtitle": "Keep your key in safe place. If you lose this key, you will lose access to your account.",
"confirm1": "I understand the risk of lost private key.",
"confirm2": "I will make sure keep it safe and not sharing with anyone.",
"confirm3": "I understand I cannot recover private key.",
"button": "Save key & Continue"
},
"signupWithProvider": {
"title": "Let's set up your account on Nostr",
"username": "Username *",
"chooseProvider": "Choose a Provider",
"usernameFooter": "Use to login to Lume and other Nostr apps. You can choose provider you trust to manage your account",
"email": "Backup Email (optional)",
"emailFooter": "Use for recover your account if you lose your password"
},
"onboardingSettings": {
"title": "You're almost ready to use Lume.",
"subtitle": "Let's start personalizing your experience.",
"notification": {
"title": "Push notification",
"subtitle": "Enabling push notifications will allow you to receive notifications from Lume."
},
"lowPower": {
"title": "Low Power Mode",
"subtitle": "Limited relay connection and hide all media, sustainable for low network environment."
},
"translation": {
"title": "Translation (nostr.wine)",
"subtitle": "Translate text to your preferred language, powered by Nostr Wine."
},
"footer": "There are many more settings you can configure from the 'Settings' Screen. Be sure to visit it later."
},
"relays": {
"global": "Global",
"follows": "Follows",
"sidebar": {
"title": "Connected relays",
"empty": "Empty."
},
"relayView": {
"empty": "Could not load relay information 😬",
"owner": "Owner",
"contact": "Contact",
"software": "Software",
"nips": "Supported NIPs",
"limit": "Limitation",
"payment": "Open payment website",
"paymentNote": "You need to make a payment to connect this relay"
}
},
"suggestion": {
"title": "Suggested Follows",
"error": "Error. Cannot get trending users",
"button": "Save & Go back"
},
"interests": {
"title": "Interests",
"subtitle": "Pick things you'd like to see in your home feed.",
"edit": "Edit Interest",
"followAll": "Follow All",
"unfollowAll": "Unfollow All"
},
"settings": {
"general": {
"title": "General",
"update": {
"title": "Update",
"subtitle": "Automatically download new update"
},
"lowPower": {
"title": "Low Power",
"subtitle": "Sustainable for low network environment"
},
"startup": {
"title": "Startup",
"subtitle": "Launch Lume at Login"
},
"media": {
"title": "Media",
"subtitle": "Automatically load media"
},
"hashtag": {
"title": "Hashtag",
"subtitle": "Show all hashtags in content"
},
"notification": {
"title": "Notification",
"subtitle": "Automatically send notification"
},
"translation": {
"title": "Translation",
"subtitle": "Translate text to your language"
},
"appearance": {
"title": "Appearance",
"light": "Light",
"dark": "Dark",
"system": "System"
}
},
"user": {
"title": "User"
},
"zap": {
"title": "Zap",
"nwc": "Connection String"
},
"backup": {
"title": "Backup",
"privkey": {
"title": "Private key",
"button": "Remove private key"
}
},
"advanced": {
"title": "Advanced",
"cache": {
"title": "Cache",
"subtitle": "Use for boost up nostr connection",
"button": "Clear"
},
"instant": {
"title": "Instant Zap",
"subtitle": "Zap with default amount, no confirmation"
},
"defaultAmount": "Default amount"
},
"about": {
"title": "About",
"version": "Version",
"checkUpdate": "Check for update",
"installUpdate": "Install"
}
},
"onboarding": {
"home": {
"title": "Your account was successfully created!",
"subtitle": "For starters, let's set up your profile.",
"profileSettings": "Profile Settings"
},
"profile": {
"title": "About you",
"subtitle": "Tell Lume about yourself to start building your home feed."
},
"finish": {
"title": "Profile setup complete!",
"subtitle": "You can exit the setup here and start using Lume.",
"report": "Report a issue"
}
},
"activity": {
"title": "Activity",
"empty": "Yo! Nothing new yet.",
"mention": "mention you",
"repost": "reposted",
"zap": "zapped",
"newReply": "New reply",
"boost": "Boost",
"boostSubtitle": "@ Someone has reposted to your note",
"conversation": "Conversation",
"conversationSubtitle": "@ Someone has replied to your note"
}
}

View File

@@ -1,59 +0,0 @@
-- Add migration script here
-- create accounts table
-- is_active (multi-account feature), value:
-- 0: false
-- 1: true
CREATE TABLE
accounts (
id INTEGER NOT NULL PRIMARY KEY,
npub TEXT NOT NULL UNIQUE,
pubkey TEXT NOT NULL UNIQUE,
privkey TEXT NOT NULL,
follows JSON,
is_active INTEGER NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- create notes table
CREATE TABLE
notes (
id INTEGER NOT NULL PRIMARY KEY,
event_id TEXT NOT NULL UNIQUE,
account_id INTEGER NOT NULL,
pubkey TEXT NOT NULL,
kind INTEGER NOT NULL DEFAULT 1,
tags JSON,
content TEXT NOT NULL,
created_at INTEGER NOT NULL,
parent_id TEXT,
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 TABLE
settings (
id INTEGER NOT NULL PRIMARY KEY,
key TEXT NOT NULL,
value TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- create metadata table
CREATE TABLE
metadata (
id TEXT NOT NULL PRIMARY KEY,
pubkey TEXT NOT NULL,
content TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);

View File

@@ -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
);

View File

@@ -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")

View File

@@ -1,3 +0,0 @@
-- Add migration script here
-- add pubkey to channel
ALTER TABLE channels ADD pubkey TEXT NOT NULL DEFAULT '';

View File

@@ -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
);

View File

@@ -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)
);

View File

@@ -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)
);

View File

@@ -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)
);

View File

@@ -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)
);

View File

View File

@@ -0,0 +1,83 @@
[
{
"default": true,
"official": true,
"label": "onboarding",
"name": "Onboarding",
"description": "Tips for Mastering Lume.",
"url": "/columns/onboarding",
"picture": ""
},
{
"default": true,
"official": true,
"label": "columns_gallery",
"name": "Columns Gallery",
"description": "Expand your experiences.",
"url": "/columns/gallery",
"picture": ""
},
{
"default": false,
"official": true,
"label": "local_feeds",
"name": "Local Feeds",
"description": "All notes from your follows.",
"url": "/columns/newsfeed",
"picture": ""
},
{
"default": false,
"official": true,
"label": "notification",
"name": "Notification",
"description": "All things around you.",
"url": "/columns/notification",
"picture": ""
},
{
"default": false,
"official": true,
"label": "search",
"name": "Search",
"description": "Find anything.",
"url": "/columns/search",
"picture": ""
},
{
"default": false,
"official": true,
"label": "stories",
"name": "Stories",
"description": "Keep up to date with your follows.",
"url": "/columns/stories",
"picture": ""
},
{
"default": false,
"official": true,
"label": "global_feeds",
"name": "Global Feeds",
"description": "Discover all global notes.",
"url": "/columns/global",
"picture": ""
},
{
"default": false,
"official": true,
"label": "group_feeds",
"name": "Group",
"description": "Custom feeds for group of people.",
"url": "/columns/group",
"picture": ""
},
{
"default": false,
"official": true,
"label": "trending",
"name": "Trending",
"description": "Discover all trending notes.",
"url": "/columns/trending",
"picture": ""
}
]

View File

@@ -0,0 +1,2 @@
wss://relay.damus.io,
wss://relay.nostr.net,

View File

@@ -0,0 +1,438 @@
use keyring::Entry;
use keyring_search::{Limit, List, Search};
use nostr_sdk::prelude::*;
use serde::{Deserialize, Serialize};
use specta::Type;
use std::{
collections::HashSet,
fs::{self, File},
str::FromStr,
time::Duration,
};
use tauri::{Emitter, Manager, State};
use crate::{common::init_nip65, Nostr, NOTIFICATION_SUB_ID};
#[derive(Debug, Clone, Serialize, Deserialize, Type)]
struct Account {
password: String,
nostr_connect: Option<String>,
}
#[tauri::command]
#[specta::specta]
pub fn get_accounts() -> Vec<String> {
let search = Search::new().expect("Unexpected.");
let results = search.by_service("Lume Secret Storage");
let list = List::list_credentials(&results, Limit::All);
let accounts: HashSet<String> = list
.split_whitespace()
.filter(|v| v.starts_with("npub1"))
.map(String::from)
.collect();
accounts.into_iter().collect()
}
#[tauri::command]
#[specta::specta]
pub async fn create_account(
name: String,
about: String,
picture: String,
password: String,
state: State<'_, Nostr>,
) -> Result<String, String> {
let client = &state.client;
let keys = Keys::generate();
let npub = keys.public_key().to_bech32().map_err(|e| e.to_string())?;
let secret_key = keys.secret_key();
let enc = EncryptedSecretKey::new(secret_key, password, 16, KeySecurity::Medium)
.map_err(|err| err.to_string())?;
let enc_bech32 = enc.to_bech32().map_err(|err| err.to_string())?;
// Save account
let keyring = Entry::new("Lume Secret Storage", &npub).map_err(|e| e.to_string())?;
let account = Account {
password: enc_bech32,
nostr_connect: None,
};
let j = serde_json::to_string(&account).map_err(|e| e.to_string())?;
let _ = keyring.set_password(&j);
let signer = NostrSigner::Keys(keys);
// Update signer
client.set_signer(Some(signer)).await;
let mut metadata = Metadata::new()
.display_name(name.clone())
.name(name.to_lowercase())
.about(about);
if let Ok(url) = Url::parse(&picture) {
metadata = metadata.picture(url)
}
match client.set_metadata(&metadata).await {
Ok(_) => Ok(npub),
Err(e) => Err(e.to_string()),
}
}
#[tauri::command]
#[specta::specta]
pub async fn import_account(key: String, password: String) -> Result<String, String> {
let (npub, enc_bech32) = match key.starts_with("ncryptsec") {
true => {
let enc = EncryptedSecretKey::from_bech32(key).map_err(|err| err.to_string())?;
let enc_bech32 = enc.to_bech32().map_err(|err| err.to_string())?;
let secret_key = enc.to_secret_key(password).map_err(|err| err.to_string())?;
let keys = Keys::new(secret_key);
let npub = keys.public_key().to_bech32().unwrap();
(npub, enc_bech32)
}
false => {
let secret_key = SecretKey::from_bech32(key).map_err(|err| err.to_string())?;
let keys = Keys::new(secret_key.clone());
let npub = keys.public_key().to_bech32().unwrap();
let enc = EncryptedSecretKey::new(&secret_key, password, 16, KeySecurity::Medium)
.map_err(|err| err.to_string())?;
let enc_bech32 = enc.to_bech32().map_err(|err| err.to_string())?;
(npub, enc_bech32)
}
};
let keyring = Entry::new("Lume Secret Storage", &npub).map_err(|e| e.to_string())?;
let account = Account {
password: enc_bech32,
nostr_connect: None,
};
let pwd = serde_json::to_string(&account).map_err(|e| e.to_string())?;
keyring.set_password(&pwd).map_err(|e| e.to_string())?;
Ok(npub)
}
#[tauri::command]
#[specta::specta]
pub async fn connect_account(uri: String, state: State<'_, Nostr>) -> Result<String, String> {
let client = &state.client;
match NostrConnectURI::parse(uri.clone()) {
Ok(bunker_uri) => {
// Local user
let app_keys = Keys::generate();
let app_secret = app_keys.secret_key().to_secret_hex();
// Get remote user
let remote_user = bunker_uri.signer_public_key().unwrap();
let remote_npub = remote_user.to_bech32().unwrap();
match Nip46Signer::new(bunker_uri, app_keys, Duration::from_secs(120), None) {
Ok(signer) => {
let mut url = Url::parse(&uri).unwrap();
let query: Vec<(String, String)> = url
.query_pairs()
.filter(|(name, _)| name != "secret")
.map(|(name, value)| (name.into_owned(), value.into_owned()))
.collect();
url.query_pairs_mut().clear().extend_pairs(&query);
let key = format!("{}_nostrconnect", remote_npub);
let keyring = Entry::new("Lume Secret Storage", &key).unwrap();
let account = Account {
password: app_secret,
nostr_connect: Some(url.to_string()),
};
let j = serde_json::to_string(&account).map_err(|e| e.to_string())?;
let _ = keyring.set_password(&j);
// Update signer
let _ = client.set_signer(Some(signer.into())).await;
Ok(remote_npub)
}
Err(err) => Err(err.to_string()),
}
}
Err(err) => Err(err.to_string()),
}
}
#[tauri::command]
#[specta::specta]
pub async fn reset_password(key: String, password: String) -> Result<(), String> {
let secret_key = SecretKey::from_bech32(key).map_err(|err| err.to_string())?;
let keys = Keys::new(secret_key.clone());
let npub = keys.public_key().to_bech32().unwrap();
let enc = EncryptedSecretKey::new(&secret_key, password, 16, KeySecurity::Medium)
.map_err(|err| err.to_string())?;
let enc_bech32 = enc.to_bech32().map_err(|err| err.to_string())?;
let keyring = Entry::new("Lume Secret Storage", &npub).map_err(|e| e.to_string())?;
let account = Account {
password: enc_bech32,
nostr_connect: None,
};
let j = serde_json::to_string(&account).map_err(|e| e.to_string())?;
let _ = keyring.set_password(&j);
Ok(())
}
#[tauri::command]
#[specta::specta]
pub fn get_private_key(id: String) -> Result<String, String> {
let keyring = Entry::new("Lume Secret Storage", &id).map_err(|e| e.to_string())?;
let password = keyring.get_password().map_err(|e| e.to_string())?;
Ok(password)
}
#[tauri::command]
#[specta::specta]
pub fn delete_account(id: String) -> Result<(), String> {
let keyring = Entry::new("Lume Secret Storage", &id).map_err(|e| e.to_string())?;
let _ = keyring.delete_credential();
Ok(())
}
#[tauri::command]
#[specta::specta]
pub fn is_account_sync(id: String, handle: tauri::AppHandle) -> bool {
let config_dir = handle
.path()
.app_config_dir()
.expect("Error: app config directory not found.");
fs::metadata(config_dir.join(id)).is_ok()
}
#[tauri::command]
#[specta::specta]
pub async fn login(
account: String,
password: String,
state: State<'_, Nostr>,
handle: tauri::AppHandle,
) -> Result<String, String> {
let client = &state.client;
let keyring = Entry::new("Lume Secret Storage", &account).map_err(|e| e.to_string())?;
let account = match keyring.get_password() {
Ok(pw) => {
let account: Account = serde_json::from_str(&pw).map_err(|e| e.to_string())?;
account
}
Err(e) => return Err(e.to_string()),
};
let public_key = match account.nostr_connect {
None => {
let ncryptsec =
EncryptedSecretKey::from_bech32(account.password).map_err(|e| e.to_string())?;
let secret_key = ncryptsec
.to_secret_key(password)
.map_err(|_| "Wrong password.")?;
let keys = Keys::new(secret_key);
let public_key = keys.public_key().to_bech32().unwrap();
let signer = NostrSigner::Keys(keys);
// Update signer
client.set_signer(Some(signer)).await;
public_key
}
Some(bunker) => {
let uri = NostrConnectURI::parse(bunker).map_err(|e| e.to_string())?;
let public_key = uri.signer_public_key().unwrap().to_bech32().unwrap();
let app_keys = Keys::from_str(&account.password).map_err(|e| e.to_string())?;
match Nip46Signer::new(uri, app_keys, Duration::from_secs(120), None) {
Ok(signer) => {
// Update signer
client.set_signer(Some(signer.into())).await;
public_key
}
Err(e) => return Err(e.to_string()),
}
}
};
// NIP-65: Connect to user's relay list
init_nip65(client, &public_key).await;
// Run seperate thread for syncing data
let pk = public_key.clone();
tauri::async_runtime::spawn(async move {
let config_dir = handle.path().app_config_dir().unwrap();
let state = handle.state::<Nostr>();
let client = &state.client;
// Convert current user to PublicKey
let author = PublicKey::from_str(&pk).unwrap();
// Fetching user's metadata
if let Ok(report) = client
.reconcile(
Filter::new()
.author(author)
.kinds(vec![
Kind::Metadata,
Kind::ContactList,
Kind::MuteList,
Kind::Bookmarks,
Kind::Interests,
Kind::PinList,
])
.limit(1000),
NegentropyOptions::default(),
)
.await
{
println!("Received: {}", report.received.len())
}
// Fetching user's events
if let Ok(report) = client
.reconcile(
Filter::new()
.author(author)
.kinds(vec![Kind::TextNote, Kind::Repost])
.limit(200),
NegentropyOptions::default(),
)
.await
{
println!("Received: {}", report.received.len())
}
// Fetching user's notification
if let Ok(report) = client
.reconcile(
Filter::new()
.pubkey(author)
.kinds(vec![
Kind::TextNote,
Kind::Repost,
Kind::Reaction,
Kind::ZapReceipt,
])
.limit(200),
NegentropyOptions::default(),
)
.await
{
println!("Received: {}", report.received.len())
}
// Subscribe for new notification
if let Ok(e) = client
.subscribe_with_id(
SubscriptionId::new(NOTIFICATION_SUB_ID),
vec![Filter::new()
.pubkey(author)
.kinds(vec![
Kind::TextNote,
Kind::Repost,
Kind::Reaction,
Kind::ZapReceipt,
])
.since(Timestamp::now())],
None,
)
.await
{
println!("Subscribed: {}", e.success.len())
}
// Get user's contact list
let contact_list = {
let contacts = client.get_contact_list(None).await.unwrap();
// Update app's state
state.contact_list.lock().await.clone_from(&contacts);
// Return
contacts
};
// Get events from contact list
if !contact_list.is_empty() {
let authors: Vec<PublicKey> = contact_list.iter().map(|f| f.public_key).collect();
// Fetching contact's metadata
if let Ok(report) = client
.reconcile(
Filter::new()
.authors(authors.clone())
.kinds(vec![Kind::Metadata, Kind::ContactList, Kind::MuteList])
.limit(3000),
NegentropyOptions::default(),
)
.await
{
println!("Received: {}", report.received.len())
}
// Fetching contact's events
if let Ok(report) = client
.reconcile(
Filter::new()
.authors(authors.clone())
.kinds(vec![Kind::TextNote, Kind::Repost])
.limit(1000),
NegentropyOptions::default(),
)
.await
{
println!("Received: {}", report.received.len());
// Save the process status
let _ = File::create(config_dir.join(author.to_bech32().unwrap()));
// Update frontend
handle.emit("synchronized", ()).unwrap();
};
for author in authors.into_iter() {
let filter = Filter::new()
.author(author)
.kind(Kind::ContactList)
.limit(1);
let mut circles = state.circles.lock().await;
let mut list: Vec<PublicKey> = Vec::new();
if let Ok(events) = client.database().query(vec![filter]).await {
if let Some(event) = events.into_iter().next() {
for tag in event.tags.into_iter() {
if let Some(TagStandard::PublicKey {
public_key,
uppercase: false,
..
}) = tag.to_standardized()
{
list.push(public_key)
}
}
if !list.is_empty() {
circles.insert(author, list);
};
}
}
}
} else {
handle.emit("synchronized", ()).unwrap();
}
});
Ok(public_key)
}

View File

@@ -0,0 +1,679 @@
use futures::future::join_all;
use nostr_sdk::prelude::*;
use serde::Serialize;
use specta::Type;
use std::{str::FromStr, time::Duration};
use tauri::State;
use crate::common::{create_event_tags, filter_converstation, parse_event, Meta};
use crate::{Nostr, DEFAULT_DIFFICULTY, FETCH_LIMIT};
#[derive(Debug, Clone, Serialize, Type)]
pub struct RichEvent {
pub raw: String,
pub parsed: Option<Meta>,
}
#[tauri::command]
#[specta::specta]
pub async fn get_event_meta(content: String) -> Result<Meta, ()> {
let meta = parse_event(&content).await;
Ok(meta)
}
#[tauri::command]
#[specta::specta]
pub async fn get_event(id: String, state: State<'_, Nostr>) -> Result<RichEvent, String> {
let client = &state.client;
let event_id = EventId::parse(&id).map_err(|err| err.to_string())?;
let filter = Filter::new().id(event_id);
match client.database().query(vec![filter.clone()]).await {
Ok(events) => {
if let Some(event) = events.first() {
let raw = event.as_json();
let parsed = if event.kind == Kind::TextNote {
Some(parse_event(&event.content).await)
} else {
None
};
Ok(RichEvent { raw, parsed })
} else {
match client
.get_events_of(
vec![filter],
EventSource::relays(Some(Duration::from_secs(5))),
)
.await
{
Ok(events) => {
if let Some(event) = events.first() {
let raw = event.as_json();
let parsed = if event.kind == Kind::TextNote {
Some(parse_event(&event.content).await)
} else {
None
};
Ok(RichEvent { raw, parsed })
} else {
Err("Cannot found this event with current relay list".into())
}
}
Err(err) => Err(err.to_string()),
}
}
}
Err(err) => Err(err.to_string()),
}
}
#[tauri::command]
#[specta::specta]
pub async fn get_event_from(
id: String,
relay_hint: String,
state: State<'_, Nostr>,
) -> Result<RichEvent, String> {
let client = &state.client;
let settings = state.settings.lock().await;
let event_id = EventId::parse(&id).map_err(|err| err.to_string())?;
let filter = Filter::new().id(event_id);
if !settings.use_relay_hint {
match client
.get_events_of(
vec![filter],
EventSource::both(Some(Duration::from_secs(5))),
)
.await
{
Ok(events) => {
if let Some(event) = events.first() {
let raw = event.as_json();
let parsed = if event.kind == Kind::TextNote {
Some(parse_event(&event.content).await)
} else {
None
};
Ok(RichEvent { raw, parsed })
} else {
Err("Cannot found this event with current relay list".into())
}
}
Err(err) => Err(err.to_string()),
}
} else {
// Add relay hint to relay pool
if let Err(e) = client.add_relay(&relay_hint).await {
return Err(e.to_string());
}
if let Err(e) = client.connect_relay(&relay_hint).await {
return Err(e.to_string());
}
match client
.get_events_of(
vec![Filter::new().id(event_id)],
EventSource::both(Some(Duration::from_secs(5))),
)
.await
{
Ok(events) => {
if let Some(event) = events.first() {
let raw = event.as_json();
let parsed = if event.kind == Kind::TextNote {
Some(parse_event(&event.content).await)
} else {
None
};
Ok(RichEvent { raw, parsed })
} else {
Err("Cannot found this event with current relay list".into())
}
}
Err(err) => Err(err.to_string()),
}
}
}
#[tauri::command]
#[specta::specta]
pub async fn get_replies(id: String, state: State<'_, Nostr>) -> Result<Vec<RichEvent>, String> {
let client = &state.client;
let event_id = EventId::parse(&id).map_err(|err| err.to_string())?;
let filter = Filter::new().kinds(vec![Kind::TextNote]).event(event_id);
match client
.get_events_of(
vec![filter],
EventSource::both(Some(Duration::from_secs(5))),
)
.await
{
Ok(events) => {
let futures = events.iter().map(|ev| async move {
let raw = ev.as_json();
let parsed = if ev.kind == Kind::TextNote {
Some(parse_event(&ev.content).await)
} else {
None
};
RichEvent { raw, parsed }
});
let rich_events = join_all(futures).await;
Ok(rich_events)
}
Err(err) => Err(err.to_string()),
}
}
#[tauri::command]
#[specta::specta]
pub async fn subscribe_to(id: String, state: State<'_, Nostr>) -> Result<(), String> {
let client = &state.client;
let subscription_id = SubscriptionId::new(&id);
let event_id = EventId::parse(&id).map_err(|err| err.to_string())?;
let filter = Filter::new()
.kinds(vec![Kind::TextNote])
.event(event_id)
.since(Timestamp::now());
match client
.subscribe_with_id(subscription_id, vec![filter], None)
.await
{
Ok(_) => Ok(()),
Err(e) => Err(e.to_string()),
}
}
#[tauri::command]
#[specta::specta]
pub async fn get_events_by(
public_key: String,
limit: i32,
state: State<'_, Nostr>,
) -> Result<Vec<RichEvent>, String> {
let client = &state.client;
let author = PublicKey::parse(&public_key).map_err(|err| err.to_string())?;
let filter = Filter::new()
.kinds(vec![Kind::TextNote, Kind::Repost])
.author(author)
.limit(limit as usize);
match client
.get_events_of(vec![filter], EventSource::Database)
.await
{
Ok(events) => {
let fils = filter_converstation(events);
let futures = fils.iter().map(|ev| async move {
let raw = ev.as_json();
let parsed = if ev.kind == Kind::TextNote {
Some(parse_event(&ev.content).await)
} else {
None
};
RichEvent { raw, parsed }
});
let rich_events = join_all(futures).await;
Ok(rich_events)
}
Err(err) => Err(err.to_string()),
}
}
#[tauri::command]
#[specta::specta]
pub async fn get_local_events(
until: Option<&str>,
state: State<'_, Nostr>,
) -> Result<Vec<RichEvent>, String> {
let client = &state.client;
let as_of = match until {
Some(until) => Timestamp::from_str(until).map_err(|err| err.to_string())?,
None => Timestamp::now(),
};
let filter = Filter::new()
.kinds(vec![Kind::TextNote, Kind::Repost])
.limit(FETCH_LIMIT)
.until(as_of);
match client.database().query(vec![filter]).await {
Ok(events) => {
let fils = filter_converstation(events);
let futures = fils.iter().map(|ev| async move {
let raw = ev.as_json();
let parsed = if ev.kind == Kind::TextNote {
Some(parse_event(&ev.content).await)
} else {
None
};
RichEvent { raw, parsed }
});
let rich_events = join_all(futures).await;
Ok(rich_events)
}
Err(err) => Err(err.to_string()),
}
}
#[tauri::command]
#[specta::specta]
pub async fn get_group_events(
public_keys: Vec<&str>,
until: Option<&str>,
state: State<'_, Nostr>,
) -> Result<Vec<RichEvent>, String> {
let client = &state.client;
let as_of = match until {
Some(until) => Timestamp::from_str(until).map_err(|err| err.to_string())?,
None => Timestamp::now(),
};
let authors: Vec<PublicKey> = public_keys
.iter()
.map(|p| {
if p.starts_with("npub1") {
PublicKey::from_bech32(p).map_err(|err| err.to_string())
} else {
PublicKey::from_hex(p).map_err(|err| err.to_string())
}
})
.collect::<Result<Vec<_>, _>>()?;
let filter = Filter::new()
.kinds(vec![Kind::TextNote, Kind::Repost])
.limit(20)
.until(as_of)
.authors(authors);
match client
.get_events_of(
vec![filter],
EventSource::both(Some(Duration::from_secs(5))),
)
.await
{
Ok(events) => {
let fils = filter_converstation(events);
let futures = fils.iter().map(|ev| async move {
let raw = ev.as_json();
let parsed = if ev.kind == Kind::TextNote {
Some(parse_event(&ev.content).await)
} else {
None
};
RichEvent { raw, parsed }
});
let rich_events = join_all(futures).await;
Ok(rich_events)
}
Err(err) => Err(err.to_string()),
}
}
#[tauri::command]
#[specta::specta]
pub async fn get_global_events(
until: Option<&str>,
state: State<'_, Nostr>,
) -> Result<Vec<RichEvent>, String> {
let client = &state.client;
let as_of = match until {
Some(until) => Timestamp::from_str(until).map_err(|err| err.to_string())?,
None => Timestamp::now(),
};
let filter = Filter::new()
.kinds(vec![Kind::TextNote, Kind::Repost])
.limit(20)
.until(as_of);
match client
.get_events_of(
vec![filter],
EventSource::both(Some(Duration::from_secs(5))),
)
.await
{
Ok(events) => {
let fils = filter_converstation(events);
let futures = fils.iter().map(|ev| async move {
let raw = ev.as_json();
let parsed = if ev.kind == Kind::TextNote {
Some(parse_event(&ev.content).await)
} else {
None
};
RichEvent { raw, parsed }
});
let rich_events = join_all(futures).await;
Ok(rich_events)
}
Err(err) => Err(err.to_string()),
}
}
#[tauri::command]
#[specta::specta]
pub async fn get_hashtag_events(
hashtags: Vec<&str>,
until: Option<&str>,
state: State<'_, Nostr>,
) -> Result<Vec<RichEvent>, String> {
let client = &state.client;
let as_of = match until {
Some(until) => Timestamp::from_str(until).map_err(|err| err.to_string())?,
None => Timestamp::now(),
};
let filter = Filter::new()
.kinds(vec![Kind::TextNote, Kind::Repost])
.limit(20)
.until(as_of)
.hashtags(hashtags);
match client
.get_events_of(
vec![filter],
EventSource::both(Some(Duration::from_secs(5))),
)
.await
{
Ok(events) => {
let fils = filter_converstation(events);
let futures = fils.iter().map(|ev| async move {
let raw = ev.as_json();
let parsed = if ev.kind == Kind::TextNote {
Some(parse_event(&ev.content).await)
} else {
None
};
RichEvent { raw, parsed }
});
let rich_events = join_all(futures).await;
Ok(rich_events)
}
Err(err) => Err(err.to_string()),
}
}
#[tauri::command]
#[specta::specta]
pub async fn publish(
content: String,
warning: Option<String>,
difficulty: Option<u8>,
state: State<'_, Nostr>,
) -> Result<String, String> {
let client = &state.client;
// Create tags from content
let mut tags = create_event_tags(&content);
// Add client tag
// TODO: allow user config this setting
tags.push(Tag::custom(TagKind::custom("client"), vec!["Lume"]));
// Add content-warning tag if present
if let Some(reason) = warning {
let t = TagStandard::ContentWarning {
reason: Some(reason),
};
let tag = Tag::from_standardized(t);
tags.push(tag)
};
// Create unsigned event
let builder =
EventBuilder::text_note(content, tags).pow(difficulty.unwrap_or(DEFAULT_DIFFICULTY));
// Publish
match client.send_event_builder(builder).await {
Ok(event_id) => Ok(event_id.to_bech32().unwrap()),
Err(err) => Err(err.to_string()),
}
}
#[tauri::command]
#[specta::specta]
pub async fn reply(
content: String,
to: String,
root: Option<String>,
state: State<'_, Nostr>,
) -> Result<String, String> {
let client = &state.client;
let database = client.database();
// Create tags from content
let mut tags = create_event_tags(&content);
let reply_id = EventId::parse(&to).map_err(|err| err.to_string())?;
match database.query(vec![Filter::new().id(reply_id)]).await {
Ok(events) => {
if let Some(event) = events.first() {
let relay_hint = if let Some(relays) = database
.event_seen_on_relays(&event.id)
.await
.map_err(|err| err.to_string())?
{
relays.into_iter().next().map(UncheckedUrl::new)
} else {
None
};
let t = TagStandard::Event {
event_id: event.id,
relay_url: relay_hint,
marker: Some(Marker::Reply),
public_key: Some(event.pubkey),
};
let tag = Tag::from(t);
tags.push(tag)
} else {
return Err("Reply event is not found.".into());
}
}
Err(err) => return Err(err.to_string()),
};
if let Some(id) = root {
let root_id = match EventId::from_hex(id) {
Ok(val) => val,
Err(_) => return Err("Event is not valid.".into()),
};
if let Ok(events) = database.query(vec![Filter::new().id(root_id)]).await {
if let Some(event) = events.first() {
let relay_hint = if let Some(relays) = database
.event_seen_on_relays(&event.id)
.await
.map_err(|err| err.to_string())?
{
relays.into_iter().next().map(UncheckedUrl::new)
} else {
None
};
let t = TagStandard::Event {
event_id: event.id,
relay_url: relay_hint,
marker: Some(Marker::Root),
public_key: Some(event.pubkey),
};
let tag = Tag::from(t);
tags.push(tag)
}
}
};
match client.publish_text_note(content, tags).await {
Ok(event_id) => Ok(event_id.to_bech32().map_err(|err| err.to_string())?),
Err(err) => Err(err.to_string()),
}
}
#[tauri::command]
#[specta::specta]
pub async fn repost(raw: &str, state: State<'_, Nostr>) -> Result<String, String> {
let client = &state.client;
let event = Event::from_json(raw).map_err(|err| err.to_string())?;
match client.repost(&event, None).await {
Ok(event_id) => Ok(event_id.to_string()),
Err(err) => Err(err.to_string()),
}
}
#[tauri::command]
#[specta::specta]
pub async fn delete(id: String, state: State<'_, Nostr>) -> Result<String, String> {
let client = &state.client;
let event_id = EventId::parse(&id).map_err(|err| err.to_string())?;
match client.delete_event(event_id).await {
Ok(event_id) => Ok(event_id.to_string()),
Err(err) => Err(err.to_string()),
}
}
#[tauri::command]
#[specta::specta]
pub async fn event_to_bech32(id: String, state: State<'_, Nostr>) -> Result<String, String> {
let client = &state.client;
let event_id = EventId::parse(&id).map_err(|err| err.to_string())?;
let seens = client
.database()
.event_seen_on_relays(&event_id)
.await
.map_err(|err| err.to_string())?;
match seens {
Some(set) => {
let relays = set.into_iter().collect::<Vec<_>>();
let event = Nip19Event::new(event_id, relays);
match event.to_bech32() {
Ok(id) => Ok(id),
Err(err) => Err(err.to_string()),
}
}
None => match event_id.to_bech32() {
Ok(id) => Ok(id),
Err(err) => Err(err.to_string()),
},
}
}
#[tauri::command]
#[specta::specta]
pub async fn user_to_bech32(user: &str, state: State<'_, Nostr>) -> Result<String, String> {
let client = &state.client;
let public_key = PublicKey::parse(user).map_err(|err| err.to_string())?;
match client
.get_events_of(
vec![Filter::new()
.author(public_key)
.kind(Kind::RelayList)
.limit(1)],
EventSource::both(Some(Duration::from_secs(5))),
)
.await
{
Ok(events) => match events.first() {
Some(event) => {
let relay_list = nip65::extract_relay_list(event);
let relays = relay_list
.into_iter()
.map(|i| i.0.to_string())
.collect::<Vec<_>>();
let profile =
Nip19Profile::new(public_key, relays).map_err(|err| err.to_string())?;
Ok(profile.to_bech32().map_err(|err| err.to_string())?)
}
None => match public_key.to_bech32() {
Ok(pk) => Ok(pk),
Err(err) => Err(err.to_string()),
},
},
Err(_) => match public_key.to_bech32() {
Ok(pk) => Ok(pk),
Err(err) => Err(err.to_string()),
},
}
}
#[tauri::command]
#[specta::specta]
pub async fn search(
query: String,
until: Option<String>,
state: State<'_, Nostr>,
) -> Result<Vec<RichEvent>, String> {
let client = &state.client;
let timestamp = match until {
Some(str) => Timestamp::from_str(&str).map_err(|err| err.to_string())?,
None => Timestamp::now(),
};
let filter = Filter::new()
.kinds(vec![Kind::TextNote, Kind::Metadata])
.search(query)
.until(timestamp)
.limit(FETCH_LIMIT);
match client
.get_events_of(
vec![filter],
EventSource::both(Some(Duration::from_secs(5))),
)
.await
{
Ok(events) => {
let fils = filter_converstation(events);
let futures = fils.iter().map(|ev| async move {
let raw = ev.as_json();
let parsed = if ev.kind == Kind::TextNote {
Some(parse_event(&ev.content).await)
} else {
None
};
RichEvent { raw, parsed }
});
let rich_events = join_all(futures).await;
Ok(rich_events)
}
Err(e) => Err(e.to_string()),
}
}

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