Compare commits

..

661 Commits

Author SHA1 Message Date
Abdullah Atta
59945411e8 editor: improve task lists 2024-03-20 10:59:43 +05:00
Abdullah Atta
0f2554b9b3 web: fix assigning a color removes that color from all other notes 2024-03-20 07:24:29 +05:00
Abdullah Atta
181739dcd2 web: fix changes in callout heading not causing toc update 2024-03-20 07:16:34 +05:00
Abdullah Atta
ab8d283059 web: fix toc items not indented 2024-03-20 07:16:07 +05:00
Abdullah Atta
468f7c6a56 editor: add block-id on nodes inside callout 2024-03-20 07:15:48 +05:00
Abdullah Atta
c36a76cfdc editor: disable conflicting simple checklist input rule 2024-03-20 06:55:15 +05:00
Ammar Ahmed
57834bc9f1 mobile: fix tab title 2024-03-20 06:42:28 +05:00
Abdullah Atta
cad28f3436 web: fix image picker shown when there are 0 images 2024-03-19 22:44:21 +05:00
Abdullah Atta
cfb8b1ef0b editor: add support for copy/pasting code blocks with highlighting 2024-03-19 22:40:44 +05:00
Abdullah Atta
b626577730 web: fix crash on copying from codeblock 2024-03-19 22:32:43 +05:00
Abdullah Atta
e8ed3e2d8b web: only show content blocks with direct links in referenced in tab 2024-03-19 22:15:40 +05:00
Abdullah Atta
0ac3e4b67f core: fix extraction of blocks with links 2024-03-19 22:15:20 +05:00
Abdullah Atta
6de0112600 editor: fix hover popup appearing in wrong position 2024-03-19 22:14:42 +05:00
Abdullah Atta
4b8c35b6af editor: fix outline list has no data-block-id attribute 2024-03-19 21:56:38 +05:00
Abdullah Atta
c72ee27aa4 editor: fix DOMException when removing react node views 2024-03-19 16:29:53 +05:00
Abdullah Atta
875436a1ad editor: minor refactors 2024-03-19 12:30:05 +05:00
Abdullah Atta
1ede80c33c editor: fix crash on select all + backspace with lists 2024-03-19 12:29:56 +05:00
Abdullah Atta
e6de183f77 editor: fix crash on removing task list 2024-03-19 12:29:37 +05:00
Ammar Ahmed
514302d20d editor: enable block id on checklist and callout 2024-03-19 12:03:07 +05:00
Abdullah Atta
14946e092d editor: fix react node views for react 18 2024-03-19 12:02:25 +05:00
Ammar Ahmed
d9fafc7703 editor: always show note internal link button in toolbar 2024-03-19 11:29:48 +05:00
Abdullah Atta
5e8ab57271 editor: handle link open on click 2024-03-18 12:09:03 +05:00
Abdullah Atta
00c648341b ui: fix weird zIndex animation on popups 2024-03-18 12:05:18 +05:00
Abdullah Atta
4063c573ec editor: update tiptap & other packages 2024-03-18 12:00:23 +05:00
Abdullah Atta
72f908bc90 editor: fix newline added in callout on typing anything 2024-03-18 11:20:51 +05:00
Abdullah Atta
4eebe10f2e editor: fix => turning into a callout 2024-03-18 11:18:41 +05:00
Abdullah Atta
6c0d6127ba editor: fix image size resetting on resize 2024-03-18 11:13:05 +05:00
Abdullah Atta
4c9381599f web: fix images not getting attached 2024-03-18 11:12:36 +05:00
Abdullah Atta
8650ed2ba5 web: fix attachment delete dialog not rendering any buttons 2024-03-18 10:27:31 +05:00
Abdullah Atta
600953baa7 core: fix attachment deletion 2024-03-18 10:27:31 +05:00
Ammar Ahmed
8967280e54 mobile: use contentBlocksWithLinks 2024-03-18 10:22:59 +05:00
Ammar Ahmed
57a2181e62 core: fix duplicate backlinks shown on note 2024-03-18 10:22:59 +05:00
Ammar Ahmed
911cacd9e9 mobile: cleanup 2024-03-18 10:22:59 +05:00
Ammar Ahmed
361be50e3f mobile: show error if attachment download fails 2024-03-18 10:22:59 +05:00
Ammar Ahmed
6a306ddda2 core: support video,audio,document filter in attachments 2024-03-18 10:22:59 +05:00
Ammar Ahmed
1d6045f5ac mobile: fix all attachments showin in note attachments 2024-03-18 10:22:59 +05:00
Abdullah Atta
3d286f6899 editor: #dialogContainer > .dialogContainer 2024-03-18 10:20:56 +05:00
Abdullah Atta
859c35e387 web: fix editor dom structure 2024-03-18 10:20:31 +05:00
Abdullah Atta
8d16611124 web: fix editor toolbar is not sticky 2024-03-18 08:31:14 +05:00
Ammar Ahmed
36afdf182c editor: fix collapsing a callout collapses all parent callouts 2024-03-16 13:10:16 +05:00
Ammar Ahmed
ad448b567b mobile: fix webpack config 2024-03-16 10:35:21 +05:00
Ammar Ahmed
e80f329f33 mobile: release v3.0.10 2024-03-16 09:54:23 +05:00
Ammar Ahmed
0c6ece1e5b mobile: open note in new tab 2024-03-16 09:43:17 +05:00
Ammar Ahmed
5b2a72c8d6 mobile: fix incorrect tab content by default 2024-03-16 08:03:36 +05:00
Ammar Ahmed
fc3a788575 mobile: fix incorrect button type in dialog 2024-03-16 07:23:10 +05:00
Ammar Ahmed
fd61dbfe32 mobile: fix publish button hidden on tablet 2024-03-15 11:04:04 +05:00
Ammar Ahmed
1a11bea05e mobile: cleanup 2024-03-15 10:54:27 +05:00
Ammar Ahmed
43e7c8c7f9 mobile: update deps 2024-03-15 10:51:36 +05:00
Ammar Ahmed
db90d4c443 mobile: fix app lock shows on session expired sheet 2024-03-15 10:50:53 +05:00
Ammar Ahmed
f375c7d3e4 mobile: support showing diff of conflicted note 2024-03-15 10:50:26 +05:00
Ammar Ahmed
fc5aeeb221 editor: add highlight diff extension 2024-03-15 10:49:37 +05:00
Ammar Ahmed
31685d12bd mobile: remove redundant code 2024-03-15 09:02:15 +05:00
Ammar Ahmed
5ffa11a7f6 mobile: render title after loaded 2024-03-15 08:51:24 +05:00
Ammar Ahmed
08e8035fcb mobile: bump android version 2024-03-15 08:08:16 +05:00
Ammar Ahmed
76b3c5ed7a mobile: fix button action 2024-03-15 08:07:11 +05:00
Ammar Ahmed
29468916e3 mobile: check if editorController.current is undefined 2024-03-15 08:05:22 +05:00
Ammar Ahmed
dde5dcd8fb mobile: cleanup 2024-03-15 07:44:33 +05:00
Ammar Ahmed
381184f8c4 mobile: add readonly editor 2024-03-15 07:43:25 +05:00
Abdullah Atta
5a78d9e517 web: make opfs safer by allowing only 1 operation at a time 2024-03-15 07:14:08 +05:00
Abdullah Atta
9edf5402c9 web: fix more tests 2024-03-14 13:07:01 +05:00
Abdullah Atta
74b49f24a8 editor: fix some images not loading 2024-03-14 13:07:01 +05:00
Abdullah Atta
dfcbf3045a web: fix lock/unlock from properties not working 2024-03-14 13:07:01 +05:00
Abdullah Atta
345922e74a web: fix title of locked note not saving 2024-03-14 13:07:01 +05:00
Abdullah Atta
21475c0514 web: update url on switching between sessions 2024-03-14 13:07:01 +05:00
Abdullah Atta
d498a7a2b9 web: hide tags input in new session 2024-03-14 13:07:01 +05:00
Abdullah Atta
e627c3326c web: bring back edited date in footer 2024-03-14 13:07:01 +05:00
Abdullah Atta
ad35e83269 web: fix typing fast in title input caused some characters to miss 2024-03-14 13:07:01 +05:00
Ammar Ahmed
38f04ca70a mobile: fix webpack config 2024-03-14 11:57:59 +05:00
Abdullah Atta
eeeda75408 global: update lockfiles 2024-03-14 11:11:52 +05:00
Abdullah Atta
5aec94f8a9 editor: fix type errors 2024-03-14 11:11:39 +05:00
Ammar Ahmed
ea274c5adf mobile: release v3.0.9 2024-03-14 10:56:12 +05:00
Abdullah Atta
81408f7763 web: show error if backup import fails 2024-03-14 10:53:23 +05:00
Ammar Ahmed
15dc333969 mobile: readd editor overlay 2024-03-14 10:44:55 +05:00
Ammar Ahmed
44a07c7cf6 mobile: fix tab bugs 2024-03-14 10:43:49 +05:00
Abdullah Atta
114338ab80 web: bump version to 3.0.7 2024-03-14 10:42:22 +05:00
Abdullah Atta
64e0129107 editor: do not add data-block-id attribute if no blockid 2024-03-14 10:37:28 +05:00
Abdullah Atta
749eea4979 editor: highlight active block for 5 seconds 2024-03-14 10:37:06 +05:00
Abdullah Atta
7ba785aa32 core: fix imports 2024-03-14 10:27:58 +05:00
Abdullah Atta
b4ec3fbbf1 web: improve internal links ui 2024-03-14 10:21:36 +05:00
Abdullah Atta
c0ff54afbb core: do not wrap text in content blocks 2024-03-14 10:13:19 +05:00
Abdullah Atta
6807871bb0 web: ignore realtime sync if it doesn't update content or note title 2024-03-14 10:04:00 +05:00
Abdullah Atta
6f07a3c03c web: fix behavior of editor action bar 2024-03-14 10:03:28 +05:00
Abdullah Atta
539c270c18 web: always show note statistics of active editor 2024-03-14 10:03:05 +05:00
Abdullah Atta
a7b190116a web: fix diff viewer not showing images 2024-03-14 10:02:42 +05:00
Abdullah Atta
ecba9f87be web: fix concurrent opfs reads throwing errors 2024-03-14 10:02:21 +05:00
Abdullah Atta
b11539d20f web: await promises 2024-03-14 10:01:47 +05:00
Abdullah Atta
66469b1fd5 web: use database updated event to add editor reactivity 2024-03-14 10:01:34 +05:00
Abdullah Atta
e098d65008 core: fix attachment not unlinked from notes on removal 2024-03-14 09:59:22 +05:00
Abdullah Atta
b837b9728e core: publish database updated events on content remove/update 2024-03-14 09:59:02 +05:00
Abdullah Atta
959f34c05c core: refactor database update event logic 2024-03-14 09:58:36 +05:00
Abdullah Atta
7465d4d149 core: add method to rebuild trash cache 2024-03-14 09:57:47 +05:00
Abdullah Atta
670e2bbd6d core: simplify remove from all notebooks logic 2024-03-14 09:57:02 +05:00
Abdullah Atta
7e4120e242 core: publish database updated event on relations unlink 2024-03-14 09:55:01 +05:00
Abdullah Atta
a76b26e64c core: fix note not unlinked from vault on unlock 2024-03-14 09:54:21 +05:00
Abdullah Atta
84d91d70d1 core: rebuild trash cache on sync complete 2024-03-14 09:54:00 +05:00
Abdullah Atta
cc2ba899e8 web: reopen notes after permanently deleting an attachment 2024-03-14 06:42:09 +05:00
Abdullah Atta
047efd5079 web: fix content is not updated for new notes in realtime sync 2024-03-14 06:41:39 +05:00
Abdullah Atta
3ae297ca04 web: update editor sessions in realtime 2024-03-14 06:41:17 +05:00
Abdullah Atta
82c7bcd0db web: do not show internal links, notebooks etc in properties for trash preview 2024-03-14 06:40:19 +05:00
Abdullah Atta
00e087023a web: fix editor title not changing on realtime sync 2024-03-14 06:39:39 +05:00
Abdullah Atta
c254f453ce web: special icons for readonly and trash preview tabs 2024-03-14 06:39:12 +05:00
Abdullah Atta
fb903f48e7 web: fix trash note preview is not readonly 2024-03-14 06:38:30 +05:00
Abdullah Atta
248d2a87b3 core: standarize database updated event 2024-03-13 11:01:50 +05:00
Abdullah Atta
268f5f012b global: upgrade typescript to 5.4.2 2024-03-13 09:01:12 +05:00
Abdullah Atta
ba0e8d5d3f web: fix type errors 2024-03-13 09:01:12 +05:00
Abdullah Atta
925cc7a3bc core: sort & group reminders in sqlite 2024-03-13 09:01:12 +05:00
Ammar Ahmed
e39e5a7bf0 mobile: minor cleanup 2024-03-13 08:59:57 +05:00
Ammar Ahmed
57de6fd014 mobile: fix search in share extension 2024-03-12 11:55:57 +05:00
Ammar Ahmed
679f6644f7 editor: do not focus editor on end search 2024-03-12 11:55:57 +05:00
Ammar Ahmed
b5e18fe350 mobile: fix editor tab bugs 2024-03-12 11:55:57 +05:00
Ammar Ahmed
9156c57b39 mobile: fix use-db-item hook not working 2024-03-12 11:55:57 +05:00
Ammar Ahmed
02bf88252c mobile: fix attachment exists check when uploading file 2024-03-12 11:55:57 +05:00
Ammar Ahmed
fe54930332 mobile: fix attachment progress not working 2024-03-12 11:55:57 +05:00
Ammar Ahmed
b7d72437de mobile: fix note with attachments not saved from share extension 2024-03-12 11:55:57 +05:00
Ammar Ahmed
2250299608 mobile: fix share extension append to exisitng note not working 2024-03-12 11:55:57 +05:00
Ammar Ahmed
1807109805 common: up version when migrating toolbar 2024-03-12 11:55:57 +05:00
Abdullah Atta
8b47626173 core: fix table x has no column y errors 2024-03-12 08:24:53 +05:00
Ammar Ahmed
ee9474afb7 mobile: blur editor on back 2024-03-12 08:24:53 +05:00
Abdullah Atta
a9b4c5e256 web: use dnd-kit for smoother drag/drop in tabs 2024-03-12 08:24:53 +05:00
Abdullah Atta
d41f049cee web: always sort pinned tabs first 2024-03-12 08:24:53 +05:00
Abdullah Atta
0e43408bff web: fix pinned tabs getting unpinned after app refresh 2024-03-12 08:24:53 +05:00
Ammar Ahmed
1c0a8e00a6 mobile: add useNoteLocked hook 2024-03-12 08:24:53 +05:00
Ammar Ahmed
c106db2422 mobile: fix ui of linked blocks 2024-03-12 08:24:53 +05:00
Ammar Ahmed
23734558dd mobile: fix jump to block 2024-03-12 08:24:53 +05:00
Ammar Ahmed
8ca8f54c33 mobile: fix content block ui 2024-03-12 08:24:53 +05:00
Ammar Ahmed
cad349ca12 mobile: fix loading placeholder position 2024-03-12 08:24:53 +05:00
Ammar Ahmed
ac7fb315d6 mobile: fix colors and size of icons in editor header 2024-03-12 08:24:53 +05:00
Ammar Ahmed
d7302a2cf0 mobile: use flatlist for rendering tabs 2024-03-12 08:24:53 +05:00
Ammar Ahmed
3254a1ff30 mobile: show keyboard when opening new tab or empty tab 2024-03-12 08:24:52 +05:00
Ammar Ahmed
2cab3dd486 mobile: make tab active on focus 2024-03-12 08:24:52 +05:00
Ammar Ahmed
e2767f2f77 mobile: fix tabs 2024-03-12 08:24:52 +05:00
Ammar Ahmed
4382576bf9 mobile: fix minor bugs in tabs 2024-03-12 08:24:52 +05:00
Ammar Ahmed
e89f7e3819 mobile: fix duplicate imports 2024-03-12 08:24:31 +05:00
Abdullah Atta
bced2b7872 web: bring back editor margins toggle in action bar 2024-03-12 08:24:31 +05:00
Abdullah Atta
7c6596f826 web: minor ui fixes 2024-03-12 08:24:31 +05:00
Abdullah Atta
1afad07b2d web: fix section subtitle horizontal margin 2024-03-12 08:24:31 +05:00
Abdullah Atta
43ccb398c0 web: add placeholder in table of contents 2024-03-12 08:24:30 +05:00
Abdullah Atta
5fbeb152e5 web: update diff content on tab switch 2024-03-12 08:24:30 +05:00
Abdullah Atta
d5e7fbabaa web: minor refactor 2024-03-12 08:24:30 +05:00
Abdullah Atta
33ff702295 web: fix properties section horizontal margin 2024-03-12 08:24:30 +05:00
Abdullah Atta
f3322cc8f1 core: remove note from vault if its content is not locked 2024-03-12 08:24:30 +05:00
Abdullah Atta
4356d10028 web: fix locked notes getting overwritten with unencrypted content 2024-03-12 08:24:30 +05:00
Abdullah Atta
371984a366 web: fix diff session not opening after app refresh 2024-03-12 08:24:30 +05:00
Abdullah Atta
e25016354e editor: fix search decorations not cleared on search end 2024-03-12 08:24:30 +05:00
Abdullah Atta
8fe4bddb85 web: add all missing functionality in note linking dialog 2024-03-12 08:24:30 +05:00
Abdullah Atta
fc121ef396 web: remove custom search state logic & use editor commands 2024-03-12 08:24:30 +05:00
Abdullah Atta
73a1295e29 editor: fix text on selected search result not visible 2024-03-12 08:24:30 +05:00
Abdullah Atta
8abf57ae24 editor: use global search store for managing search state 2024-03-12 08:24:30 +05:00
Abdullah Atta
a0f14dc3ef editor: minor refactor 2024-03-12 08:24:30 +05:00
Abdullah Atta
ce8cba4f13 web: remove locked session type guard (switch to simple boolean)
the type guard was incorrect
2024-03-12 08:24:30 +05:00
Abdullah Atta
e726bd073b web: add content to new session type 2024-03-12 08:24:30 +05:00
Abdullah Atta
3ee5ea097b web: fix editor title not updating on creating a note 2024-03-12 08:24:30 +05:00
Abdullah Atta
6272e8b805 web: remove preview session type 2024-03-12 08:24:30 +05:00
Abdullah Atta
ae5c323d3b web: ${id}_editorScroll > editorScroll_${id} 2024-03-12 08:24:29 +05:00
Abdullah Atta
afc3ede9b0 web: set session content before saving 2024-03-12 08:24:11 +05:00
Abdullah Atta
7671e0e297 web: add dialog container inside tab 2024-03-12 08:24:11 +05:00
Abdullah Atta
005f2d8ef1 web: handle locked notes properly in real time editor sync 2024-03-12 08:24:11 +05:00
Abdullah Atta
7b20acaa5a web: freeze unhydrated sessions 2024-03-12 08:24:11 +05:00
Abdullah Atta
da938ec348 web: remove unused & commented out code 2024-03-12 08:24:11 +05:00
Abdullah Atta
d32d438eeb web: focus editor on switching tab and toggle active class 2024-03-12 08:23:47 +05:00
Abdullah Atta
e289caf561 web: define editor & session once and pass it everywhere 2024-03-12 08:23:47 +05:00
Abdullah Atta
e8cd0c0a52 web: remove unlocked session type 2024-03-12 08:23:47 +05:00
Abdullah Atta
62bdee7789 web: set session id on saving note 2024-03-12 08:23:47 +05:00
Abdullah Atta
ccb9c492a8 core: add block ids before returning content 2024-03-12 08:23:46 +05:00
Abdullah Atta
4506e5e90a editor: fix range error crash 2024-03-12 08:23:46 +05:00
Abdullah Atta
2cc772106b editor: do not add block id on list items
(because they already contain paragraphs and we don't want duplicates)
2024-03-12 08:23:46 +05:00
Abdullah Atta
a82caf5da2 editor: do not touch editor when its view is destroyed 2024-03-12 08:23:46 +05:00
Abdullah Atta
1cebcb7876 editor: fix selection/focus is lost when editor state is updated 2024-03-12 08:23:46 +05:00
Abdullah Atta
0247903772 editor: fix list type thumbnails in toolbar 2024-03-12 08:23:46 +05:00
Abdullah Atta
1f5164660d editor: hide hover popup on editor destroy 2024-03-12 08:23:46 +05:00
Abdullah Atta
3a835ad90d editor: render interactive popups in popup instead of menu 2024-03-12 08:23:46 +05:00
Abdullah Atta
18c13ed8fe editor: scroll blocks into view only for active editor 2024-03-12 08:23:46 +05:00
Abdullah Atta
35345b9214 editor: query editor dom based on active editor class 2024-03-12 08:23:46 +05:00
Abdullah Atta
2c98b98765 editor: render all popups in popup container 2024-03-12 08:23:46 +05:00
Abdullah Atta
ace224b03c editor: close all popups and dropdowns on switching tabs 2024-03-12 08:23:46 +05:00
Abdullah Atta
23e9b07310 editor: fix placeholder is not visible 2024-03-12 08:23:46 +05:00
Abdullah Atta
fdc5642b3c ui: allow setting popup container 2024-03-12 08:23:46 +05:00
Abdullah Atta
9c81432dfd web: disable properties button in action bar when diff is open 2024-03-12 08:23:46 +05:00
Abdullah Atta
1825796649 web: allow session item size to grow 2024-03-12 08:23:46 +05:00
Abdullah Atta
9c5940e872 web: add support for /notes/:noteId/edit hash route 2024-03-12 08:23:46 +05:00
Abdullah Atta
ad77334e00 core: do not change date modified on items when bulk adding 2024-03-12 08:23:46 +05:00
Abdullah Atta
761b5b7793 editor: make image size clamping responsive 2024-03-12 08:23:45 +05:00
Abdullah Atta
eadf5260c4 web: fix race condition where editor context would be destroyed and updated at the same time 2024-03-12 08:23:45 +05:00
Abdullah Atta
bf62cd93b2 web: create error from ErrorEvent if none found 2024-03-12 08:23:45 +05:00
Abdullah Atta
92c9f31e01 editor: fix crash on loading web clip 2024-03-12 08:23:45 +05:00
Abdullah Atta
3404999bcb web: reenable tags refreshing in editor 2024-03-12 08:23:45 +05:00
Abdullah Atta
e9816ef3a2 editor: fix position of loading placeholder for floating image 2024-03-12 08:23:45 +05:00
Abdullah Atta
f10b7c9b66 editor: fix react node views not rendering on editor load 2024-03-12 08:23:45 +05:00
Abdullah Atta
36cf1fb950 web: fix crash on refreshing editor store 2024-03-12 08:23:45 +05:00
Ammar Ahmed
c1f4a4e3ab mobile: fix randId function duplicate 2024-03-12 08:23:45 +05:00
Abdullah Atta
50a22ddf85 editor: fix crash when resizing window due to a memory leak 2024-03-12 08:23:45 +05:00
Abdullah Atta
d3d74ff7df web: fix temporary tabs cannot be made permanent 2024-03-12 08:23:45 +05:00
Abdullah Atta
ed91e1e22f web: fix jumping tabs when pinning/unpinning tabs 2024-03-12 08:23:45 +05:00
Abdullah Atta
a765d22f4b web: fix crashes when moving tabs 2024-03-12 08:23:45 +05:00
Abdullah Atta
aca0e40fd9 web: fix new sessions can't be opened after app refresh 2024-03-12 08:23:45 +05:00
Abdullah Atta
183613296b web: fix type errors 2024-03-12 08:23:45 +05:00
Ammar Ahmed
3d75791006 editor: remove editor.current usage 2024-03-12 08:23:45 +05:00
Ammar Ahmed
516c214174 mobile: fix editor loading multiple times 2024-03-12 08:23:44 +05:00
Abdullah Atta
541868e681 web: use createInternalLink everywhere 2024-03-12 08:23:44 +05:00
Ammar Ahmed
c18513a04d mobile: finalize note linking 2024-03-12 08:23:44 +05:00
Ammar Ahmed
37220256fa core: parse internal link from href 2024-03-12 08:23:44 +05:00
Ammar Ahmed
e28a4b4e23 core: fix extracting internal links 2024-03-12 08:23:44 +05:00
Abdullah Atta
04d66576cb web: show references & linked notes in properties 2024-03-12 08:23:44 +05:00
Abdullah Atta
63ae8a4a86 web: reset active block after scroll 2024-03-12 08:23:44 +05:00
Abdullah Atta
6e0404fe8b core: add internal links extraction 2024-03-12 08:23:44 +05:00
Abdullah Atta
db79ad3f47 web: add full support for adding internal links 2024-03-12 08:23:44 +05:00
Abdullah Atta
46ac983770 editor: add support for adding/removing internal links 2024-03-12 08:23:44 +05:00
Abdullah Atta
03cc358e61 core: add support for processing internal links in note content 2024-03-12 08:23:43 +05:00
Ammar Ahmed
e457215248 mobile: note linking 2024-03-12 08:23:43 +05:00
Ammar Ahmed
bf393b8015 mobile: update deps 2024-03-12 08:21:28 +05:00
Abdullah Atta
b8eee77646 web: fix type errors and broken imports 2024-03-12 08:21:28 +05:00
Abdullah Atta
4ef4f8798c editor: reset editor on options update 2024-03-12 08:21:28 +05:00
Abdullah Atta
99886fdc96 web: add support for table of contents 2024-03-12 08:21:27 +05:00
Abdullah Atta
80ef5c890a web: add support for tabs 2024-03-12 08:21:03 +05:00
Abdullah Atta
c925ddd462 common: add utility for formatting history session time 2024-03-12 08:19:11 +05:00
Abdullah Atta
73d380d069 mobile: simplify unencrypted content check 2024-03-12 08:19:11 +05:00
Abdullah Atta
a67515118c core: simplify encryption content checks 2024-03-12 08:19:11 +05:00
Abdullah Atta
ad46f82337 core: restoring a history session should create a new version 2024-03-12 08:19:11 +05:00
Abdullah Atta
055a991fcb editor: create editor only once 2024-03-12 08:19:11 +05:00
Ammar Ahmed
d23c8203a3 mobile: implement toc 2024-03-12 08:19:11 +05:00
Ammar Ahmed
3b0ec278d4 mobile: support vault notes in tabs 2024-03-12 08:19:11 +05:00
Ammar Ahmed
55b4c77ad1 mobile: fix tab bugs 2024-03-12 08:19:11 +05:00
Ammar Ahmed
aa74541d6e mobile: add tab history 2024-03-12 08:19:11 +05:00
Ammar Ahmed
5c5e6c7438 mobile: some more fixes 2024-03-12 08:19:11 +05:00
Ammar Ahmed
a1235b48ef mobile: fix numerous issues with tabs 2024-03-12 08:19:10 +05:00
Ammar Ahmed
e015b180a8 mobile: push changes 2024-03-12 08:19:10 +05:00
Ammar Ahmed
e3c37c470d mobile: add editor tabs 2024-03-12 08:19:10 +05:00
Abdullah Atta
855203bd0e core: remove unnecessary notes collection init before migration 2024-03-12 08:19:10 +05:00
Abdullah Atta
6e4700121a web: bump version to 3.0.6 2024-03-12 08:19:10 +05:00
Abdullah Atta
a67b04db7b setup: only disable esbuild rebuild on mobile 2024-03-12 08:19:10 +05:00
Abdullah Atta
0f84d02abc setup: ignore esbuild rebuild script 2024-03-12 08:19:10 +05:00
Abdullah Atta
85c2be9500 mobile: update package lockfile 2024-03-12 08:19:10 +05:00
Abdullah Atta
a5a05f501a editor: fix task items not showing correctly 2024-03-12 08:19:10 +05:00
Abdullah Atta
9bb946d27e ui: fix menu is not scrollable on small screens 2024-03-12 08:19:10 +05:00
Abdullah Atta
cdd089fcf3 web: fix loading skeleton for compact items in list 2024-03-12 08:19:10 +05:00
Ammar Ahmed
49d4d2b6f9 mobile: bump version code 2024-03-12 08:19:09 +05:00
Ammar Ahmed
8d1408997f mobile: release v3.0.8 2024-03-12 08:19:09 +05:00
Ammar Ahmed
d18a8742f1 mobile: improve notebook sheet wording 2024-03-12 08:19:09 +05:00
Ammar Ahmed
d9d229b020 mobile: change sheet button positions 2024-03-12 08:19:09 +05:00
Ammar Ahmed
045527d502 mobile: cleanup 2024-03-12 08:19:09 +05:00
Ammar Ahmed
3c29303ac8 mobile: reminder notification shows even after removing reminders 2024-03-12 08:19:09 +05:00
Ammar Ahmed
98c6ee7904 mobile: simplify reminder sheet ui 2024-03-12 08:19:09 +05:00
Ammar Ahmed
a1dc396564 mobile: remove usage of customStyle prop 2024-03-12 08:19:09 +05:00
Abdullah Atta
4767597fc1 core: fix settings are not migrated 2024-03-12 08:19:09 +05:00
Ammar Ahmed
1e05512c98 mobile: update deps 2024-03-12 08:19:09 +05:00
Ammar Ahmed
68908e0e87 mobile: fix tags not showing properly 2024-03-12 08:19:09 +05:00
Ammar Ahmed
1808b84b0b mobile: cleanup 2024-03-12 08:19:09 +05:00
Ammar Ahmed
1a5595e3db mobile: update Pods 2024-03-12 08:19:08 +05:00
Ammar Ahmed
a96250b937 mobile: release v3.0.7 beta 2024-03-12 08:19:08 +05:00
Ammar Ahmed
19f4fbfcf7 mobile: fix sorting attachments 2024-03-12 08:19:08 +05:00
Abdullah Atta
35c8848b89 web: fix height of attachments table 2024-03-12 08:19:08 +05:00
Abdullah Atta
970f51595b core: do not include deleted attachments in filters 2024-03-12 08:19:08 +05:00
Abdullah Atta
b31d279e15 web: bump version to 3.0.5 2024-03-12 08:19:08 +05:00
Ammar Ahmed
f708eacdc3 mobile: fix mobile sheet ui 2024-03-12 08:19:08 +05:00
Abdullah Atta
7827a35de9 web: show error if there's no internet on updating profile 2024-03-12 08:19:08 +05:00
Abdullah Atta
5e0217bcb1 web: allow clearing database on database disk image is malformed 2024-03-12 08:19:08 +05:00
Abdullah Atta
54debb035a web: fix error due to changed file picker return 2024-03-12 08:19:08 +05:00
Abdullah Atta
3e42d3020d web: fix attachFile- when saving web clip 2024-03-12 08:19:08 +05:00
Ammar Ahmed
c7ab4c9ccf mobile: enable auto sync 2024-03-12 08:19:08 +05:00
Ammar Ahmed
d684c3a8b2 mobile: finalize image upload 2024-03-12 08:19:08 +05:00
Abdullah Atta
3feee27ad6 web: add image compression 2024-03-12 08:19:08 +05:00
Abdullah Atta
4add55adf2 web: add support for multiselecting attachments 2024-03-12 08:19:08 +05:00
ammarahm-ed
4ba90510ea mobile: handle uploading multiple files 2024-03-12 08:19:07 +05:00
ammarahm-ed
4b693b301f mobile: add optional image compression on upload 2024-03-12 08:19:07 +05:00
Abdullah Atta
a9fcd11e11 web: fix sync icon spin direction 2024-03-12 08:19:07 +05:00
Abdullah Atta
01ee348870 core: fix migration for db version > 6 2024-03-12 08:19:07 +05:00
Abdullah Atta
c0cec22e10 core: only get attachment id when processing content 2024-03-12 08:19:07 +05:00
Abdullah Atta
12b87cceeb web: enable auto sync 2024-03-12 08:19:07 +05:00
Abdullah Atta
b9cd40937d web: edit profile directly 2024-03-12 08:19:07 +05:00
Ammar Ahmed
1efae55a85 mobile: add user profile 2024-03-12 08:19:07 +05:00
Ammar Ahmed
932cf0c877 core: fetch user profile before updating profile 2024-03-12 08:19:07 +05:00
Abdullah Atta
0ba6be4fe6 web: add support for setting user profile 2024-03-12 08:19:06 +05:00
Abdullah Atta
cdaa3184a9 core: add support for setting user profile 2024-03-12 08:18:50 +05:00
Ammar Ahmed
03445bb45a mobile: cleanup 2024-03-12 08:18:50 +05:00
Ammar Ahmed
9d649c9bce mobile: fix note assigned to multiple colors 2024-03-12 08:18:50 +05:00
Ammar Ahmed
9a34e4884a mobile: small ui fixes 2024-03-12 08:18:50 +05:00
Ammar Ahmed
df0b51f5ec mobile: ui bug fixes 2024-03-12 08:18:50 +05:00
Ammar Ahmed
2554e5d63a mobile: user profile 2024-03-12 08:18:50 +05:00
Abdullah Atta
5479d800cf core: fix migration errors & compact deleted items 2024-03-12 08:17:21 +05:00
Ammar Ahmed
f729b8f908 mobile: release v3.0.6 2024-03-12 08:17:21 +05:00
Ammar Ahmed
af21da8f2e mobile: fix toolbar migration 2024-03-12 08:17:21 +05:00
Ammar Ahmed
9d13e9f700 core: check for deleted attachments in pending attachments 2024-03-12 08:17:21 +05:00
Ammar Ahmed
d9932a68d9 mobile: fix backup sheet never closes on manual backups 2024-03-12 08:17:21 +05:00
Ammar Ahmed
17a9d1851f mobile: allow sort by title in all groupings 2024-03-12 08:17:20 +05:00
Abdullah Atta
17f68b5315 desktop: disable os encryption of keystore in portable app 2024-03-12 08:16:11 +05:00
Abdullah Atta
b1ce214571 web: migrate toolbar on first use 2024-03-12 08:16:11 +05:00
Abdullah Atta
cfeba093d9 common: add toolbar migration 2024-03-12 08:16:11 +05:00
Abdullah Atta
69038d8edd global: update lockfiles 2024-03-12 08:16:10 +05:00
Abdullah Atta
934faf3b87 web: bump version to 3.0.4-beta 2024-03-12 08:16:01 +05:00
Abdullah Atta
71272d51c9 common: get note's locked status from its content 2024-03-12 08:16:01 +05:00
Abdullah Atta
b295e79677 core: always delete vault references on vault deletion 2024-03-12 08:16:01 +05:00
Abdullah Atta
74789675eb web: fix note not selected after switching from locked note 2024-03-12 08:16:01 +05:00
Abdullah Atta
1234d289eb core: fix sync tests 2024-03-12 08:16:01 +05:00
Abdullah Atta
723c29bad6 core: fix database image is malformed error when deleting vault 2024-03-12 08:16:01 +05:00
Abdullah Atta
343f1f320c core: fix database image is malformed error on unlocking a note 2024-03-12 08:16:01 +05:00
Abdullah Atta
50e70b90db web: fix sync not running after login 2024-03-12 08:16:01 +05:00
Abdullah Atta
a2fd5b266c web: refresh nav items on deleting a tag 2024-03-12 08:16:01 +05:00
Abdullah Atta
ebf32f0603 core: fix database image is malformed error 2024-03-12 08:16:01 +05:00
Abdullah Atta
4dae3a424c core: speed up backup restore 2024-03-12 08:16:01 +05:00
Ammar Ahmed
086aa53212 mobile: fix color of + button on hidden items
in side menu
2024-03-12 08:16:01 +05:00
Abdullah Atta
6d4b53b489 core: fix deleted items getting imported during backup restore 2024-03-12 08:16:00 +05:00
Abdullah Atta
c09064d2d6 core: fix duplicate colors created during backup restore 2024-03-12 08:16:00 +05:00
Ammar Ahmed
024be4ce89 mobile: fix readonly mode 2024-03-12 08:16:00 +05:00
Ammar Ahmed
513d6b3d72 editor: fix keyboard opens on drag in editor 2024-03-12 08:16:00 +05:00
Ammar Ahmed
513b4016b9 mobile: clear selection after deleting items 2024-03-12 08:16:00 +05:00
Ammar Ahmed
8de57a1b5d mobile: fix reminder ui in selection mode 2024-03-12 08:16:00 +05:00
Ammar Ahmed
34aba64bde mobile: remove pass min limit on vault 2024-03-12 08:16:00 +05:00
Abdullah Atta
eedfe38b26 web: clear editor if opened note is unlocked 2024-03-12 08:16:00 +05:00
Abdullah Atta
36406875fc core: remove note's vault relation regardless of vault 2024-03-12 08:15:43 +05:00
Abdullah Atta
854c2323e6 core: don't unlink vault notes on vault remove 2024-03-12 08:15:43 +05:00
Abdullah Atta
1c3694df9b web: fix vault settings not updating on deleting vault 2024-03-12 08:15:43 +05:00
Abdullah Atta
305b62b1a2 core: fix sqlite crash on calling delete with empty array 2024-03-12 08:15:43 +05:00
Abdullah Atta
5550a9f592 web: fix unnecessary rerendering of notebook header 2024-03-12 08:15:43 +05:00
Abdullah Atta
a97d917c7a web: disable auto sync 2024-03-12 08:15:42 +05:00
Abdullah Atta
a55e188ba8 core: enable sync push 2024-03-12 08:15:42 +05:00
Abdullah Atta
f0a70ac4da web: add drag/drop tests 2024-03-12 08:15:42 +05:00
Abdullah Atta
4d675a87a6 web: fix cannot navigate into nested notebook by hovering on it 2024-03-12 08:15:42 +05:00
Abdullah Atta
38c0a5a034 editor: fix react error 409 2024-03-12 08:15:42 +05:00
Abdullah Atta
607e901673 web: expand parent when a child notebook is added 2024-03-12 08:15:42 +05:00
Muhammad Ali
35b44c69b9 web: add support for item drag/droping (#3230)
* web: basic drag drop function for single note

* web: added check for noteId

* web: add support for item drag drop

---------

Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2024-03-12 08:15:42 +05:00
Ammar Ahmed
d920c73acb mobile: disable auto sync 2024-03-12 08:15:42 +05:00
Ammar Ahmed
34f909e37f editor: fix callout margins 2024-03-12 08:15:42 +05:00
Ammar Ahmed
a33970250e mobile: fix keyboard jump on tap in dropdown 2024-03-12 08:15:42 +05:00
Abdullah Atta
297ca467d4 editor: fix rtl for outline list 2024-03-12 08:15:42 +05:00
Abdullah Atta
eeeb0908dd editor: add callout component 2024-03-12 08:15:42 +05:00
Ammar Ahmed
359a5ead1b mobile: release v3.0.5 beta 2024-03-12 08:15:42 +05:00
Ammar Ahmed
92fe455fc3 mobile: update toolbar 2024-03-12 08:15:41 +05:00
Abdullah Atta
31b2fe7e85 editor: add support for simple checklists 2024-03-12 08:15:41 +05:00
Ammar Ahmed
4b9f284ed9 editor: implement simple checklists 2024-03-12 08:15:25 +05:00
Abdullah Atta
85c812f271 web: show error if saving a note fails 2024-03-12 08:15:25 +05:00
Abdullah Atta
4aa4167351 core: fix database image is malformed error on updating locked note 2024-03-12 08:15:25 +05:00
Abdullah Atta
a8dfd91d12 web: bump version to 3.0.3-beta 2024-03-12 08:15:25 +05:00
Abdullah Atta
d23321aa68 desktop: include preload script when comparing bundles 2024-03-12 08:15:25 +05:00
Abdullah Atta
6c4ac1f2e7 core: add more lookup tests 2024-03-12 08:15:25 +05:00
Abdullah Atta
35e8b4bad6 core: allow testing with persisted database 2024-03-12 08:15:25 +05:00
Abdullah Atta
3285664e9f core: return items in same order when using .records 2024-03-12 08:15:24 +05:00
Abdullah Atta
7839bc2b6d core: improve notes lookup performance 2024-03-12 08:15:24 +05:00
Abdullah Atta
65f725dd00 core: refactor test setup & use better-sqlite-multiple-cipher 2024-03-12 08:15:24 +05:00
Abdullah Atta
b1f8b3d8f8 web: destroy sql database on app close 2024-03-12 08:15:24 +05:00
Abdullah Atta
83b6cbd98e core: fix database image is malformed error 2024-03-12 08:15:24 +05:00
Abdullah Atta
89737d9f90 core: fix note headling getting removed 2024-03-12 08:15:24 +05:00
Abdullah Atta
3b0e873c31 web: fix notebook indentation 2024-03-12 08:15:24 +05:00
Abdullah Atta
4bcd82fd7a core: fix sorting of newly created notes 2024-03-12 08:15:24 +05:00
Abdullah Atta
f5de8caa0d web: allow sorting by title everywhere 2024-03-12 08:15:24 +05:00
Abdullah Atta
13b821e061 core: add support for sorting by title & date together 2024-03-12 08:15:24 +05:00
Abdullah Atta
479f60518b web: add child notebook under opened notebook 2024-03-12 08:15:24 +05:00
Abdullah Atta
a71ac363bb web: rerender subnotebooks on root notebook change 2024-03-12 08:15:24 +05:00
Abdullah Atta
3b49a06d29 web: hide sort button in notebook view 2024-03-12 08:15:24 +05:00
Abdullah Atta
e443f3a8a3 web: await notes context refreshing 2024-03-12 08:15:24 +05:00
Abdullah Atta
6bb67318d8 web: clear keystore when clearing database 2024-03-12 08:15:24 +05:00
Abdullah Atta
0e79a5bfff web: allow clearing keystore 2024-03-12 08:15:24 +05:00
Abdullah Atta
20e7ff88b0 web: fix empty root notebook indentation 2024-03-12 08:15:24 +05:00
Abdullah Atta
e36f57850f web: fix monograph publish status not updating 2024-03-12 08:15:24 +05:00
Abdullah Atta
f76446440b web: fix nested notebook navigation from shortcuts 2024-03-12 08:15:23 +05:00
Abdullah Atta
873c3824e5 web: fix color cannot be renamed 2024-03-12 08:15:23 +05:00
Abdullah Atta
0db0b56be6 web: allow non-pro users to customize sidebar 2024-03-12 08:15:23 +05:00
Abdullah Atta
d3a7ec6b8c web: reimplement app lock & web key store 2024-03-12 08:15:23 +05:00
Ammar Ahmed
9d58dd9bab mobile: fix app lock on ios 2024-03-12 08:15:23 +05:00
Ammar Ahmed
409f5f1706 mobile: v3.0.4 2024-03-12 08:15:23 +05:00
Ammar Ahmed
1cd0c7b80a editor: fix color picker missing prop 2024-03-12 08:15:23 +05:00
Ammar Ahmed
bd6a2b2c48 mobile: improve verification flow before changing app lock 2024-03-12 08:15:23 +05:00
Ammar Ahmed
065a7fc683 mobile: fix reordering in side menu 2024-03-12 08:15:23 +05:00
Ammar Ahmed
adc55f719d editor: fix keyboard focus issues on mobile 2024-03-12 08:15:23 +05:00
Ammar Ahmed
4a266487b5 mobile: fix bugs 2024-03-12 08:15:23 +05:00
Ammar Ahmed
d7d5623cd6 mobile: fix sidemenu shortcuts 2024-03-12 08:15:22 +05:00
Abdullah Atta
5d21d3b621 web: remove security key config on app lock disable 2024-03-12 08:15:22 +05:00
Abdullah Atta
e622a379fd core: fix object id date parsing 2024-03-12 08:15:22 +05:00
Abdullah Atta
34acf8488e web: fix cr.isIndexedDBSupported is not a function 2024-03-12 08:15:22 +05:00
Ammar Ahmed
6d45a324db mobile: v3.0.3 beta 2024-03-12 08:15:22 +05:00
Ammar Ahmed
c8ccd31fe0 mobile: fix backup failed on iOS 2024-03-12 08:15:22 +05:00
Ammar Ahmed
6a2734acff mobile: bump version 2024-03-12 08:15:22 +05:00
Ammar Ahmed
e48aecc198 mobile: fix issue reporting 2024-03-12 08:15:22 +05:00
Ammar Ahmed
129dec46b3 mobile: fix rendering slow in list 2024-03-12 08:15:22 +05:00
Abdullah Atta
cbb360b714 ui: fix right clicking when menu is open doesn't close it 2024-03-12 08:15:22 +05:00
Abdullah Atta
eb9b67c0ca ui: fix hover highlighting 2 items in menu 2024-03-12 08:15:22 +05:00
Abdullah Atta
c71c3d834c web: fix color renaming and add color remove support 2024-03-12 08:15:22 +05:00
Abdullah Atta
3ccfad63bf web: add readonly indicator on notes 2024-03-12 08:15:22 +05:00
Abdullah Atta
806ce833cf web: fix compact view not affecting notes 2024-03-12 08:15:22 +05:00
Abdullah Atta
854a4d4f52 editor: fix Position -1 is outside of fragment error 2024-03-12 08:15:22 +05:00
Ammar Ahmed
9d16428781 mobile: fix migration bugs 2024-03-12 08:15:21 +05:00
Abdullah Atta
d3d4ab2f25 core: minor refactoring 2024-03-12 08:11:12 +05:00
Abdullah Atta
4575b0b516 core: migrate deleted items as well 2024-03-12 08:11:12 +05:00
Abdullah Atta
62226a186a web: refresh app on sync completed 2024-03-12 08:11:12 +05:00
Abdullah Atta
28e21acfc3 core: fix continuous invalid_grant error if login fails 2024-03-12 08:11:11 +05:00
Abdullah Atta
6d24a2e429 web: bump to v3.0.2-beta 2024-03-12 08:11:00 +05:00
Abdullah Atta
5a95ca5be8 web: hide window/tab title on app lock 2024-03-12 08:11:00 +05:00
Abdullah Atta
1ad1b91cc6 core: add support for creating backups of legacy collections 2024-03-12 08:11:00 +05:00
Abdullah Atta
a77a4f552d web: fix P.item is undefined error 2024-03-12 08:11:00 +05:00
Abdullah Atta
dade84ff7f core: remove deleteReason property 2024-03-12 08:11:00 +05:00
Ammar Ahmed
da5a7c7137 Update ios.publish.yml
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-03-12 08:11:00 +05:00
Ammar Ahmed
e21d182cec mobile: cleanup gradle.properties 2024-03-12 08:11:00 +05:00
Ammar Ahmed
189f46cb3d mobile: fix share extension 2024-03-12 08:11:00 +05:00
Ammar Ahmed
ee98d87b11 mobile: beta release 2024-03-12 08:11:00 +05:00
Ammar Ahmed
d3a1aa0b0d mobile: fix notebook move to trash 2024-03-12 08:10:59 +05:00
Ammar Ahmed
b0e304bcea mobile: cleanup 2024-03-12 08:10:59 +05:00
Abdullah Atta
e84afd37a8 desktop: disable downgrades 2024-03-12 08:10:59 +05:00
Ammar Ahmed
64851302f4 mobile: stop app updates check in beta 2024-03-12 08:10:59 +05:00
Ammar Ahmed
dddbc671fb mobile: minor fixes 2024-03-12 08:10:59 +05:00
Abdullah Atta
5ea0254849 web: improve database deletion 2024-03-12 08:10:59 +05:00
Abdullah Atta
7ec9380fc9 web: reload page on reset from error boundary 2024-03-12 08:10:59 +05:00
Abdullah Atta
c9fb213fbb web: locked status not updating on note 2024-03-12 08:10:59 +05:00
Abdullah Atta
9a48f50a79 web: only save note's content through vault 2024-03-12 08:10:59 +05:00
Abdullah Atta
395dd8fb9e core: fix adding note to vault should return its id 2024-03-12 08:10:59 +05:00
Abdullah Atta
fcb88a9764 core: fix database resetting 2024-03-12 08:10:59 +05:00
Abdullah Atta
7d70cd2d3d theme: fix error input variant 2024-03-12 08:10:59 +05:00
Abdullah Atta
e5fbc61c26 web: allow typing custom date when adding reminder 2024-03-12 08:10:59 +05:00
Abdullah Atta
daf201cd6b common: use upcoming reminder when resolving reminders on note 2024-03-12 08:10:59 +05:00
Ammar Ahmed
6210dbc52a mobile: fix reminders 2024-03-12 08:10:59 +05:00
Ammar Ahmed
80f88f85ba mobile: fix notebooks & colors 2024-03-12 08:10:58 +05:00
Abdullah Atta
027e343841 core: set mode to "sync" for migrations during sync 2024-03-12 08:10:58 +05:00
Abdullah Atta
fc2f4ee57d desktop: patch better-sqlite3-multiple-ciphers to get prebuilt binaries 2024-03-12 08:10:58 +05:00
Abdullah Atta
0bd477ce9e web: bump to 3.0.1-beta 2024-03-12 08:10:58 +05:00
Abdullah Atta
145e778397 core: enable sync during tests 2024-03-12 08:10:58 +05:00
Abdullah Atta
0287257905 core: improve backup importing 2024-03-12 08:10:58 +05:00
Abdullah Atta
4b916dff47 core: add support for nested transactions 2024-03-12 08:10:58 +05:00
Abdullah Atta
7d18656033 web: use single transaction for importing a backup 2024-03-12 08:10:58 +05:00
Abdullah Atta
a935b677df web: make sqlite slightly faster 2024-03-12 08:09:52 +05:00
Ammar Ahmed
40ca5a3b4c mobile: fix release build 2024-03-12 08:09:52 +05:00
Abdullah Atta
4f9cd8dbb7 core: fix type errors 2024-03-12 08:09:51 +05:00
Ammar Ahmed
0d08318185 mobile: minor fixes 2024-03-12 08:09:51 +05:00
Ammar Ahmed
961dd2ef30 core: fix migration bugs 2024-03-12 08:09:21 +05:00
Ammar Ahmed
f7a5dbc71c mobile: fix saving user key 2024-03-12 08:09:21 +05:00
Abdullah Atta
303ac1db56 web: fix monograph publishing popup 2024-03-12 08:09:21 +05:00
Abdullah Atta
a421df8f1b web: ui fixes 2024-03-12 08:09:21 +05:00
Abdullah Atta
a8a9f56e02 web: fix app lock not getting disabled 2024-03-12 08:09:21 +05:00
Ammar Ahmed
236d17620d mobile: minor fixes 2024-03-12 08:09:21 +05:00
Ammar Ahmed
946b2a8555 mobile: locked notes 2024-03-12 08:09:21 +05:00
Abdullah Atta
6c868fb589 web: fix indexedDB not getting detected 2024-03-12 08:09:21 +05:00
Abdullah Atta
8bdd4b2638 core: destroy kysely on error 2024-03-12 08:09:21 +05:00
Abdullah Atta
d4deb90616 crypto: move libsodium & sodium-native to peer deps 2024-03-12 08:09:20 +05:00
Abdullah Atta
15744feb41 global: pin node version to 20 2024-03-12 08:09:20 +05:00
Abdullah Atta
e75005df89 web: various fixes 2024-03-12 08:09:20 +05:00
Abdullah Atta
b1fac8f9ce common: fix note resolution 2024-03-12 08:09:20 +05:00
Abdullah Atta
4ef77c5924 core: fix database migration 2024-03-12 08:09:20 +05:00
Abdullah Atta
9f1db293a0 core: disable sync push 2024-03-12 08:09:20 +05:00
Abdullah Atta
03ac543ae0 web: trigger error boundary on unhandled errors 2024-03-12 08:09:20 +05:00
Abdullah Atta
cf929ba1ce web: use safeStorage to encrypt secrets on desktop 2024-03-12 08:09:20 +05:00
Abdullah Atta
f3928db1ab desktop: use better-sqlite3 on desktop for SQLite 2024-03-12 08:09:20 +05:00
Abdullah Atta
e92dbadd8e desktop: fix autoupdater 2024-03-12 08:09:20 +05:00
Abdullah Atta
8eca2cb2b8 desktop: add api to delete files 2024-03-12 08:09:20 +05:00
Abdullah Atta
f0c5951eb0 desktop: expose electron's safeStorage api via trpc 2024-03-12 08:09:20 +05:00
Abdullah Atta
c3d18e4177 desktop: enable native modules rebuild during build 2024-03-12 08:09:20 +05:00
Ammar Ahmed
847037b2f7 core: return decrypted content on unlock note 2024-03-12 08:09:20 +05:00
Ammar Ahmed
6227e50dec mobile: applock with pin and password 2024-03-12 08:09:20 +05:00
Ammar Ahmed
89b6030bc3 mobile: minor fixes 2024-03-12 08:09:19 +05:00
Ammar Ahmed
248f692c2b mobile: sqlite-multiple-ciphers patch 2024-03-12 08:09:19 +05:00
Ammar Ahmed
6bac78117f mobile: refactor 2024-03-12 08:09:19 +05:00
Ammar Ahmed
e3ce44878e mobile: fix reorderable side menu 2024-03-12 08:09:19 +05:00
Ammar Ahmed
5f99783683 mobile: yearly reminders 2024-03-12 08:09:19 +05:00
Abdullah Atta
3d4cc1c4d7 web: add support for yearly reminders 2024-03-12 08:09:19 +05:00
Abdullah Atta
a2a05c5d8c core: add support for yearly reminders 2024-03-12 08:09:19 +05:00
Ammar Ahmed
c8eea0a0e4 mobile: stop bg fetch events when toggled off 2024-03-12 08:09:18 +05:00
Ammar Ahmed
8736a58a02 mobile: enable experimental background sync 2024-03-12 08:09:18 +05:00
Abdullah Atta
53c75ca6ef web: add support for hiding items from side bar 2024-03-12 08:09:18 +05:00
Abdullah Atta
506fc227c3 web: add support for reordering navigation menu items 2024-03-12 08:09:18 +05:00
Ammar Ahmed
4f40bdd262 mobile: cleanup 2024-03-12 08:09:18 +05:00
Ammar Ahmed
7bcd1df35a core: add sidebar order settings 2024-03-12 08:09:18 +05:00
Ammar Ahmed
1e4d63f84f mobile: reorder sidebar items 2024-03-12 08:09:18 +05:00
Abdullah Atta
7e7bb1b1b3 web: add support for custom colors 2024-03-12 08:09:18 +05:00
Ammar Ahmed
8e612db63f mobile: allow custom colors 2024-03-12 08:09:04 +05:00
Ammar Ahmed
140468cf3d mobile: migrate app lock 2024-03-12 08:09:04 +05:00
Abdullah Atta
114466e3a6 web: remove cbor-x package 2024-03-12 08:09:04 +05:00
Abdullah Atta
6c90653937 web: add support for at rest encryption and app lock 2024-03-12 08:09:03 +05:00
Ammar Ahmed
aec4c510f1 mobile: at rest encryption 2024-03-12 08:04:34 +05:00
Ammar Ahmed
8722157f33 mobile: simplify tests 2024-03-12 08:04:10 +05:00
Abdullah Atta
15b2aa6445 core: remove dummy test files 2024-03-12 08:04:10 +05:00
Abdullah Atta
7bddfa096f core: migrate key value storage to sqlite 2024-03-12 08:04:09 +05:00
Ammar Ahmed
7048c7e8db mobile: update sheet component 2024-03-12 08:03:42 +05:00
Abdullah Atta
508a259884 core: fix moving nested notebooks to trash 2024-03-12 08:03:42 +05:00
Abdullah Atta
8c5c9d447f global: move item resolution logic to @notesnook/common 2024-03-12 08:03:42 +05:00
Ammar Ahmed
fd951c3aaa mobile: add theme switch animation 2024-03-12 08:03:42 +05:00
Abdullah Atta
a026eb4a04 web: fix all type errors 2024-03-12 08:03:42 +05:00
Abdullah Atta
b02c43c99d web: fix duplicate imports 2024-03-12 08:03:12 +05:00
Abdullah Atta
c2be3a4f4d core: fix type error 2024-03-12 08:03:12 +05:00
Abdullah Atta
2b4155ad1d core: add tests for sync merger 2024-03-12 08:03:11 +05:00
Abdullah Atta
829a8a7ef8 core: migrate vault to a database collection 2024-03-12 08:03:11 +05:00
Ammar Ahmed
77c3e41564 mobile: fix exporter and attachment download 2024-03-12 08:03:11 +05:00
Ammar Ahmed
8e932b7ca0 global: fix type errors during build 2024-03-12 08:03:11 +05:00
Abdullah Atta
6e5c3e83d8 web: use simple transform stream for export progress 2024-03-12 08:03:11 +05:00
Abdullah Atta
a3db77285e web: fix exporting 2024-03-12 08:03:11 +05:00
Ammar Ahmed
0d864dfa10 mobile: add patches 2024-03-12 08:03:11 +05:00
Abdullah Atta
ae3d900af6 web: update export note snapshots for linux 2024-03-12 08:03:11 +05:00
Abdullah Atta
992a1d5231 web: fix reminder tests 2024-03-12 08:03:11 +05:00
Abdullah Atta
0a01ef6357 web: refresh notebooks after adding a new notebook 2024-03-12 08:03:11 +05:00
Abdullah Atta
7c6e79d78d web: fix force redirect to home on navigating to a color 2024-03-12 08:03:11 +05:00
Abdullah Atta
6084bb78a1 web: fix crash when sorting tags 2024-03-12 08:03:11 +05:00
Abdullah Atta
df987f6e94 web: fix crash when removing a notebook 2024-03-12 08:03:10 +05:00
Ammar Ahmed
a1e237a82a mobile: sync with latest core changes 2024-03-12 08:03:10 +05:00
Abdullah Atta
1e97e81fe7 core: remove unnecessary console.log 2024-03-12 08:03:10 +05:00
Ammar Ahmed
3ecda367f8 mobile: fix search to use filtered selector for notes 2024-03-12 08:03:10 +05:00
Abdullah Atta
afa4432521 core: prevent recursive sync after pushing items 2024-03-12 08:03:10 +05:00
Abdullah Atta
b24bc4fda0 web: simplify sync status 2024-03-12 08:03:10 +05:00
Abdullah Atta
0cca379a97 web: fix previewing trashed notes 2024-03-12 08:03:10 +05:00
Abdullah Atta
ca9e701386 core: fix trash 2024-03-12 08:03:10 +05:00
Abdullah Atta
48d79acbd3 web: improve sync test reliability 2024-03-12 08:03:10 +05:00
Abdullah Atta
2dabc62df3 core: auto sync not triggered on note update 2024-03-12 08:03:10 +05:00
Abdullah Atta
2ab7564622 web: fix note history tests 2024-03-12 08:01:37 +05:00
Abdullah Atta
0c0f19b23f web: fix selection logic in list 2024-03-12 08:01:37 +05:00
Abdullah Atta
1e5847e09e web: set testId on auth input fields 2024-03-12 08:01:37 +05:00
Abdullah Atta
e6d0061ca0 core: fix note content is not saving 2024-03-12 08:01:37 +05:00
Abdullah Atta
35b56fe8d2 core: fix data is not iterable error on backup restore 2024-03-12 08:01:37 +05:00
Abdullah Atta
4cd7f604df global: update lockfiles 2024-03-12 08:01:37 +05:00
Abdullah Atta
e65c36eff7 core: add retry if a test fails 2024-03-12 08:01:37 +05:00
Abdullah Atta
2e39e96846 core: fix invalid object-id generation for some timestamps 2024-03-12 08:01:37 +05:00
Abdullah Atta
357019a807 core: fix sync & monographs tests 2024-03-12 08:01:36 +05:00
Abdullah Atta
bb014cbb36 core: fix auto sync starting even when auto sync is disabled 2024-03-12 08:01:20 +05:00
Abdullah Atta
5d0e7ea28b core: fix sync tests 2024-03-12 08:00:59 +05:00
Abdullah Atta
96903c512b core: remove unnecessary migration success log 2024-03-12 08:00:59 +05:00
Abdullah Atta
b9acb8a213 core: fix Crypto is not supported on this platform. error during tests 2024-03-12 08:00:59 +05:00
Abdullah Atta
48e625480c core: make all the core tests pass again 2024-03-12 08:00:59 +05:00
Abdullah Atta
bc3dce6ecf web: fix crash when note has no title 2024-03-12 08:00:59 +05:00
Abdullah Atta
0da883b40a core: set default title if note has no title 2024-03-12 08:00:59 +05:00
Abdullah Atta
56d230191f web: update kysely patch 2024-03-12 08:00:59 +05:00
Abdullah Atta
abdb9626d0 web: run patch-package after npm i 2024-03-12 08:00:59 +05:00
Abdullah Atta
567eb789fc web: more fixes 2024-03-12 08:00:58 +05:00
Abdullah Atta
aa85b57e75 web: fix many type errors 2024-03-12 08:00:58 +05:00
Abdullah Atta
b5d9a83e1b global: update lockfiles 2024-03-12 07:58:39 +05:00
Abdullah Atta
ee2d0912fd theme: fix tinycolor2 not found error 2024-03-12 07:58:39 +05:00
Abdullah Atta
22cb2f1829 web: fix notes search in tags, favorites etc 2024-03-12 07:58:39 +05:00
Abdullah Atta
c3f76fa7c9 web: update wa-sqlite 2024-03-12 07:58:39 +05:00
Abdullah Atta
6923801426 web: use memory tempStore for sqlite 2024-03-12 07:58:39 +05:00
Abdullah Atta
210b6ba10c web: add support for exporting sql database 2024-03-12 07:58:39 +05:00
Abdullah Atta
b3bf5ff7a9 core: fix FTS5 SQLite search 2024-03-12 07:58:39 +05:00
Ammar Ahmed
ab1ff2f0bb mobile: cleanup 2024-03-12 07:58:38 +05:00
Ammar Ahmed
a813a5dd92 mobile: fix types 2024-03-12 07:58:38 +05:00
Ammar Ahmed
b85fc2d473 mobile: refactor zustand stores 2024-03-12 07:58:38 +05:00
Ammar Ahmed
112b44802f mobile: bug fixes 2024-03-12 07:58:38 +05:00
Ammar Ahmed
c121d4a010 core: add fn to get cache item 2024-03-12 07:58:07 +05:00
Abdullah Atta
26c7f04317 web: only auto align title & headline 2024-03-12 07:58:07 +05:00
Abdullah Atta
1fe3e5102b web: getKey -> key 2024-03-12 07:58:07 +05:00
Abdullah Atta
e0d44e58e6 web: fix resolved item data misaligned with items 2024-03-12 07:58:07 +05:00
Abdullah Atta
3103a7b97c core: fix many issues with virtualized grouping 2024-03-12 07:58:07 +05:00
Ammar Ahmed
ef802bfa5c core: early return when items are empty 2024-03-12 07:58:07 +05:00
Abdullah Atta
a1c2f3f679 web: fix random crashes when scrolling in list 2024-03-12 07:58:07 +05:00
Abdullah Atta
c7843effc6 web: replace react-virtual with react-virtuouso 2024-03-12 07:58:07 +05:00
Ammar Ahmed
1bd9ecca37 mobile: fix build ang bugs 2024-03-12 07:58:07 +05:00
Abdullah Atta
2f55f36802 web: hide attachments access if user is logged out 2024-03-12 07:58:07 +05:00
Abdullah Atta
af5b05df70 web: allow core to specify custom sql db name 2024-03-12 07:58:07 +05:00
Abdullah Atta
1b2479cad2 web: close idb connection on sqlite connection close 2024-03-12 07:58:07 +05:00
Abdullah Atta
b92b4bff4c core: clear database on logout 2024-03-12 07:58:06 +05:00
Ammar Ahmed
e8301907cd core: add tempStore option to DB 2024-03-12 07:58:06 +05:00
Abdullah Atta
2c3b400b5d core: migrate items sequentially during sync 2024-03-12 07:58:06 +05:00
Abdullah Atta
8350d24822 core: fix build error 2024-03-12 07:58:06 +05:00
Abdullah Atta
934f77d369 web: execute only 1 query at a time 2024-03-12 07:58:06 +05:00
Abdullah Atta
e8a9301434 web: fix diff viewer crashing the app 2024-03-12 07:58:06 +05:00
Abdullah Atta
58b51201d9 core: do not stop sync if a conflict occurs 2024-03-12 07:58:06 +05:00
Abdullah Atta
02bc3a9db4 core: allow only 1 transaction at a time 2024-03-12 07:58:06 +05:00
Abdullah Atta
b777546bc9 core: simplify item key derivation in virtualized grouping 2024-03-12 07:58:06 +05:00
Abdullah Atta
5b96b956e8 web: improve list item rendering performance 2024-03-12 07:58:06 +05:00
Abdullah Atta
e90f2d7087 core: always send realtime sync event 2024-03-12 07:58:06 +05:00
Abdullah Atta
8c1e0d2414 core: fix content date edited not updating 2024-03-12 07:58:06 +05:00
Abdullah Atta
007c9859dc core: put items in chunks of 200 2024-03-12 07:58:06 +05:00
Abdullah Atta
c72cac1213 web: set name prop on fields 2024-03-12 07:58:06 +05:00
Abdullah Atta
f8b6dd6d1a core: implement sync v2 2024-03-12 07:58:05 +05:00
Ammar Ahmed
5e71df03af mobile: use index based grouping 2024-03-12 07:55:47 +05:00
Abdullah Atta
e3f74f7f6f web: changes to use new grouping api 2024-03-12 07:55:47 +05:00
Abdullah Atta
5a759268b8 core: implement new high perf indexed based grouping 2024-03-12 07:55:47 +05:00
Ammar Ahmed
a9d98f73e4 mobile: fix share extension in release 2024-03-12 07:55:21 +05:00
Abdullah Atta
65dcd6e035 web: fix router types 2024-03-12 07:55:21 +05:00
Abdullah Atta
921b802aa0 web: enable vite hot reloading 2024-03-12 07:55:21 +05:00
Abdullah Atta
0b767de51b web: fix minor build issues 2024-03-12 07:55:21 +05:00
Abdullah Atta
e9bd553116 web: migrate everything to react@18 2024-03-12 07:55:21 +05:00
Abdullah Atta
d4fcf1687a web: fix notebook tests 2024-03-12 07:55:21 +05:00
Ammar Ahmed
996fb6d60f mobile: share extension cleanup 2024-03-12 07:55:21 +05:00
Ammar Ahmed
fd6d259d6c mobile: cleanup 2024-03-12 07:55:21 +05:00
Ammar Ahmed
4f16d172f8 mobile: migrate share extension 2024-03-12 07:55:21 +05:00
Ammar Ahmed
b94c3ac182 mobile: fix navigation 2024-03-12 07:55:21 +05:00
Abdullah Atta
ea383c80f2 web: send noteId when decrypting real-time locked content 2024-03-12 07:55:21 +05:00
Abdullah Atta
1b769f23cb web: fix tag tests 2024-03-12 07:55:20 +05:00
Ammar Ahmed
d5feab78c8 mobile: pass tests 2024-03-12 07:55:20 +05:00
Abdullah Atta
043099d217 web: fix html export snapshot 2024-03-12 07:55:20 +05:00
Abdullah Atta
670a8a05d1 core: fix md with frontmatter export 2024-03-12 07:55:20 +05:00
Ammar Ahmed
01ea478e46 core: fix ts error 2024-03-12 07:55:20 +05:00
Ammar Ahmed
ebd3ed06ab mobile: fix webpack build 2024-03-12 07:55:20 +05:00
Ammar Ahmed
f34591228e mobile: push changes 2024-03-12 07:55:20 +05:00
Abdullah Atta
7247ad4a05 web: fix notes tests 2024-03-12 07:55:20 +05:00
Abdullah Atta
e4fd25cb76 core: prevent duplicate colors based on color code 2024-03-12 07:55:00 +05:00
Abdullah Atta
3c67928583 core: fix error on locking notes 2024-03-12 07:55:00 +05:00
Ammar Ahmed
9aaa915caa mobile: push changes 2024-03-12 07:55:00 +05:00
Abdullah Atta
43318b185b web: reset search results on navigation 2024-03-12 07:55:00 +05:00
Abdullah Atta
015666388f web: reset prepared sql stmt on error 2024-03-12 07:55:00 +05:00
Abdullah Atta
542f7687f5 web: reuse search query 2024-03-12 07:55:00 +05:00
Abdullah Atta
5b744eae3c core: use porter trigram tokenizer for fts 2024-03-12 07:54:59 +05:00
Abdullah Atta
28cd11fdc7 core: properly escape fts query 2024-03-12 07:54:59 +05:00
Abdullah Atta
29ccbd0942 web: add support for assigning tags to notes 2024-03-12 07:54:59 +05:00
Abdullah Atta
30a127d2da core: fix "type" does not exist 2024-03-12 07:54:59 +05:00
Abdullah Atta
0d7973a34c core: fix build error 2024-03-12 07:54:59 +05:00
Ammar Ahmed
487edd7165 mobile: migrate to sqlite 2024-03-12 07:54:59 +05:00
Abdullah Atta
b3fe79b0a7 web: fix note editor properties 2024-03-12 07:53:23 +05:00
Abdullah Atta
966047585c common: type is now optional in getFormattedDate 2024-03-12 07:53:05 +05:00
Abdullah Atta
d57ca9b07c core: return FilteredSelector from attachments.ofNote 2024-03-12 07:53:05 +05:00
Abdullah Atta
e76b7ee0a5 web: show notebook & tag shortcuts when assigning notes 2024-03-12 07:53:05 +05:00
Abdullah Atta
2b42315c53 web: implement virtualized search for all items 2024-03-12 07:53:05 +05:00
Abdullah Atta
947443b4c7 web: use lazy loading to load attachments 2024-03-12 07:53:04 +05:00
Abdullah Atta
2547ab42e9 web: load tag & color title lazily 2024-03-12 07:52:42 +05:00
Abdullah Atta
306aca0645 web: show all nested notebooks as tree when moving notes 2024-03-12 07:52:42 +05:00
Abdullah Atta
f2b2dc33e6 web: add support for nested notebooks 2024-03-12 07:52:42 +05:00
Abdullah Atta
7a8f8dc565 web: use new virtualized grouping for reminders 2024-03-12 07:52:42 +05:00
Abdullah Atta
0528115ad3 web: use new virtualized grouping for trash 2024-03-12 07:52:42 +05:00
Abdullah Atta
4a5ee49db6 web: use new virtualized grouping for monographs 2024-03-12 07:52:42 +05:00
Abdullah Atta
3ca761013d core: add support for fetching trash as grouped 2024-03-12 07:52:42 +05:00
Abdullah Atta
bdeb123f18 web: install missing @hazae41/foras 2024-03-12 07:52:42 +05:00
Abdullah Atta
3f5f84aac0 core: fix attachment extraction for locked notes 2024-03-12 07:52:41 +05:00
Abdullah Atta
01d3bd7810 global: update lockfiles 2024-03-12 07:52:41 +05:00
Abdullah Atta
8e6d6e20d7 web: start initial migration to sqlite 2024-03-12 07:52:41 +05:00
Abdullah Atta
375185a9ea ui: add support for lazily loading menu items 2024-03-12 07:51:38 +05:00
Abdullah Atta
c2e9773486 common: remove total-notes utility 2024-03-12 07:51:38 +05:00
Abdullah Atta
5e0e7b17e2 core: changes according to client needs 2024-03-12 07:51:38 +05:00
Abdullah Atta
aa90684616 core: fix database migration 2024-03-12 07:51:37 +05:00
Abdullah Atta
fa47b4151f core: add support for incremental grouping 2024-03-12 07:51:24 +05:00
Abdullah Atta
eca5db19a2 core: fix size of nanoid in benchmarks 2024-03-12 07:51:24 +05:00
Abdullah Atta
b053b0eab4 core: optimize bson objectid generation & add benchmarks 2024-03-12 07:51:23 +05:00
Abdullah Atta
70da1045d7 core: fix monographs 2024-03-12 07:51:10 +05:00
Abdullah Atta
b5fd2b0751 core: fix sync tests 2024-03-12 07:51:10 +05:00
Abdullah Atta
97f6f09882 core: remove temporary sqlite db 2024-03-12 07:51:10 +05:00
Abdullah Atta
0c773727ee core: migrate everything to sqlite 2024-03-12 07:51:10 +05:00
Abdullah Atta
952ce39f1c core: migrate all database writes to sqlite 2024-03-12 07:49:55 +05:00
Abdullah Atta
057c7f3f5d global: update lockfiles 2024-03-12 07:49:14 +05:00
Abdullah Atta
9439c52801 core: convert everything else to typescript 2024-03-12 07:48:50 +05:00
Abdullah Atta
b1cebbe8f2 core: remove unnecessary sync tests 2024-03-12 07:48:50 +05:00
Abdullah Atta
836a47fd96 core: migrate monographs to typescript 2024-03-12 07:48:50 +05:00
Abdullah Atta
136b2ed457 core: make migration tests less flaky 2024-03-12 07:48:50 +05:00
Abdullah Atta
7f4006de95 core: add tests for migrations 2024-03-12 07:48:49 +05:00
Abdullah Atta
dc96209ed9 core: migrate settings to its own collection 2024-03-12 07:48:09 +05:00
Abdullah Atta
9b0332d5e0 core: get rid of topics; move to sub notebooks 2024-03-12 07:47:20 +05:00
Abdullah Atta
a1300fefd6 core: migrate attachments to use relations for linking to notes 2024-03-12 07:47:20 +05:00
Abdullah Atta
27032e853b core: minor updates and fixes 2024-03-12 07:47:20 +05:00
Abdullah Atta
22646e1398 core: fix types & syncing issues 2024-03-12 07:47:20 +05:00
ammarahm-ed
6e5e7c92c9 mobile: pass all tests 2024-03-12 07:41:34 +05:00
ammarahm-ed
3254109ea5 mobile: fix filesystem not loaded 2024-03-12 07:41:34 +05:00
ammarahm-ed
98ab2bfd8f mobile: fix navigating to tags 2024-03-12 07:41:34 +05:00
ammarahm-ed
6cbf22c163 mobile: migrate to typescript 2024-03-12 07:41:33 +05:00
ammarahm-ed
1714c1abca common: fix ts errors 2024-03-12 07:41:33 +05:00
Abdullah Atta
1bf65c7a53 mobile: use new types from core 2024-03-12 07:41:33 +05:00
Abdullah Atta
0075fde915 web: use new types from core 2024-03-12 07:41:33 +05:00
Abdullah Atta
318c61f531 core: fix more typings 2024-03-12 07:39:14 +05:00
Abdullah Atta
6dc502fd92 core: fix typing errors 2024-03-12 07:38:43 +05:00
Abdullah Atta
db7d7edcb5 core: convert almost everything to typescript 2024-03-12 07:38:43 +05:00
Ammar Ahmed
278840bcfd mobile: fix lint errors 2024-03-12 07:28:59 +05:00
Abdullah Atta
f149ad7c71 ci: update node version to 20 2024-03-12 07:28:59 +05:00
Abdullah Atta
ad29de8a04 config: update nx 2024-03-12 07:28:58 +05:00
Abdullah Atta
0759098414 desktop: set release channel to beta 2024-03-12 07:28:45 +05:00
Ammar Ahmed
528751a3ce mobile: update ios version number 2024-03-12 07:28:45 +05:00
Ammar Ahmed
3dd5bd8c4a ci: update workflow name
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-03-12 07:28:23 +05:00
Ammar Ahmed
1ed84fe1b4 mobile: v3 beta release 2024-03-12 07:28:23 +05:00
Ammar Ahmed
1dcf8daecb ci: update iOS workflow
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-03-12 07:25:38 +05:00
Ammar Ahmed
fc0ac1e02a Update android.publish.internal.yml
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-03-12 07:25:38 +05:00
Ammar Ahmed
a1efab6673 ci: android.publish.yml
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-03-12 07:25:38 +05:00
Abdullah Atta
4a6445e241 desktop: do not set teamId for notarization 2024-03-12 07:25:38 +05:00
Abdullah Atta
3fadb6016c ci: APPLE_API_KEY_ISSUER > APPLE_API_ISSUER 2024-03-12 07:25:38 +05:00
Abdullah Atta
99f469ba38 desktop: fix unknown property 'notarize' error 2024-03-12 07:25:38 +05:00
Abdullah Atta
d1753f449a desktop: use official electron builder notarization 2024-03-12 07:25:38 +05:00
Abdullah Atta
fe19a6b0cc ci: update {upload,download}-artifact to v4 2024-03-12 07:25:38 +05:00
Abdullah Atta
bb67472dee ci: get rid of you may only define one of branches and branches-ignore for a single event 2024-03-12 07:25:38 +05:00
Abdullah Atta
13213cf4cd ci: use m1 for building on mac 2024-03-12 07:25:23 +05:00
Abdullah Atta
b49a890849 ci: use wrangler directly to publish to cf 2024-03-12 07:25:23 +05:00
Abdullah Atta
3eb21afd42 desktop: use app version from autoUpdater 2024-03-12 07:25:23 +05:00
Abdullah Atta
b98021929f ci: update cloudflare action 2024-03-12 07:25:23 +05:00
Abdullah Atta
40ccad1181 desktop: ready beta for deployment 2024-03-12 07:25:23 +05:00
Abdullah Atta
e2db62d551 ci: deploy to correct cf pages project
Signed-off-by: Abdullah Atta <abdullahatta@streetwriters.co>
2024-03-12 07:24:45 +05:00
Abdullah Atta
0229641917 core: turn off sync push by default 2024-03-12 07:24:45 +05:00
551 changed files with 12134 additions and 81283 deletions

View File

@@ -97,9 +97,6 @@ jobs:
- name: Setup Node
uses: ./.github/actions/setup-node-with-cache
- name: Install setuptools
run: brew install python-setuptools
- name: Setup notarization
run: |
mkdir -p ~/private_keys/
@@ -147,7 +144,7 @@ jobs:
CSC_KEY_PASSWORD: ${{ secrets.mac_certs_password }}
run: |
npx nx run release --project @notesnook/desktop -- --variant=mas
yarn electron-builder --mac mas --universal -p never
npx electron-builder --mac mas --universal -p never
working-directory: ./apps/desktop
- name: Build zip and dmg
@@ -161,9 +158,9 @@ jobs:
run: |
npx nx run release --project @notesnook/desktop
if [ ${{ inputs.publish-github }} == true ]; then
yarn electron-builder --mac zip dmg --arm64 --x64 -p always
npx electron-builder --mac zip dmg --arm64 --x64 -p always
else
yarn electron-builder --mac zip dmg --arm64 --x64 -p never
npx electron-builder --mac zip dmg --arm64 --x64 -p never
fi
working-directory: ./apps/desktop
@@ -219,7 +216,7 @@ jobs:
- name: Build snap
if: inputs.publish-snap
run: |
yarn electron-builder --linux snap:x64 -p never
npx electron-builder --linux snap:x64 -p never
working-directory: ./apps/desktop
- name: Build AppImage
@@ -227,9 +224,9 @@ jobs:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
if [ ${{ inputs.publish-github }} == true ]; then
yarn electron-builder --linux AppImage:x64 AppImage:arm64 -p always
npx electron-builder --linux AppImage:x64 AppImage:arm64 -p always
else
yarn electron-builder --linux AppImage:x64 AppImage:arm64 -p never
npx electron-builder --linux AppImage:x64 AppImage:arm64 -p never
fi
working-directory: ./apps/desktop
@@ -254,8 +251,8 @@ jobs:
with:
dotnet-version: 6.0.x
- name: Install TrustedSigning
run: Install-Module -Name TrustedSigning -RequiredVersion 0.3.15 -Force -Repository PSGallery
- name: Install AzureCodeSigning
run: Install-Module -Name AzureCodeSigning -RequiredVersion 0.3.0 -Force -Repository PSGallery
shell: pwsh
- name: Setup Node

69
.github/workflows/web.beta.publish.yml vendored Normal file
View File

@@ -0,0 +1,69 @@
name: Publish @notesnook/web Beta
on:
workflow_dispatch:
push:
branches:
- master
- "!v3-beta"
paths-ignore:
- "apps/mobile/**"
- "packages/editor-mobile/**"
- "apps/desktop/**"
- "apps/vericrypt/**"
- "servers/**"
- "packages/clipper/**"
- "extensions/web-clipper/**"
pull_request:
types:
- closed
- ready_for_review
- reopened
- opened
- synchronize
branches:
- master
- "!v3-beta"
paths-ignore:
- "apps/mobile/**"
- "packages/editor-mobile/**"
- "apps/desktop/**"
- "apps/vericrypt/**"
- "servers/**"
- "packages/clipper/**"
- "extensions/web-clipper/**"
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Node
uses: ./.github/actions/setup-node-with-cache
- name: Install packages
run: |
npm ci --ignore-scripts --prefer-offline --no-audit
npm run bootstrap -- --scope=web
- name: Setup environment
run: |
echo "NX_CLOUD_ACCESS_TOKEN=${{ secrets.NX_CLOUD_ACCESS_TOKEN }}" >> $GITHUB_ENV
echo "CLOUDFLARE_ACCOUNT_ID=${{ secrets.CLOUDFLARE_ACCOUNT_ID }}" >> $GITHUB_ENV
echo "CLOUDFLARE_API_TOKEN=${{ secrets.CLOUDFLARE_API_TOKEN }}" >> $GITHUB_ENV
- name: Generate beta build
run: npm run build:beta:web
- name: Publish to Cloudflare Pages
uses: unlike-ltd/github-actions-cloudflare-pages@v0.1.1
id: pages
with:
cloudflare-api-token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
cloudflare-account-id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
cloudflare-project-name: notesnook-beta-app
directory: ./apps/web/build
github-token: ${{ secrets.GITHUB_TOKEN }}
github-environment: ${{ (github.ref == 'refs/heads/master' && 'beta') || 'preview' }}

View File

@@ -67,7 +67,7 @@ jobs:
- name: Install packages
run: |
npm ci --ignore-scripts --prefer-offline --no-audit
npm install -D @playwright/test otplib dayjs @zip.js/zip.js
npm install -D @playwright/test otplib
- name: Validate build extraction
run: ls -ld ./apps/web/build/index.html

View File

@@ -0,0 +1,32 @@
name: Publish @notesnook/web v3 Beta
on:
workflow_dispatch:
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Node
uses: ./.github/actions/setup-node-with-cache
- name: Install packages
run: |
npm ci --ignore-scripts --prefer-offline --no-audit
npm run bootstrap -- --scope=web
- name: Setup environment
run: |
echo "NX_CLOUD_ACCESS_TOKEN=${{ secrets.NX_CLOUD_ACCESS_TOKEN }}" >> $GITHUB_ENV
echo "CLOUDFLARE_ACCOUNT_ID=${{ secrets.CLOUDFLARE_ACCOUNT_ID }}" >> $GITHUB_ENV
echo "CLOUDFLARE_API_TOKEN=${{ secrets.CLOUDFLARE_API_TOKEN }}" >> $GITHUB_ENV
- name: Build
run: npm run build:web
- name: Publish to Cloudflare Pages
run: npx --yes wrangler pages deploy --project-name=notesnook-v3-beta ./apps/web/build/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 401 B

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 543 B

After

Width:  |  Height:  |  Size: 917 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 763 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 KiB

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -1,23 +1,23 @@
{
"name": "@notesnook/desktop",
"version": "3.0.2",
"version": "3.0.7-beta",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@notesnook/desktop",
"version": "3.0.2",
"version": "3.0.7-beta",
"hasInstallScript": true,
"license": "GPL-3.0-or-later",
"dependencies": {
"@notesnook/crypto": "file:../../packages/crypto",
"@trpc/client": "10.38.3",
"@trpc/server": "10.38.3",
"better-sqlite3-multiple-ciphers": "^9.5.0",
"better-sqlite3-multiple-ciphers": "^9.4.0",
"electron-trpc": "0.5.2",
"electron-updater": "6.1.4",
"icojs": "^0.17.1",
"sodium-native": "^4.1.1",
"sodium-native": "^4.0.6",
"typed-emitter": "^2.1.0",
"yargs": "^17.6.2",
"zod": "^3.21.4"
@@ -26,13 +26,11 @@
"@types/node": "18.16.1",
"@types/yargs": "^17.0.24",
"chokidar": "^3.5.3",
"electron": "^29.3.1",
"electron-builder": "^24.13.3",
"electron": "^28.2.1",
"electron-builder": "^24.9.1",
"esbuild": "^0.20.0",
"node-gyp-build": "^4.8.0",
"prebuildify": "^6.0.1",
"tree-kill": "^1.2.2",
"undici": "^6.14.1"
"undici": "^6.6.1"
},
"optionalDependencies": {
"dmg-license": "^1.0.11"
@@ -70,9 +68,9 @@
}
},
"node_modules/@electron/asar": {
"version": "3.2.9",
"resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.9.tgz",
"integrity": "sha512-Vu2P3X2gcZ3MY9W7yH72X9+AMXwUQZEJBrsPIbX0JsdllLtoh62/Q8Wg370/DawIEVKOyfD6KtTLo645ezqxUA==",
"version": "3.2.8",
"resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.8.tgz",
"integrity": "sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==",
"dev": true,
"dependencies": {
"commander": "^5.0.0",
@@ -171,9 +169,9 @@
}
},
"node_modules/@electron/notarize": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz",
"integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==",
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.1.0.tgz",
"integrity": "sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==",
"dev": true,
"dependencies": {
"debug": "^4.1.1",
@@ -233,9 +231,9 @@
}
},
"node_modules/@electron/universal": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz",
"integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==",
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz",
"integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==",
"dev": true,
"dependencies": {
"@electron/asar": "^3.2.1",
@@ -655,100 +653,13 @@
"node": ">=12"
}
},
"node_modules/@isaacs/cliui": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
"dev": true,
"dependencies": {
"string-width": "^5.1.2",
"string-width-cjs": "npm:string-width@^4.2.0",
"strip-ansi": "^7.0.1",
"strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
"wrap-ansi": "^8.1.0",
"wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@isaacs/cliui/node_modules/ansi-regex": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
"node_modules/@fastify/busboy": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz",
"integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==",
"dev": true,
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/@isaacs/cliui/node_modules/ansi-styles": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
"dev": true,
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@isaacs/cliui/node_modules/emoji-regex": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"dev": true
},
"node_modules/@isaacs/cliui/node_modules/string-width": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
"dev": true,
"dependencies": {
"eastasianwidth": "^0.2.0",
"emoji-regex": "^9.2.2",
"strip-ansi": "^7.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@isaacs/cliui/node_modules/strip-ansi": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
"dev": true,
"dependencies": {
"ansi-regex": "^6.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
"dev": true,
"dependencies": {
"ansi-styles": "^6.1.0",
"string-width": "^5.0.1",
"strip-ansi": "^7.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
"node": ">=14"
}
},
"node_modules/@malept/cross-spawn-promise": {
@@ -807,16 +718,6 @@
"resolved": "../../packages/crypto",
"link": true
},
"node_modules/@pkgjs/parseargs": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
"integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
"dev": true,
"optional": true,
"engines": {
"node": ">=14"
}
},
"node_modules/@sindresorhus/is": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
@@ -1066,25 +967,26 @@
"dev": true
},
"node_modules/app-builder-lib": {
"version": "24.13.3",
"resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz",
"integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==",
"version": "24.9.1",
"resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.9.1.tgz",
"integrity": "sha512-Q1nYxZcio4r+W72cnIRVYofEAyjBd3mG47o+zms8HlD51zWtA/YxJb01Jei5F+jkWhge/PTQK+uldsPh6d0/4g==",
"dev": true,
"dependencies": {
"@develar/schema-utils": "~2.6.5",
"@electron/notarize": "2.2.1",
"@electron/notarize": "2.1.0",
"@electron/osx-sign": "1.0.5",
"@electron/universal": "1.5.1",
"@electron/universal": "1.4.1",
"@malept/flatpak-bundler": "^0.4.0",
"@types/fs-extra": "9.0.13",
"7zip-bin": "~5.2.0",
"async-exit-hook": "^2.0.1",
"bluebird-lst": "^1.0.9",
"builder-util": "24.13.1",
"builder-util-runtime": "9.2.4",
"builder-util": "24.8.1",
"builder-util-runtime": "9.2.3",
"chromium-pickle-js": "^0.2.0",
"debug": "^4.3.4",
"ejs": "^3.1.8",
"electron-publish": "24.13.1",
"electron-publish": "24.8.1",
"form-data": "^4.0.0",
"fs-extra": "^10.1.0",
"hosted-git-info": "^4.1.0",
@@ -1101,16 +1003,12 @@
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"dmg-builder": "24.13.3",
"electron-builder-squirrel-windows": "24.13.3"
}
},
"node_modules/app-builder-lib/node_modules/builder-util-runtime": {
"version": "9.2.4",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz",
"integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==",
"version": "9.2.3",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz",
"integrity": "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
@@ -1199,9 +1097,9 @@
]
},
"node_modules/better-sqlite3-multiple-ciphers": {
"version": "9.5.0",
"resolved": "https://registry.npmjs.org/better-sqlite3-multiple-ciphers/-/better-sqlite3-multiple-ciphers-9.5.0.tgz",
"integrity": "sha512-6A9xBRvssONJW07Lur6pmkaUwlCGz1bnjFmXrrAR3qXETUBk92OI4C/+LhMOatn5wQ8AQzLScFZC/CKUpxkTaw==",
"version": "9.4.0",
"resolved": "https://registry.npmjs.org/better-sqlite3-multiple-ciphers/-/better-sqlite3-multiple-ciphers-9.4.0.tgz",
"integrity": "sha512-uQoBdShnpCdAPUmCPuLSrHtfSHAxjIFQvLnMbXHsvbWkfBP3sPfnnIaUTz7KHYRqgWNLlcQfs+9F9uqvMqau6Q==",
"hasInstallScript": true,
"dependencies": {
"bindings": "^1.5.0",
@@ -1334,16 +1232,16 @@
"dev": true
},
"node_modules/builder-util": {
"version": "24.13.1",
"resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz",
"integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==",
"version": "24.8.1",
"resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.8.1.tgz",
"integrity": "sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw==",
"dev": true,
"dependencies": {
"@types/debug": "^4.1.6",
"7zip-bin": "~5.2.0",
"app-builder-bin": "4.0.0",
"bluebird-lst": "^1.0.9",
"builder-util-runtime": "9.2.4",
"builder-util-runtime": "9.2.3",
"chalk": "^4.1.2",
"cross-spawn": "^7.0.3",
"debug": "^4.3.4",
@@ -1370,9 +1268,9 @@
}
},
"node_modules/builder-util/node_modules/builder-util-runtime": {
"version": "9.2.4",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz",
"integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==",
"version": "9.2.3",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz",
"integrity": "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
@@ -1576,59 +1474,13 @@
"dev": true
},
"node_modules/config-file-ts": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz",
"integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==",
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz",
"integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==",
"dev": true,
"dependencies": {
"glob": "^10.3.10",
"typescript": "^5.3.3"
}
},
"node_modules/config-file-ts/node_modules/glob": {
"version": "10.3.12",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz",
"integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==",
"dev": true,
"dependencies": {
"foreground-child": "^3.1.0",
"jackspeak": "^2.3.6",
"minimatch": "^9.0.1",
"minipass": "^7.0.4",
"path-scurry": "^1.10.2"
},
"bin": {
"glob": "dist/esm/bin.mjs"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/config-file-ts/node_modules/minimatch": {
"version": "9.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
"integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/config-file-ts/node_modules/minipass": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
"integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
"dev": true,
"engines": {
"node": ">=16 || 14 >=14.17"
"glob": "^7.1.6",
"typescript": "^4.0.2"
}
},
"node_modules/core-util-is": {
@@ -1817,14 +1669,14 @@
}
},
"node_modules/dmg-builder": {
"version": "24.13.3",
"resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz",
"integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==",
"version": "24.9.1",
"resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.9.1.tgz",
"integrity": "sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ==",
"dev": true,
"dependencies": {
"app-builder-lib": "24.13.3",
"builder-util": "24.13.1",
"builder-util-runtime": "9.2.4",
"app-builder-lib": "24.9.1",
"builder-util": "24.8.1",
"builder-util-runtime": "9.2.3",
"fs-extra": "^10.1.0",
"iconv-lite": "^0.6.2",
"js-yaml": "^4.1.0"
@@ -1834,9 +1686,9 @@
}
},
"node_modules/dmg-builder/node_modules/builder-util-runtime": {
"version": "9.2.4",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz",
"integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==",
"version": "9.2.3",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz",
"integrity": "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
@@ -1871,31 +1723,16 @@
"node": ">=8"
}
},
"node_modules/dotenv": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz",
"integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/dotenv-expand": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
"dev": true
},
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
"dev": true
},
"node_modules/ejs": {
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
"integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
"version": "3.1.9",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
"integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
"dev": true,
"dependencies": {
"jake": "^10.8.5"
@@ -1908,14 +1745,14 @@
}
},
"node_modules/electron": {
"version": "29.3.1",
"resolved": "https://registry.npmjs.org/electron/-/electron-29.3.1.tgz",
"integrity": "sha512-auge1/6RVqgUd6TgIq88wKdUCJi2cjESi3jy7d+6X4JzvBGprKBqMJ8JSSFpu/Px1YJrFUKAxfy6SC+TQf1uLw==",
"version": "28.2.1",
"resolved": "https://registry.npmjs.org/electron/-/electron-28.2.1.tgz",
"integrity": "sha512-wlzXf+OvOiVlBf9dcSeMMf7Q+N6DG+wtgFbMK0sA/JpIJcdosRbLMQwLg/LTwNVKIbmayqFLDp4FmmFkEMhbYA==",
"dev": true,
"hasInstallScript": true,
"dependencies": {
"@electron/get": "^2.0.0",
"@types/node": "^20.9.0",
"@types/node": "^18.11.18",
"extract-zip": "^2.0.1"
},
"bin": {
@@ -1926,16 +1763,16 @@
}
},
"node_modules/electron-builder": {
"version": "24.13.3",
"resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz",
"integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==",
"version": "24.9.1",
"resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.9.1.tgz",
"integrity": "sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg==",
"dev": true,
"dependencies": {
"app-builder-lib": "24.13.3",
"builder-util": "24.13.1",
"builder-util-runtime": "9.2.4",
"app-builder-lib": "24.9.1",
"builder-util": "24.8.1",
"builder-util-runtime": "9.2.3",
"chalk": "^4.1.2",
"dmg-builder": "24.13.3",
"dmg-builder": "24.9.1",
"fs-extra": "^10.1.0",
"is-ci": "^3.0.0",
"lazy-val": "^1.0.5",
@@ -1952,9 +1789,9 @@
}
},
"node_modules/electron-builder/node_modules/builder-util-runtime": {
"version": "9.2.4",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz",
"integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==",
"version": "9.2.3",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz",
"integrity": "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
@@ -1965,14 +1802,14 @@
}
},
"node_modules/electron-publish": {
"version": "24.13.1",
"resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz",
"integrity": "sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==",
"version": "24.8.1",
"resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.8.1.tgz",
"integrity": "sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw==",
"dev": true,
"dependencies": {
"@types/fs-extra": "^9.0.11",
"builder-util": "24.13.1",
"builder-util-runtime": "9.2.4",
"builder-util": "24.8.1",
"builder-util-runtime": "9.2.3",
"chalk": "^4.1.2",
"fs-extra": "^10.1.0",
"lazy-val": "^1.0.5",
@@ -1980,9 +1817,9 @@
}
},
"node_modules/electron-publish/node_modules/builder-util-runtime": {
"version": "9.2.4",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz",
"integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==",
"version": "9.2.3",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz",
"integrity": "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
@@ -2020,15 +1857,6 @@
"tiny-typed-emitter": "^2.1.0"
}
},
"node_modules/electron/node_modules/@types/node": {
"version": "20.12.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz",
"integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==",
"dev": true,
"dependencies": {
"undici-types": "~5.26.4"
}
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -2223,22 +2051,6 @@
"node": ">=8"
}
},
"node_modules/foreground-child": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
"integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
"dev": true,
"dependencies": {
"cross-spawn": "^7.0.0",
"signal-exit": "^4.0.1"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
@@ -2749,12 +2561,12 @@
}
},
"node_modules/isbinaryfile": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz",
"integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz",
"integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==",
"dev": true,
"engines": {
"node": ">= 18.0.0"
"node": ">= 14.0.0"
},
"funding": {
"url": "https://github.com/sponsors/gjtorikian/"
@@ -2766,24 +2578,6 @@
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
"node_modules/jackspeak": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
"integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
"dev": true,
"dependencies": {
"@isaacs/cliui": "^8.0.2"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
},
"optionalDependencies": {
"@pkgjs/parseargs": "^0.11.0"
}
},
"node_modules/jake": {
"version": "10.8.7",
"resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
@@ -3116,18 +2910,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/npm-run-path": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz",
"integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==",
"dev": true,
"dependencies": {
"path-key": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
@@ -3173,31 +2955,6 @@
"node": ">=8"
}
},
"node_modules/path-scurry": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz",
"integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==",
"dev": true,
"dependencies": {
"lru-cache": "^10.2.0",
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/path-scurry/node_modules/lru-cache": {
"version": "10.2.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.1.tgz",
"integrity": "sha512-tS24spDe/zXhWbNPErCHs/AGOzbKGHT+ybSBqmdLm8WZ1xXLWvH8Qn71QPAlqVhd0qUTWjy+Kl9JmISgDdEjsA==",
"dev": true,
"engines": {
"node": "14 || >=16.14"
}
},
"node_modules/peek-readable": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz",
@@ -3274,23 +3031,6 @@
"node": ">=10"
}
},
"node_modules/prebuildify": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/prebuildify/-/prebuildify-6.0.1.tgz",
"integrity": "sha512-8Y2oOOateom/s8dNBsGIcnm6AxPmLH4/nanQzL5lQMU+sC0CMhzARZHizwr36pUPLdvBnOkCNQzxg4djuFSgIw==",
"dev": true,
"dependencies": {
"minimist": "^1.2.5",
"mkdirp-classic": "^0.5.3",
"node-abi": "^3.3.0",
"npm-run-path": "^3.1.0",
"pump": "^3.0.0",
"tar-fs": "^2.1.0"
},
"bin": {
"prebuildify": "bin.js"
}
},
"node_modules/progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
@@ -3374,6 +3114,15 @@
"node": ">=12.0.0"
}
},
"node_modules/read-config-file/node_modules/dotenv": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz",
"integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==",
"dev": true,
"engines": {
"node": ">=10"
}
},
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -3449,6 +3198,21 @@
"node": ">= 4"
}
},
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"dependencies": {
"glob": "^7.1.3"
},
"bin": {
"rimraf": "bin.js"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/roarr": {
"version": "2.15.4",
"resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
@@ -3586,18 +3350,6 @@
"node": ">=8"
}
},
"node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"dev": true,
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/simple-concat": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
@@ -3678,12 +3430,12 @@
}
},
"node_modules/sodium-native": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.1.1.tgz",
"integrity": "sha512-LXkAfRd4FHtkQS4X6g+nRcVaN7mWVNepV06phIsC6+IZFvGh1voW5TNQiQp2twVaMf05gZqQjuS+uWLM6gHhNQ==",
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.0.6.tgz",
"integrity": "sha512-uYsyycwcz9kYDwpXxJmL2YZosynsxcP6RPySbARVJdC9uNDa2CMjzJ7/WsMMvThKgvAYsBWdZc7L/WSVj9lTcA==",
"hasInstallScript": true,
"dependencies": {
"node-gyp-build": "^4.8.0"
"node-gyp-build": "^4.6.0"
}
},
"node_modules/source-map": {
@@ -3706,9 +3458,9 @@
}
},
"node_modules/sprintf-js": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
"integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
"integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
"dev": true,
"optional": true
},
@@ -3742,21 +3494,6 @@
"node": ">=8"
}
},
"node_modules/string-width-cjs": {
"name": "string-width",
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -3768,19 +3505,6 @@
"node": ">=8"
}
},
"node_modules/strip-ansi-cjs": {
"name": "strip-ansi",
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
@@ -3830,9 +3554,9 @@
}
},
"node_modules/tar": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
"integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
"integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
"dev": true,
"dependencies": {
"chownr": "^2.0.0",
@@ -3893,12 +3617,15 @@
"integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA=="
},
"node_modules/tmp": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
"integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
"integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
"dev": true,
"dependencies": {
"rimraf": "^3.0.0"
},
"engines": {
"node": ">=14.14"
"node": ">=8.17.0"
}
},
"node_modules/tmp-promise": {
@@ -3987,33 +3714,30 @@
}
},
"node_modules/typescript": {
"version": "5.4.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
"integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
"version": "4.9.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
"integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
"node": ">=4.2.0"
}
},
"node_modules/undici": {
"version": "6.14.1",
"resolved": "https://registry.npmjs.org/undici/-/undici-6.14.1.tgz",
"integrity": "sha512-mAel3i4BsYhkeVPXeIPXVGPJKeBzqCieZYoFsbWfUzd68JmHByhc1Plit5WlylxXFaGpgkZB8mExlxnt+Q1p7A==",
"version": "6.6.1",
"resolved": "https://registry.npmjs.org/undici/-/undici-6.6.1.tgz",
"integrity": "sha512-J0GaEp0ztu/grIE2Uq57AbK6TRb+bWbOlxu0POCzhFKA6LKbwSAev+hDQaQcgUUA9CPs8Ky+cauzTHnQrtAQEA==",
"dev": true,
"dependencies": {
"@fastify/busboy": "^2.0.0"
},
"engines": {
"node": ">=18.17"
"node": ">=18.0"
}
},
"node_modules/undici-types": {
"version": "5.26.5",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
"dev": true
},
"node_modules/universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
@@ -4087,24 +3811,6 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs": {
"name": "wrap-ansi",
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",

