Compare commits

..

1015 Commits

Author SHA1 Message Date
Ammar Ahmed
ff069b1fba mobile: fix moving notebook on ios 2024-05-01 15:18:28 +05:00
Ammar Ahmed
015883c2f3 mobile: fix moving notebook on ios 2024-05-01 15:17:46 +05:00
Ammar Ahmed
70c9dd0083 mobile: reduce font size in notebook header 2024-05-01 15:15:37 +05:00
Ammar Ahmed
ae6d8c5f2b mobile: hide breadcrumbs in top level notebooks 2024-05-01 15:15:37 +05:00
Abdullah Atta
38e2250fd1 web: log attachment on failure 2024-05-01 14:55:49 +05:00
Ammar Ahmed
17e2c5a8a2 desktop: fix app icon size for macos 2024-05-01 14:53:32 +05:00
Ammar Ahmed
2e226f0f72 mobile: fix cannot read property 'sortDirection' of undefined 2024-05-01 13:34:48 +05:00
Ammar Ahmed
167c54578b mobile: fix scrolling broken in reminder -> repeat -> month 2024-05-01 13:34:37 +05:00
Abdullah Atta
fb656af5ca web: sort tags by title in editor header 2024-05-01 13:34:20 +05:00
Ammar Ahmed
ddfab272d2 common: sort tags by title in resolved items 2024-05-01 13:34:20 +05:00
Ammar Ahmed
28958311c1 mobile: fix share extention crash on sharing from some apps 2024-05-01 13:34:06 +05:00
Ammar Ahmed
f1b8275b4b mobile: add support for setting note title form quick note widget 2024-05-01 13:34:06 +05:00
Ammar Ahmed
c8c75d40dd mobile: fix theme search returns empty results 2024-05-01 13:33:50 +05:00
Ammar Ahmed
bace90808d mobile: fix footer size for notebook screen 2024-05-01 13:33:31 +05:00
Ammar Ahmed
fe7c7e8db4 mobile: fix notebook-sheet position 2024-05-01 13:32:02 +05:00
Ammar Ahmed
519a569366 mobile: fix notebook sheet flicker 2024-05-01 13:32:02 +05:00
Ammar Ahmed
89d602a40f mobile: do not lock app when requesting permission 2024-05-01 13:31:38 +05:00
Abdullah Atta
a8db65b5af editor: fix performance issues due to using portals for react node views 2024-05-01 13:29:55 +05:00
Ammar Ahmed
716239abfd mobile: fix selection header 2024-05-01 13:21:31 +05:00
Ammar Ahmed
62dd5a5416 mobile: fix vault unlock with biometrics 2024-05-01 13:19:00 +05:00
Ammar Ahmed
96558c5df5 mobile: fix search bar position on ios 2024-05-01 13:18:21 +05:00
Ammar Ahmed
45997dd2e4 editor: fix scroll into view should bring heading to top 2024-05-01 13:16:54 +05:00
Ammar Ahmed
bde190f01c mobile: render settings icon if no profile pic is set 2024-05-01 13:15:24 +05:00
Ammar Ahmed
042c97688f mobile: add quick theme switch button 2024-05-01 13:15:24 +05:00
Ammar Ahmed
95b5114070 mobile: fix confusing settings/sync button 2024-05-01 13:15:24 +05:00
Ammar Ahmed
20742e2a1c mobile: fix back navigation from editor (#4867)
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-05-01 13:13:44 +05:00
Ammar Ahmed
1e3149284e mobile: report error when migration fails due to backup error 2024-05-01 13:01:41 +05:00
Ammar Ahmed
d77c09f1fd mobile: fix opening internal link in readonly mode 2024-05-01 13:00:58 +05:00
Ammar Ahmed
aa602ea8e9 mobile: fix position of context menu 2024-05-01 12:59:50 +05:00
Ammar Ahmed
8ab6b6dc31 mobile: skip checking encrypted backup if user is logged out 2024-05-01 12:57:42 +05:00
Ammar Ahmed
404d136a73 mobile: fix sidebar order not loading on app launch 2024-05-01 12:50:13 +05:00
Abdullah Atta
cf9aeecd7e editor: fix placeholder showing always in first line of editor 2024-05-01 12:37:48 +05:00
Abdullah Atta
1adda96ce2 editor: fix many papercut ux issues in search replace 2024-05-01 12:36:00 +05:00
Abdullah Atta
6dd6d818c9 editor: add support for multi line search/replace 2024-05-01 12:36:00 +05:00
Abdullah Atta
c7e83961d4 web: show all notes if query is empty in note linking dialog 2024-05-01 12:35:38 +05:00
Abdullah Atta
03428e5848 core: allow full FTS5 search syntax 2024-05-01 12:35:38 +05:00
Abdullah Atta
d0fceed56d web: improve app performance by reducing react rerenders 2024-05-01 12:34:43 +05:00
Abdullah Atta
b8c68b5163 web: fix middle pane size increasing on exiting focus mode 2024-04-30 21:52:25 +05:00
Abdullah Atta
2496004896 web: fix position of image preview toolbar 2024-04-30 21:51:57 +05:00
Abdullah Atta
16ec35de25 web: do not change properties top on web app 2024-04-30 21:51:57 +05:00
Abdullah Atta
d248b8e2b8 web: properties & toc side bars must be below the titlebar 2024-04-30 21:51:57 +05:00
Abdullah Atta
641e7484e3 desktop: add custom dns toggle in settings 2024-04-30 21:51:35 +05:00
Abdullah Atta
a46409ff44 core: add more fts trigger tests 2024-04-30 21:51:17 +05:00
Abdullah Atta
5dbabc2706 core: fix database disk image is malformed error on updating deleted content 2024-04-30 21:51:17 +05:00
Abdullah Atta
2d4d656dd9 web: canceling backup on password change should abort 2024-04-30 21:50:48 +05:00
Abdullah Atta
ab51b22e4a web: do not ask for password when downloading backup during recovery 2024-04-30 21:50:32 +05:00
Abdullah Atta
781d09daca web: fix navigation menu resize issues 2024-04-30 21:50:21 +05:00
Abdullah Atta
f21533e5e4 core: fix sql collection only getting first batch on iteration 2024-04-30 21:50:00 +05:00
Abdullah Atta
2ea9b04863 web: fix toggles in properties not working 2024-04-30 21:49:37 +05:00
Abdullah Atta
675d517cbc web: reduce zoom factor step to 0.1 2024-04-30 21:49:13 +05:00
Abdullah Atta
c336c57bda web: disable pwa 2024-04-30 21:48:28 +05:00
Abdullah Atta
7b5fa09c71 web: fix all users are premium 2024-04-30 13:15:54 +05:00
Ammar Ahmed
d85974ed7a mobile: fix editor crash in v3 2024-04-30 12:09:15 +05:00
Ammar Ahmed
9598ea7542 mobile: fix wrong version in update sheet 2024-04-30 10:10:17 +05:00
Ammar Ahmed
42048ad53a mobile: fix multi-selection ux 2024-04-30 00:42:27 +05:00
Ammar Ahmed
1fbd2efb92 mobile: fix crash during backup 2024-04-30 00:17:25 +05:00
Ammar Ahmed
fe91ef79a0 global: update logo 2024-04-29 13:24:54 +05:00
Abdullah Atta
583d585b2f desktop: re-enable arm64 builds 2024-04-29 11:53:09 +05:00
Abdullah Atta
94b28f86ca desktop: remove channel when publishing 2024-04-29 11:38:31 +05:00
Abdullah Atta
f927f05f86 desktop: fix spawn EINVAL error on build 2024-04-29 11:15:43 +05:00
Abdullah Atta
bde8dea048 global: update package lockfiles 2024-04-29 11:15:21 +05:00
Abdullah Atta
511bea9b23 editor: update snapshots 2024-04-28 10:54:10 +05:00
Abdullah Atta
eda95530de desktop: set generateUpdatesFilesForAllChannels to false 2024-04-26 15:59:42 +05:00
Abdullah Atta
5173decaa5 crypto: upgrade sodium-native to 4.1.1 2024-04-26 15:48:42 +05:00
Abdullah Atta
00dcb55f6e ci: migrate to TrustedSigning from AzureCodeSigning 2024-04-26 15:44:29 +05:00
Abdullah Atta
6dbe1073cd ci: use AzureCodeSigning version 0.3.4 2024-04-26 15:30:53 +05:00
Abdullah Atta
9be3e4fcfa desktop: install node-gyp-build 2024-04-26 15:30:03 +05:00
Abdullah Atta
f9f0a866bd setup: fix infinite loop in postinstall 2024-04-26 15:18:49 +05:00
Abdullah Atta
daafeb2fa8 setup: retry postinstall commands 3 times 2024-04-26 15:17:49 +05:00
Abdullah Atta
a92b34b81c ci: back to node@20.x 2024-04-26 15:14:25 +05:00
Abdullah Atta
e29b6838b3 ci: use node@18.x 2024-04-26 14:53:23 +05:00
Ammar Ahmed
16ff7c92e4 mobile: update android version 2024-04-26 14:46:56 +05:00
Abdullah Atta
07e1ea6edf ci: use yarn instead of npx when executing electron-builder 2024-04-26 14:41:28 +05:00
Abdullah Atta
b26ede95fb desktop: use prebuilds on linux-arm 2024-04-26 14:01:32 +05:00
Abdullah Atta
971793a3ad desktop: use net.fetch for handling protocol requests 2024-04-26 14:01:32 +05:00
Abdullah Atta
6a2b5e1499 desktop: upgrade electron to 29 2024-04-26 14:01:32 +05:00
Abdullah Atta
d18b775d06 web: use same logic for uploading attachment on desktop & web 2024-04-26 14:01:32 +05:00
Abdullah Atta
d6cc899d95 web: close note after removing attachment permanently 2024-04-26 14:01:32 +05:00
Abdullah Atta
ea10058276 web: fix linked notes not showing in attachment context menu 2024-04-26 14:01:32 +05:00
Abdullah Atta
568c88be3e fs: fix out of bounds error when reading chunks 2024-04-26 14:01:32 +05:00
Abdullah Atta
f047552f18 core: fix attachment not getting detached from note's content 2024-04-26 14:01:32 +05:00
Ammar Ahmed
9a58430b5d mobile: release v3.0.0 2024-04-26 11:29:59 +05:00
Ammar Ahmed
205885edf5 mobile: disable app lock when picking file to restore backup 2024-04-26 11:29:59 +05:00
Abdullah Atta
8ffb49b700 desktop: fix Unexpected token 'with' on build 2024-04-26 10:30:44 +05:00
Abdullah Atta
25b18a2edd ci: pin node version to 20.2.0 2024-04-26 10:24:54 +05:00
Abdullah Atta
cfea85c8fb web: add v3 feature highlights 2024-04-26 09:35:06 +05:00
Abdullah Atta
82fc6d31c3 web: fix new notes not getting assigned to default notebook 2024-04-26 09:15:35 +05:00
Abdullah Atta
fb2de1753e web: fix full screen test 2024-04-26 09:06:00 +05:00
Ammar Ahmed
ceb5ce5cdd mobile: add quick settings tile on android 2024-04-26 08:49:38 +05:00
Ammar Ahmed
98d443001c mobile: fix no placeholder text on share widget 2024-04-26 08:49:38 +05:00
Abdullah Atta
5115dee069 core: fix crash when converting html to text 2024-04-26 08:28:32 +05:00
Abdullah Atta
0dc29c7026 core: refactor reminder upcoming time sql 2024-04-26 07:49:47 +05:00
Muhammad Ali
a5eb5e9df3 core: fix incorrect upcoming time in weekly/monthly reminders (#4464) 2024-04-25 16:22:34 +05:00
Ammar Ahmed
b680575328 mobile: fix padding of internal editors on mobile 2024-04-25 15:50:17 +05:00
Ammar Ahmed
c94ef616a5 mobile: improve ui of side menu user section 2024-04-25 15:31:10 +05:00
Ammar Ahmed
3ae40c09fc mobile: fix db init in background failing 2024-04-25 15:31:10 +05:00
Ammar Ahmed
5de4e00ce2 mobile: enable background sync by default 2024-04-25 15:31:10 +05:00
Ammar Ahmed
99e4e61a55 mobile: fix notebook sheet does not remember last position 2024-04-25 15:31:10 +05:00
Abdullah Atta
1ad7bfb82f web: fix settings dialog side bar transparent from bottom 2024-04-25 14:43:21 +05:00
Abdullah Atta
30ef679432 web: fix empty editor after unlocking app 2024-04-25 13:40:11 +05:00
Abdullah Atta
bb97f5e757 clipper(web): update app logo 2024-04-25 13:00:29 +05:00
Abdullah Atta
6cd5a04470 desktop: update app logo 2024-04-25 13:00:17 +05:00
Abdullah Atta
0c32ebf163 web: update app logo 2024-04-25 13:00:07 +05:00
Abdullah Atta
e150e08f29 editor: fix crash on dragging a react node 2024-04-25 10:38:40 +05:00
Ammar Ahmed
bbd603f10c docs: update logo 2024-04-25 10:23:05 +05:00
Ammar Ahmed
677944cba9 docs: remove mentions of topic 2024-04-25 10:23:05 +05:00
Ammar Ahmed
dd2cee53d3 mobile: update app logo 2024-04-25 10:23:05 +05:00
Ammar Ahmed
60c8d5ac89 mobile: fix notes in notifications not launch on app start 2024-04-25 10:23:05 +05:00
Ammar Ahmed
59276de406 mobile: fix background sync 2024-04-25 10:23:05 +05:00
Abdullah Atta
67981be516 desktop: clonableCryptoKey is always true on desktop 2024-04-25 10:17:37 +05:00
Abdullah Atta
77dfcec08c web: fix attachments ui in properties 2024-04-24 11:45:15 +05:00
Abdullah Atta
c4360ab95f common: fix exports 2024-04-24 11:45:00 +05:00
Abdullah Atta
17c4b72381 web: minor ui fix 2024-04-23 09:35:01 +05:00
Ammar Ahmed
e91cc2bdca mobile: support pinned editor tabs 2024-04-22 15:55:10 +05:00
Abdullah Atta
811f2305ec core: disable transactions for now 2024-04-22 12:23:43 +05:00
Abdullah Atta
98a707b5f5 setup: remove --prefer-offline 2024-04-22 09:52:26 +05:00
Abdullah Atta
aa9b24fa10 core: do not run auto sync on changes in notehistory & sessioncontent collections 2024-04-22 09:37:54 +05:00
Abdullah Atta
0b3060e4c0 web: improve error reporting if a query fails 2024-04-22 09:14:10 +05:00
Ammar Ahmed
d523db84cc mobile: fix back gesture handler broken in editor 2024-04-22 08:38:32 +05:00
Abdullah Atta
6a6a9ae6b3 ci: install @zip.js/zip.js before running web tests 2024-04-20 19:48:18 +05:00
Abdullah Atta
b1bc28e069 ci: install dayjs before running web tests 2024-04-20 19:41:47 +05:00
Abdullah Atta
f95c068bc1 web: fix all tests 2024-04-20 16:42:11 +05:00
Abdullah Atta
0e4cd087d4 core: add tests for virtualized grouping 2024-04-20 16:42:11 +05:00
Ammar Ahmed
f217b8cfec mobile: add borders to dialogs & sheet 2024-04-19 12:26:25 +05:00
Ammar Ahmed
d3787efbf0 web: fix wording of trash interval 2024-04-19 12:26:09 +05:00
Ammar Ahmed
e279878b12 mobile: improve move note sheet ux 2024-04-19 12:00:13 +05:00
Ammar Ahmed
154a227be0 mobile: fix placeholder item height in compact mode 2024-04-19 10:32:53 +05:00
Ammar Ahmed
756259c907 mobile: minor improvement in list 2024-04-19 10:23:12 +05:00
Ammar Ahmed
453ed4820a mobile: remove beta tag from reminders 2024-04-19 10:23:12 +05:00
Ammar Ahmed
10ab612366 mobile: fix section header title for rtl lang 2024-04-19 10:23:12 +05:00
Ammar Ahmed
8dc4f7ed3d mobile: remove v3 beta notice on login page 2024-04-19 10:23:12 +05:00
Ammar Ahmed
a73538bafc mobile: use border color for borders 2024-04-19 10:23:12 +05:00
Abdullah Atta
014887c7dc core: fix virtualized grouping showing duplicate groups 2024-04-19 10:14:22 +05:00
Abdullah Atta
246e49bd8c web: remove beta tag 2024-04-18 15:48:47 +05:00
Ammar Ahmed
146ac12935 mobile: fix search not update on changing item property 2024-04-18 14:48:37 +05:00
Abdullah Atta
4f5245adcf web: fix changing readonly doesn't update editor 2024-04-18 13:26:59 +05:00
Abdullah Atta
0bc0cc5729 Merge branch 'v3-beta' 2024-04-18 13:19:33 +05:00
Ammar Ahmed
1136072eff mobile: improve search experience 2024-04-18 13:11:43 +05:00
Ammar Ahmed
4cc8a538a4 mobile: make side bar order stateful 2024-04-18 13:11:43 +05:00
Abdullah Atta
271913ba20 core: fix migrate to sqlite progress reporting 2024-04-18 12:53:16 +05:00
Abdullah Atta
3efe541869 web: fix nav menu items order not respected 2024-04-18 12:17:31 +05:00
Abdullah Atta
b3bcdd4f9c web: fix status bar hidden 2024-04-18 12:06:01 +05:00
Abdullah Atta
13f739763c desktop: use secure dns by default 2024-04-18 11:26:22 +05:00
Abdullah Atta
bde2b26133 web: bring back publish button in top action bar 2024-04-18 11:26:01 +05:00
Abdullah Atta
6eef65952d editor: fix simple checklist not working in firefox 2024-04-18 10:23:23 +05:00
Abdullah Atta
3d85795216 common: add toolbar migration for addInternalLink tool 2024-04-18 10:00:55 +05:00
Ammar Ahmed
f1a1989990 misc: update deps 2024-04-18 09:49:56 +05:00
Ammar Ahmed
76ff5eddd0 mobile: fix tests 2024-04-18 09:49:56 +05:00
Ammar Ahmed
068ee8dc68 mobile: support drag & drop images on iOS 2024-04-18 09:49:56 +05:00
Ammar Ahmed
bbf0fb641b mobile: fix attachment upload from base64 2024-04-18 09:49:56 +05:00
Ammar Ahmed
3cae22faf1 core: fix upload attachment from content 2024-04-18 09:49:56 +05:00
Abdullah Atta
34a4a27ba0 web: reduce batch size to 100 2024-04-18 09:43:18 +05:00
Abdullah Atta
d96a78c741 web: middle click should close tab even if there is scroll 2024-04-18 09:40:41 +05:00
Abdullah Atta
c9e5ee9ddb core: use database logger instead of console.error 2024-04-18 09:37:21 +05:00
Abdullah Atta
f43c2a40f5 web: do not jump to focus the same item again 2024-04-18 08:52:12 +05:00
Abdullah Atta
b12a0e979c web: send contentId when saving a note's content 2024-04-17 16:14:20 +05:00
Abdullah Atta
d0372b82db core: add content noteId to sqlite index 2024-04-17 16:14:00 +05:00
Abdullah Atta
dac1441add web: fix various crashes 2024-04-17 14:53:05 +05:00
Abdullah Atta
a65ebec7ae web: replace allotment with react-resizable-panels 2024-04-17 14:23:19 +05:00
Abdullah Atta
d5cf65e568 web: fix potential crash when saving note 2024-04-16 23:36:38 +05:00
Ammar Ahmed
424073298e mobile: fix quick note widget not working 2024-04-16 23:24:50 +05:00
Abdullah Atta
580c83687e desktop: fix build on windows 2024-04-16 22:27:20 +05:00
Abdullah Atta
de226a8ab6 web: bump version to 3.0.14 2024-04-16 12:48:45 +05:00
Abdullah Atta
8b94b08066 web: handle error when scheduling a cron task 2024-04-16 12:08:22 +05:00
Abdullah Atta
18c460a8b2 web: fix padding at bottom on opening a nested notebook 2024-04-15 22:11:24 +05:00
Abdullah Atta
fbb3a56c0c core: fix too many SQL variables error on trash cleanup 2024-04-15 22:01:32 +05:00
Ammar Ahmed
48f602d4fe mobile: fix help links 2024-04-15 22:01:12 +05:00
Abdullah Atta
ad2b68c8ed editor: fix notes with task lists taking too long to load 2024-04-15 20:55:07 +05:00
Abdullah Atta
c2eafccf2a editor: fix note with task list saving on open 2024-04-15 20:35:50 +05:00
Ammar Ahmed
5ca74b6127 mobile: handle native error 2024-04-09 17:00:32 +05:00
Ammar Ahmed
143a38ade6 mobile: set privacy screen when app lock settings change 2024-04-09 16:36:30 +05:00
Ammar Ahmed
40cff39713 mobile: bump version 2024-04-09 16:28:52 +05:00
Ammar Ahmed
3efa1140b2 mobile: fix editor padding 2024-04-09 16:28:15 +05:00
Ammar Ahmed
64f28aedbf mobile: revert timer change 2024-04-09 16:03:27 +05:00
Ammar Ahmed
74e3a28e2a mobile: fix app state 2024-04-09 16:02:45 +05:00
Ammar Ahmed
58c324b2ac mobile: minor fixes 2024-04-09 15:35:17 +05:00
Abdullah Atta
25fa2dc406 clipper: publish v0.3.2 2024-04-09 14:59:07 +05:00
Abdullah Atta
3e76f3b8c6 clipper: allow web clipper to connect with v3 web app 2024-04-09 14:58:55 +05:00
Abdullah Atta
a12a3fbdc8 clipper: publish v0.3.1 2024-04-09 14:07:49 +05:00
Abdullah Atta
46c492c92a web: fix no column notes.id on opening web clipper 2024-04-09 13:58:29 +05:00
Abdullah Atta
dbace71754 web: bump version to 3.0.13 2024-04-09 13:41:31 +05:00
Abdullah Atta
ece5b56bdd web: add tracing to debug empty content on save issue 2024-04-09 13:37:58 +05:00
Abdullah Atta
c35dd826dc core: fix too many SQL variables error on bulk deletion 2024-04-09 13:17:12 +05:00
Abdullah Atta
675324f6af web: fix color check status not updating in properties 2024-04-09 12:33:27 +05:00
Abdullah Atta
8788a14229 web: send error as is instead of copying it in shared service 2024-04-09 12:19:23 +05:00
Abdullah Atta
c8f697c5b1 web: fix context menu not opening on attachments 2024-04-09 11:57:32 +05:00
Abdullah Atta
48a4d67c13 web: handle errors during attachments download 2024-04-09 11:50:16 +05:00
Abdullah Atta
e4289bb69e web: fix gradients not rendering in app logo 2024-04-09 03:12:53 +05:00
Abdullah Atta
7000c67535 core: fix no such column: dateEdited on sorting tags 2024-04-09 02:56:13 +05:00
Abdullah Atta
0eb61c80fa web: improve loading of really long notes 2024-04-09 02:46:27 +05:00
Abdullah Atta
4bbd43e54b editor: speed up note loading significantly 2024-04-09 01:37:30 +05:00
Abdullah Atta
ce949d94f2 editor: use css containment for editor 2024-04-09 01:37:30 +05:00
Abdullah Atta
bdbf205745 editor: simplify link node detection 2024-04-09 01:37:30 +05:00
Abdullah Atta
899ab2ddb1 editor: use schema from editor directly 2024-04-09 01:37:30 +05:00
Abdullah Atta
a302276af9 editor: speed up setting block id on edit 2024-04-09 01:37:30 +05:00
Abdullah Atta
ee14a292ab editor: use alfaaz for word counting 2024-04-09 01:37:30 +05:00
Ammar Ahmed
646949c96c mobile: bump version 2024-04-04 17:28:46 +05:00
Ammar Ahmed
ebfb5c29dd editor: minor fixes 2024-04-04 13:35:45 +05:00
Ammar Ahmed
3932ae62b0 mobile: minor fixes in editor 2024-04-04 13:00:40 +05:00
Ammar Ahmed
f671d2dec0 editor: fix position out of range error 2024-04-04 11:47:18 +05:00
Ammar Ahmed
6261f3f2c6 mobile: accept shared title in extension 2024-04-04 08:10:26 +05:00
Ammar Ahmed
1b9802b8e0 mobile: make add notebook button floating 2024-04-04 06:24:25 +05:00
Ammar Ahmed
ca95af7043 core: add missing settings keys 2024-04-04 06:23:53 +05:00
Abdullah Atta
0aac2eb1e0 web: set max editor session duration to 5 minutes 2024-04-04 00:40:40 +05:00
Abdullah Atta
c10d083dab web: fix flickering in footer during save indicator update 2024-04-04 00:19:09 +05:00
Abdullah Atta
27c6cdec47 editor: fix typo 2024-04-03 23:59:58 +05:00
Abdullah Atta
8fd0f97dfe core: fix search queries with 3 characters not allowed 2024-04-03 17:34:24 +05:00
Abdullah Atta
59d65a2cbb editor: fix crash if code block language contains space 2024-04-03 16:51:17 +05:00
Abdullah Atta
9bd978b8c6 web: fix notebook title not updating on edit 2024-04-03 16:44:43 +05:00
Abdullah Atta
d6e22f2e3e web: fix task list header overlapping toolbar 2024-04-03 16:34:47 +05:00
Abdullah Atta
a9a1290530 web: fix text not selectable from bottom of editor 2024-04-03 16:11:42 +05:00
Abdullah Atta
b8eab5bddc web: fix crash on showing announcement 2024-04-03 16:05:20 +05:00
Abdullah Atta
6836d6551f editor: fix image size resetting on opening new tab 2024-04-03 16:05:03 +05:00
Abdullah Atta
8e07ae8b26 web: press escape to exit search 2024-04-03 15:35:50 +05:00
Abdullah Atta
b013a1cfa7 editor: fix collapsed callouts not rendering correctly 2024-04-03 15:33:28 +05:00
Abdullah Atta
0650d00ca1 web: close tab on moving note to trash 2024-04-03 15:24:10 +05:00
Abdullah Atta
c048f789e7 desktop: fix toggles in properties not working 2024-04-03 15:01:58 +05:00
Abdullah Atta
9c158dfa53 setup: exclude better-sqlite3 & sodium-native from rebuild 2024-04-02 15:19:00 +05:00
Abdullah Atta
168be74277 global: update lockfiles 2024-04-02 14:38:22 +05:00
Abdullah Atta
016532ef42 ci: use brew to install setuptools 2024-04-02 12:33:11 +05:00
Abdullah Atta
7368796a72 ci: fix No module named 'distutils' 2024-04-02 12:14:40 +05:00
Abdullah Atta
b3e10de0a1 desktop: get rid of @elctron/rebuild 2024-04-02 12:13:06 +05:00
Abdullah Atta
dd674d38df desktop: ignore errors during update check 2024-04-02 11:58:33 +05:00
Abdullah Atta
a427e32796 web: bump version to 3.0.12 2024-04-02 11:52:27 +05:00
Abdullah Atta
b44d2e5c9b web: fix tests 2024-04-02 11:51:33 +05:00
Abdullah Atta
c42d046188 desktop: fix left margin in titlebar 2024-04-01 17:26:23 +05:00
Abdullah Atta
ae5f9f0f4a desktop: add @electron/rebuild 2024-04-01 17:20:41 +05:00
Abdullah Atta
1681a587b9 web: add margins before tabs in web app 2024-04-01 17:20:12 +05:00
Abdullah Atta
b43d51aa72 desktop: fix custom title bar on linux 2024-04-01 17:17:28 +05:00
Abdullah Atta
f99d4bc013 web: fix pressing Fix it resulted in database error 2024-04-01 12:50:11 +05:00
Abdullah Atta
430c2f51f6 web: fix create vault dialog cannot be closed 2024-04-01 11:54:14 +05:00
Abdullah Atta
b55b521def core: fix Cannot read property 'sortBy' of undefined 2024-04-01 11:43:51 +05:00
Abdullah Atta
c26e2d800d editor: add Shift+Mod+L shortcut for adding internal links 2024-04-01 11:38:59 +05:00
Ammar Ahmed
310de9f950 mobile: export notes 2024-04-01 11:27:10 +05:00
Abdullah Atta
9109c5180a editor: remove display: inline for floating images 2024-04-01 11:27:10 +05:00
Abdullah Atta
db57c125d6 web: use new export utility from @notesnook/common 2024-04-01 11:27:10 +05:00
Abdullah Atta
3ec177c631 web: expose streaming file decryption 2024-04-01 11:27:10 +05:00
Abdullah Atta
fa561df14f web: allow reading data from stream when writing zip 2024-04-01 11:27:10 +05:00
Abdullah Atta
b0abf56f20 common: add export notes utility
this utility resolves attachments & internal links
2024-04-01 11:27:09 +05:00
Abdullah Atta
a4ac051af0 core: minor changes 2024-04-01 11:27:09 +05:00
Abdullah Atta
7a2db59516 core: fix export of floating images 2024-04-01 11:27:09 +05:00
Abdullah Atta
76c33e3cbc core: add support for resolving attachments & internal links 2024-04-01 11:27:09 +05:00
Abdullah Atta
fd295b226a core: remove unused methods 2024-04-01 11:27:09 +05:00
Abdullah Atta
9bb82aebfe core: improve export performance 2024-04-01 11:27:09 +05:00
Abdullah Atta
38c6dd3953 web: integrate the tab bar like before 2024-04-01 11:23:56 +05:00
Abdullah Atta
0517f61164 web: enable custom title bar in the web app 2024-04-01 11:23:56 +05:00
Ammar Ahmed
17289f2df6 desktop: fix output binary path 2024-04-01 11:23:56 +05:00
Abdullah Atta
44a7f057ac desktop: fix titlebar alignment 2024-04-01 11:23:56 +05:00
Ammar Ahmed
be5d0820d5 desktop: fix title bar for macos 2024-04-01 11:23:56 +05:00
Abdullah Atta
23bd4a564f desktop: add custom titlebar 2024-04-01 11:23:56 +05:00
Ammar Ahmed
be41cf1252 mobile: show readonly icon on note item 2024-03-30 12:06:56 +05:00
Ammar Ahmed
cf643fe0b0 mobile: fix link notebooks sheet 2024-03-30 11:51:07 +05:00
Ammar Ahmed
988efa4577 mobile: show sync disabled icon on note 2024-03-30 11:50:24 +05:00
Ammar Ahmed
631160c2c9 mobile: fix colors on color page 2024-03-30 09:47:13 +05:00
Abdullah Atta
ebe3f2b771 web: make shared sqlite more robust 2024-03-29 15:49:25 +05:00
Abdullah Atta
3e300d98c4 web: handle more errors in error boundary 2024-03-29 15:49:08 +05:00
Abdullah Atta
1a1e673a6c web: fix double app refresh on logout 2024-03-29 15:48:41 +05:00
Abdullah Atta
6ce08b5aa3 web: do not destroy db on tab/window close 2024-03-29 15:48:26 +05:00
Abdullah Atta
2ef0d5b5cd web: fix profile settings not updating on logout 2024-03-29 15:39:00 +05:00
Abdullah Atta
a15978bf6a core: separate db setup & init 2024-03-29 15:38:36 +05:00
Abdullah Atta
8fb8c54157 core: do not close db connection on reset 2024-03-29 15:38:17 +05:00
Abdullah Atta
9f4647be47 core: add support for dropping triggers 2024-03-29 15:37:59 +05:00
Abdullah Atta
1a38da30f4 web: reduce provider port retry delay to 50ms 2024-03-28 10:00:27 +05:00
Abdullah Atta
c3d244b3b6 web: always keep one tab open 2024-03-28 09:56:23 +05:00
Abdullah Atta
751af3c2d1 web: add support for multiple browser tabs & windows 2024-03-28 09:50:37 +05:00
Abdullah Atta
ec00779062 core: only create triggers if they do not exist 2024-03-28 09:50:37 +05:00
Abdullah Atta
165ba064a9 core: add support for skipping database initialization 2024-03-28 09:50:37 +05:00
Ammar Ahmed
2763068e21 mobile: release v3.0.15 2024-03-27 12:39:59 +05:00
Ammar Ahmed
210bdeaed0 mobile: fix vault unlocking 2024-03-27 11:48:56 +05:00
Ammar Ahmed
3037a153dd mobile: fix app lock key decryption error 2024-03-27 11:48:56 +05:00
Abdullah Atta
474fb597c6 web: respect tag casing 2024-03-27 11:28:05 +05:00
Abdullah Atta
6c19968ef6 desktop: fix ENOENT error when saving backup 2024-03-27 11:26:35 +05:00
Abdullah Atta
38dedcbc3c web: change backup filename format 2024-03-27 11:26:35 +05:00
Abdullah Atta
0e066d5d63 desktop: handle error during update check 2024-03-27 11:26:35 +05:00
Ammar Ahmed
d45a65edea mobile: fix applock unlocks app on entering any pin 2024-03-27 09:40:45 +05:00
Abdullah Atta
98e3c2955b core: fix groups returning only 1 group 2024-03-26 12:29:41 +05:00
Abdullah Atta
9c0eca0891 web: bump version to 3.0.11 2024-03-26 11:53:15 +05:00
Abdullah Atta
32c377a0ea web: add v3 beta notice on login screen 2024-03-26 11:53:15 +05:00
Ammar Ahmed
02145ec17e mobile: release v3.0.14 2024-03-26 11:50:44 +05:00
Abdullah Atta
9e1a864f54 web: fix tests 2024-03-26 11:45:09 +05:00
Abdullah Atta
4989dc4301 web: focus item in list when switching tabs 2024-03-26 11:45:08 +05:00
Abdullah Atta
4f43e4eab5 web: fix reminder cannot be edited 2024-03-26 11:45:08 +05:00
Ammar Ahmed
d59219e62b mobile: fix applock toggles working without verification 2024-03-26 11:44:46 +05:00
Ammar Ahmed
5f5209af8c mobile: fix sidemenu ui 2024-03-26 11:40:11 +05:00
Ammar Ahmed
6a9e6065d1 mobile: fix typo 2024-03-26 11:36:32 +05:00
Ammar Ahmed
00119dbefe mobile: add notice on login page 2024-03-26 11:26:57 +05:00
Ammar Ahmed
c466af60a6 mobile: resize textarea after delay in title 2024-03-26 11:05:41 +05:00
Ammar Ahmed
e5512974d5 mobile: no need to check editor ready state 2024-03-26 11:05:23 +05:00
Ammar Ahmed
7861fa0b11 mobile: fix title of preview tab 2024-03-26 11:05:08 +05:00
Ammar Ahmed
c20dbf1158 mobile: fix recyclerlistview crash 2024-03-26 09:32:43 +05:00
Ammar Ahmed
9e7c302693 mobile: minor bug fixes 2024-03-26 08:57:23 +05:00
Abdullah Atta
e007f2592c core: add extensive grouping/sorting tests 2024-03-26 07:55:23 +05:00
Abdullah Atta
3a5ea3e8ef web: fix sidebar items are not reorderable 2024-03-25 15:11:03 +05:00
Abdullah Atta
0a0edd4814 web: middle click on note to open it in new tab 2024-03-25 13:37:26 +05:00
Abdullah Atta
62bbea01e6 web: middle click on tab to close it 2024-03-25 13:16:42 +05:00
Abdullah Atta
3730596030 editor: fix random crash Cannot read properties of null (reading 'domFromPos') 2024-03-25 13:06:06 +05:00
Abdullah Atta
7f176942ba editor: cancel image download on switching notes 2024-03-25 13:02:11 +05:00
Abdullah Atta
72a09f48e0 desktop: prevent downloading multiple updates 2024-03-25 12:38:30 +05:00
Abdullah Atta
632291e901 web: crash on assigning a tag from editor 2024-03-25 12:17:15 +05:00
Abdullah Atta
17352e783b web: navigate to root notebook or notebooks on deletion 2024-03-25 12:05:44 +05:00
Abdullah Atta
d8729f8171 core: ignore trash when checking notebook existence 2024-03-25 12:05:25 +05:00
Abdullah Atta
8ac8f8f56a desktop: fix crash on showing reminder notification with no description 2024-03-25 11:11:49 +05:00
Abdullah Atta
a2cfa8873f core: fix sync tests 2024-03-23 07:23:02 +05:00
Abdullah Atta
13a7f39d27 mobile: bump version to 3.0.13 2024-03-23 06:32:18 +05:00
Abdullah Atta
4e22a5605b web: bump version to 3.0.10 2024-03-23 06:29:24 +05:00
Abdullah Atta
0afcf8cbab core: fix The item must contain the id field. error on migration 2024-03-23 06:27:59 +05:00
Licaon_Kter
c54759e766 Remove gradle property unused in Java 17
Signed-off-by: Licaon_Kter <licaon-kter@users.noreply.github.com>
2024-03-22 23:17:45 +05:00
Ammar Ahmed
b1d13c125f mobile: bump version code on ios 2024-03-22 11:29:07 +05:00
Ammar Ahmed
85aab9506c mobile: release v3.0.12 2024-03-22 11:17:43 +05:00
Abdullah Atta
728b63b001 setup: revert "disable esbuild rebuild" 2024-03-22 11:13:31 +05:00
Abdullah Atta
b91567e2cf setup: disable esbuild rebuild 2024-03-22 11:09:22 +05:00
Abdullah Atta
c3179542a6 web: bump version to 3.0.9 2024-03-22 11:04:45 +05:00
Abdullah Atta
7ea575a1b8 web: fix locked note immediately getting locked on edit 2024-03-22 11:01:35 +05:00
Abdullah Atta
d2eeb93339 core: make tag title matching case sensitive 2024-03-22 10:51:56 +05:00
Abdullah Atta
ca59670b68 web: show errors during tag edit/create 2024-03-22 10:45:48 +05:00
Abdullah Atta
a1117d77f3 core: prevent tags with duplicate names 2024-03-22 10:45:48 +05:00
Ammar Ahmed
e7ee455ee3 mobile: throw error when renaming tag to existing tag title 2024-03-22 10:30:34 +05:00
Abdullah Atta
9ad9c0c633 core: fix duplicate tags created during migration 2024-03-22 10:16:00 +05:00
Abdullah Atta
ec2a6f26e6 core: add date created in tag/color during migration 2024-03-22 10:16:00 +05:00
Abdullah Atta
ead4f59ba7 web: use plain divs for rendering item skeleton 2024-03-22 10:15:59 +05:00
Abdullah Atta
c4f0cd18ad core: generate setting key ids once
this greatly improves performance because md5 id generation is slow
2024-03-22 10:15:59 +05:00
Ammar Ahmed
77d5bd71f9 mobile: minor ui fixes 2024-03-22 09:33:40 +05:00
Ammar Ahmed
eb0aff2fc3 mobile: fix tags not rendered in note properties 2024-03-22 09:24:14 +05:00
Ammar Ahmed
e4e1eb0ced mobile: fix tag delete in bulk 2024-03-22 09:24:14 +05:00
Ammar Ahmed
116a017938 mobile: add try/catch to check item loading issues 2024-03-22 09:24:14 +05:00
Ammar Ahmed
6dfbb27c33 core: fix user profile cleared on clearing an profile data 2024-03-22 09:24:14 +05:00
Ammar Ahmed
097c6915fb mobile: migrate user profile to settings 2024-03-22 09:24:14 +05:00
Abdullah Atta
97490a5e37 web: make app work in offline mode 2024-03-22 08:19:28 +05:00
Abdullah Atta
799678efca common: fix type error 2024-03-22 07:23:53 +05:00
Abdullah Atta
e3afb1d068 web: use user profile from settings 2024-03-21 13:17:03 +05:00
Abdullah Atta
d32db74ccc core: move user profile to settings collection 2024-03-21 13:16:21 +05:00
Abdullah Atta
e24452c386 editor: remove not an image error thrown when downloading images 2024-03-21 12:42:23 +05:00
Abdullah Atta
68e97f17d0 editor: fix clicking on internal link opens a new tab 2024-03-21 12:28:26 +05:00
Abdullah Atta
9040a4561d editor: fix Cannot read properties of null (reading 'posFromDOM') error 2024-03-21 12:28:07 +05:00
Abdullah Atta
1ed8205f45 web: show reload app button in error overlay 2024-03-21 12:07:25 +05:00
Abdullah Atta
feaa207f68 common: do not render undefined items 2024-03-21 12:06:56 +05:00
Abdullah Atta
76e766583c core: filter out ids that have no note against them on lookup 2024-03-21 12:04:07 +05:00
Ammar Ahmed
f15446b1d6 mobile: bump version code 2024-03-21 11:45:03 +05:00
Ammar Ahmed
18be9fda41 mobile: bump android version code to 3000 2024-03-21 11:22:49 +05:00
Abdullah Atta
9b3430b5d9 web: fix editor tags not updated when creating note in a tag 2024-03-21 11:22:49 +05:00
Abdullah Atta
5b79fbd7b5 web: highlight changes in diff viewer 2024-03-21 11:22:49 +05:00
Abdullah Atta
cc0be4565d editor: refactor diff highlighter extension 2024-03-21 11:22:49 +05:00
Abdullah Atta
41865fb286 web: bump version to 3.0.8 2024-03-21 11:22:49 +05:00
Ammar Ahmed
37507d4f0a mobile: release v3.0.11 2024-03-21 11:22:49 +05:00
Ammar Ahmed
755a8d45e9 mobile: update Pods 2024-03-21 11:22:49 +05:00
Abdullah Atta
357d872362 web: fix assigning a color removes that color from all other notes 2024-03-21 11:22:49 +05:00
Abdullah Atta
63be4088a5 web: fix changes in callout heading not causing toc update 2024-03-21 11:22:49 +05:00
Abdullah Atta
7e4d123a51 web: fix toc items not indented 2024-03-21 11:22:49 +05:00
Abdullah Atta
1a2ce6ba72 editor: add block-id on nodes inside callout 2024-03-21 11:22:49 +05:00
Abdullah Atta
adb3805ec7 editor: disable conflicting simple checklist input rule 2024-03-21 11:22:49 +05:00
Ammar Ahmed
328f324d9e mobile: fix tab title 2024-03-21 11:22:49 +05:00
Abdullah Atta
108c9e2944 web: fix image picker shown when there are 0 images 2024-03-21 11:22:49 +05:00
Abdullah Atta
f2a5ed6642 editor: add support for copy/pasting code blocks with highlighting 2024-03-21 11:22:49 +05:00
Abdullah Atta
e1339617b5 web: fix crash on copying from codeblock 2024-03-21 11:22:48 +05:00
Abdullah Atta
4f22010c56 web: only show content blocks with direct links in referenced in tab 2024-03-21 11:22:48 +05:00
Abdullah Atta
831b8497b2 core: fix extraction of blocks with links 2024-03-21 11:22:48 +05:00
Abdullah Atta
37dd691270 editor: fix hover popup appearing in wrong position 2024-03-21 11:22:48 +05:00
Abdullah Atta
4349445910 editor: fix outline list has no data-block-id attribute 2024-03-21 11:22:48 +05:00
Abdullah Atta
669849018a editor: fix DOMException when removing react node views 2024-03-21 11:22:48 +05:00
Abdullah Atta
71ad15b4b6 editor: minor refactors 2024-03-21 11:22:48 +05:00
Abdullah Atta
732185a69d editor: fix crash on select all + backspace with lists 2024-03-21 11:22:48 +05:00
Abdullah Atta
479dec6998 editor: fix crash on removing task list 2024-03-21 11:22:48 +05:00
Ammar Ahmed
ff6b65c55c editor: enable block id on checklist and callout 2024-03-21 11:22:48 +05:00
Abdullah Atta
6e5493f149 editor: fix react node views for react 18 2024-03-21 11:22:48 +05:00
Ammar Ahmed
b185338be2 editor: always show note internal link button in toolbar 2024-03-21 11:22:48 +05:00
Abdullah Atta
b4161644d0 editor: handle link open on click 2024-03-21 11:22:48 +05:00
Abdullah Atta
61e0fdea50 ui: fix weird zIndex animation on popups 2024-03-21 11:22:48 +05:00
Abdullah Atta
cb124c7445 editor: update tiptap & other packages 2024-03-21 11:22:48 +05:00
Abdullah Atta
fce0d50061 editor: fix newline added in callout on typing anything 2024-03-21 11:22:48 +05:00
Abdullah Atta
dac2a22824 editor: fix => turning into a callout 2024-03-21 11:22:48 +05:00
Abdullah Atta
655bdf3798 editor: fix image size resetting on resize 2024-03-21 11:22:48 +05:00
Abdullah Atta
907bfd04ed web: fix images not getting attached 2024-03-21 11:22:48 +05:00
Abdullah Atta
38ca451d7e web: fix attachment delete dialog not rendering any buttons 2024-03-21 11:22:48 +05:00
Abdullah Atta
52800b39e4 core: fix attachment deletion 2024-03-21 11:22:47 +05:00
Ammar Ahmed
9d700f6fd1 mobile: use contentBlocksWithLinks 2024-03-21 11:22:47 +05:00
Ammar Ahmed
0a5f0d407e core: fix duplicate backlinks shown on note 2024-03-21 11:22:47 +05:00
Ammar Ahmed
a84f3a4434 mobile: cleanup 2024-03-21 11:22:47 +05:00
Ammar Ahmed
1dbd2d8f5f mobile: show error if attachment download fails 2024-03-21 11:22:47 +05:00
Ammar Ahmed
ec1001067d core: support video,audio,document filter in attachments 2024-03-21 11:22:47 +05:00
Ammar Ahmed
0374aa17c4 mobile: fix all attachments showin in note attachments 2024-03-21 11:22:47 +05:00
Abdullah Atta
78cbce5ca0 editor: #dialogContainer > .dialogContainer 2024-03-21 11:22:47 +05:00
Abdullah Atta
65c988cf36 web: fix editor dom structure 2024-03-21 11:22:47 +05:00
Abdullah Atta
1487bf027a web: fix editor toolbar is not sticky 2024-03-21 11:22:47 +05:00
Ammar Ahmed
c5ec5f127d editor: fix collapsing a callout collapses all parent callouts 2024-03-21 11:22:47 +05:00
Ammar Ahmed
2627c83e79 mobile: fix webpack config 2024-03-21 11:22:47 +05:00
Ammar Ahmed
d54f2351f6 mobile: release v3.0.10 2024-03-21 11:22:47 +05:00
Ammar Ahmed
460c2b4662 mobile: open note in new tab 2024-03-21 11:22:47 +05:00
Ammar Ahmed
cf5fac7d41 mobile: fix incorrect tab content by default 2024-03-21 11:22:47 +05:00
Ammar Ahmed
8d4ae8e970 mobile: fix incorrect button type in dialog 2024-03-21 11:22:47 +05:00
Ammar Ahmed
f9db4d49b1 mobile: fix publish button hidden on tablet 2024-03-21 11:22:46 +05:00
Ammar Ahmed
728b22f337 mobile: cleanup 2024-03-21 11:22:46 +05:00
Ammar Ahmed
de42a895dd mobile: update deps 2024-03-21 11:22:46 +05:00
Ammar Ahmed
0b813b3fa1 mobile: fix app lock shows on session expired sheet 2024-03-21 11:22:46 +05:00
Ammar Ahmed
d13ff079a4 mobile: support showing diff of conflicted note 2024-03-21 11:22:46 +05:00
Ammar Ahmed
eca9f221ac editor: add highlight diff extension 2024-03-21 11:22:46 +05:00
Ammar Ahmed
48a3f11215 mobile: remove redundant code 2024-03-21 11:22:46 +05:00
Ammar Ahmed
dc7fcb67f0 mobile: render title after loaded 2024-03-21 11:22:46 +05:00
Ammar Ahmed
78e8f932c2 mobile: bump android version 2024-03-21 11:22:46 +05:00
Ammar Ahmed
65678a0995 mobile: fix button action 2024-03-21 11:22:46 +05:00
Ammar Ahmed
2b9381d40e mobile: check if editorController.current is undefined 2024-03-21 11:22:46 +05:00
Ammar Ahmed
0f795ff913 mobile: cleanup 2024-03-21 11:22:46 +05:00
Ammar Ahmed
43cb5d278c mobile: add readonly editor 2024-03-21 11:22:46 +05:00
Abdullah Atta
c7142e409b web: fix more tests 2024-03-21 11:22:11 +05:00
Abdullah Atta
3876cb5ec3 editor: fix some images not loading 2024-03-21 11:22:11 +05:00
Abdullah Atta
47862c3182 web: fix lock/unlock from properties not working 2024-03-21 11:22:11 +05:00
Abdullah Atta
533bef014d web: fix title of locked note not saving 2024-03-21 11:22:11 +05:00
Abdullah Atta
f5ac0b93f6 web: update url on switching between sessions 2024-03-21 11:22:11 +05:00
Abdullah Atta
d5a27b052c web: hide tags input in new session 2024-03-21 11:22:11 +05:00
Abdullah Atta
4a36606121 web: bring back edited date in footer 2024-03-21 11:22:11 +05:00
Abdullah Atta
b69933444c web: fix typing fast in title input caused some characters to miss 2024-03-21 11:22:11 +05:00
Ammar Ahmed
48866efa57 mobile: fix webpack config 2024-03-21 11:22:11 +05:00
Abdullah Atta
c56445f817 global: update lockfiles 2024-03-21 11:22:11 +05:00
Abdullah Atta
18afc0a49c editor: fix type errors 2024-03-21 11:22:11 +05:00
Ammar Ahmed
f38c4bbbac mobile: release v3.0.9 2024-03-21 11:22:11 +05:00
Abdullah Atta
de125a33d1 web: show error if backup import fails 2024-03-21 11:22:11 +05:00
Ammar Ahmed
81b7e34b0d mobile: readd editor overlay 2024-03-21 11:22:11 +05:00
Ammar Ahmed
5d2853d002 mobile: fix tab bugs 2024-03-21 11:22:11 +05:00
Abdullah Atta
ad41544403 web: bump version to 3.0.7 2024-03-21 11:22:10 +05:00
Abdullah Atta
c8bf1fc2cd editor: do not add data-block-id attribute if no blockid 2024-03-21 11:22:10 +05:00
Abdullah Atta
3d25a1d5c2 editor: highlight active block for 5 seconds 2024-03-21 11:22:10 +05:00
Abdullah Atta
a8896b847f core: fix imports 2024-03-21 11:22:10 +05:00
Abdullah Atta
a1b3327aa8 web: improve internal links ui 2024-03-21 11:22:10 +05:00
Abdullah Atta
e9431af138 core: do not wrap text in content blocks 2024-03-21 11:22:10 +05:00
Abdullah Atta
8b07508204 web: ignore realtime sync if it doesn't update content or note title 2024-03-21 11:22:10 +05:00
Abdullah Atta
3e0d9f92af web: fix behavior of editor action bar 2024-03-21 11:22:10 +05:00
Abdullah Atta
0e4a2c7593 web: always show note statistics of active editor 2024-03-21 11:22:10 +05:00
Abdullah Atta
a7a2dcf791 web: fix diff viewer not showing images 2024-03-21 11:22:10 +05:00
Abdullah Atta
47221dc81b web: fix concurrent opfs reads throwing errors 2024-03-21 11:22:10 +05:00
Abdullah Atta
6fb8f11d2f web: await promises 2024-03-21 11:21:08 +05:00
Abdullah Atta
0cfd607806 web: use database updated event to add editor reactivity 2024-03-21 11:21:08 +05:00
Abdullah Atta
a86565a8ec core: fix attachment not unlinked from notes on removal 2024-03-21 11:21:08 +05:00
Abdullah Atta
3ee231e459 core: publish database updated events on content remove/update 2024-03-21 11:21:08 +05:00
Abdullah Atta
335021090d core: refactor database update event logic 2024-03-21 11:21:08 +05:00
Abdullah Atta
b001107135 core: add method to rebuild trash cache 2024-03-21 11:21:08 +05:00
Abdullah Atta
dba1d8645d core: simplify remove from all notebooks logic 2024-03-21 11:21:08 +05:00
Abdullah Atta
9dff23bdd5 core: publish database updated event on relations unlink 2024-03-21 11:21:08 +05:00
Abdullah Atta
90e48cbc16 core: fix note not unlinked from vault on unlock 2024-03-21 11:21:08 +05:00
Abdullah Atta
4a1a912d0f core: rebuild trash cache on sync complete 2024-03-21 11:21:08 +05:00
Abdullah Atta
8a6328ef07 web: reopen notes after permanently deleting an attachment 2024-03-21 11:21:08 +05:00
Abdullah Atta
a66c72e099 web: fix content is not updated for new notes in realtime sync 2024-03-21 11:21:07 +05:00
Abdullah Atta
652cbcda52 web: update editor sessions in realtime 2024-03-21 11:21:07 +05:00
Abdullah Atta
199c5d3e64 web: do not show internal links, notebooks etc in properties for trash preview 2024-03-21 11:21:07 +05:00
Abdullah Atta
8b1b569fee web: fix editor title not changing on realtime sync 2024-03-21 11:21:07 +05:00
Abdullah Atta
d869a69477 web: special icons for readonly and trash preview tabs 2024-03-21 11:21:07 +05:00
Abdullah Atta
00995431f4 web: fix trash note preview is not readonly 2024-03-21 11:21:07 +05:00
Abdullah Atta
cec7c5f3b1 core: standarize database updated event 2024-03-21 11:21:07 +05:00
Abdullah Atta
47ae03ba8a global: upgrade typescript to 5.4.2 2024-03-21 11:21:07 +05:00
Abdullah Atta
3aa3858981 web: fix type errors 2024-03-21 11:21:06 +05:00
Abdullah Atta
67fa1d6bb4 core: sort & group reminders in sqlite 2024-03-21 11:21:06 +05:00
Ammar Ahmed
00ecb149df mobile: minor cleanup 2024-03-21 11:21:06 +05:00
Ammar Ahmed
d931d20006 mobile: fix search in share extension 2024-03-21 11:21:06 +05:00
Ammar Ahmed
b4a0e97e3f editor: do not focus editor on end search 2024-03-21 11:21:06 +05:00
Ammar Ahmed
8edcfcf2f1 mobile: fix editor tab bugs 2024-03-21 11:21:06 +05:00
Ammar Ahmed
6a8ccf9401 mobile: fix use-db-item hook not working 2024-03-21 11:21:06 +05:00
Ammar Ahmed
e2eab24574 mobile: fix attachment exists check when uploading file 2024-03-21 11:21:06 +05:00
Ammar Ahmed
6a4e31e972 mobile: fix attachment progress not working 2024-03-21 11:21:06 +05:00
Ammar Ahmed
04f54f79fa mobile: fix note with attachments not saved from share extension 2024-03-21 11:21:05 +05:00
Ammar Ahmed
c148c6b9cf mobile: fix share extension append to exisitng note not working 2024-03-21 11:21:05 +05:00
Ammar Ahmed
030cbefe3f common: up version when migrating toolbar 2024-03-21 11:21:05 +05:00
Abdullah Atta
85342e5f74 core: fix table x has no column y errors 2024-03-21 11:21:05 +05:00
Ammar Ahmed
46565aa45c mobile: blur editor on back 2024-03-21 11:21:05 +05:00
Abdullah Atta
8496423b50 web: use dnd-kit for smoother drag/drop in tabs 2024-03-21 11:21:05 +05:00
Abdullah Atta
e39be83f70 web: always sort pinned tabs first 2024-03-21 11:21:05 +05:00
Abdullah Atta
3a6d1e7a76 web: fix pinned tabs getting unpinned after app refresh 2024-03-21 11:21:05 +05:00
Ammar Ahmed
15fc1d0cca mobile: add useNoteLocked hook 2024-03-21 11:21:05 +05:00
Ammar Ahmed
685322f02a mobile: fix ui of linked blocks 2024-03-21 11:21:05 +05:00
Ammar Ahmed
b849861146 mobile: fix jump to block 2024-03-21 11:21:05 +05:00
Ammar Ahmed
91e041108c mobile: fix content block ui 2024-03-21 11:21:05 +05:00
Ammar Ahmed
76f2ac2c1d mobile: fix loading placeholder position 2024-03-21 11:21:05 +05:00
Ammar Ahmed
bc11999201 mobile: fix colors and size of icons in editor header 2024-03-21 11:21:05 +05:00
Ammar Ahmed
103b1b88f5 mobile: use flatlist for rendering tabs 2024-03-21 11:21:05 +05:00
Ammar Ahmed
5b703fe53a mobile: show keyboard when opening new tab or empty tab 2024-03-21 11:21:05 +05:00
Ammar Ahmed
ab33aa7ebd mobile: make tab active on focus 2024-03-21 11:21:04 +05:00
Ammar Ahmed
4db043b111 mobile: fix tabs 2024-03-21 11:21:04 +05:00
Ammar Ahmed
3efe977c49 mobile: fix minor bugs in tabs 2024-03-21 11:21:04 +05:00
Ammar Ahmed
08c03bc3a4 mobile: fix duplicate imports 2024-03-21 11:21:04 +05:00
Abdullah Atta
5cb373f730 web: bring back editor margins toggle in action bar 2024-03-21 11:21:04 +05:00
Abdullah Atta
123f1a2658 web: minor ui fixes 2024-03-21 11:21:04 +05:00
Abdullah Atta
72645ce0ad web: fix section subtitle horizontal margin 2024-03-21 11:21:04 +05:00
Abdullah Atta
3f375065fc web: add placeholder in table of contents 2024-03-21 11:21:04 +05:00
Abdullah Atta
3d816751f6 web: update diff content on tab switch 2024-03-21 11:21:04 +05:00
Abdullah Atta
f44c553749 web: minor refactor 2024-03-21 11:21:04 +05:00
Abdullah Atta
9c0ee7e63c web: fix properties section horizontal margin 2024-03-21 11:21:04 +05:00
Abdullah Atta
ae3a73c334 core: remove note from vault if its content is not locked 2024-03-21 11:21:04 +05:00
Abdullah Atta
fe0129e1a4 web: fix locked notes getting overwritten with unencrypted content 2024-03-21 11:21:04 +05:00
Abdullah Atta
274395d01b web: fix diff session not opening after app refresh 2024-03-21 11:21:04 +05:00
Abdullah Atta
5deb5253c1 editor: fix search decorations not cleared on search end 2024-03-21 11:21:04 +05:00
Abdullah Atta
55e3213e5c web: add all missing functionality in note linking dialog 2024-03-21 11:21:04 +05:00
Abdullah Atta
bc9b5c39ee web: remove custom search state logic & use editor commands 2024-03-21 11:21:04 +05:00
Abdullah Atta
7a48c7c1e3 editor: fix text on selected search result not visible 2024-03-21 11:21:03 +05:00
Abdullah Atta
324256a499 editor: use global search store for managing search state 2024-03-21 11:21:03 +05:00
Abdullah Atta
eaea7bdd2a editor: minor refactor 2024-03-21 11:21:03 +05:00
Abdullah Atta
5985e22777 web: remove locked session type guard (switch to simple boolean)
the type guard was incorrect
2024-03-21 11:21:03 +05:00
Abdullah Atta
5de7fc5bd7 web: add content to new session type 2024-03-21 11:21:03 +05:00
Abdullah Atta
b54457f522 web: fix editor title not updating on creating a note 2024-03-21 11:21:03 +05:00
Abdullah Atta
f94341facc web: remove preview session type 2024-03-21 11:21:03 +05:00
Abdullah Atta
90a19e7152 web: ${id}_editorScroll > editorScroll_${id} 2024-03-21 11:21:03 +05:00
Abdullah Atta
32998b9c8c web: set session content before saving 2024-03-21 11:21:03 +05:00
Abdullah Atta
88532ae13b web: add dialog container inside tab 2024-03-21 11:21:03 +05:00
Abdullah Atta
64a138fa80 web: handle locked notes properly in real time editor sync 2024-03-21 11:21:03 +05:00
Abdullah Atta
8fe2774d8f web: freeze unhydrated sessions 2024-03-21 11:21:03 +05:00
Abdullah Atta
8ef42dd605 web: remove unused & commented out code 2024-03-21 11:21:03 +05:00
Abdullah Atta
5b44206931 web: focus editor on switching tab and toggle active class 2024-03-21 11:21:03 +05:00
Abdullah Atta
29f92a0806 web: define editor & session once and pass it everywhere 2024-03-21 11:21:03 +05:00
Abdullah Atta
03f8332c67 web: remove unlocked session type 2024-03-21 11:21:03 +05:00
Abdullah Atta
144d362527 web: set session id on saving note 2024-03-21 11:21:03 +05:00
Abdullah Atta
7a6ccb932d core: add block ids before returning content 2024-03-21 11:21:03 +05:00
Abdullah Atta
94c1556a5c editor: fix range error crash 2024-03-21 11:21:03 +05:00
Abdullah Atta
5974ffc0d4 editor: do not add block id on list items
(because they already contain paragraphs and we don't want duplicates)
2024-03-21 11:21:03 +05:00
Abdullah Atta
6184281694 editor: do not touch editor when its view is destroyed 2024-03-21 11:21:02 +05:00
Abdullah Atta
c51406ca04 editor: fix selection/focus is lost when editor state is updated 2024-03-21 11:21:02 +05:00
Abdullah Atta
07db957f67 editor: fix list type thumbnails in toolbar 2024-03-21 11:21:02 +05:00
Abdullah Atta
d31194bb39 editor: hide hover popup on editor destroy 2024-03-21 11:21:02 +05:00
Abdullah Atta
44827d13fe editor: render interactive popups in popup instead of menu 2024-03-21 11:21:02 +05:00
Abdullah Atta
c847ca0817 editor: scroll blocks into view only for active editor 2024-03-21 11:21:02 +05:00
Abdullah Atta
bd102ea346 editor: query editor dom based on active editor class 2024-03-21 11:21:02 +05:00
Abdullah Atta
688dde9890 editor: render all popups in popup container 2024-03-21 11:21:02 +05:00
Abdullah Atta
adfef8faef editor: close all popups and dropdowns on switching tabs 2024-03-21 11:21:02 +05:00
Abdullah Atta
7785bcd5a8 editor: fix placeholder is not visible 2024-03-21 11:21:02 +05:00
Abdullah Atta
569f4537e7 ui: allow setting popup container 2024-03-21 11:21:02 +05:00
Abdullah Atta
43a03079a1 web: disable properties button in action bar when diff is open 2024-03-21 11:21:02 +05:00
Abdullah Atta
852802da4b web: allow session item size to grow 2024-03-21 11:21:02 +05:00
Abdullah Atta
ce4e0a1916 web: add support for /notes/:noteId/edit hash route 2024-03-21 11:21:02 +05:00
Abdullah Atta
ce53495b76 core: do not change date modified on items when bulk adding 2024-03-21 11:21:02 +05:00
Abdullah Atta
42571b0794 editor: make image size clamping responsive 2024-03-21 11:21:02 +05:00
Abdullah Atta
3a2eba3242 web: fix race condition where editor context would be destroyed and updated at the same time 2024-03-21 11:21:02 +05:00
Abdullah Atta
2d9f41e114 web: create error from ErrorEvent if none found 2024-03-21 11:21:02 +05:00
Abdullah Atta
8dada6d936 editor: fix crash on loading web clip 2024-03-21 11:21:02 +05:00
Abdullah Atta
2c4170bacc web: reenable tags refreshing in editor 2024-03-21 11:21:02 +05:00
Abdullah Atta
86ff1890f1 editor: fix position of loading placeholder for floating image 2024-03-21 11:21:01 +05:00
Abdullah Atta
2ef17b800c editor: fix react node views not rendering on editor load 2024-03-21 11:21:01 +05:00
Abdullah Atta
0c0d91f8fd web: fix crash on refreshing editor store 2024-03-21 11:21:01 +05:00
Ammar Ahmed
ba7b88f5d8 mobile: fix randId function duplicate 2024-03-21 11:21:01 +05:00
Abdullah Atta
47a396ffaf editor: fix crash when resizing window due to a memory leak 2024-03-21 11:21:01 +05:00
Abdullah Atta
f60fcefd1c web: fix temporary tabs cannot be made permanent 2024-03-21 11:21:01 +05:00
Abdullah Atta
57e1629b0c web: fix jumping tabs when pinning/unpinning tabs 2024-03-21 11:21:01 +05:00
Abdullah Atta
5988640d3f web: fix crashes when moving tabs 2024-03-21 11:21:01 +05:00
Abdullah Atta
6512ace33b web: fix new sessions can't be opened after app refresh 2024-03-21 11:21:01 +05:00
Abdullah Atta
0a36b5ba5b web: fix type errors 2024-03-21 11:21:01 +05:00
Ammar Ahmed
832652730a editor: remove editor.current usage 2024-03-21 11:21:01 +05:00
Ammar Ahmed
ae7908e000 mobile: fix editor loading multiple times 2024-03-21 11:21:01 +05:00
Abdullah Atta
b40fe805e7 web: use createInternalLink everywhere 2024-03-21 11:21:01 +05:00
Ammar Ahmed
09f37ae872 mobile: finalize note linking 2024-03-21 11:21:00 +05:00
Ammar Ahmed
ef6c4bb6fb core: parse internal link from href 2024-03-21 11:20:27 +05:00
Ammar Ahmed
4fc5ec00ae core: fix extracting internal links 2024-03-21 11:20:27 +05:00
Abdullah Atta
9267433d74 web: show references & linked notes in properties 2024-03-21 11:20:26 +05:00
Abdullah Atta
dbda1eff82 web: reset active block after scroll 2024-03-21 11:20:26 +05:00
Abdullah Atta
c8f9925973 core: add internal links extraction 2024-03-21 11:20:26 +05:00
Abdullah Atta
ff87bebe8f web: add full support for adding internal links 2024-03-21 11:20:26 +05:00
Abdullah Atta
54f1945a58 editor: add support for adding/removing internal links 2024-03-21 11:20:26 +05:00
Abdullah Atta
2a547c879b core: add support for processing internal links in note content 2024-03-21 11:20:26 +05:00
Ammar Ahmed
cfa98578ea mobile: note linking 2024-03-21 11:20:26 +05:00
Ammar Ahmed
270cb16d30 mobile: update deps 2024-03-21 11:20:26 +05:00
Abdullah Atta
06113db2ff web: fix type errors and broken imports 2024-03-21 11:20:26 +05:00
Abdullah Atta
3efb79308a editor: reset editor on options update 2024-03-21 11:20:26 +05:00
Abdullah Atta
b0b5bd235f web: add support for table of contents 2024-03-21 11:20:25 +05:00
Abdullah Atta
4a2fcf950e web: add support for tabs 2024-03-21 11:20:25 +05:00
Abdullah Atta
e166a634f2 common: add utility for formatting history session time 2024-03-21 11:20:00 +05:00
Abdullah Atta
b97ec3948b mobile: simplify unencrypted content check 2024-03-21 11:20:00 +05:00
Abdullah Atta
e14bb065dc core: simplify encryption content checks 2024-03-21 11:20:00 +05:00
Abdullah Atta
80a77871a0 core: restoring a history session should create a new version 2024-03-21 11:20:00 +05:00
Abdullah Atta
51963f799c editor: create editor only once 2024-03-21 11:20:00 +05:00
Ammar Ahmed
71d94853ba mobile: implement toc 2024-03-21 11:20:00 +05:00
Ammar Ahmed
c33c365b62 mobile: support vault notes in tabs 2024-03-21 11:20:00 +05:00
Ammar Ahmed
2ce31fc81c mobile: fix tab bugs 2024-03-21 11:19:59 +05:00
Ammar Ahmed
d9521b5058 mobile: add tab history 2024-03-21 11:19:59 +05:00
Ammar Ahmed
366948cd28 mobile: some more fixes 2024-03-21 11:19:59 +05:00
Ammar Ahmed
ad338aeefc mobile: fix numerous issues with tabs 2024-03-21 11:19:59 +05:00
Ammar Ahmed
6b6ee76c39 mobile: push changes 2024-03-21 11:19:59 +05:00
Ammar Ahmed
3f23507a74 mobile: add editor tabs 2024-03-21 11:19:59 +05:00
Abdullah Atta
815c9eb7de core: remove unnecessary notes collection init before migration 2024-03-21 11:19:59 +05:00
Abdullah Atta
aab2b0307e web: bump version to 3.0.6 2024-03-21 11:19:59 +05:00
Abdullah Atta
b9e7cbd608 setup: only disable esbuild rebuild on mobile 2024-03-21 11:19:59 +05:00
Abdullah Atta
0cf0b00c58 setup: ignore esbuild rebuild script 2024-03-21 11:19:58 +05:00
Abdullah Atta
29e07036b1 mobile: update package lockfile 2024-03-21 11:19:58 +05:00
Abdullah Atta
61b1aa919a editor: fix task items not showing correctly 2024-03-21 11:19:58 +05:00
Abdullah Atta
90b7b5f87b ui: fix menu is not scrollable on small screens 2024-03-21 11:19:58 +05:00
Abdullah Atta
7103167693 web: fix loading skeleton for compact items in list 2024-03-21 11:19:58 +05:00
Ammar Ahmed
77e0f5af17 mobile: bump version code 2024-03-21 11:19:58 +05:00
Ammar Ahmed
0618341cf8 mobile: release v3.0.8 2024-03-21 11:19:58 +05:00
Ammar Ahmed
42a4acb688 mobile: improve notebook sheet wording 2024-03-21 11:19:58 +05:00
Ammar Ahmed
131b1a0aa6 mobile: change sheet button positions 2024-03-21 11:19:58 +05:00
Ammar Ahmed
e327c92e1a mobile: cleanup 2024-03-21 11:19:58 +05:00
Ammar Ahmed
d22301ccf9 mobile: reminder notification shows even after removing reminders 2024-03-21 11:19:58 +05:00
Ammar Ahmed
5d2c615a30 mobile: simplify reminder sheet ui 2024-03-21 11:19:58 +05:00
Ammar Ahmed
4a2088ec1e mobile: remove usage of customStyle prop 2024-03-21 11:19:58 +05:00
Abdullah Atta
238510132f core: fix settings are not migrated 2024-03-21 11:19:58 +05:00
Ammar Ahmed
b7a8277749 mobile: update deps 2024-03-21 11:19:57 +05:00
Ammar Ahmed
0251363d65 mobile: fix tags not showing properly 2024-03-21 11:19:57 +05:00
Ammar Ahmed
a784f47430 mobile: cleanup 2024-03-21 11:19:57 +05:00
Ammar Ahmed
cf28b27da6 mobile: update Pods 2024-03-21 11:19:57 +05:00
Ammar Ahmed
1fa020c569 mobile: release v3.0.7 beta 2024-03-21 11:19:57 +05:00
Ammar Ahmed
ead87f7068 mobile: fix sorting attachments 2024-03-21 11:19:57 +05:00
Abdullah Atta
e35f3c5a96 web: fix height of attachments table 2024-03-21 11:19:57 +05:00
Abdullah Atta
c5282c9ddd core: do not include deleted attachments in filters 2024-03-21 11:19:57 +05:00
Abdullah Atta
fc21a8be97 web: bump version to 3.0.5 2024-03-21 11:19:57 +05:00
Ammar Ahmed
c3e315a2ae mobile: fix mobile sheet ui 2024-03-21 11:19:57 +05:00
Abdullah Atta
ca30433fd5 web: show error if there's no internet on updating profile 2024-03-21 11:19:57 +05:00
Abdullah Atta
03240345eb web: allow clearing database on database disk image is malformed 2024-03-21 11:19:56 +05:00
Abdullah Atta
156b844fd9 web: fix error due to changed file picker return 2024-03-21 11:19:56 +05:00
Abdullah Atta
f1a6662f01 web: fix attachFile- when saving web clip 2024-03-21 11:19:56 +05:00
Ammar Ahmed
4e5b5e6e3f mobile: enable auto sync 2024-03-21 11:19:56 +05:00
Ammar Ahmed
b80dd8c81e mobile: finalize image upload 2024-03-21 11:19:56 +05:00
Abdullah Atta
2cee5020dd web: add image compression 2024-03-21 11:19:56 +05:00
Abdullah Atta
1a00fc6e30 web: add support for multiselecting attachments 2024-03-21 11:19:56 +05:00
ammarahm-ed
64697a7771 mobile: handle uploading multiple files 2024-03-21 11:19:56 +05:00
ammarahm-ed
d97be2d4fb mobile: add optional image compression on upload 2024-03-21 11:19:56 +05:00
Abdullah Atta
6504beda78 web: fix sync icon spin direction 2024-03-21 11:19:56 +05:00
Abdullah Atta
3795c69a7b core: fix migration for db version > 6 2024-03-21 11:19:56 +05:00
Abdullah Atta
77b6ad5408 core: only get attachment id when processing content 2024-03-21 11:19:56 +05:00
Abdullah Atta
480b4398da web: enable auto sync 2024-03-21 11:19:56 +05:00
Abdullah Atta
7ed7d26d6f web: edit profile directly 2024-03-21 11:19:56 +05:00
Ammar Ahmed
2463ad2820 mobile: add user profile 2024-03-21 11:19:56 +05:00
Ammar Ahmed
85c50bf0fa core: fetch user profile before updating profile 2024-03-21 11:19:56 +05:00
Abdullah Atta
54ba654b97 web: add support for setting user profile 2024-03-21 11:19:55 +05:00
Abdullah Atta
e58fc38a6d core: add support for setting user profile 2024-03-21 11:19:33 +05:00
Ammar Ahmed
f0ef9e072e mobile: cleanup 2024-03-21 11:19:33 +05:00
Ammar Ahmed
cd62069b9b mobile: fix note assigned to multiple colors 2024-03-21 11:19:33 +05:00
Ammar Ahmed
8089f7e181 mobile: small ui fixes 2024-03-21 11:19:33 +05:00
Ammar Ahmed
c1ec580fdc mobile: ui bug fixes 2024-03-21 11:19:33 +05:00
Ammar Ahmed
ae43d58a38 mobile: user profile 2024-03-21 11:19:33 +05:00
Abdullah Atta
2713f26f90 core: fix migration errors & compact deleted items 2024-03-21 11:19:32 +05:00
Ammar Ahmed
783a97e340 mobile: release v3.0.6 2024-03-21 11:19:32 +05:00
Ammar Ahmed
dcea1544b9 mobile: fix toolbar migration 2024-03-21 11:19:32 +05:00
Ammar Ahmed
9e0286052f core: check for deleted attachments in pending attachments 2024-03-21 11:19:32 +05:00
Ammar Ahmed
a41b7d8fd8 mobile: fix backup sheet never closes on manual backups 2024-03-21 11:19:32 +05:00
Ammar Ahmed
9473c30426 mobile: allow sort by title in all groupings 2024-03-21 11:19:32 +05:00
Abdullah Atta
8bf7609d2f desktop: disable os encryption of keystore in portable app 2024-03-21 11:19:32 +05:00
Abdullah Atta
c63572abd5 web: migrate toolbar on first use 2024-03-21 11:19:32 +05:00
Abdullah Atta
a003e396b8 common: add toolbar migration 2024-03-21 11:19:32 +05:00
Abdullah Atta
c4323b7814 global: update lockfiles 2024-03-21 11:19:32 +05:00
Abdullah Atta
f27c7e9cf4 web: bump version to 3.0.4-beta 2024-03-21 11:19:03 +05:00
Abdullah Atta
613c1ca30f common: get note's locked status from its content 2024-03-21 11:19:03 +05:00
Abdullah Atta
b4542a532b core: always delete vault references on vault deletion 2024-03-21 11:19:03 +05:00
Abdullah Atta
6d8e5a1d1d web: fix note not selected after switching from locked note 2024-03-21 11:19:03 +05:00
Abdullah Atta
951f628351 core: fix sync tests 2024-03-21 11:19:03 +05:00
Abdullah Atta
3ff6b5afd1 core: fix database image is malformed error when deleting vault 2024-03-21 11:19:03 +05:00
Abdullah Atta
5aef851eb0 core: fix database image is malformed error on unlocking a note 2024-03-21 11:19:03 +05:00
Abdullah Atta
f14a72ec1c web: fix sync not running after login 2024-03-21 11:19:03 +05:00
Abdullah Atta
484fc4f5a4 web: refresh nav items on deleting a tag 2024-03-21 11:19:02 +05:00
Abdullah Atta
6b9567a0be core: fix database image is malformed error 2024-03-21 11:19:02 +05:00
Abdullah Atta
0f2a88124b core: speed up backup restore 2024-03-21 11:19:02 +05:00
Ammar Ahmed
740a7b4918 mobile: fix color of + button on hidden items
in side menu
2024-03-21 11:19:02 +05:00
Abdullah Atta
6fd3c77348 core: fix deleted items getting imported during backup restore 2024-03-21 11:19:02 +05:00
Abdullah Atta
70818c24cd core: fix duplicate colors created during backup restore 2024-03-21 11:19:02 +05:00
Ammar Ahmed
69c20045c2 mobile: fix readonly mode 2024-03-21 11:19:02 +05:00
Ammar Ahmed
c65a6e5e62 editor: fix keyboard opens on drag in editor 2024-03-21 11:19:02 +05:00
Ammar Ahmed
4a2da72fa3 mobile: clear selection after deleting items 2024-03-21 11:19:02 +05:00
Ammar Ahmed
2d83fde2c5 mobile: fix reminder ui in selection mode 2024-03-21 11:19:02 +05:00
Ammar Ahmed
3898cc7752 mobile: remove pass min limit on vault 2024-03-21 11:19:02 +05:00
Abdullah Atta
c633864073 web: clear editor if opened note is unlocked 2024-03-21 11:19:02 +05:00
Abdullah Atta
77ee56dd14 core: remove note's vault relation regardless of vault 2024-03-21 11:19:02 +05:00
Abdullah Atta
6c47a485f0 core: don't unlink vault notes on vault remove 2024-03-21 11:19:02 +05:00
Abdullah Atta
9f241959cf web: fix vault settings not updating on deleting vault 2024-03-21 11:19:02 +05:00
Abdullah Atta
da20e7977a core: fix sqlite crash on calling delete with empty array 2024-03-21 11:19:02 +05:00
Abdullah Atta
0931c0d5f2 web: fix unnecessary rerendering of notebook header 2024-03-21 11:19:02 +05:00
Abdullah Atta
cdebfdd7c0 web: disable auto sync 2024-03-21 11:19:02 +05:00
Abdullah Atta
ef6ff34ec6 core: enable sync push 2024-03-21 11:19:02 +05:00
Abdullah Atta
9a42273a50 web: add drag/drop tests 2024-03-21 11:19:02 +05:00
Abdullah Atta
75a358a4ce web: fix cannot navigate into nested notebook by hovering on it 2024-03-21 11:19:02 +05:00
Abdullah Atta
6c122c6498 editor: fix react error 409 2024-03-21 11:19:01 +05:00
Abdullah Atta
963f331290 web: expand parent when a child notebook is added 2024-03-21 11:19:01 +05:00
Muhammad Ali
9798ada335 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-21 11:19:01 +05:00
Ammar Ahmed
2f17ad69a1 mobile: disable auto sync 2024-03-21 11:19:01 +05:00
Ammar Ahmed
505d71f1c7 editor: fix callout margins 2024-03-21 11:19:01 +05:00
Ammar Ahmed
4ed6bdd668 mobile: fix keyboard jump on tap in dropdown 2024-03-21 11:19:01 +05:00
Abdullah Atta
b87dce6a51 editor: fix rtl for outline list 2024-03-21 11:19:01 +05:00
Abdullah Atta
295eb8ffec editor: add callout component 2024-03-21 11:19:01 +05:00
Ammar Ahmed
c7b2046e46 mobile: release v3.0.5 beta 2024-03-21 11:19:01 +05:00
Ammar Ahmed
254c2acede mobile: update toolbar 2024-03-21 11:19:01 +05:00
Abdullah Atta
4ea4bbd782 editor: add support for simple checklists 2024-03-21 11:19:00 +05:00
Ammar Ahmed
e3f08668ed editor: implement simple checklists 2024-03-21 11:18:14 +05:00
Abdullah Atta
d6113f75ca web: show error if saving a note fails 2024-03-21 11:18:13 +05:00
Abdullah Atta
1dcd227014 core: fix database image is malformed error on updating locked note 2024-03-21 11:18:13 +05:00
Abdullah Atta
8af190e83d web: bump version to 3.0.3-beta 2024-03-21 11:18:13 +05:00
Abdullah Atta
dd06e5fd52 desktop: include preload script when comparing bundles 2024-03-21 11:18:13 +05:00
Abdullah Atta
cd55f443d9 core: add more lookup tests 2024-03-21 11:18:13 +05:00
Abdullah Atta
974221d938 core: allow testing with persisted database 2024-03-21 11:18:13 +05:00
Abdullah Atta
02c084ed6d core: return items in same order when using .records 2024-03-21 11:18:13 +05:00
Abdullah Atta
456927548a core: improve notes lookup performance 2024-03-21 11:18:13 +05:00
Abdullah Atta
53490cc28b core: refactor test setup & use better-sqlite-multiple-cipher 2024-03-21 11:18:13 +05:00
Abdullah Atta
15014d2d49 web: destroy sql database on app close 2024-03-21 11:18:13 +05:00
Abdullah Atta
3ee14b9463 core: fix database image is malformed error 2024-03-21 11:18:13 +05:00
Abdullah Atta
9e46f1ec06 core: fix note headling getting removed 2024-03-21 11:18:13 +05:00
Abdullah Atta
47c433b2c9 web: fix notebook indentation 2024-03-21 11:18:13 +05:00
Abdullah Atta
72d5072cac core: fix sorting of newly created notes 2024-03-21 11:18:13 +05:00
Abdullah Atta
6b14b29103 web: allow sorting by title everywhere 2024-03-21 11:18:13 +05:00
Abdullah Atta
e3ef25714a core: add support for sorting by title & date together 2024-03-21 11:18:13 +05:00
Abdullah Atta
ac1bf9e84e web: add child notebook under opened notebook 2024-03-21 11:18:13 +05:00
Abdullah Atta
54abea488f web: rerender subnotebooks on root notebook change 2024-03-21 11:18:13 +05:00
Abdullah Atta
9d1ff3231a web: hide sort button in notebook view 2024-03-21 11:18:13 +05:00
Abdullah Atta
eef8b98b62 web: await notes context refreshing 2024-03-21 11:18:12 +05:00
Abdullah Atta
a4e0fecfe9 web: clear keystore when clearing database 2024-03-21 11:18:12 +05:00
Abdullah Atta
370837278b web: allow clearing keystore 2024-03-21 11:18:12 +05:00
Abdullah Atta
c03d25ece6 web: fix empty root notebook indentation 2024-03-21 11:18:12 +05:00
Abdullah Atta
34be765ac5 web: fix monograph publish status not updating 2024-03-21 11:18:12 +05:00
Abdullah Atta
bf208921ad web: fix nested notebook navigation from shortcuts 2024-03-21 11:18:12 +05:00
Abdullah Atta
14b469d8b6 web: fix color cannot be renamed 2024-03-21 11:18:12 +05:00
Abdullah Atta
cc239d927c web: allow non-pro users to customize sidebar 2024-03-21 11:18:12 +05:00
Abdullah Atta
1c7e619b55 web: reimplement app lock & web key store 2024-03-21 11:18:12 +05:00
Ammar Ahmed
3205dae30c mobile: fix app lock on ios 2024-03-21 11:18:12 +05:00
Ammar Ahmed
57da24821f mobile: v3.0.4 2024-03-21 11:18:12 +05:00
Ammar Ahmed
16f4184e25 editor: fix color picker missing prop 2024-03-21 11:18:12 +05:00
Ammar Ahmed
4c51fbf816 mobile: improve verification flow before changing app lock 2024-03-21 11:18:12 +05:00
Ammar Ahmed
f7835f43f6 mobile: fix reordering in side menu 2024-03-21 11:18:12 +05:00
Ammar Ahmed
aeabd9929c editor: fix keyboard focus issues on mobile 2024-03-21 11:18:12 +05:00
Ammar Ahmed
94a0d841ac mobile: fix bugs 2024-03-21 11:18:12 +05:00
Ammar Ahmed
3172d5a552 mobile: fix sidemenu shortcuts 2024-03-21 11:18:11 +05:00
Abdullah Atta
a042f6d418 web: remove security key config on app lock disable 2024-03-21 11:18:11 +05:00
Abdullah Atta
d9ff5e0053 core: fix object id date parsing 2024-03-21 11:18:11 +05:00
Abdullah Atta
7ce9121f8e web: fix cr.isIndexedDBSupported is not a function 2024-03-21 11:18:11 +05:00
Ammar Ahmed
e0c1d6344d mobile: v3.0.3 beta 2024-03-21 11:18:11 +05:00
Ammar Ahmed
6c378a0122 mobile: fix backup failed on iOS 2024-03-21 11:18:11 +05:00
Ammar Ahmed
1371b14005 mobile: bump version 2024-03-21 11:18:11 +05:00
Ammar Ahmed
bf7f3eb86f mobile: fix issue reporting 2024-03-21 11:18:11 +05:00
Ammar Ahmed
c8716df6a6 mobile: fix rendering slow in list 2024-03-21 11:18:11 +05:00
Abdullah Atta
fd12d4bd00 ui: fix right clicking when menu is open doesn't close it 2024-03-21 11:18:11 +05:00
Abdullah Atta
29d0f40c1a ui: fix hover highlighting 2 items in menu 2024-03-21 11:18:11 +05:00
Abdullah Atta
63fd526db8 web: fix color renaming and add color remove support 2024-03-21 11:18:10 +05:00
Abdullah Atta
0fbfc709da web: add readonly indicator on notes 2024-03-21 11:18:10 +05:00
Abdullah Atta
19f0488745 web: fix compact view not affecting notes 2024-03-21 11:18:10 +05:00
Abdullah Atta
f81c30222a editor: fix Position -1 is outside of fragment error 2024-03-21 11:18:10 +05:00
Ammar Ahmed
26ae76d644 mobile: fix migration bugs 2024-03-21 11:18:10 +05:00
Abdullah Atta
f370118498 core: minor refactoring 2024-03-21 11:18:10 +05:00
Abdullah Atta
d3a32421ee core: migrate deleted items as well 2024-03-21 11:18:10 +05:00
Abdullah Atta
af9a83117b web: refresh app on sync completed 2024-03-21 11:18:10 +05:00
Abdullah Atta
ce418487ad core: fix continuous invalid_grant error if login fails 2024-03-21 11:18:10 +05:00
Abdullah Atta
9bd7dbc940 web: bump to v3.0.2-beta 2024-03-21 11:18:10 +05:00
Abdullah Atta
bc91a41bbe web: hide window/tab title on app lock 2024-03-21 11:18:10 +05:00
Abdullah Atta
7efbc666a0 core: add support for creating backups of legacy collections 2024-03-21 11:18:10 +05:00
Abdullah Atta
5ecd70e121 web: fix P.item is undefined error 2024-03-21 11:18:10 +05:00
Abdullah Atta
e4d165edb7 core: remove deleteReason property 2024-03-21 11:18:10 +05:00
Ammar Ahmed
d24f29e98f Update ios.publish.yml
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-03-21 11:18:09 +05:00
Ammar Ahmed
5559738654 mobile: cleanup gradle.properties 2024-03-21 11:18:09 +05:00
Ammar Ahmed
54a321cb4c mobile: fix share extension 2024-03-21 11:18:09 +05:00
Ammar Ahmed
b2f0e74ade mobile: beta release 2024-03-21 11:18:09 +05:00
Ammar Ahmed
a105c09841 mobile: fix notebook move to trash 2024-03-21 11:18:09 +05:00
Ammar Ahmed
6ad8d7ba1b mobile: cleanup 2024-03-21 11:18:09 +05:00
Abdullah Atta
c58bb57de0 desktop: disable downgrades 2024-03-21 11:18:09 +05:00
Ammar Ahmed
aec183bd78 mobile: stop app updates check in beta 2024-03-21 11:18:09 +05:00
Ammar Ahmed
75ed6de07f mobile: minor fixes 2024-03-21 11:18:09 +05:00
Abdullah Atta
8f56953915 web: improve database deletion 2024-03-21 11:18:09 +05:00
Abdullah Atta
7d98f93dd6 web: reload page on reset from error boundary 2024-03-21 11:18:09 +05:00
Abdullah Atta
e74123bc9c web: locked status not updating on note 2024-03-21 11:18:09 +05:00
Abdullah Atta
d21b4c021d web: only save note's content through vault 2024-03-21 11:18:09 +05:00
Abdullah Atta
ca05865021 core: fix adding note to vault should return its id 2024-03-21 11:18:09 +05:00
Abdullah Atta
b30ed83f78 core: fix database resetting 2024-03-21 11:18:09 +05:00
Abdullah Atta
a4d0b2d0dc theme: fix error input variant 2024-03-21 11:18:08 +05:00
Abdullah Atta
fa1c48be41 web: allow typing custom date when adding reminder 2024-03-21 11:18:08 +05:00
Abdullah Atta
ec29cc0801 common: use upcoming reminder when resolving reminders on note 2024-03-21 11:18:08 +05:00
Ammar Ahmed
44e9a69faa mobile: fix reminders 2024-03-21 11:18:08 +05:00
Ammar Ahmed
920598f943 mobile: fix notebooks & colors 2024-03-21 11:18:08 +05:00
Abdullah Atta
5afdd88eb7 core: set mode to "sync" for migrations during sync 2024-03-21 11:18:08 +05:00
Abdullah Atta
81ebc3906f desktop: patch better-sqlite3-multiple-ciphers to get prebuilt binaries 2024-03-21 11:18:08 +05:00
Abdullah Atta
ec7d581c3d web: bump to 3.0.1-beta 2024-03-21 11:18:08 +05:00
Abdullah Atta
60e1da412c core: enable sync during tests 2024-03-21 11:18:08 +05:00
Abdullah Atta
27cf0a3c6b core: improve backup importing 2024-03-21 11:18:08 +05:00
Abdullah Atta
e24beebd43 core: add support for nested transactions 2024-03-21 11:18:08 +05:00
Abdullah Atta
9bea47e358 web: use single transaction for importing a backup 2024-03-21 11:18:08 +05:00
Abdullah Atta
779f000f3e web: make sqlite slightly faster 2024-03-21 11:18:08 +05:00
Ammar Ahmed
37eeeb1d64 mobile: fix release build 2024-03-21 11:18:07 +05:00
Abdullah Atta
c231c07633 core: fix type errors 2024-03-21 11:18:07 +05:00
Ammar Ahmed
4ee82b4fd6 mobile: minor fixes 2024-03-21 11:18:07 +05:00
Ammar Ahmed
d0f0c32ffa core: fix migration bugs 2024-03-21 11:18:07 +05:00
Ammar Ahmed
2c931d72f9 mobile: fix saving user key 2024-03-21 11:18:07 +05:00
Abdullah Atta
1cf832f0fe web: fix monograph publishing popup 2024-03-21 11:18:07 +05:00
Abdullah Atta
1e49fd8145 web: ui fixes 2024-03-21 11:18:07 +05:00
Abdullah Atta
bd93048aaa web: fix app lock not getting disabled 2024-03-21 11:18:07 +05:00
Ammar Ahmed
1b5dc9eb14 mobile: minor fixes 2024-03-21 11:18:07 +05:00
Ammar Ahmed
e93490acfc mobile: locked notes 2024-03-21 11:18:07 +05:00
Abdullah Atta
487306b943 web: fix indexedDB not getting detected 2024-03-21 11:17:32 +05:00
Abdullah Atta
573a37f671 core: destroy kysely on error 2024-03-21 11:17:32 +05:00
Abdullah Atta
8bfee794c8 crypto: move libsodium & sodium-native to peer deps 2024-03-21 11:17:32 +05:00
Abdullah Atta
aea31102f6 global: pin node version to 20 2024-03-21 11:17:32 +05:00
Abdullah Atta
bfe9aa5330 web: various fixes 2024-03-21 11:17:32 +05:00
Abdullah Atta
a45c5db34e common: fix note resolution 2024-03-21 11:17:32 +05:00
Abdullah Atta
3e588e243c core: fix database migration 2024-03-21 11:17:31 +05:00
Abdullah Atta
03dba9f624 core: disable sync push 2024-03-21 11:17:31 +05:00
Abdullah Atta
b707690817 web: trigger error boundary on unhandled errors 2024-03-21 11:17:31 +05:00
Abdullah Atta
3b7660834d web: use safeStorage to encrypt secrets on desktop 2024-03-21 11:17:31 +05:00
Abdullah Atta
f4b14e37ae desktop: use better-sqlite3 on desktop for SQLite 2024-03-21 11:17:31 +05:00
Abdullah Atta
146223e2b6 desktop: fix autoupdater 2024-03-21 11:16:51 +05:00
Abdullah Atta
d6b037c178 desktop: add api to delete files 2024-03-21 11:16:51 +05:00
Abdullah Atta
3df8cc53e3 desktop: expose electron's safeStorage api via trpc 2024-03-21 11:16:51 +05:00
Abdullah Atta
63ab54cc42 desktop: enable native modules rebuild during build 2024-03-21 11:16:51 +05:00
Ammar Ahmed
569954b767 core: return decrypted content on unlock note 2024-03-21 11:16:51 +05:00
Ammar Ahmed
9722fab8f3 mobile: applock with pin and password 2024-03-21 11:16:51 +05:00
Ammar Ahmed
bad138d2fa mobile: minor fixes 2024-03-21 11:16:51 +05:00
Ammar Ahmed
a7e57354dd mobile: sqlite-multiple-ciphers patch 2024-03-21 11:16:51 +05:00
Ammar Ahmed
45fa486a6d mobile: refactor 2024-03-21 11:16:50 +05:00
Ammar Ahmed
a65d271cbd mobile: fix reorderable side menu 2024-03-21 11:16:50 +05:00
Ammar Ahmed
feba11626d mobile: yearly reminders 2024-03-21 11:16:50 +05:00
Abdullah Atta
a5afc47d82 web: add support for yearly reminders 2024-03-21 11:16:50 +05:00
Abdullah Atta
9edf6d165d core: add support for yearly reminders 2024-03-21 11:16:50 +05:00
Ammar Ahmed
12b8a9e487 mobile: stop bg fetch events when toggled off 2024-03-21 11:16:50 +05:00
Ammar Ahmed
9e8b5487b2 mobile: enable experimental background sync 2024-03-21 11:16:50 +05:00
Abdullah Atta
305a522a65 web: add support for hiding items from side bar 2024-03-21 11:16:49 +05:00
Abdullah Atta
2f77390a8e web: add support for reordering navigation menu items 2024-03-21 11:16:49 +05:00
Ammar Ahmed
0ab704b115 mobile: cleanup 2024-03-21 11:16:49 +05:00
Ammar Ahmed
c353f7a872 core: add sidebar order settings 2024-03-21 11:16:49 +05:00
Ammar Ahmed
9a242f63eb mobile: reorder sidebar items 2024-03-21 11:16:49 +05:00
Abdullah Atta
cc07cedd4a web: add support for custom colors 2024-03-21 11:16:49 +05:00
Ammar Ahmed
f1f4cd67f7 mobile: allow custom colors 2024-03-21 11:16:49 +05:00
Ammar Ahmed
ceb948bd1f mobile: migrate app lock 2024-03-21 11:16:49 +05:00
Abdullah Atta
90a0878600 web: remove cbor-x package 2024-03-21 11:16:49 +05:00
Abdullah Atta
26a63591bd web: add support for at rest encryption and app lock 2024-03-21 11:16:48 +05:00
Ammar Ahmed
87ee599da1 mobile: at rest encryption 2024-03-21 11:15:56 +05:00
Ammar Ahmed
7843a153a7 mobile: simplify tests 2024-03-21 11:15:56 +05:00
Abdullah Atta
72331faee7 core: remove dummy test files 2024-03-21 11:15:56 +05:00
Abdullah Atta
28470d60c6 core: migrate key value storage to sqlite 2024-03-21 11:15:56 +05:00
Ammar Ahmed
ab47c89ef7 mobile: update sheet component 2024-03-21 11:15:56 +05:00
Abdullah Atta
b086e652c3 core: fix moving nested notebooks to trash 2024-03-21 11:15:55 +05:00
Abdullah Atta
ef2d8bf5af global: move item resolution logic to @notesnook/common 2024-03-21 11:15:55 +05:00
Ammar Ahmed
d3221abd7e mobile: add theme switch animation 2024-03-21 11:15:55 +05:00
Abdullah Atta
448d19e9fd web: fix all type errors 2024-03-21 11:15:31 +05:00
Abdullah Atta
0a973cd83a web: fix duplicate imports 2024-03-21 11:15:31 +05:00
Abdullah Atta
4bff11bf12 core: fix type error 2024-03-21 11:15:31 +05:00
Abdullah Atta
f127203a5e core: add tests for sync merger 2024-03-21 11:15:31 +05:00
Abdullah Atta
dc3caa16d0 core: migrate vault to a database collection 2024-03-21 11:15:31 +05:00
Ammar Ahmed
1f33ea9db3 mobile: fix exporter and attachment download 2024-03-21 11:15:31 +05:00
Ammar Ahmed
4e157455c8 global: fix type errors during build 2024-03-21 11:15:30 +05:00
Abdullah Atta
2bb3652be2 web: use simple transform stream for export progress 2024-03-21 11:14:56 +05:00
Abdullah Atta
becc00d2ee web: fix exporting 2024-03-21 11:14:56 +05:00
Ammar Ahmed
e6186c0bbd mobile: add patches 2024-03-21 11:14:56 +05:00
Abdullah Atta
6538540f3b web: update export note snapshots for linux 2024-03-21 11:14:56 +05:00
Abdullah Atta
a437125730 web: fix reminder tests 2024-03-21 11:14:56 +05:00
Abdullah Atta
339e5965bb web: refresh notebooks after adding a new notebook 2024-03-21 11:14:56 +05:00
Abdullah Atta
e3eb3c8000 web: fix force redirect to home on navigating to a color 2024-03-21 11:14:56 +05:00
Abdullah Atta
2ef0f41612 web: fix crash when sorting tags 2024-03-21 11:14:56 +05:00
Abdullah Atta
0a38a734f5 web: fix crash when removing a notebook 2024-03-21 11:14:56 +05:00
Ammar Ahmed
c2d11cdc79 mobile: sync with latest core changes 2024-03-21 11:14:56 +05:00
Abdullah Atta
0fcab638a3 core: remove unnecessary console.log 2024-03-21 11:14:55 +05:00
Ammar Ahmed
b37853866f mobile: fix search to use filtered selector for notes 2024-03-21 11:14:55 +05:00
Abdullah Atta
e6642ac9ab core: prevent recursive sync after pushing items 2024-03-21 11:14:55 +05:00
Abdullah Atta
c294e80230 web: simplify sync status 2024-03-21 11:14:55 +05:00
Abdullah Atta
996f4d29be web: fix previewing trashed notes 2024-03-21 11:14:55 +05:00
Abdullah Atta
0c5a5c7438 core: fix trash 2024-03-21 11:14:55 +05:00
Abdullah Atta
9926c0b6da web: improve sync test reliability 2024-03-21 11:14:55 +05:00
Abdullah Atta
8e691769ae core: auto sync not triggered on note update 2024-03-21 11:14:55 +05:00
Abdullah Atta
add2d8af9b web: fix note history tests 2024-03-21 11:14:55 +05:00
Abdullah Atta
bc72c8b87c web: fix selection logic in list 2024-03-21 11:14:55 +05:00
Abdullah Atta
b73964afb9 web: set testId on auth input fields 2024-03-21 11:14:55 +05:00
Abdullah Atta
96b6115e7b core: fix note content is not saving 2024-03-21 11:14:55 +05:00
Abdullah Atta
ea46488d94 core: fix data is not iterable error on backup restore 2024-03-21 11:14:55 +05:00
Abdullah Atta
df0e8ed567 global: update lockfiles 2024-03-21 11:14:55 +05:00
Abdullah Atta
1e86b4d772 core: add retry if a test fails 2024-03-21 11:14:54 +05:00
Abdullah Atta
b1e1ed982a core: fix invalid object-id generation for some timestamps 2024-03-21 11:14:54 +05:00
Abdullah Atta
500388a634 core: fix sync & monographs tests 2024-03-21 11:14:54 +05:00
Abdullah Atta
7a60ac17ce core: fix auto sync starting even when auto sync is disabled 2024-03-21 11:14:54 +05:00
Abdullah Atta
a6a2f848d7 core: fix sync tests 2024-03-21 11:14:54 +05:00
Abdullah Atta
25e6350c04 core: remove unnecessary migration success log 2024-03-21 11:14:54 +05:00
Abdullah Atta
e0329c273f core: fix Crypto is not supported on this platform. error during tests 2024-03-21 11:14:54 +05:00
Abdullah Atta
fd7b33fe30 core: make all the core tests pass again 2024-03-21 11:14:54 +05:00
Abdullah Atta
6d70f8d2f9 web: fix crash when note has no title 2024-03-21 11:14:54 +05:00
Abdullah Atta
c6bb28c139 core: set default title if note has no title 2024-03-21 11:14:54 +05:00
Abdullah Atta
6796206099 web: update kysely patch 2024-03-21 11:14:54 +05:00
Abdullah Atta
ca40342978 web: run patch-package after npm i 2024-03-21 11:14:54 +05:00
Abdullah Atta
36150fb55b web: more fixes 2024-03-21 11:14:54 +05:00
Abdullah Atta
7b3f671159 web: fix many type errors 2024-03-21 11:14:53 +05:00
Abdullah Atta
0cd6191190 global: update lockfiles 2024-03-21 11:13:46 +05:00
Abdullah Atta
cbccb97d42 theme: fix tinycolor2 not found error 2024-03-21 11:13:46 +05:00
Abdullah Atta
2ce9386759 web: fix notes search in tags, favorites etc 2024-03-21 11:13:46 +05:00
Abdullah Atta
f5b85a82d0 web: update wa-sqlite 2024-03-21 11:13:46 +05:00
Abdullah Atta
0123da10f7 web: use memory tempStore for sqlite 2024-03-21 11:13:46 +05:00
Abdullah Atta
1228f1b6fa web: add support for exporting sql database 2024-03-21 11:13:46 +05:00
Abdullah Atta
3126c2d325 core: fix FTS5 SQLite search 2024-03-21 11:13:46 +05:00
Ammar Ahmed
a9c9ca29c8 mobile: cleanup 2024-03-21 11:13:46 +05:00
Ammar Ahmed
665f44bcee mobile: fix types 2024-03-21 11:13:45 +05:00
Ammar Ahmed
c444f7ddb8 mobile: refactor zustand stores 2024-03-21 11:13:45 +05:00
Ammar Ahmed
787c36c754 mobile: bug fixes 2024-03-21 11:13:45 +05:00
Ammar Ahmed
3502469c1d core: add fn to get cache item 2024-03-21 11:13:45 +05:00
Abdullah Atta
c58b16cba6 web: only auto align title & headline 2024-03-21 11:13:45 +05:00
Abdullah Atta
15ea57b692 web: getKey -> key 2024-03-21 11:13:45 +05:00
Abdullah Atta
655cf0617e web: fix resolved item data misaligned with items 2024-03-21 11:13:45 +05:00
Abdullah Atta
57311397e0 core: fix many issues with virtualized grouping 2024-03-21 11:13:45 +05:00
Ammar Ahmed
94db2387c8 core: early return when items are empty 2024-03-21 11:13:45 +05:00
Abdullah Atta
bd1cf0fadc web: fix random crashes when scrolling in list 2024-03-21 11:13:45 +05:00
Abdullah Atta
cfd53a8b2c web: replace react-virtual with react-virtuouso 2024-03-21 11:13:44 +05:00
Ammar Ahmed
baa2d1a389 mobile: fix build ang bugs 2024-03-21 11:13:15 +05:00
Abdullah Atta
8cd963a893 web: hide attachments access if user is logged out 2024-03-21 11:13:15 +05:00
Abdullah Atta
6e3ee9171b web: allow core to specify custom sql db name 2024-03-21 11:13:15 +05:00
Abdullah Atta
088ef2285f web: close idb connection on sqlite connection close 2024-03-21 11:13:15 +05:00
Abdullah Atta
e127b8f4ab core: clear database on logout 2024-03-21 11:13:15 +05:00
Ammar Ahmed
e218962c55 core: add tempStore option to DB 2024-03-21 11:13:15 +05:00
Abdullah Atta
fa080b5ce2 core: migrate items sequentially during sync 2024-03-21 11:13:15 +05:00
Abdullah Atta
d7d019f870 core: fix build error 2024-03-21 11:13:15 +05:00
Abdullah Atta
74b5c4d894 web: execute only 1 query at a time 2024-03-21 11:13:14 +05:00
Abdullah Atta
4ebc3af1e4 web: fix diff viewer crashing the app 2024-03-21 11:11:30 +05:00
Abdullah Atta
3188b33d19 core: do not stop sync if a conflict occurs 2024-03-21 11:11:29 +05:00
Abdullah Atta
c2c69c282e core: allow only 1 transaction at a time 2024-03-21 11:11:29 +05:00
Abdullah Atta
f57c7b5998 core: simplify item key derivation in virtualized grouping 2024-03-21 11:11:29 +05:00
Abdullah Atta
56faf3ed48 web: improve list item rendering performance 2024-03-21 11:11:29 +05:00
Abdullah Atta
2fe8c87caa core: always send realtime sync event 2024-03-21 11:11:29 +05:00
Abdullah Atta
b7ecb7b6fb core: fix content date edited not updating 2024-03-21 11:11:29 +05:00
Abdullah Atta
569b6c7939 core: put items in chunks of 200 2024-03-21 11:11:29 +05:00
Abdullah Atta
e2f9b9c58d web: set name prop on fields 2024-03-21 11:11:29 +05:00
Abdullah Atta
94150a92aa core: implement sync v2 2024-03-21 11:11:29 +05:00
Ammar Ahmed
f81814a426 mobile: use index based grouping 2024-03-21 11:11:29 +05:00
Abdullah Atta
443b6ad7e9 web: changes to use new grouping api 2024-03-21 11:11:29 +05:00
Abdullah Atta
2ceb68ec87 core: implement new high perf indexed based grouping 2024-03-21 11:11:28 +05:00
Ammar Ahmed
29f66d457d mobile: fix share extension in release 2024-03-21 11:11:02 +05:00
Abdullah Atta
304d69f8b5 web: fix router types 2024-03-21 11:11:02 +05:00
Abdullah Atta
900a5b69a5 web: enable vite hot reloading 2024-03-21 11:11:02 +05:00
Abdullah Atta
ebe1b641fd web: fix minor build issues 2024-03-21 11:11:01 +05:00
Abdullah Atta
f26ea526e8 web: migrate everything to react@18 2024-03-21 11:11:01 +05:00
Abdullah Atta
b36e6faac5 web: fix notebook tests 2024-03-21 11:09:05 +05:00
Ammar Ahmed
528fb3092b mobile: share extension cleanup 2024-03-21 11:09:05 +05:00
Ammar Ahmed
d5ee925c52 mobile: cleanup 2024-03-21 11:09:04 +05:00
Ammar Ahmed
208e32d7ea mobile: migrate share extension 2024-03-21 11:09:04 +05:00
Ammar Ahmed
5429161f91 mobile: fix navigation 2024-03-21 11:09:04 +05:00
Abdullah Atta
81cdfcf61a web: send noteId when decrypting real-time locked content 2024-03-21 11:09:04 +05:00
Abdullah Atta
6186e22006 web: fix tag tests 2024-03-21 11:09:04 +05:00
Ammar Ahmed
4ff051130b mobile: pass tests 2024-03-21 11:09:04 +05:00
Abdullah Atta
97ae36dcda web: fix html export snapshot 2024-03-21 11:09:04 +05:00
Abdullah Atta
800b5f9d9a core: fix md with frontmatter export 2024-03-21 11:09:04 +05:00
Ammar Ahmed
d4b1f32516 core: fix ts error 2024-03-21 11:09:04 +05:00
Ammar Ahmed
6626b856fb mobile: fix webpack build 2024-03-21 11:09:04 +05:00
Ammar Ahmed
44df437c4e mobile: push changes 2024-03-21 11:09:04 +05:00
Abdullah Atta
189a9da5b5 web: fix notes tests 2024-03-21 11:09:03 +05:00
Abdullah Atta
73def8a682 core: prevent duplicate colors based on color code 2024-03-21 11:09:03 +05:00
Abdullah Atta
7c97db74dc core: fix error on locking notes 2024-03-21 11:09:03 +05:00
Ammar Ahmed
ceb6e94d0c mobile: push changes 2024-03-21 11:09:03 +05:00
Abdullah Atta
1a61c4ee8f web: reset search results on navigation 2024-03-21 11:09:03 +05:00
Abdullah Atta
d4aa4fdb90 web: reset prepared sql stmt on error 2024-03-21 11:09:03 +05:00
Abdullah Atta
3e7db7051b web: reuse search query 2024-03-21 11:09:03 +05:00
Abdullah Atta
6b6e903322 core: use porter trigram tokenizer for fts 2024-03-21 11:09:03 +05:00
Abdullah Atta
2f62c72cfe core: properly escape fts query 2024-03-21 11:09:03 +05:00
Abdullah Atta
8951352f63 web: add support for assigning tags to notes 2024-03-21 11:09:03 +05:00
Abdullah Atta
6c9e265a11 core: fix "type" does not exist 2024-03-21 11:09:03 +05:00
Abdullah Atta
1a14d37c72 core: fix build error 2024-03-21 11:09:03 +05:00
Ammar Ahmed
5bfad0149b mobile: migrate to sqlite 2024-03-21 11:09:02 +05:00
Abdullah Atta
2168609577 web: fix note editor properties 2024-03-21 11:08:13 +05:00
Abdullah Atta
7e8e981145 common: type is now optional in getFormattedDate 2024-03-21 11:08:13 +05:00
Abdullah Atta
300e65f5c4 core: return FilteredSelector from attachments.ofNote 2024-03-21 11:08:13 +05:00
Abdullah Atta
69590f9547 web: show notebook & tag shortcuts when assigning notes 2024-03-21 11:08:13 +05:00
Abdullah Atta
ae023bdf5b web: implement virtualized search for all items 2024-03-21 11:08:13 +05:00
Abdullah Atta
4556e4d230 web: use lazy loading to load attachments 2024-03-21 11:08:12 +05:00
Abdullah Atta
a77c88bddd web: load tag & color title lazily 2024-03-21 11:07:18 +05:00
Abdullah Atta
8672f92942 web: show all nested notebooks as tree when moving notes 2024-03-21 11:07:18 +05:00
Abdullah Atta
a8e81a32bf web: add support for nested notebooks 2024-03-21 11:07:18 +05:00
Abdullah Atta
95b638a135 web: use new virtualized grouping for reminders 2024-03-21 11:07:18 +05:00
Abdullah Atta
4302cdf0ea web: use new virtualized grouping for trash 2024-03-21 11:07:18 +05:00
Abdullah Atta
36d097f86c web: use new virtualized grouping for monographs 2024-03-21 11:07:18 +05:00
Abdullah Atta
b364178fc0 core: add support for fetching trash as grouped 2024-03-21 11:07:18 +05:00
Abdullah Atta
2c7927bb08 web: install missing @hazae41/foras 2024-03-21 11:07:18 +05:00
Abdullah Atta
af6041128b core: fix attachment extraction for locked notes 2024-03-21 11:07:18 +05:00
Abdullah Atta
6ccee9f6eb global: update lockfiles 2024-03-21 11:07:17 +05:00
Abdullah Atta
404f2072a1 web: start initial migration to sqlite 2024-03-21 11:05:23 +05:00
Abdullah Atta
01e774bff5 ui: add support for lazily loading menu items 2024-03-21 11:04:44 +05:00
Abdullah Atta
df9fb59f40 common: remove total-notes utility 2024-03-21 11:04:44 +05:00
Abdullah Atta
9ac9e21645 core: changes according to client needs 2024-03-21 11:04:26 +05:00
Abdullah Atta
44846cc7b5 core: fix database migration 2024-03-21 11:04:26 +05:00
Abdullah Atta
96e36a6f73 core: add support for incremental grouping 2024-03-21 11:04:26 +05:00
Abdullah Atta
37ad3ea31a core: fix size of nanoid in benchmarks 2024-03-21 11:04:26 +05:00
Abdullah Atta
07d2a701c7 core: optimize bson objectid generation & add benchmarks 2024-03-21 11:04:26 +05:00
Abdullah Atta
94f7e8cd08 core: fix monographs 2024-03-21 11:04:26 +05:00
Abdullah Atta
51819e9d4a core: fix sync tests 2024-03-21 11:04:26 +05:00
Abdullah Atta
860ec7fea8 core: remove temporary sqlite db 2024-03-21 11:04:26 +05:00
Abdullah Atta
21b3866df4 core: migrate everything to sqlite 2024-03-21 11:04:25 +05:00
Abdullah Atta
a91717aca3 core: migrate all database writes to sqlite 2024-03-21 11:04:11 +05:00
Abdullah Atta
91a272ee3d global: update lockfiles 2024-03-21 11:03:43 +05:00
Abdullah Atta
d51079fc88 core: convert everything else to typescript 2024-03-21 11:03:14 +05:00
Abdullah Atta
37ae106713 core: remove unnecessary sync tests 2024-03-21 11:03:14 +05:00
Abdullah Atta
b93b5cc8d6 core: migrate monographs to typescript 2024-03-21 11:03:14 +05:00
Abdullah Atta
9d6733deff core: make migration tests less flaky 2024-03-21 11:03:14 +05:00
Abdullah Atta
86652230bc core: add tests for migrations 2024-03-21 11:03:14 +05:00
Abdullah Atta
588e37aa20 core: migrate settings to its own collection 2024-03-21 11:03:14 +05:00
Abdullah Atta
79b75c5ba7 core: get rid of topics; move to sub notebooks 2024-03-21 11:03:14 +05:00
Abdullah Atta
cc60558839 core: migrate attachments to use relations for linking to notes 2024-03-21 11:03:13 +05:00
Abdullah Atta
c7a6cd8964 core: minor updates and fixes 2024-03-21 11:02:47 +05:00
Abdullah Atta
5b537ab470 core: fix types & syncing issues 2024-03-21 11:02:47 +05:00
ammarahm-ed
48af6c460f mobile: pass all tests 2024-03-21 11:02:47 +05:00
ammarahm-ed
89c9c58631 mobile: fix filesystem not loaded 2024-03-21 11:02:47 +05:00
ammarahm-ed
c10f518e3a mobile: fix navigating to tags 2024-03-21 11:02:47 +05:00
ammarahm-ed
1f4cd6504a mobile: migrate to typescript 2024-03-21 11:02:46 +05:00
ammarahm-ed
9ef40c01ce common: fix ts errors 2024-03-21 11:00:00 +05:00
Abdullah Atta
843be2a62c mobile: use new types from core 2024-03-21 11:00:00 +05:00
Abdullah Atta
a881a6d51e web: use new types from core 2024-03-21 10:59:59 +05:00
Abdullah Atta
22221afb7a core: fix more typings 2024-03-21 10:58:39 +05:00
Abdullah Atta
21a7c64b0b core: fix typing errors 2024-03-21 10:58:39 +05:00
Abdullah Atta
41ea254301 core: convert almost everything to typescript 2024-03-21 10:58:39 +05:00
Ammar Ahmed
3b15717150 mobile: fix lint errors 2024-03-21 10:56:01 +05:00
Abdullah Atta
94f02cdb07 ci: update node version to 20 2024-03-21 10:56:00 +05:00
Abdullah Atta
061433d8cd config: update nx 2024-03-21 10:56:00 +05:00
Abdullah Atta
c8ba88bb99 desktop: set release channel to beta 2024-03-21 10:56:00 +05:00
Ammar Ahmed
3b181cd9b2 mobile: update ios version number 2024-03-21 10:56:00 +05:00
Ammar Ahmed
5384bed382 ci: update workflow name
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-03-21 10:55:49 +05:00
Ammar Ahmed
ac0d831f22 mobile: v3 beta release 2024-03-21 10:55:49 +05:00
Ammar Ahmed
8776058655 ci: update iOS workflow
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-03-21 10:55:15 +05:00
Ammar Ahmed
5c8c806228 Update android.publish.internal.yml
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-03-21 10:55:15 +05:00
Ammar Ahmed
aa2110b736 ci: android.publish.yml
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-03-21 10:55:15 +05:00
Abdullah Atta
cbfaf6ae18 desktop: do not set teamId for notarization 2024-03-21 10:55:15 +05:00
Abdullah Atta
d815608701 ci: APPLE_API_KEY_ISSUER > APPLE_API_ISSUER 2024-03-21 10:55:15 +05:00
Abdullah Atta
696c280eaf desktop: fix unknown property 'notarize' error 2024-03-21 10:55:15 +05:00
Abdullah Atta
b8c785fa3f desktop: use official electron builder notarization 2024-03-21 10:55:15 +05:00
Abdullah Atta
d80fdfbfc1 ci: update {upload,download}-artifact to v4 2024-03-21 10:55:15 +05:00
Abdullah Atta
f783dad211 ci: get rid of you may only define one of branches and branches-ignore for a single event 2024-03-21 10:55:15 +05:00
Abdullah Atta
c335d10167 ci: use m1 for building on mac 2024-03-21 10:55:15 +05:00
Abdullah Atta
bf7a02df5e ci: use wrangler directly to publish to cf 2024-03-21 10:55:15 +05:00
Abdullah Atta
bf12385099 desktop: use app version from autoUpdater 2024-03-21 10:55:15 +05:00
Abdullah Atta
f98b53e9b8 ci: update cloudflare action 2024-03-21 10:55:15 +05:00
Abdullah Atta
8f379d253e desktop: ready beta for deployment 2024-03-21 10:55:14 +05:00
Abdullah Atta
e1f07618d3 ci: deploy to correct cf pages project
Signed-off-by: Abdullah Atta <abdullahatta@streetwriters.co>
2024-03-21 10:54:56 +05:00
Abdullah Atta
9a0c129844 core: turn off sync push by default 2024-03-21 10:54:55 +05:00
Ammar Ahmed
aa2a8ab6f4 mobile: ignore beta updates on gh release 2024-03-21 10:17:34 +05:00
Ammar Ahmed
8e59ff1318 mobile: release v2.6.18 2024-03-21 10:11:37 +05:00
Abdullah Atta
ad99c87f72 web: bump version to 2.6.17 2024-03-21 10:07:11 +05:00
Abdullah Atta
ba776b5854 global: update lockfiles 2024-03-21 10:07:02 +05:00
Abdullah Atta
e526145e48 web: fix cannot read property integration of undefined 2024-03-21 10:02:08 +05:00
Abdullah Atta
45c5e65bf6 core: add more sanity checks 2024-03-21 09:42:38 +05:00
Abdullah Atta
87bec4e2ab core: add sanity checks to handle cannot read properties of undefined (reading 'hash') error 2024-03-21 09:37:18 +05:00
Abdullah Atta
433e67a6dc web: fix pull failed error on downloading attachments 2024-03-21 09:12:55 +05:00
Ammar Ahmed
6acba51b88 mobile: fix app lock shows on session expired dialog 2024-03-21 07:46:49 +05:00
Abdullah Atta
cf1322952d web: handle errors during attachment downloading 2024-03-15 09:25:10 +05:00
Abdullah Atta
b5ac9dd430 web: make opfs safer by allowing only 1 operation at a time 2024-03-15 09:01:35 +05:00
535 changed files with 80697 additions and 11667 deletions

View File

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

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
npm install -D @playwright/test otplib dayjs @zip.js/zip.js
- name: Validate build extraction
run: ls -ld ./apps/web/build/index.html

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 520 B

After

Width:  |  Height:  |  Size: 401 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 917 B

After

Width:  |  Height:  |  Size: 543 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 763 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 1.4 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: 36 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

@@ -1,23 +1,23 @@
{
"name": "@notesnook/desktop",
"version": "3.0.7-beta",
"version": "3.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@notesnook/desktop",
"version": "3.0.7-beta",
"version": "3.0.0",
"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.4.0",
"better-sqlite3-multiple-ciphers": "^9.5.0",
"electron-trpc": "0.5.2",
"electron-updater": "6.1.4",
"icojs": "^0.17.1",
"sodium-native": "^4.0.6",
"sodium-native": "^4.1.1",
"typed-emitter": "^2.1.0",
"yargs": "^17.6.2",
"zod": "^3.21.4"
@@ -26,11 +26,13 @@
"@types/node": "18.16.1",
"@types/yargs": "^17.0.24",
"chokidar": "^3.5.3",
"electron": "^28.2.1",
"electron-builder": "^24.9.1",
"electron": "^29.3.1",
"electron-builder": "^24.13.3",
"esbuild": "^0.20.0",
"node-gyp-build": "^4.8.0",
"prebuildify": "^6.0.1",
"tree-kill": "^1.2.2",
"undici": "^6.6.1"
"undici": "^6.14.1"
},
"optionalDependencies": {
"dmg-license": "^1.0.11"
@@ -68,9 +70,9 @@
}
},
"node_modules/@electron/asar": {
"version": "3.2.8",
"resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.8.tgz",
"integrity": "sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==",
"version": "3.2.9",
"resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.9.tgz",
"integrity": "sha512-Vu2P3X2gcZ3MY9W7yH72X9+AMXwUQZEJBrsPIbX0JsdllLtoh62/Q8Wg370/DawIEVKOyfD6KtTLo645ezqxUA==",
"dev": true,
"dependencies": {
"commander": "^5.0.0",
@@ -169,9 +171,9 @@
}
},
"node_modules/@electron/notarize": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.1.0.tgz",
"integrity": "sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==",
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz",
"integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==",
"dev": true,
"dependencies": {
"debug": "^4.1.1",
@@ -231,9 +233,9 @@
}
},
"node_modules/@electron/universal": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz",
"integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==",
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz",
"integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==",
"dev": true,
"dependencies": {
"@electron/asar": "^3.2.1",
@@ -653,13 +655,100 @@
"node": ">=12"
}
},
"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==",
"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==",
"dev": true,
"engines": {
"node": ">=14"
"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_modules/@malept/cross-spawn-promise": {
@@ -718,6 +807,16 @@
"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",
@@ -967,26 +1066,25 @@
"dev": true
},
"node_modules/app-builder-lib": {
"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==",
"version": "24.13.3",
"resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz",
"integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==",
"dev": true,
"dependencies": {
"@develar/schema-utils": "~2.6.5",
"@electron/notarize": "2.1.0",
"@electron/notarize": "2.2.1",
"@electron/osx-sign": "1.0.5",
"@electron/universal": "1.4.1",
"@electron/universal": "1.5.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.8.1",
"builder-util-runtime": "9.2.3",
"builder-util": "24.13.1",
"builder-util-runtime": "9.2.4",
"chromium-pickle-js": "^0.2.0",
"debug": "^4.3.4",
"ejs": "^3.1.8",
"electron-publish": "24.8.1",
"electron-publish": "24.13.1",
"form-data": "^4.0.0",
"fs-extra": "^10.1.0",
"hosted-git-info": "^4.1.0",
@@ -1003,12 +1101,16 @@
},
"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.3",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz",
"integrity": "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==",
"version": "9.2.4",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz",
"integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
@@ -1097,9 +1199,9 @@
]
},
"node_modules/better-sqlite3-multiple-ciphers": {
"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==",
"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==",
"hasInstallScript": true,
"dependencies": {
"bindings": "^1.5.0",
@@ -1232,16 +1334,16 @@
"dev": true
},
"node_modules/builder-util": {
"version": "24.8.1",
"resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.8.1.tgz",
"integrity": "sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw==",
"version": "24.13.1",
"resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz",
"integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==",
"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.3",
"builder-util-runtime": "9.2.4",
"chalk": "^4.1.2",
"cross-spawn": "^7.0.3",
"debug": "^4.3.4",
@@ -1268,9 +1370,9 @@
}
},
"node_modules/builder-util/node_modules/builder-util-runtime": {
"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==",
"version": "9.2.4",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz",
"integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
@@ -1474,13 +1576,59 @@
"dev": true
},
"node_modules/config-file-ts": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz",
"integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==",
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz",
"integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==",
"dev": true,
"dependencies": {
"glob": "^7.1.6",
"typescript": "^4.0.2"
"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"
}
},
"node_modules/core-util-is": {
@@ -1669,14 +1817,14 @@
}
},
"node_modules/dmg-builder": {
"version": "24.9.1",
"resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.9.1.tgz",
"integrity": "sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ==",
"version": "24.13.3",
"resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz",
"integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==",
"dev": true,
"dependencies": {
"app-builder-lib": "24.9.1",
"builder-util": "24.8.1",
"builder-util-runtime": "9.2.3",
"app-builder-lib": "24.13.3",
"builder-util": "24.13.1",
"builder-util-runtime": "9.2.4",
"fs-extra": "^10.1.0",
"iconv-lite": "^0.6.2",
"js-yaml": "^4.1.0"
@@ -1686,9 +1834,9 @@
}
},
"node_modules/dmg-builder/node_modules/builder-util-runtime": {
"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==",
"version": "9.2.4",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz",
"integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
@@ -1723,16 +1871,31 @@
"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.9",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
"integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
"integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
"dev": true,
"dependencies": {
"jake": "^10.8.5"
@@ -1745,14 +1908,14 @@
}
},
"node_modules/electron": {
"version": "28.2.1",
"resolved": "https://registry.npmjs.org/electron/-/electron-28.2.1.tgz",
"integrity": "sha512-wlzXf+OvOiVlBf9dcSeMMf7Q+N6DG+wtgFbMK0sA/JpIJcdosRbLMQwLg/LTwNVKIbmayqFLDp4FmmFkEMhbYA==",
"version": "29.3.1",
"resolved": "https://registry.npmjs.org/electron/-/electron-29.3.1.tgz",
"integrity": "sha512-auge1/6RVqgUd6TgIq88wKdUCJi2cjESi3jy7d+6X4JzvBGprKBqMJ8JSSFpu/Px1YJrFUKAxfy6SC+TQf1uLw==",
"dev": true,
"hasInstallScript": true,
"dependencies": {
"@electron/get": "^2.0.0",
"@types/node": "^18.11.18",
"@types/node": "^20.9.0",
"extract-zip": "^2.0.1"
},
"bin": {
@@ -1763,16 +1926,16 @@
}
},
"node_modules/electron-builder": {
"version": "24.9.1",
"resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.9.1.tgz",
"integrity": "sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg==",
"version": "24.13.3",
"resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz",
"integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==",
"dev": true,
"dependencies": {
"app-builder-lib": "24.9.1",
"builder-util": "24.8.1",
"builder-util-runtime": "9.2.3",
"app-builder-lib": "24.13.3",
"builder-util": "24.13.1",
"builder-util-runtime": "9.2.4",
"chalk": "^4.1.2",
"dmg-builder": "24.9.1",
"dmg-builder": "24.13.3",
"fs-extra": "^10.1.0",
"is-ci": "^3.0.0",
"lazy-val": "^1.0.5",
@@ -1789,9 +1952,9 @@
}
},
"node_modules/electron-builder/node_modules/builder-util-runtime": {
"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==",
"version": "9.2.4",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz",
"integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
@@ -1802,14 +1965,14 @@
}
},
"node_modules/electron-publish": {
"version": "24.8.1",
"resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.8.1.tgz",
"integrity": "sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw==",
"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==",
"dev": true,
"dependencies": {
"@types/fs-extra": "^9.0.11",
"builder-util": "24.8.1",
"builder-util-runtime": "9.2.3",
"builder-util": "24.13.1",
"builder-util-runtime": "9.2.4",
"chalk": "^4.1.2",
"fs-extra": "^10.1.0",
"lazy-val": "^1.0.5",
@@ -1817,9 +1980,9 @@
}
},
"node_modules/electron-publish/node_modules/builder-util-runtime": {
"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==",
"version": "9.2.4",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz",
"integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
@@ -1857,6 +2020,15 @@
"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",
@@ -2051,6 +2223,22 @@
"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",
@@ -2561,12 +2749,12 @@
}
},
"node_modules/isbinaryfile": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz",
"integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==",
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz",
"integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==",
"dev": true,
"engines": {
"node": ">= 14.0.0"
"node": ">= 18.0.0"
},
"funding": {
"url": "https://github.com/sponsors/gjtorikian/"
@@ -2578,6 +2766,24 @@
"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",
@@ -2910,6 +3116,18 @@
"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",
@@ -2955,6 +3173,31 @@
"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",
@@ -3031,6 +3274,23 @@
"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",
@@ -3114,15 +3374,6 @@
"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",
@@ -3198,21 +3449,6 @@
"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",
@@ -3350,6 +3586,18 @@
"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",
@@ -3430,12 +3678,12 @@
}
},
"node_modules/sodium-native": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.0.6.tgz",
"integrity": "sha512-uYsyycwcz9kYDwpXxJmL2YZosynsxcP6RPySbARVJdC9uNDa2CMjzJ7/WsMMvThKgvAYsBWdZc7L/WSVj9lTcA==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.1.1.tgz",
"integrity": "sha512-LXkAfRd4FHtkQS4X6g+nRcVaN7mWVNepV06phIsC6+IZFvGh1voW5TNQiQp2twVaMf05gZqQjuS+uWLM6gHhNQ==",
"hasInstallScript": true,
"dependencies": {
"node-gyp-build": "^4.6.0"
"node-gyp-build": "^4.8.0"
}
},
"node_modules/source-map": {
@@ -3458,9 +3706,9 @@
}
},
"node_modules/sprintf-js": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
"integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
"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==",
"dev": true,
"optional": true
},
@@ -3494,6 +3742,21 @@
"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",
@@ -3505,6 +3768,19 @@
"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",
@@ -3554,9 +3830,9 @@
}
},
"node_modules/tar": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
"integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
"integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
"dev": true,
"dependencies": {
"chownr": "^2.0.0",
@@ -3617,15 +3893,12 @@
"integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA=="
},
"node_modules/tmp": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
"integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
"integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
"dev": true,
"dependencies": {
"rimraf": "^3.0.0"
},
"engines": {
"node": ">=8.17.0"
"node": ">=14.14"
}
},
"node_modules/tmp-promise": {
@@ -3714,30 +3987,33 @@
}
},
"node_modules/typescript": {
"version": "4.9.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
"integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
"version": "5.4.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
"integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=4.2.0"
"node": ">=14.17"
}
},
"node_modules/undici": {
"version": "6.6.1",
"resolved": "https://registry.npmjs.org/undici/-/undici-6.6.1.tgz",
"integrity": "sha512-J0GaEp0ztu/grIE2Uq57AbK6TRb+bWbOlxu0POCzhFKA6LKbwSAev+hDQaQcgUUA9CPs8Ky+cauzTHnQrtAQEA==",
"version": "6.14.1",
"resolved": "https://registry.npmjs.org/undici/-/undici-6.14.1.tgz",
"integrity": "sha512-mAel3i4BsYhkeVPXeIPXVGPJKeBzqCieZYoFsbWfUzd68JmHByhc1Plit5WlylxXFaGpgkZB8mExlxnt+Q1p7A==",
"dev": true,
"dependencies": {
"@fastify/busboy": "^2.0.0"
},
"engines": {
"node": ">=18.0"
"node": ">=18.17"
}
},
"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",
@@ -3811,6 +4087,24 @@
"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.7-beta",
"version": "3.0.0",
"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.4.0",
"better-sqlite3-multiple-ciphers": "^9.5.0",
"electron-trpc": "0.5.2",
"electron-updater": "6.1.4",
"icojs": "^0.17.1",
"sodium-native": "^4.0.6",
"sodium-native": "^4.1.1",
"typed-emitter": "^2.1.0",
"yargs": "^17.6.2",
"zod": "^3.21.4"
@@ -27,11 +27,13 @@
"@types/node": "18.16.1",
"@types/yargs": "^17.0.24",
"chokidar": "^3.5.3",
"electron": "^28.2.1",
"electron-builder": "^24.9.1",
"electron": "^29.3.1",
"electron-builder": "^24.13.3",
"esbuild": "^0.20.0",
"node-gyp-build": "^4.8.0",
"prebuildify": "^6.0.1",
"tree-kill": "^1.2.2",
"undici": "^6.6.1"
"undici": "^6.14.1"
},
"optionalDependencies": {
"dmg-license": "^1.0.11"
@@ -55,8 +57,8 @@
"productName": "Notesnook",
"copyright": "Copyright © 2023 Streetwriters (Private) Limited",
"artifactName": "notesnook_${os}_${arch}.${ext}",
"asar": false,
"generateUpdatesFilesForAllChannels": true,
"asar": false,
"files": [
"!*.chunk.js.map",
"!*.chunk.js.LICENSE.txt",
@@ -219,8 +221,7 @@
{
"provider": "github",
"repo": "notesnook",
"owner": "streetwriters",
"channel": "beta"
"owner": "streetwriters"
}
]
}