View File

@@ -2,7 +2,7 @@
"name": "@notesnook/desktop",
"productName": "Notesnook",
"description": "Your private note taking space",
"version": "3.0.2",
"version": "3.0.7-beta",
"appAppleId": "1544027013",
"private": true,
"main": "./dist/index.js",
@@ -14,11 +14,11 @@
"@notesnook/crypto": "file:../../packages/crypto",
"@trpc/client": "10.38.3",
"@trpc/server": "10.38.3",
"better-sqlite3-multiple-ciphers": "^9.5.0",
"better-sqlite3-multiple-ciphers": "^9.4.0",
"electron-trpc": "0.5.2",
"electron-updater": "6.1.4",
"icojs": "^0.17.1",
"sodium-native": "^4.1.1",
"sodium-native": "^4.0.6",
"typed-emitter": "^2.1.0",
"yargs": "^17.6.2",
"zod": "^3.21.4"
@@ -27,13 +27,11 @@
"@types/node": "18.16.1",
"@types/yargs": "^17.0.24",
"chokidar": "^3.5.3",
"electron": "^29.3.1",
"electron-builder": "^24.13.3",
"electron": "^28.2.1",
"electron-builder": "^24.9.1",
"esbuild": "^0.20.0",
"node-gyp-build": "^4.8.0",
"prebuildify": "^6.0.1",
"tree-kill": "^1.2.2",
"undici": "^6.14.1"
"undici": "^6.6.1"
},
"optionalDependencies": {
"dmg-license": "^1.0.11"
@@ -57,8 +55,8 @@
"productName": "Notesnook",
"copyright": "Copyright © 2023 Streetwriters (Private) Limited",
"artifactName": "notesnook_${os}_${arch}.${ext}",
"generateUpdatesFilesForAllChannels": true,
"asar": false,
"generateUpdatesFilesForAllChannels": true,
"files": [
"!*.chunk.js.map",
"!*.chunk.js.LICENSE.txt",
@@ -221,7 +219,8 @@
{
"provider": "github",
"repo": "notesnook",
"owner": "streetwriters"
"owner": "streetwriters",
"channel": "beta"
}
]
}

View File

@@ -1,46 +0,0 @@
diff --git a/node_modules/node-gyp-build/bin.js b/node_modules/node-gyp-build/bin.js
index 3fbcdf0..7ca3ab5 100644
--- a/node_modules/node-gyp-build/bin.js
+++ b/node_modules/node-gyp-build/bin.js
@@ -16,7 +16,8 @@ if (!buildFromSource()) {
}
function build () {
- var args = [os.platform() === 'win32' ? 'node-gyp.cmd' : 'node-gyp', 'rebuild']
+ var win32 = os.platform() === 'win32'
+ var args = [win32 ? 'node-gyp.cmd' : 'node-gyp', 'rebuild']
try {
var pkg = require('node-gyp/package.json')
@@ -27,7 +28,7 @@ function build () {
]
} catch (_) {}
- proc.spawn(args[0], args.slice(1), { stdio: 'inherit' }).on('exit', function (code) {
+ proc.spawn(args[0], args.slice(1), { stdio: 'inherit', shell: win32, windowsHide: true }).on('exit', function (code) {
if (code || !process.argv[3]) process.exit(code)
exec(process.argv[3]).on('exit', function (code) {
process.exit(code)
@@ -45,15 +46,18 @@ function preinstall () {
function exec (cmd) {
if (process.platform !== 'win32') {
- var shell = os.platform() === 'android' ? 'sh' : '/bin/sh'
- return proc.spawn(shell, ['-c', '--', cmd], {
+ var shell = os.platform() === 'android' ? 'sh' : true
+ return proc.spawn(cmd, [], {
+ shell,
stdio: 'inherit'
})
}
- return proc.spawn(process.env.comspec || 'cmd.exe', ['/s', '/c', '"' + cmd + '"'], {
+ return proc.spawn(cmd, [], {
windowsVerbatimArguments: true,
- stdio: 'inherit'
+ stdio: 'inherit',
+ shell: true,
+ windowsHide: true
})
}

View File

@@ -19,7 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import path from "path";
import fs, { readFile, writeFile } from "fs/promises";
import { existsSync, readFileSync } from "fs";
import { existsSync } from "fs";
import yargs from "yargs-parser";
import os from "os";
import * as childProcess from "child_process";
@@ -28,27 +28,21 @@ import { fileURLToPath } from "url";
const args = yargs(process.argv);
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const packageJson = JSON.parse(
readFileSync(path.join(__dirname, "..", "package.json"), "utf-8")
);
const webAppPath = path.resolve(path.join(__dirname, "..", "..", "web"));
await fs.rm("./build/", { force: true, recursive: true });
if (args.rebuild || !existsSync(path.join(webAppPath, "build"))) {
await exec(
"npx nx build:desktop @notesnook/web",
path.join(__dirname, "..", "..", "..")
);
await exec(`cd ${webAppPath} && npm run build:desktop`);
}
// temporary until there's support for prebuilt binaries for linux ARM
if (os.platform() === "linux") await patchBetterSQLite3();
// temporary until there's support for prebuilt binaries for windows ARM & linux ARM
await patchBetterSQLite3();
if (os.platform() === "win32")
await exec(
`npx prebuildify --arch=arm64 --strip -t electron@${packageJson.devDependencies.electron}`,
"npx prebuildify --arch=arm64 --strip",
path.join(__dirname, "..", "node_modules", "sodium-native")
);
@@ -70,7 +64,7 @@ if (args.run) {
if (process.platform === "win32") {
await exec(`.\\output\\win-unpacked\\Notesnook.exe`);
} else if (process.platform === "darwin") {
await exec(`./output/mac/Notesnook.app/Contents/MacOS/Notesnook`);
await exec(`./output/darwin-unpacked/Notesnook`);
} else {
await exec(`./output/linux-unpacked/Notesnook`);
}
@@ -94,7 +88,7 @@ async function patchBetterSQLite3() {
);
const json = JSON.parse(await readFile(jsonPath, "utf-8"));
json.version = "9.5.1";
json.version = "9.4.1";
json.homepage = "https://github.com/thecodrr/better-sqlite3-multiple-ciphers";
json.repository.url =
"git://github.com/thecodrr/better-sqlite3-multiple-ciphers.git";

View File

@@ -53,7 +53,7 @@ async function onChange(first) {
if (first) {
await fs.rm("./build/", { force: true, recursive: true });
await exec("npx electron-builder install-app-deps");
await exec("npx electron-rebuild");
}
await exec(`npm run bundle`);

View File

@@ -33,7 +33,7 @@ module.exports = async function (configuration) {
const DescriptionUrl = "https://notesnook.com/";
const FilesCatalog = createCatalog(configuration.path);
const command = `Invoke-TrustedSigning -Endpoint "${Endpoint}" -CodeSigningAccountName "${CodeSigningAccountName}" -CertificateProfileName "${CertificateProfileName}" -FileDigest "${FileDigest}" -TimestampRfc3161 "${TimestampRfc3161}" -TimestampDigest "${TimestampDigest}" -Description "${Description}" -DescriptionUrl "${DescriptionUrl}" -FilesCatalog "${FilesCatalog}"`;
const command = `Invoke-AzureCodeSigning -Endpoint "${Endpoint}" -CodeSigningAccountName "${CodeSigningAccountName}" -CertificateProfileName "${CertificateProfileName}" -FileDigest "${FileDigest}" -TimestampRfc3161 "${TimestampRfc3161}" -TimestampDigest "${TimestampDigest}" -Description "${Description}" -DescriptionUrl "${DescriptionUrl}" -FilesCatalog "${FilesCatalog}"`;
console.debug("Signing", configuration.path, "using command", command);

View File

@@ -24,7 +24,6 @@ import { spellCheckerRouter } from "./spell-checker";
import { updaterRouter } from "./updater";
import { bridgeRouter } from "./bridge";
import { safeStorageRouter } from "./safe-storage";
import { windowRouter } from "./window";
const t = initTRPC.create();
@@ -34,8 +33,7 @@ export const router = t.router({
spellChecker: spellCheckerRouter,
updater: updaterRouter,
bridge: bridgeRouter,
safeStorage: safeStorageRouter,
window: windowRouter
safeStorage: safeStorageRouter
});
export const api = router.createCaller({});

View File

@@ -32,7 +32,6 @@ import { AssetManager } from "../utils/asset-manager";
import { isFlatpak } from "../utils";
import { setupDesktopIntegration } from "../utils/desktop-integration";
import { rm } from "fs/promises";
import { disableCustomDns, enableCustomDns } from "../utils/custom-dns";
const t = initTRPC.create();
@@ -56,15 +55,6 @@ export const osIntegrationRouter = t.router({
config.zoomFactor = factor;
}),
customDns: t.procedure.query(() => config.customDns),
setCustomDns: t.procedure
.input(z.boolean())
.mutation(({ input: customDns }) => {
if (customDns) enableCustomDns();
else disableCustomDns();
config.customDns = customDns;
}),
proxyRules: t.procedure.query(() => config.proxyRules),
setProxyRules: t.procedure
.input(z.string().optional())
@@ -180,42 +170,16 @@ export const osIntegrationRouter = t.router({
}),
bringToFront: t.procedure.query(() => bringToFront()),
changeTheme: t.procedure
.input(
z.object({
theme: Theme,
windowControlsIconColor: z.string().optional(),
backgroundColor: z.string().optional()
})
)
.mutation(
({ input: { theme, windowControlsIconColor, backgroundColor } }) => {
if (windowControlsIconColor) {
config.windowControlsIconColor = windowControlsIconColor;
if (process.platform === "win32")
globalThis.window?.setTitleBarOverlay({
symbolColor: windowControlsIconColor
});
}
if (backgroundColor) {
config.backgroundColor = backgroundColor;
}
setTheme(theme);
}
),
.input(Theme)
.mutation(({ input }) => setTheme(input)),
onThemeChanged: t.procedure.subscription(() =>
observable<"dark" | "light">((emit) => {
const updated = () => {
nativeTheme.on("updated", () => {
if (getTheme() === "system") {
emit.next(nativeTheme.shouldUseDarkColors ? "dark" : "light");
}
};
nativeTheme.on("updated", updated);
return () => {
nativeTheme.off("updated", updated);
};
});
})
)
});

View File

@@ -28,20 +28,16 @@ type UpdateInfo = { version: string };
type Progress = { percent: number };
const t = initTRPC.create();
let cancellationToken: CancellationToken | undefined = undefined;
export const updaterRouter = t.router({
autoUpdates: t.procedure.query(() => config.automaticUpdates),
install: t.procedure.query(() => autoUpdater.quitAndInstall()),
download: t.procedure.query(async () => {
if (cancellationToken) return;
cancellationToken = new CancellationToken();
await autoUpdater
.downloadUpdate(cancellationToken)
.finally(() => (cancellationToken = undefined));
const cancellationToken = new CancellationToken();
await autoUpdater.downloadUpdate(cancellationToken);
}),
check: t.procedure.query(async () => {
await autoUpdater.checkForUpdates().catch(console.error);
await autoUpdater.checkForUpdates();
}),
toggleAutoUpdates: t.procedure
@@ -75,7 +71,6 @@ function createSubscription<
const listener: AppUpdaterEvents[TName] = (...args: any[]) => {
emit.next(args[0]);
};
autoUpdater.removeAllListeners(eventName);
autoUpdater.addListener(eventName, listener);
return () => {
autoUpdater.removeListener(eventName, listener);

View File

@@ -1,83 +0,0 @@
/*
This file is part of the Notesnook project (https://notesnook.com/)
Copyright (C) 2023 Streetwriters (Private) Limited
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 <http://www.gnu.org/licenses/>.
*/
import { initTRPC } from "@trpc/server";
import { observable } from "@trpc/server/observable";
const t = initTRPC.create();
export const windowRouter = t.router({
maximize: t.procedure.mutation(() => {
globalThis.window?.maximize();
}),
restore: t.procedure.mutation(() => {
globalThis.window?.restore();
}),
minimze: t.procedure.mutation(() => {
globalThis.window?.minimize();
}),
maximized: t.procedure.query(() => globalThis.window?.isMaximized()),
fullscreen: t.procedure.query(() => globalThis.window?.isFullScreen()),
onWindowStateChanged: t.procedure.subscription(() => {
return observable<{ maximized: boolean; fullscreen: boolean }>((emit) => {
function listener() {
emit.next({
maximized: !!globalThis.window?.isMaximized(),
fullscreen: !!globalThis.window?.isFullScreen()
});
}
function enterFullscreen() {
emit.next({
maximized: !!globalThis.window?.isMaximized(),
fullscreen: true
});
}
function leaveFullscreen() {
emit.next({
maximized: !!globalThis.window?.isMaximized(),
fullscreen: false
});
}
globalThis.window?.addListener("maximize", listener);
globalThis.window?.addListener("minimize", listener);
globalThis.window?.addListener("unmaximize", listener);
globalThis.window?.addListener("restore", listener);
globalThis.window?.addListener("enter-full-screen", enterFullscreen);
globalThis.window?.addListener("leave-full-screen", leaveFullscreen);
globalThis.window?.addListener("leave-html-full-screen", leaveFullscreen);
globalThis.window?.addListener("enter-html-full-screen", enterFullscreen);
return () => {
globalThis.window?.removeListener("maximize", listener);
globalThis.window?.removeListener("minimize", listener);
globalThis.window?.removeListener("unmaximize", listener);
globalThis.window?.removeListener("restore", listener);
globalThis.window?.removeListener("enter-full-screen", enterFullscreen);
globalThis.window?.removeListener("leave-full-screen", leaveFullscreen);
globalThis.window?.removeListener(
"leave-html-full-screen",
leaveFullscreen
);
globalThis.window?.removeListener(
"enter-html-full-screen",
enterFullscreen
);
};
});
})
});

View File

@@ -35,7 +35,6 @@ import path from "path";
import { bringToFront } from "./utils/bring-to-front";
import { bridge } from "./api/bridge";
import { setupDesktopIntegration } from "./utils/desktop-integration";
import { disableCustomDns, enableCustomDns } from "./utils/custom-dns";
// only run a single instance
if (!MAC_APP_STORE && !app.requestSingleInstanceLock()) {
@@ -83,19 +82,6 @@ async function createWindow() {
size: 512,
format: process.platform === "win32" ? "ico" : "png"
}),
titleBarStyle: "hidden",
frame: process.platform === "win32" || process.platform === "darwin",
titleBarOverlay: {
height: 37,
color: "#00000000",
symbolColor: config.windowControlsIconColor
},
trafficLightPosition: {
x: 16,
y: 12
},
webPreferences: {
zoomFactor: config.zoomFactor,
nodeIntegration: true,
@@ -136,7 +122,7 @@ async function createWindow() {
setupJumplist();
if (isDevelopment())
mainWindow.webContents.openDevTools({ mode: "bottom", activate: true });
mainWindow.webContents.openDevTools({ mode: "right", activate: true });
mainWindow.webContents.setWindowOpenHandler((details) => {
shell.openExternal(details.url);
@@ -152,9 +138,6 @@ async function createWindow() {
app.once("ready", async () => {
console.info("App ready. Opening window.");
if (config.customDns) enableCustomDns();
else disableCustomDns();
if (!isDevelopment()) registerProtocol();
await createWindow();
configureAutoUpdater();

View File

@@ -42,12 +42,7 @@ export const config = {
zoomFactor: 1,
theme: nativeTheme.themeSource,
automaticUpdates: true,
proxyRules: "",
customDns: true,
backgroundColor: nativeTheme.themeSource === "dark" ? "#0f0f0f" : "#ffffff",
windowControlsIconColor:
nativeTheme.themeSource === "dark" ? "#ffffff" : "#000000"
proxyRules: ""
};
type ConfigKey = keyof typeof config;

View File

@@ -1,37 +0,0 @@
/*
This file is part of the Notesnook project (https://notesnook.com/)
Copyright (C) 2023 Streetwriters (Private) Limited
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 <http://www.gnu.org/licenses/>.
*/
import { app } from "electron";
export function enableCustomDns() {
app.configureHostResolver({
secureDnsServers: [
"https://mozilla.cloudflare-dns.com/dns-query",
"https://dns.quad9.net/dns-query"
],
enableBuiltInResolver: true
});
}
export function disableCustomDns() {
app.configureHostResolver({
secureDnsServers: [],
enableBuiltInResolver: true
});
}

View File

@@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import { net, protocol } from "electron";
import { protocol } from "electron";
import { isDevelopment } from "./index";
import { createReadStream } from "fs";
import { extname, normalize } from "path";
@@ -62,7 +62,26 @@ function registerProtocol() {
headers: { "Content-Type": extensionToMimeType[fileExtension] }
});
} else {
return net.fetch(request, { bypassCustomProtocolHandlers: true });
if (request.headers.has("X-Content-Length")) {
request.headers.set(
"Content-Length",
request.headers.get("X-Content-Length") || "0"
);
request.headers.delete("X-Content-Length");
}
const headers = Object.fromEntries(request.headers.entries());
return await fetch(request.url, {
signal: request.signal,
mode: request.mode,
headers,
method: request.method,
body: request.body,
credentials: request.credentials,
referrer: (request as any).referrer,
duplex: "half",
redirect: "manual"
});
}
});
console.info(`${SCHEME} protocol inteception "successful"`);

View File

@@ -41,10 +41,7 @@ function setTheme(theme: Theme) {
}
function getBackgroundColor() {
return (
config.backgroundColor ||
(nativeTheme.shouldUseDarkColors ? "#0f0f0f" : "#ffffff")
);
return nativeTheme.shouldUseDarkColors ? "#0f0f0f" : "#ffffff";
}
function getSystemTheme() {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -136,10 +136,11 @@ export async function validateAppLockPassword(appLockPassword) {
const appLockCipher = CipherStorage.getMap(APPLOCK_CIPHER);
if (!appLockCipher) return true;
const decrypted = await decrypt(
await Sodium.deriveKey(appLockPassword, NOTESNOOK_APPLOCK_KEY_SALT),
{
password: appLockPassword
},
appLockCipher
);
DatabaseLogger.info(
`validateAppLockPassword: ${typeof decrypted === "string"}`
);
@@ -318,6 +319,7 @@ export async function decrypt(password, data) {
_data.output = "plain";
if (!password.salt) password.salt = data.salt;
return await Sodium.decrypt(password, _data);
}

View File

@@ -218,7 +218,12 @@ export default async function downloadAttachment(
}
if (options.base64 || options.text) {
DatabaseLogger.log(`Starting to decrypt... hash: ${attachment.hash}`);
console.log(
"starting decrypt base64 file...",
options.base64,
options.text,
attachment.hash
);
return await db.attachments.read(
attachment.hash,
options.base64 ? "base64" : "text"
@@ -287,7 +292,7 @@ export default async function downloadAttachment(
return fileUri;
} catch (e) {
DatabaseLogger.error(e);
console.log("download attachment error: ", e);
if (attachment.dateUploaded) {
RNFetchBlob.fs
.unlink(RNFetchBlob.fs.dirs.CacheDir + `/${attachment.hash}`)

View File

@@ -22,24 +22,21 @@ import NetInfo from "@react-native-community/netinfo";
import RNFetchBlob from "react-native-blob-util";
import { ToastManager } from "../../services/event-manager";
import { useAttachmentStore } from "../../stores/use-attachment-store";
import { DatabaseLogger, db } from "../database";
import { db } from "../database";
import { cacheDir, fileCheck } from "./utils";
import { createCacheDir, exists } from "./io";
export async function downloadFile(filename, data, cancelToken) {
if (!data) {
DatabaseLogger.log(`Error downloading file: ${filename}, reason: No data`);
return false;
}
if (!data) return false;
DatabaseLogger.log(`Downloading ${filename}`);
console.log("Downloading", filename);
await createCacheDir();
let { url, headers } = data;
let path = `${cacheDir}/${filename}`;
try {
if (await exists(filename)) {
DatabaseLogger.log(`File Exists already: ${filename}`);
console.log("Exists already", filename);
return true;
}
@@ -47,24 +44,13 @@ export async function downloadFile(filename, data, cancelToken) {
method: "GET",
headers
});
if (!res.ok) {
DatabaseLogger.log(
`Error downloading file: ${filename}, ${res.status}, ${res.statusText}, reason: Unable to resolve download url`
);
if (!res.ok)
throw new Error(`${res.status}: Unable to resolve download url`);
}
const downloadUrl = await res.text();
if (!downloadUrl) {
DatabaseLogger.log(
`Error downloading file: ${filename}, reason: Unable to resolve download url`
);
throw new Error("Unable to resolve download url");
}
if (!downloadUrl) throw new Error("Unable to resolve download url");
let totalSize = 0;
DatabaseLogger.log(`Download starting: ${filename}`);
console.log("Download starting");
let request = RNFetchBlob.config({
path: path,
IOSBackgroundTask: true
@@ -75,15 +61,13 @@ export async function downloadFile(filename, data, cancelToken) {
.getState()
.setProgress(0, total, filename, recieved, "download");
totalSize = total;
DatabaseLogger.log(`Downloading: ${filename}, ${recieved}/${total}`);
console.log("downloading: ", recieved, total);
});
cancelToken.cancel = () => {
useAttachmentStore.getState().remove(filename);
request.cancel();
DatabaseLogger.log(`Download cancelled: ${filename}`);
};
let response = await request;
await fileCheck(response, totalSize);
let status = response.info().status;
@@ -107,10 +91,7 @@ export async function downloadFile(filename, data, cancelToken) {
useAttachmentStore.getState().remove(filename);
RNFetchBlob.fs.unlink(path).catch(console.log);
DatabaseLogger.error(e, {
url,
headers
});
console.log("Download file error:", e, url, headers);
return false;
}
}
@@ -119,17 +100,18 @@ export async function getUploadedFileSize(hash) {
try {
const url = `${hosts.API_HOST}/s3?name=${hash}`;
const token = await db.tokenManager.getAccessToken();
const attachmentInfo = await fetch(url, {
method: "HEAD",
headers: { Authorization: `Bearer ${token}` }
});
const contentLength = parseInt(
attachmentInfo.headers?.get("content-length")
);
return isNaN(contentLength) ? 0 : contentLength;
} catch (e) {
DatabaseLogger.error(e);
return -1;
return 0;
}
}
@@ -143,9 +125,7 @@ export async function checkAttachment(hash) {
try {
const size = await getUploadedFileSize(hash);
if (size === -1) return { success: true };
if (size === 0) return { failed: "File length is 0." };
if (size <= 0) return { failed: "File length is 0." };
} catch (e) {
return { failed: e?.message };
}

View File

@@ -21,12 +21,12 @@ import Sodium from "@ammarahmed/react-native-sodium";
import { Platform } from "react-native";
import RNFetchBlob from "react-native-blob-util";
import { IOS_APPGROUPID } from "../../utils/constants";
import { DatabaseLogger, db } from "../database";
import { db } from "../database";
import { cacheDir, cacheDirOld, getRandomId } from "./utils";
export async function readEncrypted(filename, key, cipherData) {
await migrateFilesFromCache();
DatabaseLogger.log("Read encrypted file...");
console.log("Read encrypted file...");
let path = `${cacheDir}/${filename}`;
try {
@@ -34,6 +34,8 @@ export async function readEncrypted(filename, key, cipherData) {
return false;
}
const attachment = await db.attachments.attachment(filename);
console.log("decrypting....");
let output = await Sodium.decryptFile(
key,
{
@@ -43,13 +45,12 @@ export async function readEncrypted(filename, key, cipherData) {
},
cipherData.outputType === "base64" ? "base64" : "text"
);
DatabaseLogger.log("File decrypted...");
console.log("file decrypted...", attachment?.mimeType);
return output;
} catch (e) {
RNFetchBlob.fs.unlink(path).catch(console.log);
DatabaseLogger.error(e);
console.log("readEncrypted", e);
return false;
}
}
@@ -66,7 +67,7 @@ export async function hashBase64(data) {
};
}
export async function writeEncryptedBase64(data, key) {
export async function writeEncryptedBase64({ data, key }) {
await createCacheDir();
let filepath = cacheDir + `/${getRandomId("imagecache_")}`;
await RNFetchBlob.fs.writeFile(filepath, data, "base64");
@@ -76,8 +77,6 @@ export async function writeEncryptedBase64(data, key) {
});
RNFetchBlob.fs.unlink(filepath).catch(console.log);
console.log("encrypted file output: ", output);
output.size = output.length;
delete output.length;
return {
...output,
alg: "xcha-stream"
@@ -127,7 +126,7 @@ export async function clearFileStorage() {
export async function createCacheDir() {
if (!(await RNFetchBlob.fs.exists(cacheDir))) {
await RNFetchBlob.fs.mkdir(cacheDir);
DatabaseLogger.log("Cache directory created");
console.log("Cache directory created");
}
}
@@ -187,9 +186,6 @@ export async function exists(filename) {
);
if (stat.size !== expectedFileSize) {
DatabaseLogger.log(
`File size mismatch: ${filename}, expected: ${expectedFileSize}, actual: ${stat.size}`
);
RNFetchBlob.fs
.unlink(existsInAppGroup ? appGroupPath : path)
.catch(console.log);

View File

@@ -25,7 +25,6 @@ import { isImage, isDocument } from "@notesnook/core/dist/utils/filename";
import { Platform } from "react-native";
import { IOS_APPGROUPID } from "../../utils/constants";
import { createCacheDir } from "./io";
import { getUploadedFileSize } from "./download";
export async function uploadFile(filename, data, cancelToken) {
if (!data) return false;
@@ -34,18 +33,6 @@ export async function uploadFile(filename, data, cancelToken) {
DatabaseLogger.info(`Preparing to upload file: ${filename}`);
try {
const uploadedFileSize = await getUploadedFileSize(filename);
if (uploadedFileSize === -1) {
DatabaseLogger.log("Upload verification failed.");
return false;
}
const isUploaded = uploadedFileSize !== 0;
if (isUploaded) {
DatabaseLogger.log(`File ${filename} is already uploaded.`);
return true;
}
let res = await fetch(url, {
method: "PUT",
headers
@@ -63,15 +50,7 @@ export async function uploadFile(filename, data, cancelToken) {
let exists = await RNFetchBlob.fs.exists(uploadFilePath);
if (!exists && Platform.OS === "ios") {
uploadFilePath = appGroupPath;
exists = await RNFetchBlob.fs.exists(uploadFilePath);
}
if (!exists) {
throw new Error(
`Trying to upload file at path ${uploadFilePath} that doest not exist.`
);
}
DatabaseLogger.info(`Starting upload: ${filename}`);
let request = RNFetchBlob.config({

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import React, { useCallback, useEffect, useRef } from "react";
import { AppStateStatus, Platform, TextInput, View } from "react-native";
import { Platform, TextInput, View } from "react-native";
//@ts-ignore
import { useThemeColors } from "@notesnook/theme";
import { enabled } from "react-native-privacy-snapshot";
@@ -74,7 +74,6 @@ const verifyUserPassword = async (password: string) => {
};
const AppLockedOverlay = () => {
const initialLaunchBiometricRequest = useRef(true);
const { colors } = useThemeColors();
const user = getUser();
const appLocked = useUserStore((state) => state.appLocked);
@@ -83,7 +82,6 @@ const AppLockedOverlay = () => {
const passwordInputRef = useRef<TextInput>(null);
const password = useRef<string>();
const appState = useAppState();
const lastAppState = useRef<AppStateStatus>(appState);
const biometricUnlockAwaitingUserInput = useRef(false);
const keyboardType = useSettingStore(
(state) => state.settings.applockKeyboardType
@@ -133,8 +131,9 @@ const AppLockedOverlay = () => {
if (!password.current) return;
try {
const unlocked = appLockHasPasswordSecurity
? await validateAppLockPassword(password.current)
? validateAppLockPassword(password.current)
: await verifyUserPassword(password.current);
if (unlocked) {
if (!appLockHasPasswordSecurity) {
await setAppLockVerificationCipher(password.current);
@@ -155,46 +154,18 @@ const AppLockedOverlay = () => {
};
useEffect(() => {
if (appState === "active") {
enabled(false);
}
const prevState = lastAppState.current;
lastAppState.current = appState;
if (
biometricUnlockAwaitingUserInput.current ||
useUserStore.getState().disableAppLockRequests
)
return;
if (
appLocked &&
appState === "active" &&
(prevState === "background" || initialLaunchBiometricRequest.current)
!useSettingStore.getState().requestBiometrics
) {
if (SettingsService.shouldLockAppOnEnterForeground()) {
DatabaseLogger.info("Locking app on entering foreground");
useUserStore.getState().lockApp(true);
}
if (
!(
biometricUnlockAwaitingUserInput.current ||
useUserStore.getState().disableAppLockRequests ||
!appLocked ||
useSettingStore.getState().requestBiometrics ||
useSettingStore.getState().appDidEnterBackgroundForAction
)
) {
initialLaunchBiometricRequest.current = false;
DatabaseLogger.info("Biometric unlock request");
onUnlockAppRequested();
}
enabled(false);
} else {
SettingsService.appEnteredBackground();
if (
SettingsService.get().privacyScreen ||
SettingsService.getProperty("appLockEnabled")
) {
enabled(true);
}
biometricUnlockAwaitingUserInput.current = true;
onUnlockAppRequested();
}
}, [appState, onUnlockAppRequested, appLocked]);

View File

@@ -56,7 +56,6 @@ import Heading from "../ui/typography/heading";
import Paragraph from "../ui/typography/paragraph";
import { useTabStore } from "../../screens/editor/tiptap/use-tab-store";
import { editorController } from "../../screens/editor/tiptap/utils";
import SheetProvider from "../sheet-provider";
const Actions = ({
attachment,
@@ -219,11 +218,10 @@ const Actions = ({
}}
>
<Dialog context={contextId} />
<SheetProvider context={contextId} />
<View
style={{
borderBottomWidth: 1,
borderBottomColor: colors.primary.border,
borderBottomColor: colors.secondary.background,
marginBottom: notes && notes.length > 0 ? 0 : 12
}}
>
@@ -240,20 +238,36 @@ const Actions = ({
style={{
flexDirection: "row",
marginBottom: 10,
paddingHorizontal: 12,
marginTop: 6,
gap: 10
paddingHorizontal: 12
}}
>
<Paragraph size={SIZE.xs} color={colors.secondary.paragraph}>
{attachment.mimeType}
<Paragraph
size={SIZE.xs}
style={{
marginRight: 10
}}
color={colors.secondary.paragraph}
>
{attachment.type}
</Paragraph>
<Paragraph size={SIZE.xs} color={colors.secondary.paragraph}>
<Paragraph
style={{
marginRight: 10
}}
size={SIZE.xs}
color={colors.secondary.paragraph}
>
{formatBytes(attachment.size)}
</Paragraph>
{notes.length ? (
<Paragraph size={SIZE.xs} color={colors.secondary.paragraph}>
<Paragraph
style={{
marginRight: 10
}}
size={SIZE.xs}
color={colors.secondary.paragraph}
>
{notes.length} note
{notes.length > 1 ? "s" : ""}
</Paragraph>
@@ -281,7 +295,7 @@ const Actions = ({
<View
style={{
borderBottomWidth: 1,
borderBottomColor: colors.primary.border,
borderBottomColor: colors.secondary.background,
marginBottom: 12,
paddingVertical: 12
}}
@@ -352,7 +366,7 @@ const Actions = ({
{failed ? (
<Notice
type="alert"
text={`File check failed: ${failed} Try reuploading the file to fix the issue.`}
text={`File check failed with error: ${attachment.failed} Try reuploading the file to fix the issue.`}
size="small"
/>
) : null}

View File

@@ -177,7 +177,7 @@ export const AttachmentDialog = ({ note }: { note?: Note }) => {
case "audio":
items = note
? db.attachments.ofNote(note.id, "audio")
: db.attachments.audios;
: db.attachments.all;
break;
case "documents":
items = note

View File

@@ -38,7 +38,6 @@ import { useSettingStore } from "../../stores/use-setting-store";
import { eUserLoggedIn } from "../../utils/events";
import { useUserStore } from "../../stores/use-user-store";
import Sync from "../../services/sync";
import { Notice } from "../ui/notice";
const LoginSteps = {
emailAuth: 1,

View File

@@ -87,9 +87,6 @@ export const SessionExpired = () => {
MMKV.clearStore();
clearAllStores();
setVisible(false);
useUserStore.setState({
disableAppLockRequests: false
});
} catch (e) {
ToastManager.show({
heading: e.message,
@@ -154,9 +151,6 @@ export const SessionExpired = () => {
await sleep(300);
passwordInputRef.current?.focus();
setFocused(true);
useUserStore.setState({
disableAppLockRequests: true
});
}}
enableSheetKeyboardHandler={true}
visible={true}

View File

@@ -18,7 +18,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import { useThemeColors } from "@notesnook/theme";
import { useRoute } from "@react-navigation/native";
import React, { useCallback, useEffect } from "react";
import { Keyboard, View } from "react-native";
import Animated, {
@@ -55,7 +54,6 @@ const FloatingButton = ({
const deviceMode = useSettingStore((state) => state.deviceMode);
const selectionMode = useSelectionStore((state) => state.selectionMode);
const translate = useSharedValue(0);
const route = useRoute();
const animatedStyle = useAnimatedStyle(() => {
return {
@@ -142,13 +140,7 @@ const FloatingButton = ({
}}
>
<Icon
name={
route.name === "Notebooks"
? "notebook-plus"
: route.name === "Trash"
? "delete"
: "plus"
}
name={title === "Clear all trash" ? "delete" : "plus"}
color={colors.primary.accentForeground}
size={SIZE.xxl}
/>

View File

@@ -21,16 +21,14 @@ import React, { PropsWithChildren, useEffect, useRef, useState } from "react";
import { Dimensions, Platform, View, useWindowDimensions } from "react-native";
import useGlobalSafeAreaInsets from "../../hooks/use-global-safe-area-insets";
import useKeyboard from "../../hooks/use-keyboard";
import { useThemeColors } from "@notesnook/theme";
export const Container = ({ children }: PropsWithChildren) => {
const { colors } = useThemeColors();
const insets = useGlobalSafeAreaInsets();
const keyboard = useKeyboard();
const [height, setHeight] = useState(0);
const windowHeightRef = useRef(Dimensions.get("window").height);
const { height: windowHeight } = useWindowDimensions();
const timerRef = useRef<NodeJS.Timeout>();
useEffect(() => {
if (windowHeight !== windowHeightRef.current) {
setHeight(0);
@@ -45,17 +43,12 @@ export const Container = ({ children }: PropsWithChildren) => {
paddingTop: Platform.OS === "android" ? 0 : insets.top,
paddingBottom: Platform.OS === "android" ? 0 : insets.bottom,
height: height || "100%",
width: "100%",
backgroundColor: colors.primary.background
width: "100%"
}}
onLayout={(event) => {
const height = event.nativeEvent.layout.height;
clearTimeout(timerRef.current);
timerRef.current = setTimeout(() => {
if (!keyboard.keyboardShown) {
setHeight(height);
}
}, 500);
if (!keyboard.keyboardShown) {
setHeight(event.nativeEvent.layout.height);
}
}}
>
{children}

View File

@@ -45,8 +45,8 @@ const DialogButtons = ({
{
backgroundColor: colors.secondary.background,
height: 60,
borderBottomRightRadius: 5,
borderBottomLeftRadius: 5,
borderBottomRightRadius: 10,
borderBottomLeftRadius: 10,
paddingHorizontal: 12,
borderTopWidth: 0.7,
borderTopColor: getColorLinearShade(

View File

@@ -36,7 +36,6 @@ import DialogButtons from "./dialog-buttons";
import DialogHeader from "./dialog-header";
import { useCallback } from "react";
import { Button } from "../ui/button";
import { getContainerBorder } from "../../utils/colors";
export const Dialog = ({ context = "global" }) => {
const { colors } = useThemeColors();
@@ -122,8 +121,7 @@ export const Dialog = ({ context = "global" }) => {
maxHeight: 450,
borderRadius: 5,
backgroundColor: colors.primary.background,
paddingTop: 12,
...getContainerBorder(colors.primary.border, 0.5)
paddingTop: 12
};
return visible ? (

View File

@@ -24,7 +24,7 @@ import {
setAppLockVerificationCipher,
validateAppLockPassword
} from "../../../common/database/encryption";
import BiometricService from "../../../services/biometrics";
import BiometicService from "../../../services/biometrics";
import { DDS } from "../../../services/device-detection";
import {
ToastManager,
@@ -314,7 +314,6 @@ export const AppLockPassword = () => {
new Error(
`${keyboardType === "pin" ? "Pin" : "Password"} incorrect`
),
undefined,
"local"
);
return;
@@ -323,11 +322,10 @@ export const AppLockPassword = () => {
SettingsService.setProperty("appLockHasPasswordSecurity", false);
if (
!(await BiometricService.isBiometryAvailable()) ||
!(await BiometicService.isBiometryAvailable()) ||
SettingsService.getProperty("biometricsAuthEnabled") === false
) {
SettingsService.setProperty("appLockEnabled", false);
SettingsService.setPrivacyScreen(SettingsService.get());
ToastManager.show({
message: "App lock disabled",
type: "success"

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import React, { useState } from "react";
import { Image, ScrollView, TouchableOpacity, View } from "react-native";
import { Image as ImageType } from "react-native-image-crop-picker";
import { ImagePickerResponse } from "react-native-image-picker";
import { useThemeColors } from "../../../../../../packages/theme/dist";
import { presentSheet } from "../../../services/event-manager";
import { SIZE } from "../../../utils/size";
@@ -32,7 +32,7 @@ export default function AttachImage({
onAttach,
close
}: {
response: ImageType[];
response: ImagePickerResponse;
onAttach: ({ compress }: { compress: boolean }) => void;
close: ((ctx?: string | undefined) => void) | undefined;
}) {
@@ -58,14 +58,14 @@ export default function AttachImage({
}}
>
<Paragraph style={{ color: colors.primary.paragraph, marginBottom: 6 }}>
Attaching {response?.length} image(s):
Attaching {response.assets?.length} image(s):
</Paragraph>
<ScrollView horizontal>
{response?.map((item) => (
<TouchableOpacity key={item.filename} activeOpacity={0.9}>
{response.assets?.map((item) => (
<TouchableOpacity key={item.fileName} activeOpacity={0.9}>
<Image
source={{
uri: item.sourceURL || item.path
uri: item.uri
}}
style={{
width: 100,
@@ -142,7 +142,7 @@ export default function AttachImage({
<Button
title={`${
(response?.length || 0) > 1 ? "Attach Images" : "Attach Image"
(response.assets?.length || 0) > 1 ? "Attach Images" : "Attach Image"
}`}
type="accent"
width="100%"
@@ -156,16 +156,10 @@ export default function AttachImage({
);
}
AttachImage.present = (response: ImageType[], context?: string) => {
return new Promise<
| {
compress: boolean;
}
| undefined
>((resolve) => {
AttachImage.present = (response: ImagePickerResponse) => {
return new Promise((resolve) => {
let resolved = false;
presentSheet({
context: context,
component: (ref, close, update) => (
<AttachImage
response={response}

View File

@@ -75,7 +75,7 @@ const ColorPicker = ({
style={{
width: "100%",
height: 250,
backgroundColor: colors.primary.background,
backgroundColor: selectedColor,
borderRadius: 10
}}
>
@@ -146,16 +146,12 @@ const ColorPicker = ({
onChangeText={(value) => {
title.current = value;
}}
testID="color-title-input"
defaultValue={title.current}
placeholder={title.current || "Color title"}
/>
<Button
title="Add color"
style={{
marginBottom: 10
}}
onPress={async () => {
if (!selectedColor)
return ToastManager.error(
@@ -174,6 +170,7 @@ const ColorPicker = ({
return ToastManager.error(
new Error(`Color #${selectedColor} already exists`)
);
const id = await db.colors.add({
title: title.current,
colorCode: selectedColor

View File

@@ -128,7 +128,7 @@ export class VaultDialog extends Component {
: this.state.copyNote
? "Unlock note to copy it. If biometrics are not working, you can enter device pin to unlock vault."
: this.state.goToEditor
? "Unlock note to open it in editor."
? "Unlock note to open it in editor. If biometrics are not working, you can enter device pin to unlock vault."
: "Enter vault password to unlock note. If biometrics are not working, you can enter device pin to unlock vault."
: "Enter vault password to lock note. If biometrics are not working, you can enter device pin to lock note.");
}

View File

@@ -33,7 +33,6 @@ import { eScrollEvent } from "../../utils/events";
import { LeftMenus } from "./left-menus";
import { RightMenus } from "./right-menus";
import { Title } from "./title";
import { useNavigation } from "@react-navigation/native";
type HeaderRightButton = {
title: string;
@@ -67,8 +66,6 @@ export const Header = ({
hasSearch?: boolean;
onSearch?: () => void;
}) => {
const navigation = useNavigation();
const { colors } = useThemeColors();
const insets = useGlobalSafeAreaInsets();
const [borderHidden, setBorderHidden] = useState(true);

View File

@@ -71,7 +71,7 @@ export const RightMenus = ({
testID={notesnook.ids.default.addBtn}
icon={renderedInRoute === "Trash" ? "delete" : "plus"}
iconSize={SIZE.xl}
type="accent"
type="shade"
hitSlop={{
top: 10,
right: 10,
@@ -82,7 +82,7 @@ export const RightMenus = ({
marginLeft: 10,
width: 32,
height: 32,
borderRadius: 100,
borderRadius: 5,
paddingHorizontal: 0,
borderWidth: 1,
borderColor: colors.primary.accent

View File

@@ -19,12 +19,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import Sodium from "@ammarahmed/react-native-sodium";
import dataurl from "@notesnook/core/dist/utils/dataurl";
import type { ImageAttributes } from "@notesnook/editor/dist/extensions/image/index";
import { useThemeColors } from "@notesnook/theme";
import React, { useEffect, useRef, useState } from "react";
import React, { useEffect, useState } from "react";
import { Platform, View } from "react-native";
import ImageViewer from "react-native-image-zoom-viewer";
import { db } from "../../common/database";
import downloadAttachment from "../../common/filesystem/download-attachment";
import { cacheDir } from "../../common/filesystem/utils";
import {
@@ -34,13 +32,13 @@ import {
import BaseDialog from "../dialog/base-dialog";
import { IconButton } from "../ui/icon-button";
import { ProgressBarComponent } from "../ui/svg/lazy";
import type { ImageAttributes } from "@notesnook/editor/dist/extensions/image/index";
const ImagePreview = () => {
const { colors } = useThemeColors("dialog");
const [visible, setVisible] = useState(false);
const [image, setImage] = useState<string>();
const [loading, setLoading] = useState(false);
const imageRef = useRef<ImageAttributes>();
useEffect(() => {
eSubscribeEvent("ImagePreview", open);
@@ -50,7 +48,6 @@ const ImagePreview = () => {
}, []);
const open = async (image: ImageAttributes) => {
imageRef.current = image;
setVisible(true);
setLoading(true);
setTimeout(async () => {
@@ -63,9 +60,6 @@ const ImagePreview = () => {
type: "base64",
uri: ""
});
if (imageRef.current) {
imageRef.current.hash = hash;
}
}
if (!hash) return;
//@ts-ignore // FIX ME
@@ -86,13 +80,7 @@ const ImagePreview = () => {
return (
visible && (
<BaseDialog
background="black"
animation="slide"
visible={true}
onRequestClose={close}
transparent
>
<BaseDialog animation="slide" visible={true} onRequestClose={close}>
<View
style={{
width: "100%",
@@ -113,21 +101,6 @@ const ImagePreview = () => {
color={colors.primary.accent}
borderColor="transparent"
/>
<IconButton
onPress={() => {
if (imageRef.current?.hash) {
db.fs().cancel(imageRef.current?.hash);
}
close();
}}
style={{
position: "absolute",
top: Platform.OS === "android" ? 35 : 0,
right: 12
}}
color={colors.static.white}
name="close"
/>
</View>
) : (
<ImageViewer
@@ -144,12 +117,13 @@ const ImagePreview = () => {
width: "100%",
justifyContent: "flex-end",
alignItems: "center",
height: 50,
paddingHorizontal: 24,
height: 80,
marginTop: 0,
paddingHorizontal: 12,
position: "absolute",
zIndex: 999,
backgroundColor: "rgba(0,0,0,0.3)",
marginTop: Platform.OS === "android" ? 30 : 0
paddingTop: Platform.OS === "android" ? 30 : 0
}}
>
<IconButton
@@ -163,7 +137,7 @@ const ImagePreview = () => {
)}
imageUrls={[
{
url: image as string
url: image
}
]}
/>

View File

@@ -19,6 +19,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import { View } from "react-native";
import React from "react";
export const Footer = ({ height = 150 }) => {
return <View style={{ height: height }} />;
export const Footer = () => {
return <View style={{ height: 150 }} />;
};

View File

@@ -95,7 +95,7 @@ export const NotebookHeader = ({
style={{
flexShrink: 1
}}
size={SIZE.lg}
size={SIZE.xxl}
>
{notebook.title}
</Heading>
@@ -114,7 +114,7 @@ export const NotebookHeader = ({
width: 40,
height: 40
}}
type="transparent"
type={isPinnedToMenu ? "secondary" : "secondary"}
color={isPinnedToMenu ? colors.primary.accent : colors.primary.icon}
size={SIZE.lg}
/>
@@ -123,7 +123,7 @@ export const NotebookHeader = ({
onPress={onEditNotebook}
tooltipText="Edit this notebook"
name="pencil"
type="transparent"
type="secondary"
color={colors.primary.icon}
style={{
width: 40,
@@ -134,7 +134,7 @@ export const NotebookHeader = ({
</View>
{notebook.description ? (
<Paragraph size={SIZE.sm} color={colors.primary.paragraph}>
<Paragraph size={SIZE.md} color={colors.primary.paragraph}>
{notebook.description}
</Paragraph>
) : null}
@@ -148,6 +148,10 @@ export const NotebookHeader = ({
size={SIZE.xs}
color={colors.secondary.paragraph}
>
{/* {notebook.topics.length === 1
? "1 topic"
: `${notebook.topics.length} topics`}
,{" "} */}
{notebook && totalNotes > 1
? totalNotes + " notes"
: totalNotes === 1

View File

@@ -25,7 +25,7 @@ import { useIsCompactModeEnabled } from "../../../hooks/use-is-compact-mode-enab
import { presentSheet } from "../../../services/event-manager";
import SettingsService from "../../../services/settings";
import { RouteName } from "../../../stores/use-navigation-store";
import { getContainerBorder } from "../../../utils/colors";
import { ColorValues, getContainerBorder } from "../../../utils/colors";
import { GROUP } from "../../../utils/constants";
import { SIZE } from "../../../utils/size";
import Sort from "../../sheets/sort";
@@ -96,9 +96,13 @@ export const SectionHeader = React.memo<
}}
>
<Heading
color={color || colors.primary.accent}
color={
ColorValues[color?.toLowerCase() as keyof typeof ColorValues] ||
colors.primary.accent
}
size={SIZE.sm}
style={{
minWidth: 60,
alignSelf: "center",
textAlignVertical: "center"
}}

View File

@@ -211,31 +211,6 @@ const NoteItem = ({
color={colors.error.accent}
/>
) : null}
{item.localOnly ? (
<Icon
testID="sync-off"
name="sync-off"
size={SIZE.sm}
style={{
marginRight: 6
}}
color={primaryColors.icon}
/>
) : null}
{item.readonly ? (
<Icon
testID="pencil-lock"
name="pencil-lock"
size={SIZE.sm}
style={{
marginRight: 6
}}
color={primaryColors.icon}
/>
) : null}
<TimeSince
style={{
fontSize: SIZE.xs,
@@ -251,13 +226,12 @@ const NoteItem = ({
style={{
flexDirection: "row",
alignItems: "center",
marginRight: 6,
gap: 2
marginRight: 6
}}
>
<Icon
name="attachment"
size={SIZE.sm}
size={SIZE.md}
color={primaryColors.icon}
/>
<Paragraph
@@ -297,7 +271,7 @@ const NoteItem = ({
<Icon
testID="icon-star"
name="star-outline"
size={SIZE.sm}
size={SIZE.md}
style={{
marginRight: 6
}}
@@ -314,8 +288,7 @@ const NoteItem = ({
height={23}
type="plain"
textStyle={{
textDecorationLine: "underline",
color: colors.secondary.paragraph
textDecorationLine: "underline"
}}
hitSlop={{ top: 8, bottom: 12, left: 0, right: 0 }}
fontSize={SIZE.xs}
@@ -397,7 +370,7 @@ const NoteItem = ({
<Icon
testID="icon-star"
name="star-outline"
size={SIZE.sm}
size={SIZE.md}
style={{
marginRight: 6
}}

View File

@@ -28,12 +28,13 @@ import {
hideSheet,
presentSheet
} from "../../../services/event-manager";
import { useSelectionStore } from "../../../stores/use-selection-store";
import { eOnLoadNote, eShowMergeDialog } from "../../../utils/events";
import { tabBarRef } from "../../../utils/global-refs";
import { NotebooksWithDateEdited, TagsWithDateEdited } from "@notesnook/common";
import NotePreview from "../../note-history/preview";
import SelectionWrapper, { selectItem } from "../selection-wrapper";
import SelectionWrapper from "../selection-wrapper";
export const openNote = async (
item: Note,
@@ -46,8 +47,21 @@ export const openNote = async (
if (!isTrash) {
note = (await db.notes.note(item.id)) as Note;
}
if (useSelectionStore.getState().selectionMode === item.type) {
const {
selectedItemsList,
selectionMode,
clearSelection,
setSelectedItem
} = useSelectionStore.getState();
if (selectItem(item)) return;
if (selectedItemsList.length > 0 && selectionMode === item.type) {
setSelectedItem(note.id);
} else {
clearSelection();
}
return;
}
if (note.conflicted) {
eSendEvent(eShowMergeDialog, note);

View File

@@ -27,12 +27,18 @@ import Navigation from "../../../services/navigation";
import { useSelectionStore } from "../../../stores/use-selection-store";
import { useTrashStore } from "../../../stores/use-trash-store";
import { presentDialog } from "../../dialog/functions";
import SelectionWrapper, { selectItem } from "../selection-wrapper";
import SelectionWrapper from "../selection-wrapper";
export const openNotebook = (item: Notebook | BaseTrashItem<Notebook>) => {
const isTrash = item.type === "trash";
if (selectItem(item)) return;
const { selectedItemsList, setSelectedItem, selectionMode, clearSelection } =
useSelectionStore.getState();
if (selectedItemsList.length > 0 && selectionMode === item.type) {
setSelectedItem(item.id);
return;
} else {
clearSelection();
}
if (isTrash) {
presentDialog({

View File

@@ -22,6 +22,7 @@ import React from "react";
import { View } from "react-native";
import Icon from "react-native-vector-icons/MaterialCommunityIcons";
import { notesnook } from "../../../../e2e/test.ids";
import { useSelectionStore } from "../../../stores/use-selection-store";
import { SIZE } from "../../../utils/size";
import { Properties } from "../../properties";
import ReminderSheet from "../../sheets/reminder";
@@ -29,7 +30,7 @@ import { IconButton } from "../../ui/icon-button";
import { ReminderTime } from "../../ui/reminder-time";
import Heading from "../../ui/typography/heading";
import Paragraph from "../../ui/typography/paragraph";
import SelectionWrapper, { selectItem } from "../selection-wrapper";
import SelectionWrapper from "../selection-wrapper";
const ReminderItem = React.memo(
({
@@ -43,7 +44,18 @@ const ReminderItem = React.memo(
}) => {
const { colors } = useThemeColors();
const openReminder = () => {
if (selectItem(item)) return;
const {
selectedItemsList,
setSelectedItem,
selectionMode,
clearSelection
} = useSelectionStore.getState();
if (selectedItemsList.length > 0 && selectionMode === item.type) {
setSelectedItem(item.id);
return;
} else {
clearSelection();
}
ReminderSheet.present(item, undefined, isSheet);
};

View File

@@ -26,23 +26,6 @@ import { Filler } from "./back-fill";
import { SelectionIcon } from "./selection";
import { Item, TrashItem } from "@notesnook/core";
export function selectItem(item: Item) {
if (useSelectionStore.getState().selectionMode === item.type) {
const { selectionMode, clearSelection, setSelectedItem } =
useSelectionStore.getState();
if (selectionMode === item.type) {
setSelectedItem(item.id);
}
if (useSelectionStore.getState().selectedItemsList.length === 0) {
clearSelection();
}
return true;
}
return false;
}
type SelectionWrapperProps = PropsWithChildren<{
item: Item;
onPress: () => void;

View File

@@ -23,12 +23,13 @@ import React from "react";
import { View } from "react-native";
import { notesnook } from "../../../../e2e/test.ids";
import { TaggedNotes } from "../../../screens/notes/tagged";
import { useSelectionStore } from "../../../stores/use-selection-store";
import { SIZE } from "../../../utils/size";
import { Properties } from "../../properties";
import { IconButton } from "../../ui/icon-button";
import Heading from "../../ui/typography/heading";
import Paragraph from "../../ui/typography/paragraph";
import SelectionWrapper, { selectItem } from "../selection-wrapper";
import SelectionWrapper from "../selection-wrapper";
const TagItem = React.memo(
({
@@ -42,7 +43,18 @@ const TagItem = React.memo(
}) => {
const { colors } = useThemeColors();
const onPress = () => {
if (selectItem(item)) return;
const {
selectedItemsList,
setSelectedItem,
selectionMode,
clearSelection
} = useSelectionStore.getState();
if (selectedItemsList.length > 0 && selectionMode === item.type) {
setSelectedItem(item.id);
return;
} else {
clearSelection();
}
TaggedNotes.navigate(item, true);
};

View File

@@ -192,9 +192,7 @@ export default function List(props: ListProps) {
/>
) : null
}
ListFooterComponent={
<Footer height={props.renderedInRoute === "Notebook" ? 300 : 150} />
}
ListFooterComponent={<Footer />}
ListHeaderComponent={
<>
{props.CustomLisHeader ? (

View File

@@ -48,7 +48,6 @@ import { NoteWrapper } from "../list-items/note/wrapper";
import { NotebookWrapper } from "../list-items/notebook/wrapper";
import ReminderItem from "../list-items/reminder";
import TagItem from "../list-items/tag";
import { useIsCompactModeEnabled } from "../../hooks/use-is-compact-mode-enabled";
type ListItemWrapperProps<TItem = Item> = {
group?: GroupingKey;
@@ -76,7 +75,6 @@ export function ListItemWrapper(props: ListItemWrapperProps) {
const refreshTimeout = useRef<NodeJS.Timeout>();
const currentItemId = useRef<string>();
const locked = useRef(false);
const compactMode = useIsCompactModeEnabled(props.dataType as ItemType);
const refreshItem = useCallback((resolvedItem: any) => {
if (!resolvedItem || !resolvedItem.data) {
@@ -119,24 +117,14 @@ export function ListItemWrapper(props: ListItemWrapperProps) {
}
currentItemId.current = resolvedItem.item.id;
setItem(resolvedItem.item);
}
if (resolvedItem?.group) {
setGroupHeader(resolvedItem.group);
} else {
setGroupHeader(undefined);
}
}, []);
if (previousIndex.current !== index) {
previousIndex.current = index;
const resolvedItem = items?.cacheItem(index);
if (resolvedItem) {
refreshItem(resolvedItem);
} else {
setItem(undefined);
setGroupHeader(undefined);
}
refreshItem(resolvedItem);
}
useEffect(() => {
@@ -144,15 +132,12 @@ export function ListItemWrapper(props: ListItemWrapperProps) {
try {
clearTimeout(refreshTimeout.current);
const idx = index;
refreshTimeout.current = setTimeout(
async () => {
if (idx !== previousIndex.current) return;
const resolvedItem = await items?.item(idx, resolveItems);
if (idx !== previousIndex.current) return;
refreshItem(resolvedItem);
},
items?.cacheItem(index) ? 100 : 0
);
refreshTimeout.current = setTimeout(async () => {
if (idx !== previousIndex.current) return;
const resolvedItem = await items?.item(idx, resolveItems);
if (idx !== previousIndex.current) return;
refreshItem(resolvedItem);
}, 100);
} catch (e) {
console.log("Error", e);
}
@@ -163,7 +148,7 @@ export function ListItemWrapper(props: ListItemWrapperProps) {
return (
<View
style={{
height: compactMode ? 50 : 120,
height: 120,
width: "100%"
}}
/>

View File

@@ -23,9 +23,9 @@ import { FlatList, StyleSheet, View } from "react-native";
import {
DraxList,
DraxListProps,
DraxListRenderItemContent
DraxListRenderItemContent,
DraxProvider
} from "react-native-drax";
import { tabBarRef } from "../../utils/global-refs";
import { SIZE } from "../../utils/size";
import { useSideBarDraggingStore } from "../side-menu/dragging-store";
@@ -74,7 +74,6 @@ function ReorderableList<T extends { id: string }>({
const renderItemContent: DraxListRenderItemContent<T> = React.useCallback(
(info, props) => {
const isHidden = hiddenItemsState.indexOf(info?.item?.id) > -1;
return isHidden && !dragging ? null : (
<View
style={{
@@ -137,49 +136,53 @@ function ReorderableList<T extends { id: string }>({
}
return (
<View style={styles.container}>
<DraxList
{...restProps}
ref={listRef}
data={getOrderedItems()}
renderItemContent={renderItemContent}
itemStyles={{
hoverDragReleasedStyle: {
display: "none"
},
hoverDraggingWithoutReceiverStyle: {
opacity: 0.5
},
dragReleasedStyle: {
opacity: 1
},
hoverDraggingStyle: {
backgroundColor: colors.secondary.background
<DraxProvider>
<View style={styles.container}>
<DraxList
{...restProps}
ref={listRef}
data={getOrderedItems()}
renderItemContent={renderItemContent}
itemStyles={{
hoverDragReleasedStyle: {
display: "none"
},
hoverDraggingWithoutReceiverStyle: {
opacity: 0.5
},
dragReleasedStyle: {
opacity: 1
},
hoverDraggingStyle: {
backgroundColor: colors.secondary.background
}
}}
longPressDelay={500}
onItemDragStart={() =>
useSideBarDraggingStore.setState({
dragging: true
})
}
}}
longPressDelay={500}
onItemDragStart={() =>
useSideBarDraggingStore.setState({
dragging: true
})
}
disableVirtualization
itemsDraggable={disableDefaultDrag ? dragging : true}
lockItemDragsToMainAxis
onItemReorder={({ fromIndex, fromItem, toIndex, toItem }) => {
const newOrder = getOrderedItems().map((item) => item.id);
const element = newOrder.splice(fromIndex, 1)[0];
if (toIndex === 0) {
newOrder.unshift(element);
} else {
newOrder.splice(toIndex, 0, element);
}
setItemsOrder(newOrder);
onListOrderChanged?.(newOrder);
}}
keyExtractor={(item) => (item as any).id}
/>
</View>
itemsDraggable={disableDefaultDrag ? dragging : true}
lockItemDragsToMainAxis
onItemReorder={({ fromIndex, fromItem, toIndex, toItem }) => {
const newOrder = getOrderedItems().map((item) => item.id);
const element = newOrder.splice(fromIndex, 1)[0];
if (toIndex === 0) {
newOrder.unshift(element);
} else {
newOrder.splice(toIndex, 0, element);
}
setItemsOrder(newOrder);
onListOrderChanged?.(newOrder);
}}
onItemDragEnd={(e) => {
console.log(e.receiver?.receiveOffset);
}}
keyExtractor={(item) => (item as any).id}
/>
</View>
</DraxProvider>
);
}

View File

@@ -313,7 +313,7 @@ const MergeConflicts = () => {
height: height / 2 - (50 + insets.top / 2),
backgroundColor: colors.primary.background,
borderBottomWidth: 1,
borderBottomColor: colors.primary.border
borderBottomColor: colors.secondary.background
}}
>
<ReadonlyEditor

View File

@@ -199,9 +199,7 @@ export default function NoteHistory({
Note version history is local only.{" "}
<Text
onPress={() => {
openLinkInBrowser(
"https://help.notesnook.com/note-version-history"
);
openLinkInBrowser("https://docs.notesnook.com/versionhistory");
}}
style={{
color: colors.primary.accent,

View File

@@ -162,7 +162,7 @@ export const features = [
platform: "android"
}
],
info: "* Free users are limited to keeping 3 notebooks and 5 tags."
info: "* Free users are limited to keeping 3 notebooks (no limit on topics) and 5 tags."
},
{

View File

@@ -111,7 +111,6 @@ export const ColorTags = ({ item }: { item: Note }) => {
visible={visible}
setVisible={setVisible}
onColorAdded={async (color) => {
await db.relations.to(note, "color").unlink();
await db.relations.add(color, note);
useRelationStore.getState().update();
useMenuStore.getState().setColorNotes();

View File

@@ -242,6 +242,7 @@ Properties.present = async (item, buttons = [], isSheet) => {
"attachments",
"lock-unlock",
"trash",
"remove-from-topic",
"remove-from-notebook",
"history",
"read-only",
@@ -263,8 +264,7 @@ Properties.present = async (item, buttons = [], isSheet) => {
"trash",
"default-notebook",
"add-notebook",
"move-notes",
"move-notebook"
"move-notes"
]);
break;
case "tag":

View File

@@ -73,7 +73,7 @@ export const Items = ({ item, buttons, close }) => {
<Icon
allowFontScaling
name={item.icon}
size={DDS.isTab ? SIZE.xxl : shouldShrink ? SIZE.xxl : SIZE.lg}
size={DDS.isTab ? SIZE.xxl : SIZE.lg}
color={
item.on
? colors.primary.accent
@@ -241,8 +241,8 @@ export const Items = ({ item, buttons, close }) => {
}}
showsHorizontalScrollIndicator={false}
contentContainerStyle={{
paddingRight: 25,
gap: 5
gap: 10,
paddingRight: 25
}}
>
{topBarItems.map(renderTopBarItem)}

View File

@@ -48,7 +48,7 @@ export const Synced = ({ item, close }) => {
paddingTop: 10,
marginTop: 10,
borderTopWidth: 1,
borderTopColor: colors.primary.border
borderTopColor: colors.secondary.background
}}
>
<Icon
@@ -92,7 +92,7 @@ export const Synced = ({ item, close }) => {
close();
await sleep(300);
await openLinkInBrowser(
"https://help.notesnook.com/how-is-my-data-encrypted",
"https://docs.notesnook.com/how-is-my-data-encrypted/",
colors
);
} catch (e) {

View File

@@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import React, { useEffect, useState } from "react";
import React from "react";
import { View } from "react-native";
import { db } from "../../common/database";
import { TaggedNotes } from "../../screens/notes/tagged";
@@ -68,38 +68,26 @@ export const Tags = ({ item, close }) => {
};
export const TagStrip = ({ item, close }) => {
const [tags, setTags] = useState([]);
useEffect(() => {
db.relations
.to(item, "tag")
.resolve()
.then((tags) => {
setTags(tags);
});
});
return tags?.length > 0 ? (
return item.tags?.length > 0 ? (
<View
style={{
flexDirection: "row",
flexWrap: "wrap",
alignItems: "center",
marginTop: 10,
gap: 5
alignItems: "center"
}}
>
{tags?.map((tag) =>
tag ? <TagItem key={tag.id} tag={tag} close={close} /> : null
{item.tags.map((tag) =>
tag ? <TagItem key={tag} tag={tag} close={close} /> : null
)}
</View>
) : null;
};
const TagItem = ({ tag, close }) => {
const { colors } = useThemeColors();
const onPress = async () => {
TaggedNotes.navigate(tag, true);
let tags = db.tags.all;
let _tag = tags.find((t) => t.title === tag);
TaggedNotes.navigate(_tag, true);
await sleep(300);
close();
};
@@ -107,19 +95,20 @@ const TagItem = ({ tag, close }) => {
const style = {
paddingHorizontal: 0,
borderRadius: 100,
marginRight: 10,
marginTop: 0,
backgroundColor: "transparent"
};
return (
<Button
onPress={onPress}
title={"#" + tag.title}
type="plain"
title={"#" + tag}
type="secondary"
height={20}
fontSize={SIZE.xs}
style={style}
textStyle={{
color: colors.secondary.paragraph
textDecorationLine: "underline"
}}
/>
);

View File

@@ -19,14 +19,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import { Item, ItemType, VirtualizedGrouping } from "@notesnook/core";
import { useThemeColors } from "@notesnook/theme";
import React, { useEffect, useRef } from "react";
import React, { useEffect } from "react";
import {
BackHandler,
NativeEventSubscription,
Platform,
View
} from "react-native";
import Menu from "react-native-reanimated-material-menu/src/Menu";
import Animated, { FadeInUp } from "react-native-reanimated";
import { db } from "../../common/database";
import useGlobalSafeAreaInsets from "../../hooks/use-global-safe-area-insets";
import { ToastManager } from "../../services/event-manager";
@@ -42,8 +42,6 @@ import { presentDialog } from "../dialog/functions";
import MoveNoteSheet from "../sheets/add-to";
import ExportNotesSheet from "../sheets/export-notes";
import ManageTagsSheet from "../sheets/manage-tags";
import { MoveNotebookSheet } from "../sheets/move-notebook";
import { Button } from "../ui/button";
import { IconButton } from "../ui/icon-button";
import Heading from "../ui/typography/heading";
@@ -59,8 +57,6 @@ export const SelectionHeader = React.memo(
type?: ItemType;
renderedInRoute?: string;
}) => {
const menuRef = useRef<Menu>(null);
const { colors: contextMenuColors } = useThemeColors("contextMenu");
const { colors } = useThemeColors();
const selectionMode = useSelectionStore((state) => state.selectionMode);
const selectedItemsList = useSelectionStore(
@@ -135,7 +131,8 @@ export const SelectionHeader = React.memo(
}, [clearSelection, selectionMode]);
return selectionMode !== type || focusedRouteId !== id ? null : (
<View
<Animated.View
entering={FadeInUp}
style={{
width: "100%",
height: Platform.OS === "android" ? 50 + insets.top : 50,
@@ -145,7 +142,8 @@ export const SelectionHeader = React.memo(
alignItems: "center",
flexDirection: "row",
zIndex: 999,
paddingHorizontal: 12
paddingHorizontal: 12,
marginVertical: 10
}}
>
<View
@@ -165,15 +163,18 @@ export const SelectionHeader = React.memo(
borderRadius: 100,
marginRight: 10
}}
type="secondary"
onPress={() => {
clearSelection();
}}
size={SIZE.xl}
color={colors.primary.icon}
name="close"
/>
<View
style={{
backgroundColor: colors.secondary.background,
height: 40,
borderRadius: 100,
paddingHorizontal: 16,
@@ -182,12 +183,11 @@ export const SelectionHeader = React.memo(
alignItems: "center"
}}
>
<Heading size={SIZE.lg} color={colors.primary.paragraph}>
<Heading size={SIZE.md} color={colors.primary.accent}>
{selectedItemsList.length}
</Heading>
</View>
</View>
<View
style={{
flexDirection: "row",
@@ -210,142 +210,144 @@ export const SelectionHeader = React.memo(
allSelected ? colors.primary.accent : colors.primary.paragraph
}
name="select-all"
size={SIZE.xl}
/>
{selectedItemsList.length ? (
<Menu
ref={menuRef}
animationDuration={200}
style={{
borderRadius: 5,
backgroundColor: contextMenuColors.primary.background,
marginTop: -20
}}
onRequestClose={() => {
menuRef.current?.hide();
}}
anchor={
<IconButton
onPress={() => {
menuRef.current?.show();
}}
name="dots-vertical"
color={colors.primary.paragraph}
/>
}
>
{[
{
title:
selectedItemsList.length > 1
? "Move notebooks"
: "Move notebook",
onPress: async () => {
const ids = selectedItemsList;
const notebooks = await db.notebooks.all.items(ids);
MoveNotebookSheet.present(notebooks);
},
visible: renderedInRoute === "Notebooks",
icon: "arrow-right-bold-box-outline"
},
{
title: "Manage tags",
onPress: async () => {
await sleep(100);
ManageTagsSheet.present(selectedItemsList);
},
visible: type === "note",
icon: "pound"
},
{
title: "Export",
onPress: async () => {
await sleep(100);
ExportNotesSheet.present(selectedItemsList);
},
visible: type === "note",
icon: "export"
},
{
title: "Link notebook",
onPress: async () => {
await sleep(100);
MoveNoteSheet.present();
},
visible: type === "note",
icon: "plus"
},
{
title: "Unlink notebook",
onPress: async () => {
if (!id) return;
await db.notes.removeFromNotebook(id, ...selectedItemsList);
updateNotebook(id);
Navigation.queueRoutesForUpdate();
clearSelection();
},
visible: renderedInRoute === "Notebook",
icon: "minus"
},
{
title: "Unfavorite",
onPress: addToFavorite,
visible: focusedRouteId === "Favorites",
icon: "star-off"
},
{
title: `Move to trash`,
onPress: async () => {
deleteItems(
undefined,
useSelectionStore.getState().selectionMode
).then(() => {
useSelectionStore.getState().clearSelection();
useSelectionStore.getState().setSelectionMode(undefined);
});
},
visible: type !== "trash",
icon: "delete"
},
{
title: `Restore`,
onPress: restoreItem,
visible: type === "trash",
icon: "delete-restore"
},
{
title: `Delete`,
onPress: deleteItem,
visible: type === "trash",
icon: "delete"
{type !== "note" ? null : (
<>
<IconButton
onPress={async () => {
await sleep(100);
ManageTagsSheet.present(selectedItemsList);
}}
style={{
marginLeft: 10
}}
color={colors.primary.icon}
tooltipText="Manage tags"
tooltipPosition={4}
name="pound"
size={SIZE.xl}
/>
<IconButton
onPress={async () => {
ExportNotesSheet.present(selectedItemsList);
}}
tooltipText="Export"
tooltipPosition={4}
style={{
marginLeft: 10
}}
color={colors.primary.paragraph}
name="export"
size={SIZE.xl}
/>
<IconButton
onPress={async () => {
MoveNoteSheet.present();
}}
style={{
marginLeft: 10
}}
tooltipText="Add to notebooks"
tooltipPosition={4}
color={colors.primary.paragraph}
name="plus"
size={SIZE.xl}
/>
</>
)}
{renderedInRoute === "Notebook" ? (
<IconButton
onPress={async () => {
if (selectedItemsList.length > 0) {
if (!id) return;
await db.notes.removeFromNotebook(id, ...selectedItemsList);
updateNotebook(id);
Navigation.queueRoutesForUpdate();
clearSelection();
}
].map((item) =>
!item.visible ? null : (
<Button
style={{
width: 150,
justifyContent: "flex-start",
borderRadius: 0
}}
type="plain"
buttonType={{
text: contextMenuColors.primary.paragraph
}}
icon={item.icon}
key={item.title}
title={item.title}
onPress={async () => {
menuRef.current?.hide();
if (Platform.OS === "ios") await sleep(300);
item.onPress();
}}
/>
)
)}
</Menu>
}}
style={{
marginLeft: 10
}}
tooltipText={`Remove from Notebook`}
tooltipPosition={4}
testID="select-minus"
color={colors.primary.paragraph}
name="minus"
size={SIZE.xl}
/>
) : null}
{focusedRouteId === "Favorites" ? (
<IconButton
onPress={addToFavorite}
style={{
marginLeft: 10
}}
tooltipText="Remove from favorites"
tooltipPosition={4}
color={colors.primary.paragraph}
name="star-off"
size={SIZE.xl}
/>
) : null}
{type === "trash" ? null : (
<IconButton
style={{
marginLeft: 10
}}
onPress={() => {
deleteItems(
undefined,
useSelectionStore.getState().selectionMode
).then(() => {
useSelectionStore.getState().clearSelection();
useSelectionStore.getState().setSelectionMode(undefined);
});
}}
tooltipText="Move to trash"
tooltipPosition={1}
color={colors.primary.paragraph}
name="delete"
size={SIZE.xl}
/>
)}
{type === "trash" ? (
<>
<IconButton
style={{
marginLeft: 10
}}
color={colors.primary.paragraph}
onPress={restoreItem}
name="delete-restore"
tooltipText="Restore"
tooltipPosition={4}
size={SIZE.xl - 3}
/>
<IconButton
style={{
marginLeft: 10
}}
color={colors.primary.paragraph}
onPress={deleteItem}
tooltipText="Delete"
tooltipPosition={4}
name="delete"
size={SIZE.xl - 3}
/>
</>
) : null}
</View>
</View>
</Animated.View>
);
}
);

View File

@@ -39,22 +39,17 @@ import Heading from "../../ui/typography/heading";
import { MoveNotes } from "../move-notes/movenote";
import { eOnNotebookUpdated } from "../../../utils/events";
import { getParentNotebookId } from "../../../utils/notebooks";
import { useNotebookStore } from "../../../stores/use-notebook-store";
export const AddNotebookSheet = ({
notebook,
parentNotebook,
close,
showMoveNotesOnComplete,
defaultTitle
close
}: {
notebook?: Notebook;
parentNotebook?: Notebook;
close?: (didAddNotebook: boolean) => void;
showMoveNotesOnComplete: boolean;
defaultTitle?: string;
close: ((context?: string | undefined) => void) | undefined;
}) => {
const title = useRef(notebook?.title || defaultTitle);
const title = useRef(notebook?.title);
const description = useRef(notebook?.description);
const titleInput = useRef<TextInput>(null);
const descriptionInput = useRef<TextInput>(null);
@@ -90,7 +85,6 @@ export const AddNotebookSheet = ({
useMenuStore.getState().setMenuPins();
Navigation.queueRoutesForUpdate();
useRelationStore.getState().update();
useNotebookStore.getState().refresh();
const parent =
parentNotebook?.id || (await getParentNotebookId(notebook?.id || id));
@@ -103,10 +97,10 @@ export const AddNotebookSheet = ({
});
}
if (!notebook && showMoveNotesOnComplete) {
if (!notebook) {
MoveNotes.present(await db.notebooks.notebook(id));
} else {
close?.(true);
close?.();
}
};
@@ -141,7 +135,7 @@ export const AddNotebookSheet = ({
}}
returnKeyLabel="Next"
returnKeyType="next"
defaultValue={notebook ? notebook.title : title.current}
defaultValue={notebook ? notebook.title : ""}
/>
<Input
@@ -175,9 +169,7 @@ AddNotebookSheet.present = (
notebook?: Notebook,
parentNotebook?: Notebook,
context?: string,
onClose?: (didAddNotebook: boolean) => void,
showMoveNotesOnComplete = true,
defaultTitle?: string
onClose?: () => void
) => {
presentSheet({
context: context,
@@ -185,13 +177,9 @@ AddNotebookSheet.present = (
<AddNotebookSheet
notebook={notebook}
parentNotebook={parentNotebook}
close={(didAddNotebook: boolean) => {
close?.();
onClose?.(didAddNotebook);
}}
showMoveNotesOnComplete={showMoveNotesOnComplete || false}
defaultTitle={defaultTitle}
close={close}
/>
)
),
onClose: onClose
});
};

View File

@@ -19,13 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import { Note } from "@notesnook/core";
import { useThemeColors } from "@notesnook/theme";
import React, {
RefObject,
useCallback,
useEffect,
useRef,
useState
} from "react";
import React, { RefObject, useCallback, useEffect } from "react";
import {
ActivityIndicator,
Keyboard,
@@ -52,9 +46,6 @@ import { IconButton } from "../../ui/icon-button";
import Paragraph from "../../ui/typography/paragraph";
import { NotebookItem } from "./notebook-item";
import { useNotebookItemSelectionStore } from "./store";
import { AddNotebookSheet } from "../add-notebook";
import Input from "../../ui/input";
import { presentDialog } from "../../dialog/functions";
async function updateInitialSelectionState(items: string[]) {
const relations = await db.relations
@@ -101,11 +92,7 @@ const MoveNoteSheet = ({
actionSheetRef: RefObject<ActionSheetRef>;
}) => {
const { colors } = useThemeColors();
const [rootNotebooks, loading] = useNotebooks();
const searchQuery = useRef("");
const searchTimer = useRef<NodeJS.Timeout>();
const [notebooks, setNotebooks] = useState(rootNotebooks);
const [notebooks, loading] = useNotebooks();
const dimensions = useSettingStore((state) => state.dimensions);
const selectedItemsList = useSelectionStore(
(state) => state.selectedItemsList
@@ -115,12 +102,6 @@ const MoveNoteSheet = ({
(state) => state.multiSelect
);
useEffect(() => {
if (!loading) {
setNotebooks(rootNotebooks);
}
}, [loading, rootNotebooks]);
useEffect(() => {
const items = note ? [note.id] : selectedItemsList;
updateInitialSelectionState(items);
@@ -160,11 +141,6 @@ const MoveNoteSheet = ({
actionSheetRef.current?.hide();
};
const hasSelected = () => {
const selection = useNotebookItemSelectionStore.getState().selection;
return Object.keys(selection).some((key) => selection[key] === "selected");
};
const renderNotebook = useCallback(
({ index }: { item: boolean; index: number }) => (
<NotebookItem items={notebooks} id={index} index={index} />
@@ -204,7 +180,7 @@ const MoveNoteSheet = ({
paragraph={
!multiSelect
? "Long press to enable multi-select."
: "Select notebooks you want to add note(s) to."
: "Select topics you want to add note(s) to."
}
/>
@@ -214,20 +190,18 @@ const MoveNoteSheet = ({
columnGap: 10
}}
>
{hasSelected() ? (
<IconButton
name="restore"
color={colors.primary.icon}
onPress={() => {
const items = note ? [note.id] : selectedItemsList;
updateInitialSelectionState(items);
}}
style={{
width: 40,
height: 40
}}
/>
) : null}
<IconButton
name="restore"
type="secondaryAccented"
onPress={() => {
const items = note ? [note.id] : selectedItemsList;
updateInitialSelectionState(items);
}}
style={{
width: 40,
height: 40
}}
/>
<Button
height={40}
@@ -256,51 +230,6 @@ const MoveNoteSheet = ({
style={{
width: "100%"
}}
keyboardShouldPersistTaps="handled"
ListHeaderComponent={
<View
style={{
paddingHorizontal: 12,
width: "100%",
paddingTop: 12
}}
>
<Input
placeholder="Search notebooks...."
button={{
icon: "plus",
onPress: () => {
AddNotebookSheet.present(
undefined,
undefined,
"link-notebooks",
undefined,
false,
searchQuery.current
);
},
color: colors.primary.icon
}}
onChangeText={(value) => {
searchQuery.current = value;
if (!searchQuery.current) {
setNotebooks(rootNotebooks);
return;
}
searchTimer.current = setTimeout(() => {
db.lookup
.notebooks(searchQuery.current)
.sorted()
.then((result) => {
if (searchQuery.current === value) {
setNotebooks(result);
}
});
}, 300);
}}
/>
</View>
}
estimatedItemSize={50}
renderItem={renderNotebook}
ListEmptyComponent={
@@ -336,8 +265,7 @@ MoveNoteSheet.present = (note?: Note) => {
presentSheet({
component: (ref) => <MoveNoteSheet actionSheetRef={ref} note={note} />,
enableGesturesInScrollView: false,
noBottomPadding: true,
keyboardHandlerDisabled: true
noBottomPadding: true
});
};
export default MoveNoteSheet;

View File

@@ -226,13 +226,7 @@ export const NotebookItem = ({
testID={notesnook.ids.notebook.menu}
onPress={() => {
if (!item) return;
AddNotebookSheet.present(
undefined,
item,
"link-notebooks",
undefined,
false
);
AddNotebookSheet.present(undefined, item, "link-notebooks");
}}
left={0}
right={0}

View File

@@ -43,7 +43,6 @@ type TabItem = {
locked?: boolean;
noteLocked?: boolean;
readonly?: boolean;
pinned?: boolean;
};
const TabItemComponent = (props: {
@@ -84,6 +83,7 @@ const TabItemComponent = (props: {
onPress={() => {
if (!props.isFocused) {
useTabStore.getState().focusTab(props.tab.id);
props.close?.();
if (props.tab.locked) {
eSendEvent(eUnlockNote);
}
@@ -94,7 +94,6 @@ const TabItemComponent = (props: {
}, 300);
}
}
props.close?.();
}}
onLongPress={() => {
useTabStore.getState().updateTab(props.tab.id, {
@@ -130,9 +129,7 @@ const TabItemComponent = (props: {
: colors.primary.paragraph
}
style={{
fontFamily: props.tab.previewTab
? "OpenSans-Italic"
: "OpenSans-Regular"
fontStyle: props.tab.previewTab ? "italic" : "normal"
}}
numberOfLines={1}
size={SIZE.md}
@@ -141,50 +138,24 @@ const TabItemComponent = (props: {
</Paragraph>
</View>
<View
style={{
flexDirection: "row",
gap: 5,
paddingRight: 12
<IconButton
name="close"
size={SIZE.lg}
color={colors.primary.icon}
onPress={() => {
const isLastTab = useTabStore.getState().tabs.length === 1;
useTabStore.getState().removeTab(props.tab.id);
// The last tab is not actually removed, it is just cleaned up.
if (isLastTab) {
editorController.current?.reset(props.tab.id, true, true);
props.close?.();
}
}}
>
<IconButton
name="pin"
size={SIZE.lg}
color={props.tab.pinned ? colors.primary.accent : colors.primary.icon}
onPress={() => {
useTabStore.getState().updateTab(props.tab.id, {
pinned: !props.tab.pinned,
previewTab: false
});
}}
top={0}
left={0}
right={20}
bottom={0}
/>
{!props.tab?.pinned ? (
<IconButton
name="close"
size={SIZE.lg}
color={colors.primary.icon}
onPress={() => {
const isLastTab = useTabStore.getState().tabs.length === 1;
useTabStore.getState().removeTab(props.tab.id);
// The last tab is not actually removed, it is just cleaned up.
if (isLastTab) {
editorController.current?.reset(props.tab.id, true, true);
props.close?.();
}
}}
top={0}
left={0}
right={20}
bottom={0}
/>
) : null}
</View>
top={0}
left={0}
right={20}
bottom={0}
/>
</Pressable>
);
};
@@ -252,16 +223,7 @@ export default function EditorTabs({
/>
</View>
<FlatList
windowSize={3}
data={tabs.sort((t1, t2) => {
if (t1.pinned && t2.pinned) return 0;
if (t1.pinned) return -1;
if (t2.pinned) return 1;
return 0;
})}
renderItem={renderTabItem}
/>
<FlatList windowSize={3} data={tabs} renderItem={renderTabItem} />
</View>
);
}

View File

@@ -39,7 +39,6 @@ import { getElevationStyle } from "../../../utils/elevation";
import { eCloseSheet } from "../../../utils/events";
import { SIZE, ph, pv } from "../../../utils/size";
import { sleep } from "../../../utils/time";
import { Dialog } from "../../dialog";
import DialogHeader from "../../dialog/dialog-header";
import { ProTag } from "../../premium/pro-tag";
import { Button } from "../../ui/button";
@@ -48,6 +47,7 @@ import { Pressable } from "../../ui/pressable";
import Seperator from "../../ui/seperator";
import Heading from "../../ui/typography/heading";
import Paragraph from "../../ui/typography/paragraph";
import { Dialog } from "../../dialog";
const ExportNotesSheet = ({
ids,
@@ -71,7 +71,7 @@ const ExportNotesSheet = ({
const [status, setStatus] = useState<string>();
const premium = useUserStore((state) => state.premium);
const exportNoteAs = async (
const save = async (
type: "pdf" | "txt" | "md" | "html" | "md-frontmatter"
) => {
if (exporting) return;
@@ -81,18 +81,9 @@ const ExportNotesSheet = ({
setComplete(false);
let result;
if (ids.length > 1) {
result = await Exporter.bulkExport(
db.notes.all.where((eb) => eb("id", "in", ids)),
type,
setStatus
);
result = await Exporter.bulkExport(ids, type, setStatus);
} else {
const note = await db.notes.note(ids[0]);
if (!note) {
setExporting(false);
return;
}
result = await Exporter.exportNote(note, type, setStatus);
result = await Exporter.exportNote(ids[0], type);
await sleep(1000);
}
if (!result) {
@@ -110,7 +101,7 @@ const ExportNotesSheet = ({
{
title: "PDF",
func: async () => {
await exportNoteAs("pdf");
await save("pdf");
},
icon: "file-pdf-box",
desc: "View in any pdf reader app",
@@ -120,7 +111,7 @@ const ExportNotesSheet = ({
{
title: "Markdown",
func: async () => {
await exportNoteAs("md");
await save("md");
},
icon: "language-markdown",
desc: "View in any text or markdown editor",
@@ -130,7 +121,7 @@ const ExportNotesSheet = ({
{
title: "Markdown + Frontmatter",
func: async () => {
await exportNoteAs("md-frontmatter");
await save("md-frontmatter");
},
icon: "language-markdown",
desc: "View in any text or markdown editor",
@@ -140,7 +131,7 @@ const ExportNotesSheet = ({
{
title: "Plain Text",
func: async () => {
await exportNoteAs("txt");
await save("txt");
},
icon: "card-text",
desc: "View in any text editor",
@@ -150,7 +141,7 @@ const ExportNotesSheet = ({
{
title: "HTML",
func: async () => {
await exportNoteAs("html");
await save("html");
},
icon: "language-html5",
desc: "View in any web browser & html reader",
@@ -259,9 +250,11 @@ const ExportNotesSheet = ({
<>
<ActivityIndicator />
<Paragraph>
{`${
status ? `${status})` : `Exporting notes`
}... Please wait`}
{ids.length === 1
? "Exporting note... Please wait"
: `Exporting notes${
status ? ` (${status})` : ``
}... Please wait`}
</Paragraph>
</>
) : (

View File

@@ -141,7 +141,7 @@ Logged in: ${user ? "yes" : "no"}`,
defaultValue={title.current}
style={{
borderWidth: 1,
borderColor: colors.primary.border,
borderColor: colors.secondary.background,
borderRadius: 5,
padding: 12,
fontFamily: "OpenSans-Regular",
@@ -178,7 +178,7 @@ For example:
}}
style={{
borderWidth: 1,
borderColor: colors.primary.border,
borderColor: colors.secondary.background,
borderRadius: 5,
padding: 12,
fontFamily: "OpenSans-Regular",

View File

@@ -219,7 +219,7 @@ export default function LinkNote(props: {
<View
style={{
paddingHorizontal: 12,
minHeight: "100%",
minHeight: 400,
maxHeight: "100%"
}}
>
@@ -311,7 +311,6 @@ export default function LinkNote(props: {
style={{
marginTop: 10
}}
keyboardShouldPersistTaps="handled"
windowSize={3}
keyExtractor={(item) => item.id}
data={nodes}
@@ -325,7 +324,6 @@ export default function LinkNote(props: {
onSelectNote={onSelectNote}
/>
)}
keyboardShouldPersistTaps="handled"
style={{
marginTop: 10
}}

View File

@@ -96,12 +96,9 @@ export default function Migrate() {
});
setLoading(true);
await sleep(1);
const { error, report } = await BackupService.run(false, "local");
const { error } = await BackupService.run(false, "local");
if (error) {
ToastManager.error(error, "Backup failed");
if (report) {
reportError(error);
}
setLoading(false);
return;
}
@@ -162,14 +159,13 @@ export default function Migrate() {
}}
>
Migrating database{progress ? `(${progress?.collection})` : null}
{progress ? `(${progress.current}/${progress.total}) ` : null}
... please wait
{progress ? `(${progress.current}/${progress.total}) ` : null}...
please wait
</Paragraph>
<View
style={{
width: 200,
alignSelf: "center"
width: 200
}}
>
<ProgressBarComponent

View File

@@ -1,361 +0,0 @@
/*
This file is part of the Notesnook project (https://notesnook.com/)
Copyright (C) 2023 Streetwriters (Private) Limited
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 <http://www.gnu.org/licenses/>.
*/
import { Notebook, VirtualizedGrouping } from "@notesnook/core";
import { useThemeColors } from "@notesnook/theme";
import React, { useCallback, useEffect, useState } from "react";
import { Text, View } from "react-native";
import { FlatList } from "react-native-actions-sheet";
import create from "zustand";
import { db } from "../../../common/database";
import { useNotebook } from "../../../hooks/use-notebook";
import { eSendEvent, presentSheet } from "../../../services/event-manager";
import {
useNotebookStore,
useNotebooks
} from "../../../stores/use-notebook-store";
import { eOnNotebookUpdated } from "../../../utils/events";
import {
findRootNotebookId,
getParentNotebookId
} from "../../../utils/notebooks";
import { SIZE } from "../../../utils/size";
import { Dialog } from "../../dialog";
import DialogHeader from "../../dialog/dialog-header";
import { presentDialog } from "../../dialog/functions";
import SheetProvider from "../../sheet-provider";
import { Button } from "../../ui/button";
import { IconButton } from "../../ui/icon-button";
import { Pressable } from "../../ui/pressable";
import Seperator from "../../ui/seperator";
import Paragraph from "../../ui/typography/paragraph";
import { AddNotebookSheet } from "../add-notebook";
const useNotebookExpandedStore = create<{
expanded: {
[id: string]: boolean;
};
setExpanded: (id: string) => void;
}>((set, get) => ({
expanded: {},
setExpanded(id: string) {
set({
expanded: {
...get().expanded,
[id]: !get().expanded[id]
}
});
}
}));
export const MoveNotebookSheet = ({
selectedNotebooks,
close
}: {
selectedNotebooks: Notebook[];
close?: () => void;
}) => {
const [notebooks] = useNotebooks();
const { colors } = useThemeColors();
const [moveToTop, setMoveToTop] = useState(false);
useEffect(() => {
(async () => {
for (const notebook of selectedNotebooks) {
const root = await findRootNotebookId(notebook.id);
if (root !== notebook.id) {
setMoveToTop(true);
return;
}
}
})();
}, [selectedNotebooks]);
const renderItem = useCallback(
({ index }: { index: number }) => {
return (
<NotebookItem
id={index}
items={notebooks}
level={0}
selectedNotebooks={selectedNotebooks}
onPress={async (selectedNotebook) => {
presentDialog({
title: `Move ${
selectedNotebooks.length > 1
? selectedNotebooks.length + " notebooks"
: selectedNotebooks[0].title
}`,
paragraph: `Are you sure you want to move ${
selectedNotebooks.length > 1
? selectedNotebooks.length + " notebooks"
: selectedNotebooks[0].title
} to ${selectedNotebook.title}?`,
positiveText: "Move",
context: "move-notebook",
positivePress: async () => {
for (const notebook of selectedNotebooks) {
const parent = await getParentNotebookId(notebook.id);
const root = await findRootNotebookId(notebook.id);
if (selectedNotebook.id === notebook.id) continue;
if (root !== notebook.id) {
await db.relations.unlink(
{
type: "notebook",
id: parent
},
notebook
);
eSendEvent(eOnNotebookUpdated, parent);
}
await db.relations.add(selectedNotebook, notebook);
eSendEvent(eOnNotebookUpdated, selectedNotebook.id);
eSendEvent(eOnNotebookUpdated, notebook.id);
}
useNotebookStore.getState().refresh();
close?.();
}
});
}}
/>
);
},
[selectedNotebooks, notebooks, close]
);
return (
<View>
<SheetProvider context="move-notebook" />
<Dialog context="move-notebook" />
<View
style={{
paddingHorizontal: 12
}}
>
<DialogHeader
title={`Moving ${
selectedNotebooks.length > 1
? selectedNotebooks.length + " notebooks"
: selectedNotebooks[0].title
}`}
paragraph={"Select the notebook you want to move this notebook to."}
/>
</View>
<Seperator />
<FlatList
data={notebooks?.placeholders}
renderItem={renderItem}
windowSize={1}
ListHeaderComponent={
<View
style={{
paddingHorizontal: 12
}}
>
{moveToTop ? (
<Button
title="Move to top"
style={{
alignSelf: "flex-start",
width: "100%",
justifyContent: "space-between"
}}
icon="arrow-up-bold"
iconPosition="right"
type="secondaryAccented"
onPress={async () => {
for (const notebook of selectedNotebooks) {
const parent = await getParentNotebookId(notebook.id);
const root = await findRootNotebookId(notebook.id);
if (root !== notebook.id) {
await db.relations.unlink(
{
type: "notebook",
id: parent
},
notebook
);
eSendEvent(eOnNotebookUpdated, parent);
eSendEvent(eOnNotebookUpdated, notebook.id);
}
}
useNotebookStore.getState().refresh();
close?.();
}}
/>
) : null}
</View>
}
ListEmptyComponent={
<View
style={{
flex: 1,
justifyContent: "center",
alignItems: "center",
height: 200
}}
>
<Text
style={{
color: colors.secondary.icon
}}
>
No notebooks
</Text>
</View>
}
/>
</View>
);
};
const NotebookItem = ({
id,
onPress,
items,
level = 0,
selectedNotebooks
}: {
id: string | number;
level?: number;
items?: VirtualizedGrouping<Notebook>;
onPress: (item: Notebook) => void;
selectedNotebooks: Notebook[];
}) => {
const { nestedNotebooks, notebook } = useNotebook(id, items, true);
const isExpanded = useNotebookExpandedStore((state) =>
!notebook ? false : state.expanded[notebook.id]
);
const { colors } = useThemeColors();
return selectedNotebooks.find(
(n) => n.id === notebook?.id
) ? null : !notebook ? (
<View
style={{
height: 45
}}
/>
) : (
<View
style={{
minHeight: 45,
borderRadius: 0
}}
>
<Pressable
onPress={() => onPress(notebook)}
style={{
flexDirection: "row",
paddingHorizontal: 12,
height: 45
}}
>
{nestedNotebooks?.placeholders.length ? (
<IconButton
name={isExpanded ? "chevron-down" : "chevron-right"}
color={colors.primary.icon}
size={20}
onPress={() => {
if (!notebook) return;
useNotebookExpandedStore.getState().setExpanded(notebook.id);
}}
/>
) : (
<View
style={{
width: 35,
height: 30,
justifyContent: "center",
alignItems: "center"
}}
/>
)}
<View
style={{
flexDirection: "row",
justifyContent: "space-between",
flexGrow: 1,
alignItems: "center"
}}
>
<Paragraph
numberOfLines={1}
style={{
color: colors.primary.paragraph,
fontSize: 15
}}
>
{notebook.title}
</Paragraph>
<IconButton
name="plus"
onPress={() => {
if (!notebook) return;
AddNotebookSheet.present(
undefined,
notebook,
"move-notebooks",
undefined,
false
);
}}
size={SIZE.lg}
/>
</View>
</Pressable>
{nestedNotebooks?.placeholders?.length && isExpanded ? (
<View
style={{
paddingLeft: level + 1 > 0 && level + 1 < 5 ? 15 : 0,
marginTop: 5
}}
>
{nestedNotebooks.placeholders.map((item, index) => (
<NotebookItem
key={notebook?.id + index}
id={index}
onPress={onPress}
level={level + 1}
items={nestedNotebooks}
selectedNotebooks={selectedNotebooks}
/>
))}
</View>
) : null}
</View>
);
};
MoveNotebookSheet.present = async (notebooks: Notebook[]) => {
presentSheet({
component: (ref, close) => (
<MoveNotebookSheet selectedNotebooks={notebooks} close={close} />
),
keyboardHandlerDisabled: true
});
};

View File

@@ -20,8 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import { VirtualizedGrouping } from "@notesnook/core";
import { Note, Notebook } from "@notesnook/core/dist/types";
import { useThemeColors } from "@notesnook/theme";
import React, { RefObject, useEffect, useRef, useState } from "react";
import { ActivityIndicator, TextInput, View } from "react-native";
import React, { RefObject, useEffect, useState } from "react";
import { View } from "react-native";
import { ActionSheetRef } from "react-native-actions-sheet";
import { FlashList } from "react-native-actions-sheet/dist/src/views/FlashList";
import { db } from "../../../common/database";
@@ -35,7 +35,6 @@ import { Dialog } from "../../dialog";
import DialogHeader from "../../dialog/dialog-header";
import { Button } from "../../ui/button";
import { IconButton } from "../../ui/icon-button";
import Input from "../../ui/input";
import { Pressable } from "../../ui/pressable";
import Seperator from "../../ui/seperator";
import Paragraph from "../../ui/typography/paragraph";
@@ -51,60 +50,39 @@ export const MoveNotes = ({
}) => {
const { colors } = useThemeColors();
const currentNotebook = notebook;
const inputRef = useRef<TextInput>(null);
const [loading, setLoading] = useState(false);
const selectionCount = useItemSelectionStore(
(state) =>
Object.keys(state.selection).filter(
(k) =>
state.selection?.[k] === "selected" ||
state.selection[k] === "deselected"
state.initialState?.[k] !== "selected" &&
state.selection[k] !== "deselected"
)?.length > 0
);
const [notes, setNotes] = useState<VirtualizedGrouping<Note>>();
const loadNotes = React.useCallback(
async (query?: string) => {
setLoading(true);
const notes = query
? db.lookup.notes(query).sorted()
: db.notes?.all.sorted(db.settings.getGroupOptions("notes") as any);
notes
.then(async (notes) => {
await notes.item(0);
setNotes(notes);
setLoading(false);
})
.catch(() => {
setLoading(false);
});
db.relations
.from(currentNotebook, "note")
.get()
.then((existingNotes) => {
const selection: { [name: string]: any } = {};
existingNotes.forEach((rel) => {
selection[rel.toId] = "selected";
});
useItemSelectionStore.setState({
selection: selection,
initialState: selection
});
});
},
[currentNotebook]
);
useEffect(() => {
loadNotes();
db.notes?.all.sorted(db.settings.getGroupOptions("notes")).then((notes) => {
setNotes(notes);
});
db.relations
.from(currentNotebook, "note")
.get()
.then((existingNotes) => {
const selection: { [name: string]: any } = {};
existingNotes.forEach((rel) => {
selection[rel.toId] = "selected";
});
useItemSelectionStore.setState({
selection: selection,
initialState: selection
});
});
return () => {
useItemSelectionStore.getState().reset();
};
}, [currentNotebook, loadNotes]);
}, [currentNotebook]);
const renderItem = React.useCallback(
({ index }: { item: boolean; index: number }) => {
@@ -118,33 +96,19 @@ export const MoveNotes = ({
style={{
paddingHorizontal: 12,
maxHeight: "100%",
height: "100%"
height: notes?.placeholders.length
? 50 * (notes?.placeholders.length + 2)
: 300
}}
>
<Dialog context="local" />
<DialogHeader
title={`Add notes to ${currentNotebook.title}`}
paragraph={"Select the notes you want to move to this Notebook."}
paragraph={"Select the topic in which you would like to move notes."}
/>
<Seperator />
<Input
button={{
icon: "magnify",
color: colors.primary.accent,
size: SIZE.lg,
onPress: () => {}
}}
testID="search-input"
fwdRef={inputRef}
autoCapitalize="none"
onChangeText={(v) => {
loadNotes(v && v.trim() === "" ? undefined : v.trim());
}}
placeholder="Search a note"
/>
<FlashList
ListEmptyComponent={
<View
@@ -154,17 +118,13 @@ export const MoveNotes = ({
alignItems: "center"
}}
>
{loading ? (
<ActivityIndicator size="large" color={colors.primary.accent} />
) : (
<Paragraph color={colors.secondary.paragraph}>
No notes to show
</Paragraph>
)}
<Paragraph color={colors.secondary.paragraph}>
No notes to show
</Paragraph>
</View>
}
estimatedItemSize={50}
data={loading ? [] : notes?.placeholders}
data={notes?.placeholders}
renderItem={renderItem}
/>
@@ -175,12 +135,6 @@ export const MoveNotes = ({
currentNotebook.id,
...useItemSelectionStore.getState().getSelectedItemIds()
);
await db.notes?.removeFromNotebook(
currentNotebook.id,
...useItemSelectionStore.getState().getDeselectedItemIds()
);
updateNotebook(currentNotebook.id);
Navigation.queueRoutesForUpdate();
fwdRef?.current?.hide();
@@ -207,12 +161,11 @@ const SelectableNoteItem = React.memo(
const selected = useItemSelectionStore((state) =>
item?.id ? state.selection[item.id] === "selected" : false
);
const exists = useItemSelectionStore((state) =>
item?.id ? state.initialState[item.id] === "selected" : false
);
return (
return exists ? null : (
<Pressable
testID="listitem.select"
onPress={() => {
@@ -252,14 +205,8 @@ const SelectableNoteItem = React.memo(
? "check-circle-outline"
: "checkbox-blank-circle-outline"
}
type="plain"
color={
selected
? colors.selected.icon
: exists && !selected
? colors.static.red
: colors.primary.icon
}
type="selected"
color={selected ? colors.selected.icon : colors.primary.icon}
/>
<View

View File

@@ -17,14 +17,13 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import { useThemeColors } from "@notesnook/theme";
import React from "react";
import { Platform, View } from "react-native";
import { ScrollView } from "react-native-actions-sheet";
import { getVersion } from "react-native-device-info";
import { features } from "../../../features";
import { eSendEvent, presentSheet } from "../../../services/event-manager";
import SettingsService from "../../../services/settings";
import { useThemeColors } from "@notesnook/theme";
import { eCloseSheet } from "../../../utils/events";
import { SIZE } from "../../../utils/size";
import { Button } from "../../ui/button";
@@ -37,13 +36,7 @@ export type FeatureType = {
platform?: "ios" | "android";
};
const NewFeature = ({
features,
version
}: {
features: FeatureType[];
version?: string | null;
}) => {
const NewFeature = ({ features }: { features: FeatureType[] }) => {
const { colors } = useThemeColors();
return (
@@ -51,33 +44,30 @@ const NewFeature = ({
style={{
alignItems: "center",
paddingHorizontal: 12,
paddingTop: 12,
maxHeight: "100%"
paddingTop: 12
}}
>
<Heading color={colors.secondary.heading} size={SIZE.md}>
{!version ? "New version " : `v${version} `}Highlights 🎉
New Version Highlights 🎉
</Heading>
<Seperator />
<ScrollView>
{features.map((item) => (
<View
key={item.title}
style={{
backgroundColor: colors.secondary.background,
padding: 12,
borderRadius: 10,
width: "100%",
marginBottom: 10
}}
>
<Heading size={SIZE.lg - 2}>{item.title}</Heading>
<Paragraph selectable>{item.body}</Paragraph>
</View>
))}
</ScrollView>
{features.map((item) => (
<View
key={item.title}
style={{
backgroundColor: colors.secondary.background,
padding: 12,
borderRadius: 10,
width: "100%",
marginBottom: 10
}}
>
<Heading size={SIZE.lg - 2}>{item.title}</Heading>
<Paragraph>{item.body}</Paragraph>
</View>
))}
<Seperator />
<Button
@@ -118,13 +108,7 @@ NewFeature.present = () => {
);
if (_features.length === 0) return;
presentSheet({
component: (
<NewFeature
features={features}
version={SettingsService.getProperty("version")}
/>
),
disableClosing: true
component: <NewFeature features={features} />
});
return true;
};

View File

@@ -19,19 +19,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import { Notebook, VirtualizedGrouping } from "@notesnook/core";
import { useThemeColors } from "@notesnook/theme";
import React, { useEffect, useRef, useState } from "react";
import {
Platform,
RefreshControl,
View,
useWindowDimensions
} from "react-native";
import { RefreshControl, View, useWindowDimensions } from "react-native";
import ActionSheet, { ActionSheetRef } from "react-native-actions-sheet";
import { FlashList } from "react-native-actions-sheet/dist/src/views/FlashList";
import Config from "react-native-config";
import Icon from "react-native-vector-icons/MaterialCommunityIcons";
import create from "zustand";
import { notesnook } from "../../../../e2e/test.ids";
import { db } from "../../../common/database";
import { MMKV } from "../../../common/database/mmkv";
import { useNotebook } from "../../../hooks/use-notebook";
import NotebookScreen from "../../../screens/notebook";
@@ -49,7 +43,6 @@ import { IconButton } from "../../ui/icon-button";
import { Pressable } from "../../ui/pressable";
import Paragraph from "../../ui/typography/paragraph";
import { AddNotebookSheet } from "../add-notebook";
import { MoveNotebookSheet } from "../move-notebook";
import Sort from "../sort";
const useItemSelectionStore = createItemSelectionStore(true, false);
@@ -68,8 +61,7 @@ class NotebookSheetConfig {
}
static get(item: ConfigItem) {
const value = MMKV.getInt(NotebookSheetConfig.makeId(item));
return typeof value === "number" ? value : 0;
return MMKV.getInt(NotebookSheetConfig.makeId(item)) || 0;
}
static set(item: ConfigItem, index = 0) {
@@ -132,6 +124,11 @@ export const NotebookSheet = () => {
if (!focusedRouteId) return;
const nextRoot = await findRootNotebookId(focusedRouteId);
if (nextRoot !== currentItem.current) {
console.log(
"NotebookSheet.useEffect.canShow",
"Root changed to",
nextRoot
);
useItemSelectionStore.setState({
enabled: false,
selection: {}
@@ -140,14 +137,17 @@ export const NotebookSheet = () => {
currentItem.current = nextRoot;
const snapPoint = NotebookSheetConfig.get({
type: "notebook",
id: focusedRouteId as string
id: nextRoot as string
});
if (ref.current?.isOpen()) {
ref.current?.snapToIndex(snapPoint);
} else {
ref.current?.show(snapPoint);
setTimeout(() => {
ref.current?.show(snapPoint);
}, 150);
}
console.log("NotebookSheet.useEffect.didShow", focusedRouteId);
setRoot(nextRoot);
onRequestUpdate();
});
@@ -160,7 +160,7 @@ export const NotebookSheet = () => {
ref.current?.hide();
}
}
}, [canShow, focusedRouteId]);
}, [canShow, onRequestUpdate, focusedRouteId]);
return (
<ActionSheet
@@ -196,56 +196,11 @@ export const NotebookSheet = () => {
backgroundColor: colors.secondary.background
}}
keyboardHandlerEnabled={false}
snapPoints={
Config.isTesting === "true"
? [100]
: [Platform.OS === "android" ? 15 : 10, 100]
}
snapPoints={Config.isTesting === "true" ? [100] : [20, 100]}
initialSnapIndex={1}
backgroundInteractionEnabled
gestureEnabled
>
<View
style={{
position: "absolute",
right: 24 + normalize(50),
marginTop: -80
}}
>
<Pressable
testID={notesnook.buttons.add}
type="secondary"
onPress={() => {
if (!notebook) return;
AddNotebookSheet.present(
undefined,
notebook,
undefined,
undefined,
false
);
}}
style={{
borderRadius: 100
}}
>
<View
style={{
alignItems: "center",
justifyContent: "center",
height: normalize(50),
width: normalize(50)
}}
>
<Icon
name="notebook-plus"
color={colors.primary.icon}
size={SIZE.xxl}
/>
</View>
</Pressable>
</View>
<View
style={{
position: "absolute",
@@ -265,8 +220,8 @@ export const NotebookSheet = () => {
style={{
alignItems: "center",
justifyContent: "center",
height: normalize(50),
width: normalize(50)
height: normalize(60),
width: normalize(60)
}}
>
<Icon name="plus" color="white" size={SIZE.xxl} />
@@ -323,26 +278,6 @@ export const NotebookSheet = () => {
size={22}
/>
<IconButton
style={{
marginLeft: 10,
width: 40 * fontScale,
height: 40 * fontScale
}}
onPress={async () => {
const ids = useItemSelectionStore
.getState()
.getSelectedItemIds();
const notebooks = await db.notebooks.all.items(ids);
MoveNotebookSheet.present(notebooks);
}}
color={colors.primary.icon}
tooltipText="Clear selection"
tooltipPosition={1}
name="arrow-right-bold-box-outline"
size={22}
/>
<IconButton
style={{
marginLeft: 10,
@@ -384,6 +319,20 @@ export const NotebookSheet = () => {
height: 40 * fontScale
}}
/>
<IconButton
name="plus"
onPress={() => {
if (!notebook) return;
AddNotebookSheet.present(undefined, notebook, undefined);
}}
testID="add-notebook-button"
color={colors.primary.icon}
size={22}
style={{
width: 40 * fontScale,
height: 40 * fontScale
}}
/>
<IconButton
name={collapsed ? "chevron-up" : "chevron-down"}

View File

@@ -357,9 +357,7 @@ const PublishNoteSheet = ({
}}
onPress={async () => {
try {
await openLinkInBrowser(
"https://help.notesnook.com/publish-notes-with-monographs"
);
await openLinkInBrowser("https://docs.notesnook.com/monographs/");
} catch (e) {
console.error(e);
}

View File

@@ -159,7 +159,7 @@ export default function ReminderNotify({
? 160 * references?.placeholders?.length
: 500,
borderTopWidth: 1,
borderTopColor: colors.primary.border,
borderTopColor: colors.secondary.background,
marginTop: 5,
paddingTop: 5
}}

View File

@@ -18,12 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import { useThemeColors } from "@notesnook/theme";
import React, { RefObject, useRef, useState } from "react";
import {
Platform,
TextInput,
View,
ScrollView as RNScrollView
} from "react-native";
import { Platform, TextInput, View } from "react-native";
import { ActionSheetRef, ScrollView } from "react-native-actions-sheet";
import DateTimePickerModal from "react-native-modal-datetime-picker";
import {
@@ -369,7 +364,7 @@ export default function ReminderSheet({
))}
</View>
<RNScrollView showsHorizontalScrollIndicator={false} horizontal>
<ScrollView showsHorizontalScrollIndicator={false} horizontal>
{recurringMode === RecurringModes.Daily ||
recurringMode === RecurringModes.Year
? null
@@ -430,7 +425,7 @@ export default function ReminderSheet({
}}
/>
))}
</RNScrollView>
</ScrollView>
</View>
) : null}

View File

@@ -48,7 +48,6 @@ import { Button } from "../../ui/button";
import Seperator from "../../ui/seperator";
import SheetWrapper from "../../ui/sheet";
import Paragraph from "../../ui/typography/paragraph";
import { useUserStore } from "../../../stores/use-user-store";
const RestoreDataSheet = () => {
const [visible, setVisible] = useState(false);
@@ -247,6 +246,7 @@ const RestoreDataComponent = ({ close, setRestoring, restoring }) => {
await db.backup.import(backup, password, key);
});
await db.initCollections();
initialize();
refreshAllStores();
ToastManager.show({
heading: "Backup restored successfully.",
@@ -285,9 +285,9 @@ const RestoreDataComponent = ({ close, setRestoring, restoring }) => {
const backupFiles = await RNFetchBlob.fs.ls(zipOutputFolder);
// if (backupFiles.findIndex((file) => file === ".nnbackup") === -1) {
// throw new Error("Backup file is invalid");
// }
if (backupFiles.findIndex((file) => file === ".nnbackup") === -1) {
throw new Error("Backup file is invalid");
}
await db.transaction(async () => {
let password;
@@ -384,20 +384,10 @@ const RestoreDataComponent = ({ close, setRestoring, restoring }) => {
return;
}
try {
useUserStore.setState({
disableAppLockRequests: true
});
console.log("disabled...");
const file = await DocumentPicker.pickSingle({
copyTo: "cachesDirectory"
});
setTimeout(() => {
useUserStore.setState({
disableAppLockRequests: false
});
}, 1000);
if (file.name.endsWith(".nnbackupz")) {
setRestoring(true);
await restoreFromZip(file.fileCopyUri, true);
@@ -409,11 +399,6 @@ const RestoreDataComponent = ({ close, setRestoring, restoring }) => {
}
} catch (e) {
console.log("error", e.stack);
setTimeout(() => {
useUserStore.setState({
disableAppLockRequests: false
});
}, 1000);
setRestoring(false);
backupError(e);
}
@@ -430,7 +415,7 @@ const RestoreDataComponent = ({ close, setRestoring, restoring }) => {
borderRadius: 0,
flexDirection: "row",
borderBottomWidth: 0.5,
borderBottomColor: colors.primary.border
borderBottomColor: colors.secondary.background
}}
>
<View

View File

@@ -50,7 +50,7 @@ const Sort = ({ type, screen }) => {
const setOrderBy = async () => {
let _groupOptions = {
...groupOptions,
sortDirection: groupOptions?.sortDirection === "asc" ? "desc" : "asc"
sortDirection: groupOptions.sortDirection === "asc" ? "desc" : "asc"
};
if (type === "topics") {
_groupOptions.groupBy = "none";
@@ -85,7 +85,7 @@ const Sort = ({ type, screen }) => {
<Button
title={
groupOptions?.sortDirection === "asc"
groupOptions.sortDirection === "asc"
? groupOptions.groupBy === "abc" ||
groupOptions.sortBy === "title"
? "A - Z"
@@ -100,7 +100,7 @@ const Sort = ({ type, screen }) => {
: "New - Old"
}
icon={
groupOptions?.sortDirection === "asc"
groupOptions.sortDirection === "asc"
? "sort-ascending"
: "sort-descending"
}
@@ -127,7 +127,7 @@ const Sort = ({ type, screen }) => {
justifyContent: "flex-start",
flexWrap: "wrap",
borderBottomWidth: isTopicSheet ? 0 : 1,
borderBottomColor: colors.primary.border,
borderBottomColor: colors.secondary.background,
marginBottom: 12,
paddingHorizontal: 12,
paddingBottom: 12,
@@ -229,7 +229,7 @@ const Sort = ({ type, screen }) => {
if (item === "abc") {
_groupOptions.sortBy = "title";
_groupOptions.sortDirection = "desc";
_groupOptions.sortDirection = "asc";
}
updateGroupOptions(_groupOptions);

View File

@@ -170,7 +170,6 @@ export const Update = ({ version: appVersion, fwdRef }) => {
lineHeight: 20,
marginTop: 10
}}
selectable
>
{version.body}
</Paragraph>
@@ -182,7 +181,6 @@ export const Update = ({ version: appVersion, fwdRef }) => {
style={{
marginBottom: 5
}}
selectable
>
{item}
</Paragraph>

View File

@@ -43,10 +43,6 @@ export const ColorSection = React.memo(
]);
const loading = useSettingStore((state) => state.isAppLoading);
const setColorNotes = useMenuStore((state) => state.setColorNotes);
const [order, hiddensItems] = useMenuStore((state) => [
state.order["colors"],
state.hiddenItems["colors"]
]);
useEffect(() => {
if (!loading) {
@@ -63,8 +59,8 @@ export const ColorSection = React.memo(
db.settings.setSideBarHiddenItems("colors", data);
}}
disableDefaultDrag={true}
itemOrder={order}
hiddenItems={hiddensItems}
itemOrder={db.settings.getSideBarOrder("colors")}
hiddenItems={db.settings.getSideBarHiddenItems("colors")}
alwaysBounceVertical={false}
data={colorNotes}
style={{

View File

@@ -19,13 +19,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import { useThemeColors } from "@notesnook/theme";
import React, { useCallback } from "react";
import { View } from "react-native";
import { DraxProvider, DraxScrollView } from "react-native-drax";
import { FlatList, View } from "react-native";
import { notesnook } from "../../../e2e/test.ids";
import { db } from "../../common/database";
import useGlobalSafeAreaInsets from "../../hooks/use-global-safe-area-insets";
import { DDS } from "../../services/device-detection";
import { eSendEvent } from "../../services/event-manager";
import { useMenuStore } from "../../stores/use-menu-store";
import Navigation from "../../services/navigation";
import { useSettingStore } from "../../stores/use-setting-store";
import { useThemeStore } from "../../stores/use-theme-store";
import { useUserStore } from "../../stores/use-user-store";
import { SUBSCRIPTION_STATUS } from "../../utils/constants";
import { eOpenPremiumDialog } from "../../utils/events";
@@ -47,14 +49,30 @@ export const SideMenu = React.memo(
);
const isAppLoading = useSettingStore((state) => state.isAppLoading);
const dragging = useSideBarDraggingStore((state) => state.dragging);
const [order, hiddensItems] = useMenuStore((state) => [
state.order["routes"],
state.hiddenItems["routes"]
]);
const introCompleted = useSettingStore(
(state) => state.settings.introCompleted
);
const BottomItemsList = [
{
name: isDark ? "Day" : "Night",
icon: "theme-light-dark",
func: () => {
useThemeStore.getState().setColorScheme();
},
switch: true,
on: !!isDark,
close: false
},
{
name: "Settings",
icon: "cog-outline",
close: true,
func: () => {
Navigation.navigate("Settings");
}
}
];
const pro = {
name: "Notesnook Pro",
@@ -74,8 +92,8 @@ export const SideMenu = React.memo(
onHiddenItemsChanged={(data) => {
db.settings.setSideBarHiddenItems("routes", data);
}}
itemOrder={order}
hiddenItems={hiddensItems}
itemOrder={db.settings.getSideBarOrder("routes")}
hiddenItems={db.settings.getSideBarHiddenItems("routes")}
alwaysBounceVertical={false}
data={MenuItemsList}
style={{
@@ -97,7 +115,7 @@ export const SideMenu = React.memo(
<PinnedSection />
</>
),
[order, hiddensItems]
[]
);
return !isAppLoading && introCompleted ? (
@@ -116,12 +134,16 @@ export const SideMenu = React.memo(
paddingTop: insets.top
}}
>
<DraxProvider>
<DraxScrollView nestedScrollEnabled={false}>
{renderItem()}
</DraxScrollView>
</DraxProvider>
<FlatList
alwaysBounceVertical={false}
contentContainerStyle={{
flexGrow: 1
}}
showsVerticalScrollIndicator={false}
data={[0]}
keyExtractor={() => "mainMenuView"}
renderItem={renderItem}
/>
<View
style={{
paddingHorizontal: 12
@@ -131,6 +153,26 @@ export const SideMenu = React.memo(
subscriptionType === SUBSCRIPTION_STATUS.BASIC ? (
<MenuItem testID={pro.name} key={pro.name} item={pro} index={0} />
) : null}
{BottomItemsList.slice(DDS.isLargeTablet() ? 0 : 1, 3).map(
(item, index) => (
<MenuItem
testID={
item.name == "Night mode"
? notesnook.ids.menu.nightmode
: item.name
}
key={item.name}
item={item}
index={index}
rightBtn={
DDS.isLargeTablet() || item.name === "Notesnook Pro"
? undefined
: BottomItemsList[0]
}
/>
)
)}
</View>
{dragging ? (
@@ -162,7 +204,14 @@ export const SideMenu = React.memo(
/>
</View>
) : (
<UserStatus />
<View
style={{
width: "100%",
paddingHorizontal: 0
}}
>
<UserStatus />
</View>
)}
</View>
</View>

View File

@@ -44,7 +44,7 @@ export const PinnedSection = React.memo(
const menuPins = useMenuStore((state) => state.menuPins);
const loading = useSettingStore((state) => state.isAppLoading);
const setMenuPins = useMenuStore((state) => state.setMenuPins);
const [order] = useMenuStore((state) => [state.order["shortcuts"]]);
useEffect(() => {
if (!loading) {
setMenuPins();
@@ -61,13 +61,7 @@ export const PinnedSection = React.memo(
Navigation.closeDrawer();
});
};
const renderItem = ({
item,
index
}: {
item: Notebook | Tag;
index: number;
}) => {
const renderItem = ({ item }: { item: Notebook | Tag; index: number }) => {
return <PinItem item={item} onPress={onPress} />;
};
@@ -83,7 +77,7 @@ export const PinnedSection = React.memo(
}}
onHiddenItemsChanged={(data) => {}}
canHideItems={false}
itemOrder={order}
itemOrder={db.settings.getSideBarOrder("shortcuts")}
hiddenItems={[]}
alwaysBounceVertical={false}
data={menuPins}
@@ -100,10 +94,7 @@ export const PinnedSection = React.memo(
<Notice
size="small"
type="information"
text="Add shortcuts for notebooks and tags here."
style={{
marginHorizontal: 12
}}
text="Add shortcuts for notebooks, topics and tags here."
/>
}
/>

View File

@@ -25,20 +25,19 @@ import Icon from "react-native-vector-icons/MaterialCommunityIcons";
import useGlobalSafeAreaInsets from "../../hooks/use-global-safe-area-insets";
import useSyncProgress from "../../hooks/use-sync-progress";
import { eSendEvent } from "../../services/event-manager";
import Navigation from "../../services/navigation";
import Sync from "../../services/sync";
import { useThemeStore } from "../../stores/use-theme-store";
import { SyncStatus, useUserStore } from "../../stores/use-user-store";
import { eOpenLoginDialog } from "../../utils/events";
import { tabBarRef } from "../../utils/global-refs";
import { SIZE } from "../../utils/size";
import { IconButton } from "../ui/icon-button";
import { Pressable } from "../ui/pressable";
import { TimeSince } from "../ui/time-since";
import Paragraph from "../ui/typography/paragraph";
const PROFILE_PIC_URL = `https://picsum.photos/id/177/367/267`;
export const UserStatus = () => {
const { colors, isDark } = useThemeColors();
const { colors } = useThemeColors();
const user = useUserStore((state) => state.user);
const syncing = useUserStore((state) => state.syncing);
const lastSyncStatus = useUserStore((state) => state.lastSyncStatus);
@@ -56,8 +55,7 @@ export const UserStatus = () => {
alignSelf: "center",
paddingBottom: Platform.OS === "ios" ? insets.bottom / 2 : null,
borderTopWidth: 1,
borderTopColor: colors.primary.border,
backgroundColor: colors.primary.background
borderTopColor: colors.secondary.background
}}
>
<View
@@ -68,9 +66,13 @@ export const UserStatus = () => {
}}
>
<Pressable
onPress={() => {
Navigation.navigate("Settings");
tabBarRef.current.closeDrawer();
onPress={async () => {
if (user) {
Sync.run();
} else {
tabBarRef.current?.closeDrawer();
eSendEvent(eOpenLoginDialog);
}
}}
type="plain"
style={{
@@ -78,8 +80,7 @@ export const UserStatus = () => {
justifyContent: "flex-start",
padding: 12,
borderRadius: 0,
alignItems: "center",
gap: 10
alignItems: "center"
}}
>
{userProfile?.profilePicture ? (
@@ -90,19 +91,11 @@ export const UserStatus = () => {
style={{
width: 35,
height: 35,
borderRadius: 100
borderRadius: 100,
marginRight: 10
}}
/>
) : (
<Icon
name="cog-outline"
size={SIZE.lg - 2}
color={colors.secondary.icon}
style={{
paddingLeft: 8
}}
/>
)}
) : null}
<View
style={{
@@ -111,12 +104,22 @@ export const UserStatus = () => {
}}
>
<Paragraph
numberOfLines={1}
style={{
flexWrap: "wrap"
}}
size={SIZE.sm}
color={colors.primary.heading}
>
{!user || !userProfile?.fullName
? "Settings"
{!user
? "Login to sync your notes."
: lastSyncStatus === SyncStatus.Failed
? "Sync failed, tap to retry"
: syncing
? `Syncing your notes${
progress ? ` (${progress.current})` : ""
}`
: !userProfile?.fullName
? "Tap to sync"
: userProfile.fullName}
</Paragraph>
@@ -131,20 +134,16 @@ export const UserStatus = () => {
"Not logged in"
) : lastSynced && lastSynced !== "Never" ? (
<>
{syncing
? `Syncing ${progress ? `(${progress.current})` : ""}`
: lastSyncStatus === SyncStatus.Failed
{lastSyncStatus === SyncStatus.Failed
? "Sync failed"
: "Synced"}{" "}
{!syncing ? (
<TimeSince
style={{
fontSize: SIZE.xs,
color: colors.secondary.paragraph
}}
time={lastSynced}
/>
) : null}
<TimeSince
style={{
fontSize: SIZE.xs,
color: colors.secondary.paragraph
}}
time={lastSynced}
/>
{isOffline ? " (offline)" : ""}
</>
) : (
@@ -152,7 +151,7 @@ export const UserStatus = () => {
)}{" "}
<Icon
name="checkbox-blank-circle"
size={9}
size={11}
allowFontScaling
color={
!user || lastSyncStatus === SyncStatus.Failed
@@ -165,80 +164,25 @@ export const UserStatus = () => {
</Paragraph>
</View>
<View
style={{
flexDirection: "row",
gap: 0
}}
>
<IconButton
hitSlop={{
top: 10,
bottom: 10
}}
onPress={() => {
useThemeStore.getState().setColorScheme();
}}
name="theme-light-dark"
color={isDark ? colors.primary.accent : colors.primary.icon}
size={SIZE.lg}
style={{
borderRadius: 100,
width: 40,
height: 40
}}
/>
<Pressable
style={{
borderRadius: 100,
width: 40,
height: 40
}}
hitSlop={{
top: 10,
bottom: 10
}}
onPress={() => {
if (user) {
Sync.run();
} else {
tabBarRef.current?.closeDrawer();
eSendEvent(eOpenLoginDialog);
}
}}
>
{user ? (
syncing ? (
<ActivityIndicator
color={colors.primary.accent}
size={SIZE.xl}
/>
) : lastSyncStatus === SyncStatus.Failed ? (
<Icon
color={colors.error.icon}
name="sync-alert"
size={SIZE.lg}
allowFontScaling
/>
) : (
<Icon
allowFontScaling
color={colors.primary.icon}
name="sync"
size={SIZE.lg}
/>
)
) : (
<Icon
allowFontScaling
color={colors.primary.accent}
size={SIZE.lg}
name="login"
/>
)}
</Pressable>
</View>
{user ? (
syncing ? (
<ActivityIndicator color={colors.primary.accent} size={SIZE.xl} />
) : lastSyncStatus === SyncStatus.Failed ? (
<Icon
color={colors.error.icon}
name="sync-alert"
size={SIZE.lg}
allowFontScaling
/>
) : (
<Icon
allowFontScaling
color={colors.primary.accent}
name="sync"
size={SIZE.lg}
/>
)
) : null}
</Pressable>
</View>
</View>

View File

@@ -59,7 +59,7 @@ export interface TabsRef {
lock: () => boolean;
openDrawer: (animated?: boolean) => void;
closeDrawer: (animated?: boolean) => void;
page: () => number;
page: number;
setScrollEnabled: () => true;
isDrawerOpen: () => boolean;
node: RefObject<Animated.View>;
@@ -121,12 +121,7 @@ export const FluidTabs = forwardRef<TabsRef, TabProps>(function FluidTabs(
} else {
if (prevWidths.current?.sidebar !== widths.sidebar) {
translateX.value =
!appState || (appState && appState?.movedAway)
? widths.sidebar
: editorPosition;
if (translateX.value === editorPosition) {
onChangeTab?.({ i: 2, from: 1 });
}
!appState || appState?.movedAway ? widths.sidebar : editorPosition;
}
}
isLoaded.current = true;
@@ -239,7 +234,7 @@ export const FluidTabs = forwardRef<TabsRef, TabProps>(function FluidTabs(
onDrawerStateChange(false);
isDrawerOpen.value = false;
},
page: () => currentTab.value,
page: currentTab.value,
setScrollEnabled: () => true,
node: node
}),

View File

@@ -28,7 +28,6 @@ import { Toast } from "../../toast";
import { useAppState } from "../../../hooks/use-app-state";
import SettingsService from "../../../services/settings";
import { useUserStore } from "../../../stores/use-user-store";
import { getContainerBorder } from "../../../utils/colors";
/**
*
@@ -74,17 +73,9 @@ const SheetWrapper = ({
borderTopLeftRadius: 15,
alignSelf: "center",
borderBottomRightRadius: 0,
borderBottomLeftRadius: 0,
...getContainerBorder(colors.primary.border, 0.5),
borderBottomWidth: 0
borderBottomLeftRadius: 0
};
}, [
colors.primary.background,
colors.primary.border,
largeTablet,
smallTablet,
width
]);
}, [colors.primary.background, largeTablet, smallTablet, width]);
const _onOpen = () => {
if (lockEvents.current) return;

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