View File

@@ -0,0 +1,46 @@
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 } from "fs";
import { existsSync, readFileSync } from "fs";
import yargs from "yargs-parser";
import os from "os";
import * as childProcess from "child_process";
@@ -28,21 +28,27 @@ 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(`cd ${webAppPath} && npm run build:desktop`);
await exec(
"npx nx build:desktop @notesnook/web",
path.join(__dirname, "..", "..", "..")
);
}
// temporary until there's support for prebuilt binaries for windows ARM & linux ARM
await patchBetterSQLite3();
// temporary until there's support for prebuilt binaries for linux ARM
if (os.platform() === "linux") await patchBetterSQLite3();
if (os.platform() === "win32")
await exec(
"npx prebuildify --arch=arm64 --strip",
`npx prebuildify --arch=arm64 --strip -t electron@${packageJson.devDependencies.electron}`,
path.join(__dirname, "..", "node_modules", "sodium-native")
);
@@ -64,7 +70,7 @@ if (args.run) {
if (process.platform === "win32") {
await exec(`.\\output\\win-unpacked\\Notesnook.exe`);
} else if (process.platform === "darwin") {
await exec(`./output/darwin-unpacked/Notesnook`);
await exec(`./output/mac/Notesnook.app/Contents/MacOS/Notesnook`);
} else {
await exec(`./output/linux-unpacked/Notesnook`);
}
@@ -88,7 +94,7 @@ async function patchBetterSQLite3() {
);
const json = JSON.parse(await readFile(jsonPath, "utf-8"));
json.version = "9.4.1";
json.version = "9.5.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-rebuild");
await exec("npx electron-builder install-app-deps");
}
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-AzureCodeSigning -Endpoint "${Endpoint}" -CodeSigningAccountName "${CodeSigningAccountName}" -CertificateProfileName "${CertificateProfileName}" -FileDigest "${FileDigest}" -TimestampRfc3161 "${TimestampRfc3161}" -TimestampDigest "${TimestampDigest}" -Description "${Description}" -DescriptionUrl "${DescriptionUrl}" -FilesCatalog "${FilesCatalog}"`;
const command = `Invoke-TrustedSigning -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,6 +24,7 @@ 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();
@@ -33,7 +34,8 @@ export const router = t.router({
spellChecker: spellCheckerRouter,
updater: updaterRouter,
bridge: bridgeRouter,
safeStorage: safeStorageRouter
safeStorage: safeStorageRouter,
window: windowRouter
});
export const api = router.createCaller({});

View File

@@ -32,6 +32,7 @@ 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();
@@ -55,6 +56,15 @@ 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())
@@ -170,16 +180,42 @@ export const osIntegrationRouter = t.router({
}),
bringToFront: t.procedure.query(() => bringToFront()),
changeTheme: t.procedure
.input(Theme)
.mutation(({ input }) => setTheme(input)),
.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);
}
),
onThemeChanged: t.procedure.subscription(() =>
observable<"dark" | "light">((emit) => {
nativeTheme.on("updated", () => {
const updated = () => {
if (getTheme() === "system") {
emit.next(nativeTheme.shouldUseDarkColors ? "dark" : "light");
}
});
};
nativeTheme.on("updated", updated);
return () => {
nativeTheme.off("updated", updated);
};
})
)
});

View File

@@ -28,16 +28,20 @@ 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 () => {
const cancellationToken = new CancellationToken();
await autoUpdater.downloadUpdate(cancellationToken);
if (cancellationToken) return;
cancellationToken = new CancellationToken();
await autoUpdater
.downloadUpdate(cancellationToken)
.finally(() => (cancellationToken = undefined));
}),
check: t.procedure.query(async () => {
await autoUpdater.checkForUpdates();
await autoUpdater.checkForUpdates().catch(console.error);
}),
toggleAutoUpdates: t.procedure
@@ -71,6 +75,7 @@ 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

@@ -0,0 +1,83 @@
/*
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,6 +35,7 @@ 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()) {
@@ -82,6 +83,19 @@ 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,
@@ -122,7 +136,7 @@ async function createWindow() {
setupJumplist();
if (isDevelopment())
mainWindow.webContents.openDevTools({ mode: "right", activate: true });
mainWindow.webContents.openDevTools({ mode: "bottom", activate: true });
mainWindow.webContents.setWindowOpenHandler((details) => {
shell.openExternal(details.url);
@@ -138,6 +152,9 @@ 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,7 +42,12 @@ export const config = {
zoomFactor: 1,
theme: nativeTheme.themeSource,
automaticUpdates: true,
proxyRules: ""
proxyRules: "",
customDns: true,
backgroundColor: nativeTheme.themeSource === "dark" ? "#0f0f0f" : "#ffffff",
windowControlsIconColor:
nativeTheme.themeSource === "dark" ? "#ffffff" : "#000000"
};
type ConfigKey = keyof typeof config;

View File

@@ -0,0 +1,37 @@
/*
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 { protocol } from "electron";
import { net, protocol } from "electron";
import { isDevelopment } from "./index";
import { createReadStream } from "fs";
import { extname, normalize } from "path";
@@ -62,26 +62,7 @@ function registerProtocol() {
headers: { "Content-Type": extensionToMimeType[fileExtension] }
});
} else {
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"
});
return net.fetch(request, { bypassCustomProtocolHandlers: true });
}
});
console.info(`${SCHEME} protocol inteception "successful"`);

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 108 KiB

View File

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

View File

@@ -67,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");
@@ -77,6 +77,8 @@ 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"

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 { Platform, TextInput, View } from "react-native";
import { AppStateStatus, Platform, TextInput, View } from "react-native";
//@ts-ignore
import { useThemeColors } from "@notesnook/theme";
import { enabled } from "react-native-privacy-snapshot";
@@ -74,6 +74,7 @@ const verifyUserPassword = async (password: string) => {
};
const AppLockedOverlay = () => {
const initialLaunchBiometricRequest = useRef(true);
const { colors } = useThemeColors();
const user = getUser();
const appLocked = useUserStore((state) => state.appLocked);
@@ -82,6 +83,7 @@ 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
@@ -131,9 +133,8 @@ const AppLockedOverlay = () => {
if (!password.current) return;
try {
const unlocked = appLockHasPasswordSecurity
? validateAppLockPassword(password.current)
? await validateAppLockPassword(password.current)
: await verifyUserPassword(password.current);
if (unlocked) {
if (!appLockHasPasswordSecurity) {
await setAppLockVerificationCipher(password.current);
@@ -154,18 +155,46 @@ 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" &&
!useSettingStore.getState().requestBiometrics
(prevState === "background" || initialLaunchBiometricRequest.current)
) {
biometricUnlockAwaitingUserInput.current = true;
onUnlockAppRequested();
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);
}
}
}, [appState, onUnlockAppRequested, appLocked]);

View File

@@ -221,7 +221,7 @@ const Actions = ({
<View
style={{
borderBottomWidth: 1,
borderBottomColor: colors.secondary.background,
borderBottomColor: colors.primary.border,
marginBottom: notes && notes.length > 0 ? 0 : 12
}}
>
@@ -295,7 +295,7 @@ const Actions = ({
<View
style={{
borderBottomWidth: 1,
borderBottomColor: colors.secondary.background,
borderBottomColor: colors.primary.border,
marginBottom: 12,
paddingVertical: 12
}}

View File

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

View File

@@ -18,6 +18,7 @@ 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, {
@@ -54,6 +55,7 @@ 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 {
@@ -140,7 +142,13 @@ const FloatingButton = ({
}}
>
<Icon
name={title === "Clear all trash" ? "delete" : "plus"}
name={
route.name === "Notebooks"
? "notebook-plus"
: route.name === "Trash"
? "delete"
: "plus"
}
color={colors.primary.accentForeground}
size={SIZE.xxl}
/>

View File

@@ -21,14 +21,16 @@ 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);
@@ -43,12 +45,17 @@ export const Container = ({ children }: PropsWithChildren) => {
paddingTop: Platform.OS === "android" ? 0 : insets.top,
paddingBottom: Platform.OS === "android" ? 0 : insets.bottom,
height: height || "100%",
width: "100%"
width: "100%",
backgroundColor: colors.primary.background
}}
onLayout={(event) => {
if (!keyboard.keyboardShown) {
setHeight(event.nativeEvent.layout.height);
}
const height = event.nativeEvent.layout.height;
clearTimeout(timerRef.current);
timerRef.current = setTimeout(() => {
if (!keyboard.keyboardShown) {
setHeight(height);
}
}, 500);
}}
>
{children}

View File

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

View File

@@ -36,6 +36,7 @@ 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();
@@ -121,7 +122,8 @@ export const Dialog = ({ context = "global" }) => {
maxHeight: 450,
borderRadius: 5,
backgroundColor: colors.primary.background,
paddingTop: 12
paddingTop: 12,
...getContainerBorder(colors.primary.border, 0.5)
};
return visible ? (

View File

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

View File

@@ -75,7 +75,7 @@ const ColorPicker = ({
style={{
width: "100%",
height: 250,
backgroundColor: selectedColor,
backgroundColor: colors.primary.background,
borderRadius: 10
}}
>
@@ -146,12 +146,16 @@ 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(
@@ -170,7 +174,6 @@ 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. If biometrics are not working, you can enter device pin to unlock vault."
? "Unlock note to open it in editor."
: "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,6 +33,7 @@ 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;
@@ -66,6 +67,8 @@ 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="shade"
type="accent"
hitSlop={{
top: 10,
right: 10,
@@ -82,7 +82,7 @@ export const RightMenus = ({
marginLeft: 10,
width: 32,
height: 32,
borderRadius: 5,
borderRadius: 100,
paddingHorizontal: 0,
borderWidth: 1,
borderColor: colors.primary.accent

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 = () => {
return <View style={{ height: 150 }} />;
export const Footer = ({ height = 150 }) => {
return <View style={{ height: height }} />;
};

View File

@@ -95,7 +95,7 @@ export const NotebookHeader = ({
style={{
flexShrink: 1
}}
size={SIZE.xxl}
size={SIZE.lg}
>
{notebook.title}
</Heading>
@@ -114,7 +114,7 @@ export const NotebookHeader = ({
width: 40,
height: 40
}}
type={isPinnedToMenu ? "secondary" : "secondary"}
type="transparent"
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="secondary"
type="transparent"
color={colors.primary.icon}
style={{
width: 40,
@@ -134,7 +134,7 @@ export const NotebookHeader = ({
</View>
{notebook.description ? (
<Paragraph size={SIZE.md} color={colors.primary.paragraph}>
<Paragraph size={SIZE.sm} color={colors.primary.paragraph}>
{notebook.description}
</Paragraph>
) : null}
@@ -148,10 +148,6 @@ 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 { ColorValues, getContainerBorder } from "../../../utils/colors";
import { getContainerBorder } from "../../../utils/colors";
import { GROUP } from "../../../utils/constants";
import { SIZE } from "../../../utils/size";
import Sort from "../../sheets/sort";
@@ -96,13 +96,9 @@ export const SectionHeader = React.memo<
}}
>
<Heading
color={
ColorValues[color?.toLowerCase() as keyof typeof ColorValues] ||
colors.primary.accent
}
color={color || colors.primary.accent}
size={SIZE.sm}
style={{
minWidth: 60,
alignSelf: "center",
textAlignVertical: "center"
}}

View File

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

View File

@@ -28,13 +28,12 @@ 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 from "../selection-wrapper";
import SelectionWrapper, { selectItem } from "../selection-wrapper";
export const openNote = async (
item: Note,
@@ -47,21 +46,8 @@ 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 (selectedItemsList.length > 0 && selectionMode === item.type) {
setSelectedItem(note.id);
} else {
clearSelection();
}
return;
}
if (selectItem(item)) return;
if (note.conflicted) {
eSendEvent(eShowMergeDialog, note);

View File

@@ -27,18 +27,12 @@ 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 from "../selection-wrapper";
import SelectionWrapper, { selectItem } from "../selection-wrapper";
export const openNotebook = (item: Notebook | BaseTrashItem<Notebook>) => {
const isTrash = item.type === "trash";
const { selectedItemsList, setSelectedItem, selectionMode, clearSelection } =
useSelectionStore.getState();
if (selectedItemsList.length > 0 && selectionMode === item.type) {
setSelectedItem(item.id);
return;
} else {
clearSelection();
}
if (selectItem(item)) return;
if (isTrash) {
presentDialog({

View File

@@ -22,7 +22,6 @@ 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";
@@ -30,7 +29,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 from "../selection-wrapper";
import SelectionWrapper, { selectItem } from "../selection-wrapper";
const ReminderItem = React.memo(
({
@@ -44,18 +43,7 @@ const ReminderItem = React.memo(
}) => {
const { colors } = useThemeColors();
const openReminder = () => {
const {
selectedItemsList,
setSelectedItem,
selectionMode,
clearSelection
} = useSelectionStore.getState();
if (selectedItemsList.length > 0 && selectionMode === item.type) {
setSelectedItem(item.id);
return;
} else {
clearSelection();
}
if (selectItem(item)) return;
ReminderSheet.present(item, undefined, isSheet);
};

View File

@@ -26,6 +26,23 @@ 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,13 +23,12 @@ 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 from "../selection-wrapper";
import SelectionWrapper, { selectItem } from "../selection-wrapper";
const TagItem = React.memo(
({
@@ -43,18 +42,7 @@ const TagItem = React.memo(
}) => {
const { colors } = useThemeColors();
const onPress = () => {
const {
selectedItemsList,
setSelectedItem,
selectionMode,
clearSelection
} = useSelectionStore.getState();
if (selectedItemsList.length > 0 && selectionMode === item.type) {
setSelectedItem(item.id);
return;
} else {
clearSelection();
}
if (selectItem(item)) return;
TaggedNotes.navigate(item, true);
};

View File

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

View File

@@ -48,6 +48,7 @@ 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;
@@ -75,6 +76,7 @@ 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) {
@@ -117,14 +119,24 @@ 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);
refreshItem(resolvedItem);
if (resolvedItem) {
refreshItem(resolvedItem);
} else {
setItem(undefined);
setGroupHeader(undefined);
}
}
useEffect(() => {
@@ -132,12 +144,15 @@ 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);
}, 100);
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
);
} catch (e) {
console.log("Error", e);
}
@@ -148,7 +163,7 @@ export function ListItemWrapper(props: ListItemWrapperProps) {
return (
<View
style={{
height: 120,
height: compactMode ? 50 : 120,
width: "100%"
}}
/>

View File

@@ -23,9 +23,9 @@ import { FlatList, StyleSheet, View } from "react-native";
import {
DraxList,
DraxListProps,
DraxListRenderItemContent,
DraxProvider
DraxListRenderItemContent
} from "react-native-drax";
import { tabBarRef } from "../../utils/global-refs";
import { SIZE } from "../../utils/size";
import { useSideBarDraggingStore } from "../side-menu/dragging-store";
@@ -74,6 +74,7 @@ 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={{
@@ -136,53 +137,49 @@ function ReorderableList<T extends { id: string }>({
}
return (
<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
})
<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
}
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>
}}
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>
);
}

View File

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

View File

@@ -199,7 +199,9 @@ export default function NoteHistory({
Note version history is local only.{" "}
<Text
onPress={() => {
openLinkInBrowser("https://docs.notesnook.com/versionhistory");
openLinkInBrowser(
"https://help.notesnook.com/note-version-history"
);
}}
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 (no limit on topics) and 5 tags."
info: "* Free users are limited to keeping 3 notebooks and 5 tags."
},
{

View File

@@ -111,6 +111,7 @@ 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,7 +242,6 @@ Properties.present = async (item, buttons = [], isSheet) => {
"attachments",
"lock-unlock",
"trash",
"remove-from-topic",
"remove-from-notebook",
"history",
"read-only",
@@ -264,7 +263,8 @@ Properties.present = async (item, buttons = [], isSheet) => {
"trash",
"default-notebook",
"add-notebook",
"move-notes"
"move-notes",
"move-notebook"
]);
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 : SIZE.lg}
size={DDS.isTab ? SIZE.xxl : shouldShrink ? SIZE.xxl : SIZE.lg}
color={
item.on
? colors.primary.accent
@@ -241,8 +241,8 @@ export const Items = ({ item, buttons, close }) => {
}}
showsHorizontalScrollIndicator={false}
contentContainerStyle={{
gap: 10,
paddingRight: 25
paddingRight: 25,
gap: 5
}}
>
{topBarItems.map(renderTopBarItem)}

View File

@@ -48,7 +48,7 @@ export const Synced = ({ item, close }) => {
paddingTop: 10,
marginTop: 10,
borderTopWidth: 1,
borderTopColor: colors.secondary.background
borderTopColor: colors.primary.border
}}
>
<Icon
@@ -92,7 +92,7 @@ export const Synced = ({ item, close }) => {
close();
await sleep(300);
await openLinkInBrowser(
"https://docs.notesnook.com/how-is-my-data-encrypted/",
"https://help.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 from "react";
import React, { useEffect, useState } from "react";
import { View } from "react-native";
import { db } from "../../common/database";
import { TaggedNotes } from "../../screens/notes/tagged";
@@ -68,26 +68,38 @@ export const Tags = ({ item, close }) => {
};
export const TagStrip = ({ item, close }) => {
return item.tags?.length > 0 ? (
const [tags, setTags] = useState([]);
useEffect(() => {
db.relations
.to(item, "tag")
.resolve()
.then((tags) => {
setTags(tags);
});
});
return tags?.length > 0 ? (
<View
style={{
flexDirection: "row",
flexWrap: "wrap",
alignItems: "center"
alignItems: "center",
marginTop: 10,
gap: 5
}}
>
{item.tags.map((tag) =>
tag ? <TagItem key={tag} tag={tag} close={close} /> : null
{tags?.map((tag) =>
tag ? <TagItem key={tag.id} tag={tag} close={close} /> : null
)}
</View>
) : null;
};
const TagItem = ({ tag, close }) => {
const { colors } = useThemeColors();
const onPress = async () => {
let tags = db.tags.all;
let _tag = tags.find((t) => t.title === tag);
TaggedNotes.navigate(_tag, true);
TaggedNotes.navigate(tag, true);
await sleep(300);
close();
};
@@ -95,20 +107,19 @@ const TagItem = ({ tag, close }) => {
const style = {
paddingHorizontal: 0,
borderRadius: 100,
marginRight: 10,
marginTop: 0,
backgroundColor: "transparent"
};
return (
<Button
onPress={onPress}
title={"#" + tag}
type="secondary"
title={"#" + tag.title}
type="plain"
height={20}
fontSize={SIZE.xs}
style={style}
textStyle={{
textDecorationLine: "underline"
color: colors.secondary.paragraph
}}
/>
);

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 } from "react";
import React, { useEffect, useRef } from "react";
import {
BackHandler,
NativeEventSubscription,
Platform,
View
} from "react-native";
import Animated, { FadeInUp } from "react-native-reanimated";
import Menu from "react-native-reanimated-material-menu/src/Menu";
import { db } from "../../common/database";
import useGlobalSafeAreaInsets from "../../hooks/use-global-safe-area-insets";
import { ToastManager } from "../../services/event-manager";
@@ -42,6 +42,8 @@ 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";
@@ -57,6 +59,8 @@ 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(
@@ -131,8 +135,7 @@ export const SelectionHeader = React.memo(
}, [clearSelection, selectionMode]);
return selectionMode !== type || focusedRouteId !== id ? null : (
<Animated.View
entering={FadeInUp}
<View
style={{
width: "100%",
height: Platform.OS === "android" ? 50 + insets.top : 50,
@@ -142,8 +145,7 @@ export const SelectionHeader = React.memo(
alignItems: "center",
flexDirection: "row",
zIndex: 999,
paddingHorizontal: 12,
marginVertical: 10
paddingHorizontal: 12
}}
>
<View
@@ -163,18 +165,15 @@ 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,
@@ -183,11 +182,12 @@ export const SelectionHeader = React.memo(
alignItems: "center"
}}
>
<Heading size={SIZE.md} color={colors.primary.accent}>
<Heading size={SIZE.lg} color={colors.primary.paragraph}>
{selectedItemsList.length}
</Heading>
</View>
</View>
<View
style={{
flexDirection: "row",
@@ -210,144 +210,142 @@ export const SelectionHeader = React.memo(
allSelected ? colors.primary.accent : colors.primary.paragraph
}
name="select-all"
size={SIZE.xl}
/>
{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();
{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"
}
}}
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}
/>
</>
].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>
) : null}
</View>
</Animated.View>
</View>
);
}
);

View File

@@ -39,15 +39,18 @@ 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
close,
showMoveNotesOnComplete
}: {
notebook?: Notebook;
parentNotebook?: Notebook;
close: ((context?: string | undefined) => void) | undefined;
close?: (didAddNotebook: boolean) => void;
showMoveNotesOnComplete: boolean;
}) => {
const title = useRef(notebook?.title);
const description = useRef(notebook?.description);
@@ -85,6 +88,7 @@ export const AddNotebookSheet = ({
useMenuStore.getState().setMenuPins();
Navigation.queueRoutesForUpdate();
useRelationStore.getState().update();
useNotebookStore.getState().refresh();
const parent =
parentNotebook?.id || (await getParentNotebookId(notebook?.id || id));
@@ -97,10 +101,10 @@ export const AddNotebookSheet = ({
});
}
if (!notebook) {
if (!notebook && showMoveNotesOnComplete) {
MoveNotes.present(await db.notebooks.notebook(id));
} else {
close?.();
close?.(true);
}
};
@@ -169,7 +173,8 @@ AddNotebookSheet.present = (
notebook?: Notebook,
parentNotebook?: Notebook,
context?: string,
onClose?: () => void
onClose?: (didAddNotebook: boolean) => void,
showMoveNotesOnComplete = true
) => {
presentSheet({
context: context,
@@ -177,9 +182,12 @@ AddNotebookSheet.present = (
<AddNotebookSheet
notebook={notebook}
parentNotebook={parentNotebook}
close={close}
close={(didAddNotebook: boolean) => {
close?.();
onClose?.(didAddNotebook);
}}
showMoveNotesOnComplete={showMoveNotesOnComplete || false}
/>
),
onClose: onClose
)
});
};

View File

@@ -46,6 +46,7 @@ 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";
async function updateInitialSelectionState(items: string[]) {
const relations = await db.relations
@@ -141,6 +142,11 @@ 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} />
@@ -180,7 +186,7 @@ const MoveNoteSheet = ({
paragraph={
!multiSelect
? "Long press to enable multi-select."
: "Select topics you want to add note(s) to."
: "Select notebooks you want to add note(s) to."
}
/>
@@ -190,18 +196,21 @@ const MoveNoteSheet = ({
columnGap: 10
}}
>
<IconButton
name="restore"
type="secondaryAccented"
onPress={() => {
const items = note ? [note.id] : selectedItemsList;
updateInitialSelectionState(items);
}}
style={{
width: 40,
height: 40
}}
/>
{hasSelected() ? (
<IconButton
name="restore"
type="secondaryAccented"
color={colors.primary.icon}
onPress={() => {
const items = note ? [note.id] : selectedItemsList;
updateInitialSelectionState(items);
}}
style={{
width: 40,
height: 40
}}
/>
) : null}
<Button
height={40}
@@ -230,6 +239,36 @@ const MoveNoteSheet = ({
style={{
width: "100%"
}}
ListHeaderComponent={
<View
style={{
paddingHorizontal: 12,
width: "100%"
}}
>
<Button
title="Add new notebook"
style={{
alignSelf: "flex-start",
paddingHorizontal: 12,
justifyContent: "space-between"
}}
onPress={() => {
AddNotebookSheet.present(
undefined,
undefined,
"link-notebooks",
undefined,
false
);
}}
icon="plus"
iconPosition="right"
type="secondaryAccented"
width="100%"
/>
</View>
}
estimatedItemSize={50}
renderItem={renderNotebook}
ListEmptyComponent={
@@ -265,7 +304,8 @@ MoveNoteSheet.present = (note?: Note) => {
presentSheet({
component: (ref) => <MoveNoteSheet actionSheetRef={ref} note={note} />,
enableGesturesInScrollView: false,
noBottomPadding: true
noBottomPadding: true,
keyboardHandlerDisabled: true
});
};
export default MoveNoteSheet;

View File

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

View File

@@ -43,6 +43,7 @@ type TabItem = {
locked?: boolean;
noteLocked?: boolean;
readonly?: boolean;
pinned?: boolean;
};
const TabItemComponent = (props: {
@@ -83,7 +84,6 @@ const TabItemComponent = (props: {
onPress={() => {
if (!props.isFocused) {
useTabStore.getState().focusTab(props.tab.id);
props.close?.();
if (props.tab.locked) {
eSendEvent(eUnlockNote);
}
@@ -94,6 +94,7 @@ const TabItemComponent = (props: {
}, 300);
}
}
props.close?.();
}}
onLongPress={() => {
useTabStore.getState().updateTab(props.tab.id, {
@@ -129,7 +130,9 @@ const TabItemComponent = (props: {
: colors.primary.paragraph
}
style={{
fontStyle: props.tab.previewTab ? "italic" : "normal"
fontFamily: props.tab.previewTab
? "OpenSans-Italic"
: "OpenSans-Regular"
}}
numberOfLines={1}
size={SIZE.md}
@@ -138,24 +141,50 @@ const TabItemComponent = (props: {
</Paragraph>
</View>
<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?.();
}
<View
style={{
flexDirection: "row",
gap: 5,
paddingRight: 12
}}
top={0}
left={0}
right={20}
bottom={0}
/>
>
<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>
</Pressable>
);
};
@@ -223,7 +252,16 @@ export default function EditorTabs({
/>
</View>
<FlatList windowSize={3} data={tabs} renderItem={renderTabItem} />
<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}
/>
</View>
);
}

View File

@@ -39,6 +39,7 @@ 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";
@@ -47,7 +48,6 @@ 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 save = async (
const exportNoteAs = async (
type: "pdf" | "txt" | "md" | "html" | "md-frontmatter"
) => {
if (exporting) return;
@@ -81,9 +81,18 @@ const ExportNotesSheet = ({
setComplete(false);
let result;
if (ids.length > 1) {
result = await Exporter.bulkExport(ids, type, setStatus);
result = await Exporter.bulkExport(
db.notes.all.where((eb) => eb("id", "in", ids)),
type,
setStatus
);
} else {
result = await Exporter.exportNote(ids[0], type);
const note = await db.notes.note(ids[0]);
if (!note) {
setExporting(false);
return;
}
result = await Exporter.exportNote(note, type, setStatus);
await sleep(1000);
}
if (!result) {
@@ -101,7 +110,7 @@ const ExportNotesSheet = ({
{
title: "PDF",
func: async () => {
await save("pdf");
await exportNoteAs("pdf");
},
icon: "file-pdf-box",
desc: "View in any pdf reader app",
@@ -111,7 +120,7 @@ const ExportNotesSheet = ({
{
title: "Markdown",
func: async () => {
await save("md");
await exportNoteAs("md");
},
icon: "language-markdown",
desc: "View in any text or markdown editor",
@@ -121,7 +130,7 @@ const ExportNotesSheet = ({
{
title: "Markdown + Frontmatter",
func: async () => {
await save("md-frontmatter");
await exportNoteAs("md-frontmatter");
},
icon: "language-markdown",
desc: "View in any text or markdown editor",
@@ -131,7 +140,7 @@ const ExportNotesSheet = ({
{
title: "Plain Text",
func: async () => {
await save("txt");
await exportNoteAs("txt");
},
icon: "card-text",
desc: "View in any text editor",
@@ -141,7 +150,7 @@ const ExportNotesSheet = ({
{
title: "HTML",
func: async () => {
await save("html");
await exportNoteAs("html");
},
icon: "language-html5",
desc: "View in any web browser & html reader",
@@ -250,11 +259,9 @@ const ExportNotesSheet = ({
<>
<ActivityIndicator />
<Paragraph>
{ids.length === 1
? "Exporting note... Please wait"
: `Exporting notes${
status ? ` (${status})` : ``
}... Please wait`}
{`${
status ? `${status})` : `Exporting notes`
}... Please wait`}
</Paragraph>
</>
) : (

View File

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

View File

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

View File

@@ -99,6 +99,7 @@ export default function Migrate() {
const { error } = await BackupService.run(false, "local");
if (error) {
ToastManager.error(error, "Backup failed");
reportError(error);
setLoading(false);
return;
}
@@ -159,13 +160,14 @@ 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
width: 200,
alignSelf: "center"
}}
>
<ProgressBarComponent

View File

@@ -0,0 +1,361 @@
/*
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, useState } from "react";
import { View } from "react-native";
import React, { RefObject, useEffect, useRef, useState } from "react";
import { ActivityIndicator, TextInput, 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,6 +35,7 @@ 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";
@@ -50,39 +51,60 @@ 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.initialState?.[k] !== "selected" &&
state.selection[k] !== "deselected"
state.selection?.[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(() => {
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
});
});
loadNotes();
return () => {
useItemSelectionStore.getState().reset();
};
}, [currentNotebook]);
}, [currentNotebook, loadNotes]);
const renderItem = React.useCallback(
({ index }: { item: boolean; index: number }) => {
@@ -96,19 +118,33 @@ export const MoveNotes = ({
style={{
paddingHorizontal: 12,
maxHeight: "100%",
height: notes?.placeholders.length
? 50 * (notes?.placeholders.length + 2)
: 300
height: "100%"
}}
>
<Dialog context="local" />
<DialogHeader
title={`Add notes to ${currentNotebook.title}`}
paragraph={"Select the topic in which you would like to move notes."}
paragraph={"Select the notes you want to move to this Notebook."}
/>
<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
@@ -118,13 +154,17 @@ export const MoveNotes = ({
alignItems: "center"
}}
>
<Paragraph color={colors.secondary.paragraph}>
No notes to show
</Paragraph>
{loading ? (
<ActivityIndicator size="large" color={colors.primary.accent} />
) : (
<Paragraph color={colors.secondary.paragraph}>
No notes to show
</Paragraph>
)}
</View>
}
estimatedItemSize={50}
data={notes?.placeholders}
data={loading ? [] : notes?.placeholders}
renderItem={renderItem}
/>
@@ -135,6 +175,12 @@ 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();
@@ -161,11 +207,12 @@ 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 exists ? null : (
return (
<Pressable
testID="listitem.select"
onPress={() => {
@@ -205,8 +252,14 @@ const SelectableNoteItem = React.memo(
? "check-circle-outline"
: "checkbox-blank-circle-outline"
}
type="selected"
color={selected ? colors.selected.icon : colors.primary.icon}
type="plain"
color={
selected
? colors.selected.icon
: exists && !selected
? colors.static.red
: colors.primary.icon
}
/>
<View

View File

@@ -17,13 +17,14 @@ 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";
@@ -36,7 +37,13 @@ export type FeatureType = {
platform?: "ios" | "android";
};
const NewFeature = ({ features }: { features: FeatureType[] }) => {
const NewFeature = ({
features,
version
}: {
features: FeatureType[];
version?: string | null;
}) => {
const { colors } = useThemeColors();
return (
@@ -44,30 +51,33 @@ const NewFeature = ({ features }: { features: FeatureType[] }) => {
style={{
alignItems: "center",
paddingHorizontal: 12,
paddingTop: 12
paddingTop: 12,
maxHeight: "100%"
}}
>
<Heading color={colors.secondary.heading} size={SIZE.md}>
New Version Highlights 🎉
{!version ? "New version " : `v${version} `}Highlights 🎉
</Heading>
<Seperator />
{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>
))}
<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>
<Seperator />
<Button
@@ -108,7 +118,13 @@ NewFeature.present = () => {
);
if (_features.length === 0) return;
presentSheet({
component: <NewFeature features={features} />
component: (
<NewFeature
features={features}
version={SettingsService.getProperty("version")}
/>
),
disableClosing: true
});
return true;
};

View File

@@ -19,13 +19,19 @@ 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 { RefreshControl, View, useWindowDimensions } from "react-native";
import {
Platform,
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";
@@ -43,6 +49,7 @@ 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);
@@ -61,7 +68,8 @@ class NotebookSheetConfig {
}
static get(item: ConfigItem) {
return MMKV.getInt(NotebookSheetConfig.makeId(item)) || 0;
const value = MMKV.getInt(NotebookSheetConfig.makeId(item));
return typeof value === "number" ? value : 0;
}
static set(item: ConfigItem, index = 0) {
@@ -124,11 +132,6 @@ 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: {}
@@ -137,17 +140,14 @@ export const NotebookSheet = () => {
currentItem.current = nextRoot;
const snapPoint = NotebookSheetConfig.get({
type: "notebook",
id: nextRoot as string
id: focusedRouteId as string
});
if (ref.current?.isOpen()) {
ref.current?.snapToIndex(snapPoint);
} else {
setTimeout(() => {
ref.current?.show(snapPoint);
}, 150);
ref.current?.show(snapPoint);
}
console.log("NotebookSheet.useEffect.didShow", focusedRouteId);
setRoot(nextRoot);
onRequestUpdate();
});
@@ -160,7 +160,7 @@ export const NotebookSheet = () => {
ref.current?.hide();
}
}
}, [canShow, onRequestUpdate, focusedRouteId]);
}, [canShow, focusedRouteId]);
return (
<ActionSheet
@@ -196,11 +196,56 @@ export const NotebookSheet = () => {
backgroundColor: colors.secondary.background
}}
keyboardHandlerEnabled={false}
snapPoints={Config.isTesting === "true" ? [100] : [20, 100]}
snapPoints={
Config.isTesting === "true"
? [100]
: [Platform.OS === "android" ? 15 : 10, 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",
@@ -220,8 +265,8 @@ export const NotebookSheet = () => {
style={{
alignItems: "center",
justifyContent: "center",
height: normalize(60),
width: normalize(60)
height: normalize(50),
width: normalize(50)
}}
>
<Icon name="plus" color="white" size={SIZE.xxl} />
@@ -278,6 +323,26 @@ 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,
@@ -319,20 +384,6 @@ 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,7 +357,9 @@ const PublishNoteSheet = ({
}}
onPress={async () => {
try {
await openLinkInBrowser("https://docs.notesnook.com/monographs/");
await openLinkInBrowser(
"https://help.notesnook.com/publish-notes-with-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.secondary.background,
borderTopColor: colors.primary.border,
marginTop: 5,
paddingTop: 5
}}

View File

@@ -18,7 +18,12 @@ 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 } from "react-native";
import {
Platform,
TextInput,
View,
ScrollView as RNScrollView
} from "react-native";
import { ActionSheetRef, ScrollView } from "react-native-actions-sheet";
import DateTimePickerModal from "react-native-modal-datetime-picker";
import {
@@ -364,7 +369,7 @@ export default function ReminderSheet({
))}
</View>
<ScrollView showsHorizontalScrollIndicator={false} horizontal>
<RNScrollView showsHorizontalScrollIndicator={false} horizontal>
{recurringMode === RecurringModes.Daily ||
recurringMode === RecurringModes.Year
? null
@@ -425,7 +430,7 @@ export default function ReminderSheet({
}}
/>
))}
</ScrollView>
</RNScrollView>
</View>
) : null}

View File

@@ -48,6 +48,7 @@ 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);
@@ -246,7 +247,6 @@ const RestoreDataComponent = ({ close, setRestoring, restoring }) => {
await db.backup.import(backup, password, key);
});
await db.initCollections();
initialize();
refreshAllStores();
ToastManager.show({
heading: "Backup restored successfully.",
@@ -384,10 +384,20 @@ 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);
@@ -399,6 +409,11 @@ const RestoreDataComponent = ({ close, setRestoring, restoring }) => {
}
} catch (e) {
console.log("error", e.stack);
setTimeout(() => {
useUserStore.setState({
disableAppLockRequests: false
});
}, 1000);
setRestoring(false);
backupError(e);
}
@@ -415,7 +430,7 @@ const RestoreDataComponent = ({ close, setRestoring, restoring }) => {
borderRadius: 0,
flexDirection: "row",
borderBottomWidth: 0.5,
borderBottomColor: colors.secondary.background
borderBottomColor: colors.primary.border
}}
>
<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.secondary.background,
borderBottomColor: colors.primary.border,
marginBottom: 12,
paddingHorizontal: 12,
paddingBottom: 12,
@@ -229,7 +229,7 @@ const Sort = ({ type, screen }) => {
if (item === "abc") {
_groupOptions.sortBy = "title";
_groupOptions.sortDirection = "asc";
_groupOptions.sortDirection = "desc";
}
updateGroupOptions(_groupOptions);

View File

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

View File

@@ -43,6 +43,10 @@ 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) {
@@ -59,8 +63,8 @@ export const ColorSection = React.memo(
db.settings.setSideBarHiddenItems("colors", data);
}}
disableDefaultDrag={true}
itemOrder={db.settings.getSideBarOrder("colors")}
hiddenItems={db.settings.getSideBarHiddenItems("colors")}
itemOrder={order}
hiddenItems={hiddensItems}
alwaysBounceVertical={false}
data={colorNotes}
style={{

View File

@@ -19,15 +19,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import { useThemeColors } from "@notesnook/theme";
import React, { useCallback } from "react";
import { FlatList, View } from "react-native";
import { notesnook } from "../../../e2e/test.ids";
import { View } from "react-native";
import { DraxProvider, DraxScrollView } from "react-native-drax";
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 Navigation from "../../services/navigation";
import { useMenuStore } from "../../stores/use-menu-store";
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";
@@ -49,30 +47,14 @@ 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",
@@ -92,8 +74,8 @@ export const SideMenu = React.memo(
onHiddenItemsChanged={(data) => {
db.settings.setSideBarHiddenItems("routes", data);
}}
itemOrder={db.settings.getSideBarOrder("routes")}
hiddenItems={db.settings.getSideBarHiddenItems("routes")}
itemOrder={order}
hiddenItems={hiddensItems}
alwaysBounceVertical={false}
data={MenuItemsList}
style={{
@@ -115,7 +97,7 @@ export const SideMenu = React.memo(
<PinnedSection />
</>
),
[]
[order, hiddensItems]
);
return !isAppLoading && introCompleted ? (
@@ -134,16 +116,12 @@ export const SideMenu = React.memo(
paddingTop: insets.top
}}
>
<FlatList
alwaysBounceVertical={false}
contentContainerStyle={{
flexGrow: 1
}}
showsVerticalScrollIndicator={false}
data={[0]}
keyExtractor={() => "mainMenuView"}
renderItem={renderItem}
/>
<DraxProvider>
<DraxScrollView nestedScrollEnabled={false}>
{renderItem()}
</DraxScrollView>
</DraxProvider>
<View
style={{
paddingHorizontal: 12
@@ -153,26 +131,6 @@ 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 ? (
@@ -204,14 +162,7 @@ export const SideMenu = React.memo(
/>
</View>
) : (
<View
style={{
width: "100%",
paddingHorizontal: 0
}}
>
<UserStatus />
</View>
<UserStatus />
)}
</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,7 +61,13 @@ export const PinnedSection = React.memo(
Navigation.closeDrawer();
});
};
const renderItem = ({ item }: { item: Notebook | Tag; index: number }) => {
const renderItem = ({
item,
index
}: {
item: Notebook | Tag;
index: number;
}) => {
return <PinItem item={item} onPress={onPress} />;
};
@@ -77,7 +83,7 @@ export const PinnedSection = React.memo(
}}
onHiddenItemsChanged={(data) => {}}
canHideItems={false}
itemOrder={db.settings.getSideBarOrder("shortcuts")}
itemOrder={order}
hiddenItems={[]}
alwaysBounceVertical={false}
data={menuPins}
@@ -94,7 +100,10 @@ export const PinnedSection = React.memo(
<Notice
size="small"
type="information"
text="Add shortcuts for notebooks, topics and tags here."
text="Add shortcuts for notebooks and tags here."
style={{
marginHorizontal: 12
}}
/>
}
/>

View File

@@ -25,19 +25,20 @@ 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 } = useThemeColors();
const { colors, isDark } = useThemeColors();
const user = useUserStore((state) => state.user);
const syncing = useUserStore((state) => state.syncing);
const lastSyncStatus = useUserStore((state) => state.lastSyncStatus);
@@ -55,7 +56,8 @@ export const UserStatus = () => {
alignSelf: "center",
paddingBottom: Platform.OS === "ios" ? insets.bottom / 2 : null,
borderTopWidth: 1,
borderTopColor: colors.secondary.background
borderTopColor: colors.primary.border,
backgroundColor: colors.primary.background
}}
>
<View
@@ -66,13 +68,9 @@ export const UserStatus = () => {
}}
>
<Pressable
onPress={async () => {
if (user) {
Sync.run();
} else {
tabBarRef.current?.closeDrawer();
eSendEvent(eOpenLoginDialog);
}
onPress={() => {
Navigation.navigate("Settings");
tabBarRef.current.closeDrawer();
}}
type="plain"
style={{
@@ -80,7 +78,8 @@ export const UserStatus = () => {
justifyContent: "flex-start",
padding: 12,
borderRadius: 0,
alignItems: "center"
alignItems: "center",
gap: 10
}}
>
{userProfile?.profilePicture ? (
@@ -91,11 +90,19 @@ export const UserStatus = () => {
style={{
width: 35,
height: 35,
borderRadius: 100,
marginRight: 10
borderRadius: 100
}}
/>
) : null}
) : (
<Icon
name="cog-outline"
size={SIZE.lg - 2}
color={colors.secondary.icon}
style={{
paddingLeft: 8
}}
/>
)}
<View
style={{
@@ -104,22 +111,12 @@ export const UserStatus = () => {
}}
>
<Paragraph
style={{
flexWrap: "wrap"
}}
numberOfLines={1}
size={SIZE.sm}
color={colors.primary.heading}
>
{!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"
{!user || !userProfile?.fullName
? "Settings"
: userProfile.fullName}
</Paragraph>
@@ -134,16 +131,20 @@ export const UserStatus = () => {
"Not logged in"
) : lastSynced && lastSynced !== "Never" ? (
<>
{lastSyncStatus === SyncStatus.Failed
{syncing
? `Syncing ${progress ? `(${progress.current})` : ""}`
: lastSyncStatus === SyncStatus.Failed
? "Sync failed"
: "Synced"}{" "}
<TimeSince
style={{
fontSize: SIZE.xs,
color: colors.secondary.paragraph
}}
time={lastSynced}
/>
{!syncing ? (
<TimeSince
style={{
fontSize: SIZE.xs,
color: colors.secondary.paragraph
}}
time={lastSynced}
/>
) : null}
{isOffline ? " (offline)" : ""}
</>
) : (
@@ -151,7 +152,7 @@ export const UserStatus = () => {
)}{" "}
<Icon
name="checkbox-blank-circle"
size={11}
size={9}
allowFontScaling
color={
!user || lastSyncStatus === SyncStatus.Failed
@@ -164,25 +165,80 @@ export const UserStatus = () => {
</Paragraph>
</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}
<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>
</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,7 +121,12 @@ export const FluidTabs = forwardRef<TabsRef, TabProps>(function FluidTabs(
} else {
if (prevWidths.current?.sidebar !== widths.sidebar) {
translateX.value =
!appState || appState?.movedAway ? widths.sidebar : editorPosition;
!appState || (appState && appState?.movedAway)
? widths.sidebar
: editorPosition;
if (translateX.value === editorPosition) {
onChangeTab?.({ i: 2, from: 1 });
}
}
}
isLoaded.current = true;
@@ -234,7 +239,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,6 +28,7 @@ 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";
/**
*
@@ -73,9 +74,17 @@ const SheetWrapper = ({
borderTopLeftRadius: 15,
alignSelf: "center",
borderBottomRightRadius: 0,
borderBottomLeftRadius: 0
borderBottomLeftRadius: 0,
...getContainerBorder(colors.primary.border, 0.5),
borderBottomWidth: 0
};
}, [colors.primary.background, largeTablet, smallTablet, width]);
}, [
colors.primary.background,
colors.primary.border,
largeTablet,
smallTablet,
width
]);
const _onOpen = () => {
if (lockEvents.current) return;

View File

@@ -129,9 +129,9 @@ const notebooks: { id: string; steps: TStep[] } = {
}
},
{
title: "Notebook > Topic > Notes",
text: "Every Notebook has various topics which are like sections that hold all your notes.",
walkthroughItem: (colors: ThemeStore["colors"]) => (
title: "Notebook > Notes",
text: "Every Notebook can have notes and sub notebooks.",
walkthroughItem: (colors: any) => (
<View
style={{
width: "100%",
@@ -245,7 +245,7 @@ const notebooks: { id: string; steps: TStep[] } = {
},
{
title: "Easy access",
text: "You can create shortcuts of frequently accessed notebooks or topics in Side Menu",
text: "You can create shortcuts of frequently accessed notebooks in the side menu",
walkthroughItem: () => (
<View
style={{

View File

@@ -19,4 +19,35 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import { FeatureType } from "./components/sheets/new-feature";
export const features: FeatureType[] = [];
export const features: FeatureType[] = [
{
title: "Bi-directional note linking",
body: "Now you can link notes to each other in both directions."
},
{
title: "Tabs",
body: "Tabs allow you to have multiple notes open at the same time. You can switch between them easily."
},
{
title: "Nested notebooks",
body: "You can now create notebooks inside other notebooks."
},
{
title: "At-rest encryption",
body: "Your notes are now encrypted when stored on the device."
},
{
title: "Material You themed icon",
body: "The app now has a Material You themed icon that changes color based on the wallpaper.",
platform: "android"
},
{
title: "New note quick settings tile",
body: "You can now add a new note tile to quickly create notes from quick settings panel.",
platform: "android"
},
{
title: "And so much more...",
body: "V3 packs so much that it's hard to put everything here, check out our blog at Notesnook V3 is here, and it's packed with new features and improvements such as bi-directional note linking, better syncing, at-rest encryption, nested notebooks, editor tabs, better app lock and so much more. https://blog.notesnook.com/introducing-notesnook-v3."
}
];

View File

@@ -67,6 +67,7 @@ import { convertNoteToText } from "../utils/note-to-text";
import { sleep } from "../utils/time";
import { ReferencesList } from "../components/sheets/references";
import { createInternalLink } from "@notesnook/core";
import { MoveNotebookSheet } from "../components/sheets/move-notebook";
export const useActions = ({
close,
@@ -197,19 +198,22 @@ export const useActions = ({
paragraph: "Change the title of the tag " + item.title,
positivePress: async (value: string) => {
if (!value || value === "" || value.trimStart().length == 0) return;
try {
await db.tags.add({
id: item.id,
title: value
});
await db.tags.add({
id: item.id,
title: value
});
eSendEvent(Navigation.routeNames.TaggedNotes);
InteractionManager.runAfterInteractions(() => {
useTagStore.getState().refresh();
useMenuStore.getState().setMenuPins();
Navigation.queueRoutesForUpdate();
useRelationStore.getState().update();
});
eSendEvent(Navigation.routeNames.TaggedNotes);
InteractionManager.runAfterInteractions(() => {
useTagStore.getState().refresh();
useMenuStore.getState().setMenuPins();
Navigation.queueRoutesForUpdate();
useRelationStore.getState().update();
});
} catch (e) {
ToastManager.error(e as Error, undefined, "local");
}
},
input: true,
defaultValue: item.title,
@@ -487,6 +491,14 @@ export const useActions = ({
func: () => {
MoveNotes.present(item);
}
},
{
id: "move-notebook",
title: "Move notebook",
icon: "arrow-right-bold-box-outline",
func: () => {
MoveNotebookSheet.present([item]);
}
}
);
}
@@ -736,41 +748,45 @@ export const useActions = ({
}
async function copyContent() {
if (processingId.current === "copyContent") {
ToastManager.show({
heading: "Please wait...",
message: "We are preparing your note for copy to clipboard",
context: "local"
});
return;
}
if (!checkItemSynced()) return;
if (locked) {
close();
await sleep(300);
openVault({
copyNote: true,
novault: true,
locked: true,
item: item,
title: "Copy note",
description: "Unlock note to copy to clipboard."
});
} else {
processingId.current = "copyContent";
const text = await convertNoteToText(item as Note, true);
if (!text) {
ToastManager.error(new Error(Errors.export("text")));
try {
if (processingId.current === "copyContent") {
ToastManager.show({
heading: "Please wait...",
message: "We are preparing your note for copy to clipboard",
context: "local"
});
return;
}
Clipboard.setString(text);
processingId.current = undefined;
ToastManager.show({
heading: "Note copied to clipboard",
type: "success",
context: "local"
});
if (locked) {
close();
await sleep(300);
openVault({
copyNote: true,
novault: true,
locked: true,
item: item,
title: "Copy note",
description: "Unlock note to copy to clipboard."
});
} else {
processingId.current = "copyContent";
const text = await convertNoteToText(item as Note, true);
if (!text) {
ToastManager.error(new Error(Errors.export("text")));
return;
}
Clipboard.setString(text);
processingId.current = undefined;
ToastManager.show({
heading: "Note copied to clipboard",
type: "success",
context: "local"
});
}
} catch (e) {
console.error(e);
ToastManager.error(e as Error);
}
}

View File

@@ -17,12 +17,14 @@ 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 { User } from "@notesnook/core";
import {
EV,
EVENTS,
SYNC_CHECK_IDS,
SyncStatusEvent
} from "@notesnook/core/dist/common";
import { EventManagerSubscription } from "@notesnook/core/dist/utils/event-manager";
import notifee from "@notifee/react-native";
import NetInfo, {
NetInfoState,
@@ -44,10 +46,6 @@ import RNBootSplash from "react-native-bootsplash";
import { checkVersion } from "react-native-check-version";
import Config from "react-native-config";
import * as RNIap from "react-native-iap";
import { User } from "@notesnook/core";
import { EventManagerSubscription } from "@notesnook/core/dist/utils/event-manager";
//@ts-ignore
import { enabled } from "react-native-privacy-snapshot";
import { DatabaseLogger, db, setupDatabase } from "../common/database";
import { MMKV } from "../common/database/mmkv";
import Migrate from "../components/sheets/migrate";
@@ -75,6 +73,7 @@ import {
setRecoveryKeyMessage,
setUpdateAvailableMessage
} from "../services/message";
import Notifications from "../services/notifications";
import PremiumService from "../services/premium";
import SettingsService from "../services/settings";
import Sync from "../services/sync";
@@ -84,8 +83,8 @@ import { useMessageStore } from "../stores/use-message-store";
import { useSettingStore } from "../stores/use-setting-store";
import { SyncStatus, useUserStore } from "../stores/use-user-store";
import { updateStatusBarColor } from "../utils/colors";
import { BETA } from "../utils/constants";
import {
eClearEditor,
eCloseSheet,
eLoginSessionExpired,
eOnLoadNote,
@@ -97,8 +96,6 @@ import {
import { getGithubVersion } from "../utils/github-version";
import { tabBarRef } from "../utils/global-refs";
import { sleep } from "../utils/time";
import Notifications from "../services/notifications";
import { BETA } from "../utils/constants";
const onCheckSyncStatus = async (type: SyncStatusEvent) => {
const { disableSync, disableAutoSync } = SettingsService.get();
@@ -246,19 +243,19 @@ async function checkForShareExtensionLaunchedInBackground() {
}
async function saveEditorState() {
if (editorState().currentlyEditing) {
if (!editorState().movedAway) {
const id = useTabStore.getState().getCurrentNoteId();
const note = id ? await db.notes.note(id) : undefined;
const locked = note && (await db.vaults.itemExists(note));
if (locked) return;
const state = JSON.stringify({
editing: editorState().currentlyEditing,
note: note,
movedAway: editorState().movedAway,
timestamp: Date.now()
});
MMKV.setString("appState", state);
} else {
MMKV.removeItem("appState");
}
}
@@ -390,7 +387,7 @@ export const useAppEvents = () => {
setUser(user);
useUserStore.setState({
profile: await db.user.getProfile()
profile: db.settings.getProfile()
});
if (SettingsService.get().sessionExpired) {
@@ -513,18 +510,8 @@ export const useAppEvents = () => {
const onAppStateChanged = async (state: AppStateStatus) => {
if (state === "active") {
if (SettingsService.shouldLockAppOnEnterForeground()) {
useUserStore.getState().lockApp(true);
}
notifee.setBadgeCount(0);
updateStatusBarColor();
if (
!SettingsService.canLockAppInBackground() &&
!SettingsService.get().privacyScreen
) {
enabled(false);
}
checkAutoBackup();
await reconnectSSE();
@@ -544,13 +531,6 @@ export const useAppEvents = () => {
//@ts-ignore
globalThis["IS_SHARE_EXTENSION"] = false;
} else {
SettingsService.appEnteredBackground();
const id = useTabStore.getState().getCurrentNoteId();
const note = id ? await db.notes.note(id) : undefined;
const locked = note && (await db.vaults.itemExists(note));
if (locked && SettingsService.canLockAppInBackground()) {
eSendEvent(eClearEditor);
}
await saveEditorState();
if (
SettingsService.canLockAppInBackground() &&
@@ -558,7 +538,8 @@ export const useAppEvents = () => {
!useUserStore.getState().appLocked &&
!useUserStore.getState().disableAppLockRequests
) {
if (SettingsService.getProperty("appLockTimer") === 0) {
if (SettingsService.shouldLockAppOnEnterForeground()) {
DatabaseLogger.log(`AppEvents: Locking app on enter background`);
useUserStore.getState().lockApp(true);
}
@@ -569,13 +550,6 @@ export const useAppEvents = () => {
Keyboard.dismiss();
}
}
if (
(SettingsService.get().privacyScreen ||
SettingsService.canLockAppInBackground()) &&
!useSettingStore.getState().requestBiometrics
) {
enabled(true);
}
}
};
@@ -698,6 +672,9 @@ export const useAppEvents = () => {
if (db.isInitialized) {
Notifications.setupReminders(true);
if (SettingsService.get().notifNotes) {
Notifications.pinQuickNote(false);
}
useSettingStore.getState().setAppLoading(false);
DatabaseLogger.info("Database initialized");
}

View File

@@ -71,12 +71,10 @@ export const useDBItem = <T extends keyof ItemTypeKey>(
if (typeof itemId === "string" && itemId !== itemIdRef.current) return;
if (!isValidIdOrIndex(idOrIndex)) return;
console.log("useDBItem.onUpdateItem", idOrIndex, type);
if (items && typeof idOrIndex === "number") {
items.item(idOrIndex).then((item) => {
setItem(item.item);
itemIdRef.current = item.item.id;
itemIdRef.current = item.item?.id;
});
} else {
if (!(db as any)[type + "s"][type]) {

View File

@@ -36,7 +36,6 @@ export const useNotebook = (
const onRequestUpdate = React.useCallback(() => {
if (!item?.id) return;
console.log("useNotebook.onRequestUpdate", item?.id, Date.now());
const selector = db.relations.from(
{
@@ -59,7 +58,6 @@ export const useNotebook = (
useEffect(() => {
if (nestedNotebooks) {
console.log("useNotebook.useEffect.onRequestUpdate");
onRequestUpdate();
}
}, [item?.id, onRequestUpdate, nestedNotebooks]);

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import React, { useCallback, useEffect } from "react";
import BiometicService from "../services/biometrics";
import BiometricService from "../services/biometrics";
import { eSubscribeEvent, eUnSubscribeEvent } from "../services/event-manager";
import { db } from "../common/database";
@@ -39,8 +39,8 @@ export const useVaultStatus = () => {
const checkVaultStatus = useCallback(() => {
db.vault?.exists().then(async (exists) => {
const available = await BiometicService.isBiometryAvailable();
const fingerprint = await BiometicService.hasInternetCredentials();
const available = await BiometricService.isBiometryAvailable();
const fingerprint = await BiometricService.hasInternetCredentials();
if (
VaultStatusCache.exists === exists &&
VaultStatusCache.biometryEnrolled === fingerprint &&

View File

@@ -64,6 +64,8 @@ import { useSettingStore } from "../stores/use-setting-store";
import {
eClearEditor,
eCloseFullscreenEditor,
eOnEnterEditor,
eOnExitEditor,
eOnLoadNote,
eOpenFullscreenEditor,
eUnlockNote
@@ -164,9 +166,7 @@ const _TabsHolder = () => {
_deviceMode === "smallTablet"
? dimensions.width -
valueLimiter(dimensions.width * 0.4, 300, 450)
: dimensions.width > 1100
? dimensions.width * 0.55
: dimensions.width * 0.5,
: dimensions.width * 0.48,
zIndex: null,
paddingHorizontal: 0
}
@@ -257,9 +257,7 @@ const _TabsHolder = () => {
position: "relative",
width:
current === "tablet"
? size.width > 1100
? size.width * 0.55
: size.width * 0.5
? size.width * 0.48
: current === "smallTablet"
? size.width - valueLimiter(size.width * 0.4, 300, 450)
: size.width,
@@ -271,6 +269,9 @@ const _TabsHolder = () => {
if (!needsUpdate) {
return;
}
const state = getAppState();
setTimeout(() => {
switch (current) {
case "tablet":
@@ -285,7 +286,8 @@ const _TabsHolder = () => {
break;
case "mobile":
if (
!editorState().movedAway &&
state &&
!state?.movedAway &&
useTabStore.getState().getCurrentNoteId()
) {
tabBarRef.current?.goToIndex(2, false);
@@ -367,15 +369,9 @@ const _TabsHolder = () => {
editor: dimensions.width - valueLimiter(dimensions.width * 0.4, 300, 450)
},
tablet: {
sidebar:
dimensions.width > 1100
? dimensions.width * 0.15
: dimensions.width * 0.2,
sidebar: dimensions.width * 0.22,
list: dimensions.width * 0.3,
editor:
dimensions.width > 1100
? dimensions.width * 0.55
: dimensions.width * 0.5
editor: dimensions.width * 0.48
}
};
@@ -511,11 +507,13 @@ const _TabsHolder = () => {
};
export const TabHolder = React.memo(_TabsHolder, () => true);
const onChangeTab = async (obj) => {
if (obj.i === 2) {
const onChangeTab = async (event) => {
if (event.i === 2) {
editorState().movedAway = false;
editorState().isFocused = true;
activateKeepAwake();
eSendEvent(eOnEnterEditor);
if (!useTabStore.getState().getCurrentNoteId()) {
eSendEvent(eOnLoadNote, {
newNote: true
@@ -524,16 +522,15 @@ const onChangeTab = async (obj) => {
if (
useTabStore.getState().getTab(useTabStore.getState().currentTab).locked
) {
console.log("Unlocking note....");
eSendEvent(eUnlockNote);
}
}
} else {
if (obj.from === 2) {
if (event.from === 2) {
deactivateKeepAwake();
editorState().movedAway = true;
editorState().isFocused = false;
eSendEvent(eClearEditor, "removeHandler");
eSendEvent(eOnExitEditor);
// Lock all tabs with locked notes...
for (const tab of useTabStore.getState().tabs) {

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