Compare commits

...

255 Commits

Author SHA1 Message Date
Ammar Ahmed
5e68dd129e Update android.publish.yml
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-02-27 01:03:48 +05:00
Ammar Ahmed
2350d0e41d mobile: minor fix 2024-02-27 01:02:39 +05:00
Ammar Ahmed
fbd5c8e3cd mobile: fix github release 2024-02-27 01:01:07 +05:00
Abdullah Atta
ee5c4077fe docs: improve skiff pages import guide 2024-02-13 01:07:14 +05:00
Abdullah Atta
47bbfc618e docs: add guide for migrating from skiff pages 2024-02-12 10:49:40 +05:00
Abdullah Atta
b377329a8b core: fix attachment mime type on read 2024-02-02 16:02:20 +05:00
Abdullah Atta
ae8bcf3865 ci: fix you may only define one of branches and branches-ignore for a single event
Signed-off-by: Abdullah Atta <abdullahatta@streetwriters.co>
2024-01-31 12:46:32 +05:00
Abdullah Atta
2f67611829 ci: add workflows for v3 beta publishing 2024-01-31 12:41:08 +05:00
Ammar Ahmed
058c612f4f ci: update default build tools version android
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-01-30 11:41:20 +05:00
Ammar Ahmed
be8df90ccb iOS Publish Workflow (#4194)
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-01-30 11:32:48 +05:00
Abdullah Atta
aa730b5b93 web: fix title only txt exports 2024-01-30 00:29:46 +05:00
Abdullah Atta
34bbcf6387 web: add feature highlights for v2.6.15 2024-01-29 23:33:15 +05:00
Abdullah Atta
33c3c78e2f desktop: get rid of configuration.win.signingHashAlgorithms should be an array 2024-01-29 23:27:45 +05:00
Ammar Ahmed
bf144dcda4 mobile: add ExportOptions.plist 2024-01-29 23:23:48 +05:00
Ammar Ahmed
284ebdb86f ci: @notesnook/ios
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2024-01-29 23:23:01 +05:00
Abdullah Atta
9dac4cf7f4 desktop: set signing has to sha256 2024-01-29 23:22:29 +05:00
Abdullah Atta
fb973a5514 ci: run build job no matter what 2024-01-29 23:22:29 +05:00
Abdullah Atta
f9226510f9 desktop: use full path for FilesCatalog 2024-01-29 23:22:29 +05:00
Abdullah Atta
5c0a964699 ci: add inputs to disable build for specific platforms 2024-01-29 23:22:29 +05:00
Abdullah Atta
41ffaab3dc ci: install azurecodesigning module 2024-01-29 23:22:29 +05:00
Abdullah Atta
764c721f1d desktop: add windows code signing 2024-01-29 23:22:29 +05:00
Ammar Ahmed
3d267f91ef mobile: bump version code 2024-01-29 19:55:41 +05:00
Ammar Ahmed
f10f28a7f8 mobile: release v2.6.15 2024-01-29 19:32:14 +05:00
Ammar Ahmed
8d04f89a18 mobile: remove progress bar 2024-01-29 19:06:01 +05:00
Ammar Ahmed
9d1374dcd4 editor: fix progress not showing in image on mobile 2024-01-29 19:05:49 +05:00
Abdullah Atta
094a65e514 editor: hide progress on image if 0 2024-01-29 18:26:44 +05:00
Ammar Ahmed
372da979e1 mobile: support ignoring edits 2024-01-29 18:26:44 +05:00
Abdullah Atta
d3371326f2 editor: add progress indicator to image 2024-01-29 18:26:44 +05:00
Abdullah Atta
57452bd0e6 core: allow setting custom date edited 2024-01-29 18:26:44 +05:00
Abdullah Atta
993b8460bf web: do not update dateEdited if ignoring edits 2024-01-29 18:26:44 +05:00
Abdullah Atta
081201aa42 editor: add support for ignoring edits 2024-01-29 18:26:44 +05:00
Abdullah Atta
270e6778d1 editor: optimize image loading when fast scrolling 2024-01-29 16:23:59 +05:00
Abdullah Atta
2074320583 editor: revoke blob urls on image unmount 2024-01-29 16:09:05 +05:00
Abdullah Atta
cd90030616 web: fix note title in toolbar not changing 2024-01-29 15:45:13 +05:00
Abdullah Atta
807bd683b7 web: do not show success prompt on unlock cancel 2024-01-29 15:36:01 +05:00
Abdullah Atta
35929026a4 web: monograph.notesnook.com > monogr.ph 2024-01-29 15:22:22 +05:00
Ammar Ahmed
41eb94ee47 mobile: fix exporting locked notes 2024-01-29 11:02:32 +05:00
Ammar Ahmed
ba51e110ad mobile: fix opening webclips 2024-01-29 11:02:32 +05:00
Ammar Ahmed
ecad06d249 mobile: disable rtl mode 2024-01-29 11:02:32 +05:00
Abdullah Atta
19a151f637 editor: fix image query matching all images in editor 2024-01-28 17:17:45 +05:00
Ammar Ahmed
7c4a6f1e17 global: update deps 2024-01-27 23:06:24 +05:00
Ammar Ahmed
bc88e953d1 mobile: make sure tools render in toolbar 2024-01-27 23:05:30 +05:00
Ammar Ahmed
7d89ec676a mobile: fix attachments not loading when added from share ext 2024-01-27 22:50:41 +05:00
Ammar Ahmed
c8f8bcca93 mobile: organize bulk exports 2024-01-27 21:23:29 +05:00
Abdullah Atta
9fa904e849 web: fix exporting of single note 2024-01-27 21:23:29 +05:00
Abdullah Atta
05cc947cb4 web: fix pdf exports 2024-01-27 21:23:29 +05:00
alihamuh
a20a683b17 web: code refactoring 2024-01-27 21:23:29 +05:00
alihamuh
5fc43c931e web: added directory paths for exports 2024-01-27 21:23:29 +05:00
Abdullah Atta
0879c3b4d6 core: fix formatting of single spaced paragarphs in markdown exports (#4186)
* core: update showdown library to support single spaced paragraphs

* core: add tests

* core: update showdown library
2024-01-27 18:59:35 +05:00
Abdullah Atta
2eded71de3 core: fix restored attachments not syncing 2024-01-27 16:06:04 +05:00
Abdullah Atta
9e30ee50b8 core: add logs 2024-01-27 16:06:04 +05:00
Abdullah Atta
08621a5873 core: try to preserve mime type on backup restore 2024-01-27 16:06:04 +05:00
Abdullah Atta
17f5bd28ba web: do not overwrite filename & mimetype on attachment reupload 2024-01-27 16:06:04 +05:00
Ammar Ahmed
4558c0b2eb mobile: fix downloading attachments from editor 2024-01-27 16:06:04 +05:00
Abdullah Atta
a442677e91 editor: fix loading of images that have wrong mime type 2024-01-27 16:06:04 +05:00
Abdullah Atta
95666bee36 editor: remove attachment progress once it reaches 100 2024-01-27 16:06:04 +05:00
Abdullah Atta
c4232ac95a web: do not send hash when updating attachment 2024-01-27 16:06:04 +05:00
Abdullah Atta
0283037289 mobile: changes related to download cancellation 2024-01-27 16:06:04 +05:00
Abdullah Atta
b6fd0df715 web: get rid of all attachment loading logic 2024-01-27 16:06:04 +05:00
Abdullah Atta
f53fb58024 editor: eagerly load image/webclip instead of waiting on client 2024-01-27 16:06:04 +05:00
Abdullah Atta
21d452308d core: simplify download cancellation 2024-01-27 16:06:04 +05:00
Ammar Ahmed
823608cca1 mobile: daily trash cleanup 2024-01-27 16:05:28 +05:00
alihamuh
f3a0b998e4 web: added daily trash interval option 2024-01-27 16:05:28 +05:00
theProton
a47a38b16b web: fix incorrect title on scrolling note (#4137)
Signed-off-by: Parthiv-M <parthivmenon.dev@gmail.com>
2024-01-27 11:44:58 +05:00
Ammar Ahmed
a184c53dd5 mobile: fix loading empty conent in editor on tablets 2024-01-26 23:02:06 +05:00
Abdullah Atta
a3464255ec core: always use attachment mime type from backup if possible 2024-01-26 19:21:55 +05:00
Abdullah Atta
088c6670a9 core: fix crash if note title only contains whitespace 2024-01-26 19:12:41 +05:00
Abdullah Atta
27840b9bd6 editor: fix link pasting (#4178) 2024-01-26 18:57:59 +05:00
Muhammad Ali
ae819504f0 editor: fix input rules not working at the end of note (#4130)
* web: added condition in getDeletedNodes

* editor: some corrections

* editor: merge if conditions

---------

Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2024-01-26 16:43:19 +05:00
Muhammad Ali
af792e394c web: add support for moving locked notes to trash (#4134)
* web: added support for single/multi trash notes

* web: show error when trying to preview a locked note in trash

---------

Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2024-01-26 16:37:54 +05:00
Muhammad Ali
76a4d5c2a5 editor: fix subtasks getting unchecked on drag/drop reorder (#4135)
* editor: add a condition to check nested item state

* editor: force coerce value to boolean

---------

Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2024-01-26 16:31:23 +05:00
Muhammad Ali
4e23acd608 web: fix realtime editor sync cannot be disabled (#4140) 2024-01-26 16:22:56 +05:00
Ammar Ahmed
3c65dcdd8b ci: bump android build tools version 2024-01-15 12:31:37 +05:00
Ammar Ahmed
efea6e3972 theme: add missing alpha colors 2024-01-15 12:31:11 +05:00
Ammar Ahmed
185cca7880 mobile: release v2.6.15 2024-01-12 20:10:58 +05:00
Abdullah Atta
fbded93405 global: update lockfiles 2024-01-05 22:10:05 +05:00
Abdullah Atta
674881b873 web: add zip64 support for backups, export & imports (#4079)
* web: use @zip.js/zip.js for reading zip files

* web: always use zip streams for writing zips

* core: fix types

* theme: update lockfile
2024-01-05 22:05:04 +05:00
Abdullah Atta
248fb6dd2d web: bump version to 2.6.14 2024-01-05 21:55:18 +05:00
Abdullah Atta
3211e7a149 global: update lockfiles 2024-01-05 21:54:06 +05:00
Abdullah Atta
08496c699e editor: fix font size changes back after exiting list (fixes #3602) 2024-01-05 21:48:00 +05:00
Abdullah Atta
060fa25814 core: support underline when exporting as md (fix #3990) 2024-01-05 20:53:14 +05:00
Abdullah Atta
a6b1effc77 core: remove relations auto cleanup 2024-01-05 16:24:02 +05:00
Abdullah Atta
5cf9c4808e web: show resubscribe button if subscription is canceled 2024-01-05 15:55:36 +05:00
Muhammad Ali
d5a44067fd web: fix editor header title input not becoming readonly (#4064) 2024-01-05 11:08:16 +05:00
Muhammad Ali
0de463526f editor: add support for +/- font-size using shortcut keys (#4029) 2024-01-05 10:40:29 +05:00
Muhammad Ali
5fd79875ef editor: fix math/formula block getting cut off on mobile (#4023) 2024-01-05 10:39:20 +05:00
Muhammad Ali
bdb19ad325 web: add license to settings (#4020) 2024-01-05 10:38:13 +05:00
Ammar Ahmed
7a12efc823 mobile: release v2.6.14 2023-12-22 11:58:34 +05:00
Abdullah Atta
2f3bddf860 web: bump version to 2.6.13 2023-12-22 11:51:11 +05:00
Abdullah Atta
6127eb97af editor: do not mark task list as completed if there are no items 2023-12-22 11:49:10 +05:00
Abdullah Atta
86386e14f3 web: update test snapshots 2023-12-22 11:41:42 +05:00
Abdullah Atta
9cc17c29f6 web: use Cmd-a on macOS to select all items in list 2023-12-22 11:38:40 +05:00
Abdullah Atta
a31e863c7b global: update lockfiles 2023-12-22 11:16:26 +05:00
Muhammad Ali
15a32ac83a editor: fix pasting a word inside a list adds newlines around it (#3843)
* editor: added openstart, openEnd from old slice

* editor: removed extra import

* editor: update test snapshots

---------

Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-12-22 11:11:03 +05:00
Ammar Ahmed
fa5b84ec0d mobile: minor fixes 2023-12-22 11:10:19 +05:00
Muhammad Ali
7905584eac editor: disable invalid tools when inside a code block (#3997)
* editor: removed fontSize property from code-text style

* editor: TO BE CONTINUED

* editor: some comments for testing

* editor: comment removed

* editor: diabled font size and family in code-block

* editor: disable invalid tools when inside code block

* editor: remove unused console.log

---------

Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-12-22 10:26:25 +05:00
Abdullah Atta
afc9b96a11 web: make importer error resistant 2023-12-21 09:08:04 +05:00
Abdullah Atta
4e6466fc18 editor: handle md links with parentheses (#3996) 2023-12-19 14:54:22 +05:00
Abdullah Atta
233baf78ce web: handle file picker dialog cancelation 2023-12-19 14:39:45 +05:00
Abdullah Atta
42d0bee37f desktop: bump electron to 25.9.8 2023-12-19 13:07:34 +05:00
Abdullah Atta
ccadab6a10 web: add md + frontmatter to export all options 2023-12-19 12:44:23 +05:00
Muhammad Ali
bfe5a5cb96 editor: correctly style other types of lists in outline list (#3889) 2023-12-19 12:15:36 +05:00
Muhammad Ali
88fc24c4cf editor: fix code blocks pasting in a single line without formatting (#3910)
* editor: added code support for w3school

* editor: fixed newline issue in per tag code
2023-12-19 12:13:59 +05:00
Abdullah Atta
8be4fea7a3 ui: use symbols for shortcut keys on macOS 2023-12-19 11:12:20 +05:00
Muhammad Ali
a3d39d8b6d editor: add Ctrl/Cmd+\ keyboard shortcut for "Clear all formatting" (#3989)
* editor: added short-cut key in keyap

* editor: use Mod key instead of Ctrl

---------

Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-12-19 11:11:35 +05:00
Muhammad Ali
ff36f0259a editor: add support for converting md link syntax to link on paste (#3919) 2023-12-18 16:23:56 +05:00
Muhammad Ali
d13654088a editor: add support for checking/unchecking all items in a task list (#3975) 2023-12-18 16:21:44 +05:00
Muhammad Ali
8a6b97c757 editor: add special readonly mode for toolbar (#3913)
* editor: added a toolbar display on mobile in readonly mode

* editor: hide editable tools from readonly toolbar

---------

Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-12-18 16:04:02 +05:00
Muhammad Ali
d71e0c109b web: going back in search after editing a notebook opens notebook edit dialog again (#3979)
* web: changed afterAction()

* web: fix back navigation for dialogs that replace

* web: remove unused import

---------

Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-12-18 15:58:20 +05:00
Ammar Ahmed
7e345303fe mobile: fix app lock hides login page on enter background 2023-12-18 10:49:57 +05:00
Abdullah Atta
d881bdb77c web: fix attachment dialog not opening on error 2023-12-11 15:09:38 +05:00
Ammar Ahmed
4961102d8f mobile: fix subscriptions not verified on ios 2023-12-11 10:54:45 +05:00
Abdullah Atta
4f2ab4f1da docs: fix incorrect noun (fixes #3934)
Signed-off-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-12-07 09:56:55 +05:00
Ammar Ahmed
7540e34366 mobile: update provisioning profiles 2023-11-27 08:22:47 +05:00
Abdullah Atta
4d7a8b9ea0 web: bump version to 2.6.12 2023-11-25 22:20:39 +05:00
Abdullah Atta
812ecf93c8 web: fix tag tests 2023-11-25 22:18:05 +05:00
Ammar Ahmed
74d99d97bc mobile: release v2.6.12 2023-11-25 15:44:43 +05:00
Muhammad Ali
5bbc453268 web: fix new tags do not appear under "recent" tags (#3827) 2023-11-25 15:39:38 +05:00
Ammar Ahmed
d71b9edc7f mobile: add support for markdown + frontmatter 2023-11-25 15:32:31 +05:00
Abdullah Atta
134904b551 web: add md with frontmatter export 2023-11-25 15:32:31 +05:00
Abdullah Atta
3eeb292d70 core: add new md + frontmatter export format 2023-11-25 15:32:31 +05:00
Abdullah Atta
04125bbb98 web: minor ui fixes 2023-11-25 15:19:50 +05:00
Ammar Ahmed
cfc3a8341c mobile: update mmkv package 2023-11-25 15:19:27 +05:00
Abdullah Atta
cbb0a511a8 core: fix logs sorting 2023-11-25 15:19:27 +05:00
Abdullah Atta
dff1c7ed32 core: optimize logger 2023-11-25 15:19:27 +05:00
Abdullah Atta
7987ef81a6 web: use removeMulti to bulk remove old logs 2023-11-25 15:19:27 +05:00
Ammar Ahmed
8d8d4ee782 mobile: fix app freeze when deleting old logs 2023-11-25 15:19:27 +05:00
Ammar Ahmed
3a50c73cab core: add removeMulti to storage 2023-11-25 15:19:27 +05:00
Abdullah Atta
4ee0071eca core: stop localOnly items from always getting synced 2023-11-25 15:12:33 +05:00
Muhammad Ali
248192f404 editor: hide link popup in readonly mode on mobile (#3853) 2023-11-25 11:29:02 +05:00
Krishna Bharadwaj
e56b766c3a web: open testimonial source links in new tab (#3863)
Signed-off-by: Dharmavineta <krishnabharadwaj1995@gmail.com>
2023-11-25 11:27:24 +05:00
Abdullah Atta
170b2b24ab web: fix logged in status alignment 2023-11-25 11:26:19 +05:00
Ammar Ahmed
50137e0994 mobile: fix subscriptions not fulfilling on ios 2023-11-25 10:32:24 +05:00
Abdullah Atta
8b5babd5f8 desktop: use node.js fetch instead of net.fetch 2023-11-25 10:20:19 +05:00
Abdullah Atta
39e83200c8 web: fix attachment upload progress on desktop 2023-11-25 10:19:57 +05:00
Abdullah Atta
ead0e0107e core: allow deleting unuploaded attachments 2023-11-25 10:19:38 +05:00
Abdullah Atta
1c888bd4fd web: always open announcement link in browser on desktop app 2023-11-25 10:18:20 +05:00
Krishna Bharadwaj
ff92530339 web: hide email address from status bar (#3859) 2023-11-24 11:18:46 +05:00
Ammar Ahmed
ee38032403 mobile: release v2.6.11 2023-11-22 14:45:16 +05:00
Ammar Ahmed
2ce245659a mobile: fix pricing plans 2023-11-22 14:27:20 +05:00
Abdullah Atta
2c635eb4d7 web: bump version to 2.6.11 2023-11-22 10:44:39 +05:00
Abdullah Atta
d653223df0 editor: load images threadsafely 2023-11-22 10:36:48 +05:00
Muhammad Ali
290b0dfc78 web: close reminder dialog on setting snooze time (#3842) 2023-11-21 10:53:53 +05:00
Muhammad Ali
06bb9e654b web: fix weird janky animation when opening dialogs (#3826) 2023-11-21 08:20:26 +05:00
Muhammad Ali
576fe78e33 clipper: hide clip preview button when there's no clip data (#3772) 2023-11-21 08:18:28 +05:00
Abdullah Atta
0c16bfb5ff web: fix issue with service worker not getting registered 2023-11-20 12:34:07 +05:00
Abdullah Atta
a101dbdf31 web: use bloburl when previewing images 2023-11-20 11:12:02 +05:00
Abdullah Atta
682609044f editor: add support for previewing SVG images 2023-11-20 11:12:02 +05:00
Abdullah Atta
c0a7fb3a5c misc: remove unnecessary files 2023-11-20 10:01:08 +05:00
Abdullah Atta
a153aa791c web: bump version to 2.6.10 2023-11-20 09:49:31 +05:00
Abdullah Atta
76b3dd1f96 web: check if file exists before starting upload 2023-11-20 09:41:35 +05:00
Ammar Ahmed
8b9e2c8526 mobile: release v2.6.10 2023-11-20 08:44:42 +05:00
Ammar Ahmed
0dc2d14736 mobile: fix crash on pricing plans page on ios 2023-11-20 08:27:49 +05:00
Abdullah Atta
fc5dada701 editor: fix task items getting unchecked on sort 2023-11-20 08:25:27 +05:00
Abdullah Atta
f34060c4e0 editor: fix task list title getting reset 2023-11-20 08:25:27 +05:00
Abdullah Atta
006a239680 web: bump version to 2.6.9 2023-11-18 15:13:40 +05:00
Abdullah Atta
c6ed4bcab1 web: allow restoring backups when logged out 2023-11-18 15:13:05 +05:00
Abdullah Atta
b0fe967087 desktop: destroy system tray on toggle off setting 2023-11-18 14:53:14 +05:00
Abdullah Atta
3f32673b0a desktop: permanently disable menu bar 2023-11-18 14:45:17 +05:00
Ammar Ahmed
0525cecaee mobile: bump version code on android 2023-11-18 14:38:37 +05:00
Ammar Ahmed
7d84a9582b mobile: allow restoring backups when logged out 2023-11-18 14:38:37 +05:00
Abdullah Atta
289acd8ab6 web: add cross icon for removing tags 2023-11-18 14:35:57 +05:00
Abdullah Atta
bb6d9f604b web: wait 1s for math to render on pdf print 2023-11-18 14:23:57 +05:00
Abdullah Atta
c20a8232cd core: safe check for IS_DESKTOP_APP 2023-11-18 14:23:57 +05:00
Ammar Ahmed
c886212e89 core: add padding to math block in exports 2023-11-18 14:23:57 +05:00
Abdullah Atta
799ae111ae editor: disable resizing of floating images 2023-11-18 13:05:00 +05:00
Abdullah Atta
2a990979a0 editor: fix drag/drop of task items 2023-11-18 13:04:45 +05:00
Ammar Ahmed
2d1071117b mobile: release v2.6.9 2023-11-18 12:17:27 +05:00
Ammar Ahmed
aefce1ee67 mobile: add support /now /time in title 2023-11-18 12:17:27 +05:00
Ammar Ahmed
64d10f5050 mobile: reupload if file size is zero 2023-11-18 12:17:11 +05:00
Abdullah Atta
95b9edca62 web: check if attachment really exists on insertion 2023-11-18 12:17:11 +05:00
Abdullah Atta
06c8422cbe core: prevent duplicate attachments on backup restore 2023-11-18 12:17:11 +05:00
Abdullah Atta
177d8b5112 web: remove rogue console.log 2023-11-18 10:18:53 +05:00
Abdullah Atta
39afa98fce web: lazily load fs module 2023-11-18 10:17:23 +05:00
Abdullah Atta
5bc1ad4ba5 editor: fix url is undefined error in loading images 2023-11-18 10:16:59 +05:00
Abdullah Atta
0b1223976c web: fix builds 2023-11-18 10:03:14 +05:00
Muhammad Ali
3873758fe5 clipper(web): add fallback height & width for web clip(#3766) 2023-11-18 10:03:14 +05:00
Abdullah Atta
3c876cb1d8 global: update lockfiles 2023-11-18 10:03:13 +05:00
Abdullah Atta
0a1a16c197 editor: show placeholder when downloading image 2023-11-18 10:03:13 +05:00
Ammar Ahmed
3c56325fa6 mobile: fix image download 2023-11-18 10:03:13 +05:00
Abdullah Atta
e5db3353ae editor: improve image loading 2023-11-18 10:03:13 +05:00
Muhammad Ali
3416ba4eaa editor: removed a useState method 2023-11-18 10:03:13 +05:00
Muhammad Ali
cdb69bf553 editor: removed updateImage command from useEffect 2023-11-18 10:03:13 +05:00
Abdullah Atta
1aff6d0d55 editor: sync task list state at the very end 2023-11-18 10:03:13 +05:00
Ammar Ahmed
67b7bdcea3 mobile: update iap library to latest 2023-11-18 10:02:45 +05:00
Abdullah Atta
9b6a6de415 editor: update snapshots 2023-11-17 12:50:43 +05:00
Abdullah Atta
8325246a56 web: reduce network check retries to 3 2023-11-17 11:49:52 +05:00
Abdullah Atta
3d11fb5e3f web: specify if session has expired during login 2023-11-17 08:44:17 +05:00
Abdullah Atta
4627a58a52 web: show tags in readonly mode 2023-11-17 08:34:16 +05:00
Muhammad Ali
e557047af1 web: fix pressing enter to add a new tag from list of suggestion fails (#3548)
* web: added ref to control resturn key func

* web: click should open autosuggestions menu

---------

Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-11-17 08:30:13 +05:00
Muhammad Ali
8b4cea7339 editor: make table header row immovable (#3459) 2023-11-16 15:30:32 +05:00
Muhammad Ali
ba5e35ec5c editor: fix resize for floating images (#3643)
* editor: removed maxWidth to make image float resizeable

* editor: fix resize for floating images

---------

Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-11-16 15:26:25 +05:00
aryan katiyar
f53817e94d web: add link to source code in Settings (#3683) 2023-11-16 15:18:11 +05:00
Muhammad Ali
846efc5351 editor: use prosemirror plugin for managing task list state (#3252)
Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-11-16 15:12:19 +05:00
Abdullah Atta
0149d00d64 web: add support for storing attachments in opfs or cache storage 2023-11-16 15:01:48 +05:00
Abdullah Atta
275f9730f1 web: allow downloading unuploading attachments 2023-11-16 15:01:48 +05:00
Abdullah Atta
43bc954989 core: allow uploading attachments that are in 0 notes 2023-11-16 15:01:48 +05:00
Abdullah Atta
c88bc722e1 fs: get rid of localforage and use generic interface 2023-11-16 15:01:48 +05:00
Muhammad Ali
ec6fc6839e editor: support datetime shortcuts in task list title & note title (#3746)
Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-11-16 14:14:43 +05:00
Abdullah Atta
8383c93292 desktop: only set openAtLogin if not already set 2023-11-16 13:07:21 +05:00
Muhammad Ali
37d8d85935 clipper: delete import css rules after iteration (#3720)
Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-11-16 13:06:51 +05:00
Muhammad Ali
95db7c6329 desktop: fix minimize to system tray not working immediately after enabling (#3734)
Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-11-16 13:01:22 +05:00
Muhammad Ali
636783335f desktop: add setting to disable menu bar (#3728)
Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-11-16 09:51:01 +05:00
Abdullah Atta
f88431ded4 core: handle case where headline is undefined 2023-11-03 08:28:41 +05:00
Abdullah Atta
91b0de0580 web: bump version to 2.6.8 2023-11-02 13:23:00 +05:00
Abdullah Atta
a5704ad75c desktop: do not show auto update toggle for flatpak users 2023-11-02 13:20:51 +05:00
Abdullah Atta
ba8c09a7d9 desktop: update electron to 25.9.3 2023-11-02 13:07:15 +05:00
Abdullah Atta
dbe4015655 web: preserve note edited time when exporting 2023-11-02 12:59:47 +05:00
Abdullah Atta
76237ad7dd web: fix sync progress in account recovery 2023-11-02 10:35:06 +05:00
Abdullah Atta
dbfb1168fb core: fix restored notes not syncing (closes #3472) 2023-11-02 10:34:21 +05:00
Abdullah Atta
830d28fbe5 editor: fix pasting link replaces selected text
fixes #3520
2023-10-31 12:33:49 +05:00
Abdullah Atta
c6def2a8fe web: fix crash on opening editor properties
(fixes #3585)
2023-10-31 12:03:45 +05:00
Abdullah Atta
ebc95fcea7 web: make duplicate filenames in attachments unique on download (#3678)
* web: make duplicate filenames in attachments unique

* Update apps/web/src/utils/streams/attachment-stream.ts

Signed-off-by: Abdullah Atta <thecodrr@protonmail.com>

* web: make attachment filename case insensitive

---------

Signed-off-by: Abdullah Atta <thecodrr@protonmail.com>
2023-10-31 11:35:01 +05:00
Abdullah Atta
f78cfe59e8 web: hide note title immediately on setting change 2023-10-31 11:12:11 +05:00
Johnny Avila
a2cbc93d34 web: add setting to allow hiding note title from window title (#3480)
Signed-off-by: Johnny Avila <avila.johnny11@gmail.com>
Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-10-31 11:08:14 +05:00
Muhammad Ali
4728f14e8c core: add year when grouping by month (#3630) 2023-10-31 10:57:52 +05:00
Abdullah Atta
e94b431d58 web: change pwa theme color according to current theme (#3621)
* web: change pwa theme color according to current theme

* web: use background color as pwa theme-color
2023-10-31 10:56:37 +05:00
Muhammad Ali
0ac5e2b995 web: hide unnecessary items from status bar in focus mode (#3577)
* web: used app-store to hide sync-status suring focus mode

* web: hide useless items from status bar in focus mode

---------

Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-10-31 10:54:57 +05:00
Muhammad Ali
365764e3e3 web: update vault setting immediately after vault creation (#3542)
* web: added onStateChange function to vault-settings.

* web: fix font style of checkbox in password dialog

---------

Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-10-31 10:50:38 +05:00
Ammar Ahmed
8d2b5aa3de mobile: release v2.6.8 2023-10-30 15:24:30 +05:00
Ammar Ahmed
9a031a4a43 mobile: fix selection state causing delete to fail 2023-10-30 14:25:14 +05:00
Ammar Ahmed
d412679fd7 mobile: fix relogin in session expired mode 2023-10-30 11:56:52 +05:00
Ammar Ahmed
22c52d4432 core: reset lastSynced if new login 2023-10-30 11:55:43 +05:00
Ammar Ahmed
9e5bdf9e33 core: fix access token not saved 2023-10-30 11:55:14 +05:00
Abdullah Atta
7253eca5c0 core: do not allow saving empty token response 2023-10-30 10:55:39 +05:00
Abdullah Atta
b1f3dc29c5 core: use single sse command for logging the user out 2023-10-30 10:55:39 +05:00
Abdullah Atta
8e3df8d41b editor: disallow links in inline code 2023-10-30 10:41:04 +05:00
Ammar Ahmed
efad22c00a mobile: fix 24 hour reminder time 2023-10-30 10:26:15 +05:00
Ammar Ahmed
b7690f13b1 mobile: hide pinned notification subtitle 2023-10-30 09:58:52 +05:00
Ammar Ahmed
6e1739da2e mobile: fix note not added to default notebook in widget 2023-10-24 17:35:53 +05:00
Ammar Ahmed
77ab423041 mobile: fix keep in view in editor (#3612) 2023-10-24 16:54:00 +05:00
Ammar Ahmed
96a8e885d3 Fix session expiry dialog not presented when user encryption key is not found (#3625)
* core: fix session expired dialog not shown when
user encryption key does not
exist

* core: add watch command
2023-10-24 15:58:26 +05:00
Ammar Ahmed
2b917c7eca mobile: fix pin input hide behind keyboard on session expiry sheet (#3624) 2023-10-24 15:57:20 +05:00
Ammar Ahmed
942d2f7a4e mobile: fix system bar colors (#3611) 2023-10-24 12:44:41 +05:00
Ammar Ahmed
75142ff1b2 mobile: fix session id mismatch causing editor to get stuck.(#3613) 2023-10-24 09:18:55 +05:00
Abdullah Atta
74172dc3fa docs: update organizing notes using notebooks doc 2023-10-03 14:42:54 +05:00
Abdullah Atta
848fdda8d7 docs: update outdated documentation 2023-10-03 13:44:21 +05:00
Abdullah Atta
3895569a0c setup: make flatpak source generation more robust 2023-10-03 12:02:27 +05:00
Abdullah Atta
0aac29ca76 web: bump version to 2.6.7 2023-10-02 21:06:08 +05:00
Abdullah Atta
25f9eece8d web: remove blur from dialogs 2023-10-02 21:06:08 +05:00
Ammar Ahmed
0e22b8ab2c mobile: release v2.6.7 2023-10-02 19:01:16 +05:00
Abdullah Atta
577c2ce6cd core: auto create vault if non exists & user opens a locked note 2023-10-02 18:00:36 +05:00
Abdullah Atta
5b9cb8ca4b desktop: fix close to system tray only works once 2023-10-02 17:56:41 +05:00
Ammar Ahmed
2eda93c0c2 mobile: fix add to notebook sheet hangs with many notebooks (#3505)
Signed-off-by: Ammar Ahmed <40239442+ammarahm-ed@users.noreply.github.com>
2023-10-02 17:06:28 +05:00
Ammar Ahmed
d916adf2e3 mobile: fix dialog show above app lock 2023-10-02 17:05:41 +05:00
Abdullah Atta
1f065bcbb2 web: do not show save dialog when Ctrl+S is pressed 2023-10-02 16:37:09 +05:00
Abdullah Atta
3efdd9505e editor: do not open keyboard on task item drop 2023-10-02 16:22:20 +05:00
Abdullah Atta
ab3f5f6a6c editor: hide scrollbar in math nodes 2023-10-02 16:17:39 +05:00
Muhammad Ali
9027be7bbb web: add menu item to allow copying a note as text or markdown (#3193)
Co-authored-by: Abdullah Atta <abdullahatta@streetwriters.co>
2023-10-02 16:09:35 +05:00
Abdullah Atta
7b08b5c035 core: fix vault key not getting synced 2023-10-02 16:07:52 +05:00
Abdullah Atta
4a557c67b7 core: fix require prismjs on desktop build 2023-10-02 15:28:47 +05:00
Abdullah Atta
a6ebe092e8 core: fix undefined is not an object when publishing empty note 2023-10-02 15:15:21 +05:00
Midhun Sudhir
9759e1b396 mobile: fix typo in pricing plans (#3477)
Signed-off-by: Midhun Sudhir <60651970+midhun3301@users.noreply.github.com>
2023-09-28 23:19:15 +05:00
Ammar Ahmed
b6147ca5a1 mobile: release v2.6.6 2023-09-25 13:26:40 +05:00
Ammar Ahmed
83887db77a mobile: pass e2e tests 2023-09-25 13:26:40 +05:00
321 changed files with 12848 additions and 38833 deletions

View File

@@ -1,4 +1,4 @@
name: Publish @notesnook/mobile name: Publish @notesnook/android
on: workflow_dispatch on: workflow_dispatch
@@ -28,30 +28,6 @@ jobs:
- name: Make Gradlew Executable - name: Make Gradlew Executable
run: cd apps/mobile/native/android && chmod +x ./gradlew run: cd apps/mobile/native/android && chmod +x ./gradlew
- name: Build unsigned app bundle
run: yarn release:android:bundle
- name: Sign app bundle for Playstore release
id: sign_app
uses: r0adkll/sign-android-release@v1
with:
releaseDirectory: apps/mobile/native/android/app/build/outputs/bundle/release
signingKeyBase64: ${{ secrets.SIGNING_KEY }}
alias: ${{ secrets.ALIAS }}
keyStorePassword: ${{ secrets.KEY_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
- name: Publish to Playstore
id: deploy
uses: r0adkll/upload-google-play@v1.1.1
with:
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
packageName: com.streetwriters.notesnook
releaseFiles: ${{steps.sign_app.outputs.signedReleaseFile}}
track: production
status: completed
whatsNewDirectory: apps/mobile/native/android/releasenotes/
- name: Build apks for Github release - name: Build apks for Github release
run: yarn release:android run: yarn release:android
@@ -64,6 +40,8 @@ jobs:
alias: ${{ secrets.PUBLIC_ALIAS }} alias: ${{ secrets.PUBLIC_ALIAS }}
keyStorePassword: ${{ secrets.PUBLIC_KEY_PASSWORD }} keyStorePassword: ${{ secrets.PUBLIC_KEY_PASSWORD }}
keyPassword: ${{ secrets.PUBLIC_KEY_PASSWORD }} keyPassword: ${{ secrets.PUBLIC_KEY_PASSWORD }}
env:
BUILD_TOOLS_VERSION: "33.0.0"
- name: Rename apk files - name: Rename apk files
run: | run: |

View File

@@ -18,6 +18,21 @@ on:
required: true required: true
default: true default: true
description: "Publish on GitHub releases?" description: "Publish on GitHub releases?"
build-windows:
type: boolean
required: true
default: true
description: "Build for Windows?"
build-linux:
type: boolean
required: true
default: true
description: "Build for Linux?"
build-mac:
type: boolean
required: true
default: true
description: "Build for macOS?"
jobs: jobs:
build: build:
@@ -71,6 +86,7 @@ jobs:
build-macos: build-macos:
name: Build for macOS name: Build for macOS
needs: build needs: build
if: inputs.build-mac
runs-on: macos-12 runs-on: macos-12
steps: steps:
@@ -163,6 +179,7 @@ jobs:
build-linux: build-linux:
name: Build for Linux name: Build for Linux
needs: build needs: build
if: inputs.build-linux
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
@@ -221,12 +238,22 @@ jobs:
build-windows: build-windows:
name: Build for Windows name: Build for Windows
needs: build needs: build
if: inputs.build-windows
runs-on: windows-latest runs-on: windows-latest
steps: steps:
- name: Check out Git repository - name: Check out Git repository
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Setup .NET Core SDK
uses: actions/setup-dotnet@v2
with:
dotnet-version: 6.0.x
- name: Install AzureCodeSigning
run: Install-Module -Name AzureCodeSigning -RequiredVersion 0.3.0 -Force -Repository PSGallery
shell: pwsh
- name: Setup Node - name: Setup Node
uses: ./.github/actions/setup-node-with-cache uses: ./.github/actions/setup-node-with-cache
@@ -247,6 +274,9 @@ jobs:
- name: Publish - name: Publish
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
run: | run: |
if ($${{ inputs.publish-github }} -eq $true) { if ($${{ inputs.publish-github }} -eq $true) {
yarn electron-builder --win --publish always yarn electron-builder --win --publish always

67
.github/workflows/ios.publish.yml vendored Normal file
View File

@@ -0,0 +1,67 @@
name: Publish @notesnook/ios
on: workflow_dispatch
jobs:
build:
runs-on: macos-13
timeout-minutes: 60
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Node
uses: ./.github/actions/setup-node-with-cache
- name: Install node modules
run: |
npm ci --ignore-scripts --prefer-offline --no-audit
npm run bootstrap -- --scope=mobile
- name: Build packages
run: npx nx run @notesnook/mobile:build
- name: Install Pods
run: npm run prepare:ios
- name: Build iOS App
uses: yukiarrr/ios-build-action@v1.11.2
with:
bundle-identifier: org.streetwriters.notesnook
scheme: Notesnook
configuration: "Release"
export-options: apps/mobile/native/ios/ExportOptions.plist
project-path: apps/mobile/native/ios/Notesnook.xcodeproj
workspace-path: apps/mobile/native/ios/Notesnook.xcworkspace
update-targets: |
Notesnook
Make Note
NotesWidgetExtension
disable-targets: Notesnook-tvOS,Notesnook-tvOSTests,NotesnookTests
code-signing-identity: Apple Distribution
team-id: ${{ secrets.APPLE_TEAM_ID }}
p12-base64: ${{ secrets.APPLE_CERTIFICATE_P12 }}
certificate-password: ${{ secrets.APPLE_CERTIFICATE_P12_PASSWORD }}
app-store-connect-api-key-issuer-id: ${{ secrets.API_KEY_ISSUER_ID }}
app-store-connect-api-key-id: ${{ secrets.APPSTORE_KEY_ID }}
app-store-connect-api-key-base64: ${{ secrets.APPSTORE_CONNECT_API_KEY_BASE64 }}
output-path: Notesnook.ipa
mobileprovision-base64: |
${{ secrets.APPLE_MOBILE_PROVISION_APP }}
${{ secrets.APPLE_MOBILE_PROVISION_SHARE }}
${{ secrets.APPLE_MOBILE_PROVISION_WIDGET }}
- name: 'Upload app to TestFlight'
uses: apple-actions/upload-testflight-build@v1
with:
app-path: Notesnook.ipa
issuer-id: ${{ secrets.API_KEY_ISSUER_ID }}
api-key-id: ${{ secrets.API_KEY_ID }}
api-private-key: ${{ secrets.API_KEY }}
- name: Upload to Github
uses: actions/upload-artifact@v2
with:
name: Notesnook.ipa
path: Notesnook.ipa

View File

@@ -1,10 +1,11 @@
name: Publish @notesnook/web Beta name: Publish @notesnook/web Beta
on: on:
workflow_dispatch: workflow_dispatch:
push: push:
branches: branches:
- master - master
- '!v3-beta'
paths-ignore: paths-ignore:
- "apps/mobile/**" - "apps/mobile/**"
- "packages/editor-mobile/**" - "packages/editor-mobile/**"
@@ -22,6 +23,7 @@ on:
- synchronize - synchronize
branches: branches:
- master - master
- '!v3-beta'
paths-ignore: paths-ignore:
- "apps/mobile/**" - "apps/mobile/**"
- "packages/editor-mobile/**" - "packages/editor-mobile/**"

View File

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

3
.gitignore vendored
View File

@@ -9,4 +9,5 @@ nx-cloud.env
.env.local .env.local
.nyc_output .nyc_output
site site
node_modules.backup node_modules.backup
.nx

View File

@@ -1,12 +1,12 @@
{ {
"name": "@notesnook/desktop", "name": "@notesnook/desktop",
"version": "2.6.6", "version": "2.6.15",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@notesnook/desktop", "name": "@notesnook/desktop",
"version": "2.6.6", "version": "2.6.15",
"hasInstallScript": true, "hasInstallScript": true,
"license": "GPL-3.0-or-later", "license": "GPL-3.0-or-later",
"dependencies": { "dependencies": {
@@ -24,8 +24,8 @@
"@types/node": "18.16.1", "@types/node": "18.16.1",
"@types/yargs": "^17.0.24", "@types/yargs": "^17.0.24",
"chokidar": "^3.5.3", "chokidar": "^3.5.3",
"electron": "25.8.1", "electron": "25.9.8",
"electron-builder": "^24.6.4", "electron-builder": "^24.9.1",
"electron-builder-notarize": "^1.5.1", "electron-builder-notarize": "^1.5.1",
"esbuild": "^0.17.19", "esbuild": "^0.17.19",
"tree-kill": "^1.2.2", "tree-kill": "^1.2.2",
@@ -173,12 +173,11 @@
} }
}, },
"node_modules/@electron/asar": { "node_modules/@electron/asar": {
"version": "3.2.4", "version": "3.2.8",
"resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.4.tgz", "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.8.tgz",
"integrity": "sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==", "integrity": "sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"chromium-pickle-js": "^0.2.0",
"commander": "^5.0.0", "commander": "^5.0.0",
"glob": "^7.1.6", "glob": "^7.1.6",
"minimatch": "^3.0.4" "minimatch": "^3.0.4"
@@ -216,6 +215,7 @@
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz",
"integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==",
"dev": true,
"dependencies": { "dependencies": {
"debug": "^4.1.1", "debug": "^4.1.1",
"env-paths": "^2.2.0", "env-paths": "^2.2.0",
@@ -236,6 +236,7 @@
"version": "8.1.0", "version": "8.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
"dependencies": { "dependencies": {
"graceful-fs": "^4.2.0", "graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0", "jsonfile": "^4.0.0",
@@ -249,6 +250,7 @@
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
"dev": true,
"optionalDependencies": { "optionalDependencies": {
"graceful-fs": "^4.1.6" "graceful-fs": "^4.1.6"
} }
@@ -257,6 +259,7 @@
"version": "6.3.0", "version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true,
"bin": { "bin": {
"semver": "bin/semver.js" "semver": "bin/semver.js"
} }
@@ -265,6 +268,7 @@
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"dev": true,
"engines": { "engines": {
"node": ">= 4.0.0" "node": ">= 4.0.0"
} }
@@ -798,6 +802,7 @@
"version": "4.6.0", "version": "4.6.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
"integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
"dev": true,
"engines": { "engines": {
"node": ">=10" "node": ">=10"
}, },
@@ -809,6 +814,7 @@
"version": "4.0.6", "version": "4.0.6",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
"integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
"dev": true,
"dependencies": { "dependencies": {
"defer-to-connect": "^2.0.0" "defer-to-connect": "^2.0.0"
}, },
@@ -853,6 +859,7 @@
"version": "6.0.3", "version": "6.0.3",
"resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
"integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
"dev": true,
"dependencies": { "dependencies": {
"@types/http-cache-semantics": "*", "@types/http-cache-semantics": "*",
"@types/keyv": "^3.1.4", "@types/keyv": "^3.1.4",
@@ -861,9 +868,9 @@
} }
}, },
"node_modules/@types/debug": { "node_modules/@types/debug": {
"version": "4.1.8", "version": "4.1.12",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
"integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/ms": "*" "@types/ms": "*"
@@ -881,26 +888,29 @@
"node_modules/@types/http-cache-semantics": { "node_modules/@types/http-cache-semantics": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
"integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==",
"dev": true
}, },
"node_modules/@types/keyv": { "node_modules/@types/keyv": {
"version": "3.1.4", "version": "3.1.4",
"resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
"integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
"dev": true,
"dependencies": { "dependencies": {
"@types/node": "*" "@types/node": "*"
} }
}, },
"node_modules/@types/ms": { "node_modules/@types/ms": {
"version": "0.7.31", "version": "0.7.34",
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
"integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==",
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "18.16.1", "version": "18.16.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.1.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.1.tgz",
"integrity": "sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA==" "integrity": "sha512-DZxSZWXxFfOlx7k7Rv4LAyiMroaxa3Ly/7OOzZO8cBNho0YzAi4qlbrx8W27JGqG57IgR/6J7r+nOJWw6kcvZA==",
"devOptional": true
}, },
"node_modules/@types/normalize-package-data": { "node_modules/@types/normalize-package-data": {
"version": "2.4.1", "version": "2.4.1",
@@ -922,6 +932,7 @@
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
"integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
"dev": true,
"dependencies": { "dependencies": {
"@types/node": "*" "@types/node": "*"
} }
@@ -951,15 +962,16 @@
"version": "2.10.0", "version": "2.10.0",
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
"integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
"dev": true,
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"@types/node": "*" "@types/node": "*"
} }
}, },
"node_modules/7zip-bin": { "node_modules/7zip-bin": {
"version": "5.1.1", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz",
"integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==",
"dev": true "dev": true
}, },
"node_modules/agent-base": { "node_modules/agent-base": {
@@ -1041,9 +1053,9 @@
"dev": true "dev": true
}, },
"node_modules/app-builder-lib": { "node_modules/app-builder-lib": {
"version": "24.6.4", "version": "24.9.1",
"resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.6.4.tgz", "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.9.1.tgz",
"integrity": "sha512-m9931WXb83teb32N0rKg+ulbn6+Hl8NV5SUpVDOVz9MWOXfhV6AQtTdftf51zJJvCQnQugGtSqoLvgw6mdF/Rg==", "integrity": "sha512-Q1nYxZcio4r+W72cnIRVYofEAyjBd3mG47o+zms8HlD51zWtA/YxJb01Jei5F+jkWhge/PTQK+uldsPh6d0/4g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@develar/schema-utils": "~2.6.5", "@develar/schema-utils": "~2.6.5",
@@ -1052,15 +1064,15 @@
"@electron/universal": "1.4.1", "@electron/universal": "1.4.1",
"@malept/flatpak-bundler": "^0.4.0", "@malept/flatpak-bundler": "^0.4.0",
"@types/fs-extra": "9.0.13", "@types/fs-extra": "9.0.13",
"7zip-bin": "~5.1.1", "7zip-bin": "~5.2.0",
"async-exit-hook": "^2.0.1", "async-exit-hook": "^2.0.1",
"bluebird-lst": "^1.0.9", "bluebird-lst": "^1.0.9",
"builder-util": "24.5.0", "builder-util": "24.8.1",
"builder-util-runtime": "9.2.1", "builder-util-runtime": "9.2.3",
"chromium-pickle-js": "^0.2.0", "chromium-pickle-js": "^0.2.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"ejs": "^3.1.8", "ejs": "^3.1.8",
"electron-publish": "24.5.0", "electron-publish": "24.8.1",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"fs-extra": "^10.1.0", "fs-extra": "^10.1.0",
"hosted-git-info": "^4.1.0", "hosted-git-info": "^4.1.0",
@@ -1079,6 +1091,19 @@
"node": ">=14.0.0" "node": ">=14.0.0"
} }
}, },
"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==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
"sax": "^1.2.4"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/argparse": { "node_modules/argparse": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -1103,9 +1128,9 @@
} }
}, },
"node_modules/async": { "node_modules/async": {
"version": "3.2.4", "version": "3.2.5",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==",
"dev": true "dev": true
}, },
"node_modules/async-exit-hook": { "node_modules/async-exit-hook": {
@@ -1191,6 +1216,7 @@
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
"integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
"dev": true,
"optional": true "optional": true
}, },
"node_modules/brace-expansion": { "node_modules/brace-expansion": {
@@ -1242,6 +1268,7 @@
"version": "0.2.13", "version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
"integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
"dev": true,
"engines": { "engines": {
"node": "*" "node": "*"
} }
@@ -1265,16 +1292,16 @@
"dev": true "dev": true
}, },
"node_modules/builder-util": { "node_modules/builder-util": {
"version": "24.5.0", "version": "24.8.1",
"resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.5.0.tgz", "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.8.1.tgz",
"integrity": "sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==", "integrity": "sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/debug": "^4.1.6", "@types/debug": "^4.1.6",
"7zip-bin": "~5.1.1", "7zip-bin": "~5.2.0",
"app-builder-bin": "4.0.0", "app-builder-bin": "4.0.0",
"bluebird-lst": "^1.0.9", "bluebird-lst": "^1.0.9",
"builder-util-runtime": "9.2.1", "builder-util-runtime": "9.2.3",
"chalk": "^4.1.2", "chalk": "^4.1.2",
"cross-spawn": "^7.0.3", "cross-spawn": "^7.0.3",
"debug": "^4.3.4", "debug": "^4.3.4",
@@ -1300,6 +1327,19 @@
"node": ">=12.0.0" "node": ">=12.0.0"
} }
}, },
"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==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
"sax": "^1.2.4"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/busboy": { "node_modules/busboy": {
"version": "1.6.0", "version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
@@ -1316,6 +1356,7 @@
"version": "5.0.4", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
"integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
"dev": true,
"engines": { "engines": {
"node": ">=10.6.0" "node": ">=10.6.0"
} }
@@ -1324,6 +1365,7 @@
"version": "7.0.4", "version": "7.0.4",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
"integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
"dev": true,
"dependencies": { "dependencies": {
"clone-response": "^1.0.2", "clone-response": "^1.0.2",
"get-stream": "^5.1.0", "get-stream": "^5.1.0",
@@ -1396,9 +1438,9 @@
"dev": true "dev": true
}, },
"node_modules/ci-info": { "node_modules/ci-info": {
"version": "3.8.0", "version": "3.9.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
"integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@@ -1443,6 +1485,7 @@
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
"integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
"dev": true,
"dependencies": { "dependencies": {
"mimic-response": "^1.0.0" "mimic-response": "^1.0.0"
}, },
@@ -1586,6 +1629,7 @@
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
"dev": true,
"dependencies": { "dependencies": {
"mimic-response": "^3.1.0" "mimic-response": "^3.1.0"
}, },
@@ -1600,6 +1644,7 @@
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
"dev": true,
"engines": { "engines": {
"node": ">=10" "node": ">=10"
}, },
@@ -1611,6 +1656,7 @@
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
"integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
"dev": true,
"engines": { "engines": {
"node": ">=10" "node": ">=10"
} }
@@ -1619,6 +1665,7 @@
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
"integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
"dev": true,
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"has-property-descriptors": "^1.0.0", "has-property-descriptors": "^1.0.0",
@@ -1644,6 +1691,7 @@
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
"integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
"dev": true,
"optional": true "optional": true
}, },
"node_modules/dir-compare": { "node_modules/dir-compare": {
@@ -1679,14 +1727,14 @@
} }
}, },
"node_modules/dmg-builder": { "node_modules/dmg-builder": {
"version": "24.6.4", "version": "24.9.1",
"resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.6.4.tgz", "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.9.1.tgz",
"integrity": "sha512-BNcHRc9CWEuI9qt0E655bUBU/j/3wUCYBVKGu1kVpbN5lcUdEJJJeiO0NHK3dgKmra6LUUZlo+mWqc+OCbi0zw==", "integrity": "sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"app-builder-lib": "24.6.4", "app-builder-lib": "24.9.1",
"builder-util": "24.5.0", "builder-util": "24.8.1",
"builder-util-runtime": "9.2.1", "builder-util-runtime": "9.2.3",
"fs-extra": "^10.1.0", "fs-extra": "^10.1.0",
"iconv-lite": "^0.6.2", "iconv-lite": "^0.6.2",
"js-yaml": "^4.1.0" "js-yaml": "^4.1.0"
@@ -1695,6 +1743,19 @@
"dmg-license": "^1.0.11" "dmg-license": "^1.0.11"
} }
}, },
"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==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
"sax": "^1.2.4"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/dmg-license": { "node_modules/dmg-license": {
"version": "1.0.11", "version": "1.0.11",
"resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz",
@@ -1751,9 +1812,10 @@
} }
}, },
"node_modules/electron": { "node_modules/electron": {
"version": "25.8.1", "version": "25.9.8",
"resolved": "https://registry.npmjs.org/electron/-/electron-25.8.1.tgz", "resolved": "https://registry.npmjs.org/electron/-/electron-25.9.8.tgz",
"integrity": "sha512-GtcP1nMrROZfFg0+mhyj1hamrHvukfF6of2B/pcWxmWkd5FVY1NJib0tlhiorFZRzQN5Z+APLPr7aMolt7i2AQ==", "integrity": "sha512-PGgp6PH46QVENHuAHc2NT1Su8Q1qov7qIl2jI5tsDpTibwV2zD8539AeWBQySeBU4dhbj9onIl7+1bXQ0wefBg==",
"dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
"@electron/get": "^2.0.0", "@electron/get": "^2.0.0",
@@ -1768,16 +1830,16 @@
} }
}, },
"node_modules/electron-builder": { "node_modules/electron-builder": {
"version": "24.6.4", "version": "24.9.1",
"resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.6.4.tgz", "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.9.1.tgz",
"integrity": "sha512-uNWQoU7pE7qOaIQ6CJHpBi44RJFVG8OHRBIadUxrsDJVwLLo8Nma3K/EEtx5/UyWAQYdcK4nVPYKoRqBb20hbA==", "integrity": "sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"app-builder-lib": "24.6.4", "app-builder-lib": "24.9.1",
"builder-util": "24.5.0", "builder-util": "24.8.1",
"builder-util-runtime": "9.2.1", "builder-util-runtime": "9.2.3",
"chalk": "^4.1.2", "chalk": "^4.1.2",
"dmg-builder": "24.6.4", "dmg-builder": "24.9.1",
"fs-extra": "^10.1.0", "fs-extra": "^10.1.0",
"is-ci": "^3.0.0", "is-ci": "^3.0.0",
"lazy-val": "^1.0.5", "lazy-val": "^1.0.5",
@@ -1839,6 +1901,19 @@
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true "dev": true
}, },
"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==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
"sax": "^1.2.4"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/electron-notarize": { "node_modules/electron-notarize": {
"version": "1.2.2", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-1.2.2.tgz", "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-1.2.2.tgz",
@@ -1869,20 +1944,33 @@
} }
}, },
"node_modules/electron-publish": { "node_modules/electron-publish": {
"version": "24.5.0", "version": "24.8.1",
"resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.5.0.tgz", "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.8.1.tgz",
"integrity": "sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==", "integrity": "sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/fs-extra": "^9.0.11", "@types/fs-extra": "^9.0.11",
"builder-util": "24.5.0", "builder-util": "24.8.1",
"builder-util-runtime": "9.2.1", "builder-util-runtime": "9.2.3",
"chalk": "^4.1.2", "chalk": "^4.1.2",
"fs-extra": "^10.1.0", "fs-extra": "^10.1.0",
"lazy-val": "^1.0.5", "lazy-val": "^1.0.5",
"mime": "^2.5.2" "mime": "^2.5.2"
} }
}, },
"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==",
"dev": true,
"dependencies": {
"debug": "^4.3.4",
"sax": "^1.2.4"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/electron-trpc": { "node_modules/electron-trpc": {
"version": "0.5.2", "version": "0.5.2",
"resolved": "https://registry.npmjs.org/electron-trpc/-/electron-trpc-0.5.2.tgz", "resolved": "https://registry.npmjs.org/electron-trpc/-/electron-trpc-0.5.2.tgz",
@@ -1920,6 +2008,7 @@
"version": "1.4.4", "version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"dev": true,
"dependencies": { "dependencies": {
"once": "^1.4.0" "once": "^1.4.0"
} }
@@ -1928,6 +2017,7 @@
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
"dev": true,
"engines": { "engines": {
"node": ">=6" "node": ">=6"
} }
@@ -1951,6 +2041,7 @@
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
"integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
"dev": true,
"optional": true "optional": true
}, },
"node_modules/esbuild": { "node_modules/esbuild": {
@@ -2002,6 +2093,7 @@
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"optional": true, "optional": true,
"engines": { "engines": {
"node": ">=10" "node": ">=10"
@@ -2027,6 +2119,7 @@
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
"integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
"dev": true,
"dependencies": { "dependencies": {
"debug": "^4.1.1", "debug": "^4.1.1",
"get-stream": "^5.1.0", "get-stream": "^5.1.0",
@@ -2067,6 +2160,7 @@
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
"integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
"dev": true,
"dependencies": { "dependencies": {
"pend": "~1.2.0" "pend": "~1.2.0"
} }
@@ -2183,7 +2277,7 @@
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"devOptional": true "dev": true
}, },
"node_modules/get-caller-file": { "node_modules/get-caller-file": {
"version": "2.0.5", "version": "2.0.5",
@@ -2197,6 +2291,7 @@
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
"integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
"dev": true,
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"function-bind": "^1.1.1", "function-bind": "^1.1.1",
@@ -2212,6 +2307,7 @@
"version": "5.2.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"dependencies": { "dependencies": {
"pump": "^3.0.0" "pump": "^3.0.0"
}, },
@@ -2280,6 +2376,7 @@
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
"integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
"dev": true,
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"boolean": "^3.0.1", "boolean": "^3.0.1",
@@ -2297,6 +2394,7 @@
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
"integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
"dev": true,
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"define-properties": "^1.1.3" "define-properties": "^1.1.3"
@@ -2312,6 +2410,7 @@
"version": "11.8.6", "version": "11.8.6",
"resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
"integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
"dev": true,
"dependencies": { "dependencies": {
"@sindresorhus/is": "^4.0.0", "@sindresorhus/is": "^4.0.0",
"@szmarczak/http-timer": "^4.0.5", "@szmarczak/http-timer": "^4.0.5",
@@ -2341,7 +2440,7 @@
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"devOptional": true, "dev": true,
"dependencies": { "dependencies": {
"function-bind": "^1.1.1" "function-bind": "^1.1.1"
}, },
@@ -2362,6 +2461,7 @@
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
"integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
"dev": true,
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"get-intrinsic": "^1.1.1" "get-intrinsic": "^1.1.1"
@@ -2374,6 +2474,7 @@
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
"integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
"dev": true,
"optional": true, "optional": true,
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@@ -2386,6 +2487,7 @@
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"dev": true,
"optional": true, "optional": true,
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@@ -2409,7 +2511,8 @@
"node_modules/http-cache-semantics": { "node_modules/http-cache-semantics": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
"integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
"dev": true
}, },
"node_modules/http-proxy-agent": { "node_modules/http-proxy-agent": {
"version": "5.0.0", "version": "5.0.0",
@@ -2429,6 +2532,7 @@
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
"integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
"dev": true,
"dependencies": { "dependencies": {
"quick-lru": "^5.1.1", "quick-lru": "^5.1.1",
"resolve-alpn": "^1.0.0" "resolve-alpn": "^1.0.0"
@@ -2691,7 +2795,8 @@
"node_modules/json-buffer": { "node_modules/json-buffer": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
"dev": true
}, },
"node_modules/json-parse-even-better-errors": { "node_modules/json-parse-even-better-errors": {
"version": "2.3.1", "version": "2.3.1",
@@ -2709,6 +2814,7 @@
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
"dev": true,
"optional": true "optional": true
}, },
"node_modules/json5": { "node_modules/json5": {
@@ -2738,6 +2844,7 @@
"version": "4.5.2", "version": "4.5.2",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
"integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
"dev": true,
"dependencies": { "dependencies": {
"json-buffer": "3.0.1" "json-buffer": "3.0.1"
} }
@@ -2773,6 +2880,7 @@
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true,
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@@ -2792,6 +2900,7 @@
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
"integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
"dev": true,
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"escape-string-regexp": "^4.0.0" "escape-string-regexp": "^4.0.0"
@@ -2837,6 +2946,7 @@
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
"dev": true,
"engines": { "engines": {
"node": ">=4" "node": ">=4"
} }
@@ -2959,6 +3069,7 @@
"version": "6.1.0", "version": "6.1.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
"integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
"dev": true,
"engines": { "engines": {
"node": ">=10" "node": ">=10"
}, },
@@ -2970,6 +3081,7 @@
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true,
"optional": true, "optional": true,
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@@ -2979,6 +3091,7 @@
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"dependencies": { "dependencies": {
"wrappy": "1" "wrappy": "1"
} }
@@ -2987,6 +3100,7 @@
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
"integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
"dev": true,
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@@ -3066,7 +3180,8 @@
"node_modules/pend": { "node_modules/pend": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
"integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
"dev": true
}, },
"node_modules/picomatch": { "node_modules/picomatch": {
"version": "2.3.1", "version": "2.3.1",
@@ -3105,6 +3220,7 @@
"version": "2.0.3", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true,
"engines": { "engines": {
"node": ">=0.4.0" "node": ">=0.4.0"
} }
@@ -3126,6 +3242,7 @@
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"dev": true,
"dependencies": { "dependencies": {
"end-of-stream": "^1.1.0", "end-of-stream": "^1.1.0",
"once": "^1.3.1" "once": "^1.3.1"
@@ -3144,6 +3261,7 @@
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true,
"engines": { "engines": {
"node": ">=10" "node": ">=10"
}, },
@@ -3338,12 +3456,14 @@
"node_modules/resolve-alpn": { "node_modules/resolve-alpn": {
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
"integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
"dev": true
}, },
"node_modules/responselike": { "node_modules/responselike": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
"integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
"dev": true,
"dependencies": { "dependencies": {
"lowercase-keys": "^2.0.0" "lowercase-keys": "^2.0.0"
}, },
@@ -3379,6 +3499,7 @@
"version": "2.15.4", "version": "2.15.4",
"resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
"integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
"dev": true,
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"boolean": "^3.0.1", "boolean": "^3.0.1",
@@ -3458,12 +3579,14 @@
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
"integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
"dev": true,
"optional": true "optional": true
}, },
"node_modules/serialize-error": { "node_modules/serialize-error": {
"version": "7.0.1", "version": "7.0.1",
"resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
"integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
"dev": true,
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"type-fest": "^0.13.1" "type-fest": "^0.13.1"
@@ -3479,6 +3602,7 @@
"version": "0.13.1", "version": "0.13.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
"integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
"dev": true,
"optional": true, "optional": true,
"engines": { "engines": {
"node": ">=10" "node": ">=10"
@@ -3599,6 +3723,7 @@
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
"integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
"dev": true,
"optional": true "optional": true
}, },
"node_modules/stat-mode": { "node_modules/stat-mode": {
@@ -3671,6 +3796,7 @@
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
"integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==",
"dev": true,
"dependencies": { "dependencies": {
"debug": "^4.1.0" "debug": "^4.1.0"
}, },
@@ -3940,7 +4066,8 @@
"node_modules/wrappy": { "node_modules/wrappy": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
}, },
"node_modules/xmlbuilder": { "node_modules/xmlbuilder": {
"version": "15.1.1", "version": "15.1.1",
@@ -3993,6 +4120,7 @@
"version": "2.10.0", "version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
"integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
"dev": true,
"dependencies": { "dependencies": {
"buffer-crc32": "~0.2.3", "buffer-crc32": "~0.2.3",
"fd-slicer": "~1.1.0" "fd-slicer": "~1.1.0"

View File

@@ -2,7 +2,7 @@
"name": "@notesnook/desktop", "name": "@notesnook/desktop",
"productName": "Notesnook", "productName": "Notesnook",
"description": "Your private note taking space", "description": "Your private note taking space",
"version": "2.6.6", "version": "2.6.15",
"appAppleId": "1544027013", "appAppleId": "1544027013",
"private": true, "private": true,
"main": "./dist/index.js", "main": "./dist/index.js",
@@ -25,8 +25,8 @@
"@types/node": "18.16.1", "@types/node": "18.16.1",
"@types/yargs": "^17.0.24", "@types/yargs": "^17.0.24",
"chokidar": "^3.5.3", "chokidar": "^3.5.3",
"electron": "25.8.1", "electron": "25.9.8",
"electron-builder": "^24.6.4", "electron-builder": "^24.9.1",
"electron-builder-notarize": "^1.5.1", "electron-builder-notarize": "^1.5.1",
"esbuild": "^0.17.19", "esbuild": "^0.17.19",
"tree-kill": "^1.2.2", "tree-kill": "^1.2.2",
@@ -135,6 +135,10 @@
] ]
} }
], ],
"signingHashAlgorithms": [
"sha256"
],
"sign": "./sign.js",
"icon": "assets/icons/app.ico" "icon": "assets/icons/app.ico"
}, },
"portable": { "portable": {

60
apps/desktop/sign.js Normal file
View File

@@ -0,0 +1,60 @@
/*
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/>.
*/
const { writeFileSync, rmSync, readFileSync } = require("fs");
const { execSync } = require("child_process");
const { relative, join } = require("path");
module.exports = async function (configuration) {
const Endpoint = "https://weu.codesigning.azure.net";
const CodeSigningAccountName = "Notesnook";
const CertificateProfileName = "Notesnook";
const FileDigest = configuration.hash.toUpperCase();
const TimestampRfc3161 = "http://timestamp.acs.microsoft.com";
const TimestampDigest = configuration.hash.toUpperCase();
const Description = "The Notesnook app";
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}"`;
console.debug("Signing", configuration.path, "using command", command);
psexec(command);
console.debug("Signed", configuration.path);
deleteCatalog();
};
function createCatalog(path) {
writeFileSync("_catalog", relative(__dirname, path));
return join(__dirname, "_catalog");
}
function deleteCatalog() {
rmSync("_catalog");
}
function psexec(cmd) {
return execSync(cmd, {
env: process.env,
stdio: "inherit",
shell: "pwsh"
});
}

View File

@@ -29,6 +29,8 @@ import { dirname } from "path";
import { resolvePath } from "../utils/resolve-path"; import { resolvePath } from "../utils/resolve-path";
import { observable } from "@trpc/server/observable"; import { observable } from "@trpc/server/observable";
import { AssetManager } from "../utils/asset-manager"; import { AssetManager } from "../utils/asset-manager";
import { isFlatpak } from "../utils";
import { setupDesktopIntegration } from "../utils/desktop-integration";
const t = initTRPC.create(); const t = initTRPC.create();
@@ -44,6 +46,8 @@ const NotificationOptions = z.object({
}); });
export const osIntegrationRouter = t.router({ export const osIntegrationRouter = t.router({
isFlatpak: t.procedure.query(() => isFlatpak()),
zoomFactor: t.procedure.query(() => config.zoomFactor), zoomFactor: t.procedure.query(() => config.zoomFactor),
setZoomFactor: t.procedure.input(z.number()).mutation(({ input: factor }) => { setZoomFactor: t.procedure.input(z.number()).mutation(({ input: factor }) => {
globalThis.window?.webContents.setZoomFactor(factor); globalThis.window?.webContents.setZoomFactor(factor);
@@ -79,6 +83,7 @@ export const osIntegrationRouter = t.router({
AutoLaunch.disable(); AutoLaunch.disable();
} }
config.desktopSettings = settings; config.desktopSettings = settings;
setupDesktopIntegration(settings);
}), }),
selectDirectory: t.procedure selectDirectory: t.procedure

View File

@@ -24,7 +24,6 @@ import { configureAutoUpdater } from "./utils/autoupdater";
import { getBackgroundColor, getTheme, setTheme } from "./utils/theme"; import { getBackgroundColor, getTheme, setTheme } from "./utils/theme";
import { setupMenu } from "./utils/menu"; import { setupMenu } from "./utils/menu";
import { WindowState } from "./utils/window-state"; import { WindowState } from "./utils/window-state";
import { AutoLaunch } from "./utils/autolaunch";
import { setupJumplist } from "./utils/jumplist"; import { setupJumplist } from "./utils/jumplist";
import { setupTray } from "./utils/tray"; import { setupTray } from "./utils/tray";
import { CLIOptions, parseArguments } from "./cli"; import { CLIOptions, parseArguments } from "./cli";
@@ -35,6 +34,7 @@ import { config } from "./utils/config";
import path from "path"; import path from "path";
import { bringToFront } from "./utils/bring-to-front"; import { bringToFront } from "./utils/bring-to-front";
import { bridge } from "./api/bridge"; import { bridge } from "./api/bridge";
import { setupDesktopIntegration } from "./utils/desktop-integration";
// only run a single instance // only run a single instance
if (!MAC_APP_STORE && !app.requestSingleInstanceLock()) { if (!MAC_APP_STORE && !app.requestSingleInstanceLock()) {
@@ -77,7 +77,7 @@ async function createWindow() {
darkTheme: getTheme() === "dark", darkTheme: getTheme() === "dark",
backgroundColor: getBackgroundColor(), backgroundColor: getBackgroundColor(),
opacity: 0, opacity: 0,
autoHideMenuBar: true, autoHideMenuBar: false,
icon: AssetManager.appIcon({ icon: AssetManager.appIcon({
size: 512, size: 512,
format: process.platform === "win32" ? "ico" : "png" format: process.platform === "win32" ? "ico" : "png"
@@ -93,6 +93,7 @@ async function createWindow() {
createIPCHandler({ router, windows: [mainWindow] }); createIPCHandler({ router, windows: [mainWindow] });
globalThis.window = mainWindow; globalThis.window = mainWindow;
mainWindow.setMenuBarVisibility(false);
mainWindowState.manage(mainWindow); mainWindowState.manage(mainWindow);
if (cliOptions.hidden && !config.desktopSettings.minimizeToSystemTray) if (cliOptions.hidden && !config.desktopSettings.minimizeToSystemTray)
@@ -106,7 +107,7 @@ async function createWindow() {
} }
await AssetManager.loadIcons(); await AssetManager.loadIcons();
setupDesktopIntegration(); setupDesktopIntegration(config.desktopSettings);
mainWindow.webContents.session.setSpellCheckerDictionaryDownloadURL( mainWindow.webContents.session.setSpellCheckerDictionaryDownloadURL(
"http://dictionaries.notesnook.com/" "http://dictionaries.notesnook.com/"
@@ -176,49 +177,3 @@ function createURL(options: CLIOptions, path = "/") {
return url; return url;
} }
function setupDesktopIntegration() {
const desktopIntegration = config.desktopSettings;
if (
desktopIntegration.closeToSystemTray ||
desktopIntegration.minimizeToSystemTray
) {
setupTray();
}
// when close to system tray is enabled, it becomes nigh impossible
// to "quit" the app. This is necessary in order to fix that.
if (desktopIntegration.closeToSystemTray) {
app.on("before-quit", () => app.exit(0));
}
globalThis.window?.once("close", (e) => {
if (config.desktopSettings.closeToSystemTray) {
e.preventDefault();
if (process.platform == "darwin") {
// on macOS window cannot be minimized/hidden if it is already fullscreen
// so we just close it.
if (globalThis.window?.isFullScreen()) app.exit(0);
else app.hide();
} else {
globalThis.window?.minimize();
globalThis.window?.hide();
}
}
});
globalThis.window?.on("minimize", () => {
if (config.desktopSettings.minimizeToSystemTray) {
if (process.platform == "darwin") {
app.hide();
} else {
globalThis.window?.hide();
}
}
});
if (desktopIntegration.autoStart) {
AutoLaunch.enable(!!desktopIntegration.startMinimized);
}
}

View File

@@ -35,6 +35,8 @@ const LINUX_AUTOSTART_DIRECTORY_PATH = path.join(
"autostart" "autostart"
); );
const STARTUP_ARGS = ["--hidden"];
export class AutoLaunch { export class AutoLaunch {
static enable(hidden: boolean) { static enable(hidden: boolean) {
if (process.platform === "linux") { if (process.platform === "linux") {
@@ -47,10 +49,14 @@ export class AutoLaunch {
LINUX_DESKTOP_ENTRY(hidden) LINUX_DESKTOP_ENTRY(hidden)
); );
} else { } else {
const loginItemSettings = app.getLoginItemSettings({
args: STARTUP_ARGS
});
if (loginItemSettings.openAtLogin) return;
app.setLoginItemSettings({ app.setLoginItemSettings({
openAtLogin: true, openAtLogin: true,
openAsHidden: hidden, openAsHidden: hidden,
args: ["--hidden"] args: STARTUP_ARGS
}); });
} }
} }

View File

@@ -0,0 +1,74 @@
/*
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";
import { DesktopIntegration, config } from "./config";
import { setupTray, destroyTray } from "./tray";
import { AutoLaunch } from "./autolaunch";
export function setupDesktopIntegration(
desktopIntegration: DesktopIntegration
) {
if (
desktopIntegration.closeToSystemTray ||
desktopIntegration.minimizeToSystemTray
) {
setupTray();
} else {
destroyTray();
}
// when close to system tray is enabled, it becomes nigh impossible
// to "quit" the app. This is necessary in order to fix that.
app.on("before-quit", () =>
desktopIntegration.closeToSystemTray ? app.exit(0) : null
);
globalThis.window?.on("close", (e) => {
if (config.desktopSettings.closeToSystemTray) {
e.preventDefault();
if (process.platform == "darwin") {
// on macOS window cannot be minimized/hidden if it is already fullscreen
// so we just close it.
if (globalThis.window?.isFullScreen()) app.exit(0);
else app.hide();
} else {
try {
globalThis.window?.minimize();
globalThis.window?.hide();
} catch (error) {
console.error(error);
}
}
}
});
globalThis.window?.on("minimize", () => {
if (config.desktopSettings.minimizeToSystemTray) {
if (process.platform == "darwin") {
app.hide();
} else {
globalThis.window?.hide();
}
}
});
if (desktopIntegration.autoStart) {
AutoLaunch.enable(!!desktopIntegration.startMinimized);
}
}

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/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { protocol, net } from "electron"; import { protocol } from "electron";
import { isDevelopment } from "./index"; import { isDevelopment } from "./index";
import { createReadStream } from "fs"; import { createReadStream } from "fs";
import { extname, normalize } from "path"; import { extname, normalize } from "path";
@@ -62,8 +62,25 @@ function registerProtocol() {
headers: { "Content-Type": extensionToMimeType[fileExtension] } headers: { "Content-Type": extensionToMimeType[fileExtension] }
}); });
} else { } else {
return net.fetch(request, { if (request.headers.has("X-Content-Length")) {
bypassCustomProtocolHandlers: true 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"
}); });
} }
}); });

View File

@@ -17,13 +17,12 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import "@azure/core-asynciterator-polyfill"; import "@azure/core-asynciterator-polyfill";
import SettingsService from "./services/settings";
import { import {
THEME_COMPATIBILITY_VERSION, THEME_COMPATIBILITY_VERSION,
useThemeEngineStore useThemeEngineStore
} from "@notesnook/theme"; } from "@notesnook/theme";
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import { View } from "react-native"; import { I18nManager, View } from "react-native";
import "react-native-gesture-handler"; import "react-native-gesture-handler";
import { GestureHandlerRootView } from "react-native-gesture-handler"; import { GestureHandlerRootView } from "react-native-gesture-handler";
import { SafeAreaProvider } from "react-native-safe-area-context"; import { SafeAreaProvider } from "react-native-safe-area-context";
@@ -32,11 +31,16 @@ import { withErrorBoundry } from "./components/exception-handler";
import GlobalSafeAreaProvider from "./components/globalsafearea"; import GlobalSafeAreaProvider from "./components/globalsafearea";
import { useAppEvents } from "./hooks/use-app-events"; import { useAppEvents } from "./hooks/use-app-events";
import { ApplicationHolder } from "./navigation"; import { ApplicationHolder } from "./navigation";
import { themeTrpcClient } from "./screens/settings/theme-selector";
import Notifications from "./services/notifications"; import Notifications from "./services/notifications";
import SettingsService from "./services/settings";
import { TipManager } from "./services/tip-manager"; import { TipManager } from "./services/tip-manager";
import { useThemeStore } from "./stores/use-theme-store"; import { useThemeStore } from "./stores/use-theme-store";
import { useUserStore } from "./stores/use-user-store"; import { useUserStore } from "./stores/use-user-store";
import { themeTrpcClient } from "./screens/settings/theme-selector";
I18nManager.allowRTL(false);
I18nManager.forceRTL(false);
I18nManager.swapLeftAndRightInRTL(false);
SettingsService.checkOrientation(); SettingsService.checkOrientation();
const App = () => { const App = () => {

View File

@@ -16,8 +16,8 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { MMKVLoader } from "react-native-mmkv-storage";
import { initalize } from "@notesnook/core/dist/logger"; import { initalize } from "@notesnook/core/dist/logger";
import { MMKVLoader } from "react-native-mmkv-storage";
import { KV } from "./storage"; import { KV } from "./storage";
const LoggerStorage = new MMKVLoader() const LoggerStorage = new MMKVLoader()
@@ -26,4 +26,4 @@ const LoggerStorage = new MMKVLoader()
initalize(new KV(LoggerStorage)); initalize(new KV(LoggerStorage));
export {}; export { LoggerStorage };

View File

@@ -90,6 +90,10 @@ export class KV {
return this.storage.removeItem(key); return this.storage.removeItem(key);
} }
async removeMulti(keys) {
return this.storage.removeItems(...keys);
}
async clear() { async clear() {
return this.storage.clearStore(); return this.storage.clearStore();
} }
@@ -145,6 +149,7 @@ export default {
clear: () => DefaultStorage.clear(), clear: () => DefaultStorage.clear(),
getAllKeys: () => DefaultStorage.getAllKeys(), getAllKeys: () => DefaultStorage.getAllKeys(),
writeMulti: (items) => DefaultStorage.writeMulti(items), writeMulti: (items) => DefaultStorage.writeMulti(items),
removeMulti: (keys) => DefaultStorage.removeMulti(keys),
encrypt, encrypt,
decrypt, decrypt,
decryptMulti, decryptMulti,

View File

@@ -34,7 +34,8 @@ import { useAttachmentStore } from "../../stores/use-attachment-store";
import { db } from "../database"; import { db } from "../database";
import Storage from "../database/storage"; import Storage from "../database/storage";
import { cacheDir, copyFileAsync, releasePermissions } from "./utils"; import { cacheDir, copyFileAsync, releasePermissions } from "./utils";
import { createCacheDir } from "./io"; import { createCacheDir, exists } from "./io";
import { IOS_APPGROUPID } from "../../utils/constants";
export const FileDownloadStatus = { export const FileDownloadStatus = {
Success: 1, Success: 1,
@@ -181,7 +182,9 @@ export default async function downloadAttachment(
silent: false, silent: false,
cache: false, cache: false,
throwError: false, throwError: false,
groupId: undefined groupId: undefined,
base64: false,
text: false
} }
) { ) {
await createCacheDir(); await createCacheDir();
@@ -212,10 +215,17 @@ export default async function downloadAttachment(
options.groupId || attachment.metadata.hash, options.groupId || attachment.metadata.hash,
attachment.metadata.hash attachment.metadata.hash
); );
if (
!(await RNFetchBlob.fs.exists(`${cacheDir}/${attachment.metadata.hash}`)) if (!(await exists(attachment.metadata.hash))) {
)
return; return;
}
if (options.base64 || options.text) {
return await db.attachments.read(
attachment.metadata.hash,
options.base64 ? "base64" : "text"
);
}
let filename = getFileNameWithExtension( let filename = getFileNameWithExtension(
attachment.metadata.filename, attachment.metadata.filename,
@@ -233,7 +243,8 @@ export default async function downloadAttachment(
mime: attachment.metadata.type, mime: attachment.metadata.type,
fileName: options.cache ? undefined : filename, fileName: options.cache ? undefined : filename,
uri: options.cache ? undefined : folder.uri, uri: options.cache ? undefined : folder.uri,
chunkSize: attachment.chunkSize chunkSize: attachment.chunkSize,
appGroupId: IOS_APPGROUPID
}; };
let fileUri = await Sodium.decryptFile( let fileUri = await Sodium.decryptFile(

View File

@@ -96,16 +96,22 @@ export async function downloadFile(filename, data, cancelToken) {
} }
export async function getUploadedFileSize(hash) { export async function getUploadedFileSize(hash) {
const url = `${hosts.API_HOST}/s3?name=${hash}`; try {
const token = await db.user.tokenManager.getAccessToken(); const url = `${hosts.API_HOST}/s3?name=${hash}`;
const token = await db.user.tokenManager.getAccessToken();
const attachmentInfo = await fetch(url, { const attachmentInfo = await fetch(url, {
method: "HEAD", method: "HEAD",
headers: { Authorization: `Bearer ${token}` } headers: { Authorization: `Bearer ${token}` }
}); });
const contentLength = parseInt(attachmentInfo.headers?.get("content-length")); const contentLength = parseInt(
return isNaN(contentLength) ? 0 : contentLength; attachmentInfo.headers?.get("content-length")
);
return isNaN(contentLength) ? 0 : contentLength;
} catch (e) {
return 0;
}
} }
export async function checkAttachment(hash) { export async function checkAttachment(hash) {

View File

@@ -36,9 +36,13 @@ export async function readEncrypted(filename, key, cipherData) {
} }
const attachment = db.attachments.attachment(filename); const attachment = db.attachments.attachment(filename);
const isPng = /(png)/g.test(attachment?.metadata.type); const isPng = !attachment.metadata.type
const isJpeg = /(jpeg|jpg)/g.test(attachment?.metadata.type); ? false
console.log("decrypting...."); : /(png)/g.test(attachment?.metadata.type);
const isJpeg = !attachment.metadata.type
? false
: /(jpeg|jpg)/g.test(attachment?.metadata.type);
let output = await Sodium.decryptFile( let output = await Sodium.decryptFile(
key, key,
{ {

View File

@@ -34,10 +34,69 @@ import BaseDialog from "../dialog/base-dialog";
import { allowedOnPlatform, renderItem } from "./functions"; import { allowedOnPlatform, renderItem } from "./functions";
import { useCallback } from "react"; import { useCallback } from "react";
/**
* Test announcement
* {
id: "some-announcement",
type: "dialog",
body: [
{
type: "title",
text: "This is a title",
platforms: ["all"]
},
{
type: "description",
text: "Most of you are too busy to keep up to date with what's happening in Notesnook. That is unfortunate because Notesnook has come a looooong way.",
style: {
marginBottom: 1
},
platforms: ["all"]
},
{
type: "description",
text: "To solve this, we are launching the Notesnook Digest — a newsletter to help you stay updated about Notesnook development. And to keep things interesting I'll also sprinkle this newsletter with other interesting stuff like privacy tips & news, interesting books, things I am looking forward to etc.",
style: {
marginBottom: 1
},
platforms: ["all"]
},
{
type: "description",
text: "So be sure to subscribe. There won't be a proper schedule to this (yet) maybe once or twice a month. I promise no spam — only more awesomeness.",
style: {
marginBottom: 1
},
platforms: ["all"]
},
{
type: "description",
text: "— May privacy reign.",
style: {
marginBottom: 1
},
platforms: ["all"]
},
{
type: "callToActions",
actions: [
{
type: "promo",
title: "15% Off",
platforms: ["android"],
data: "com.streetwriters.notesnook.sub.yr.15"
}
],
platforms: ["all"]
}
]
}
*/
export const AnnouncementDialog = () => { export const AnnouncementDialog = () => {
const { colors } = useThemeColors(); const { colors } = useThemeColors();
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
const [info, setInfo] = useState(null); const [info, setInfo] = useState();
const remove = useMessageStore((state) => state.remove); const remove = useMessageStore((state) => state.remove);
useEffect(() => { useEffect(() => {
@@ -51,7 +110,9 @@ export const AnnouncementDialog = () => {
const open = (data) => { const open = (data) => {
setInfo(data); setInfo(data);
setVisible(true); setImmediate(() => {
setVisible(true);
});
}; };
const close = useCallback(() => { const close = useCallback(() => {

View File

@@ -48,7 +48,7 @@ import Heading from "../ui/typography/heading";
import Paragraph from "../ui/typography/paragraph"; import Paragraph from "../ui/typography/paragraph";
import { formatBytes } from "@notesnook/common"; import { formatBytes } from "@notesnook/common";
const Actions = ({ attachment, setAttachments, fwdRef }) => { const Actions = ({ attachment, setAttachments, fwdRef, close }) => {
const { colors } = useThemeColors(); const { colors } = useThemeColors();
const contextId = attachment.metadata.hash; const contextId = attachment.metadata.hash;
const [filename, setFilename] = useState(attachment.metadata.filename); const [filename, setFilename] = useState(attachment.metadata.filename);
@@ -64,7 +64,7 @@ const Actions = ({ attachment, setAttachments, fwdRef }) => {
name: "Download", name: "Download",
onPress: async () => { onPress: async () => {
if (currentProgress) { if (currentProgress) {
await db.fs.cancel(attachment.metadata.hash, "download"); await db.fs.cancel(attachment.metadata.hash);
useAttachmentStore.getState().remove(attachment.metadata.hash); useAttachmentStore.getState().remove(attachment.metadata.hash);
} }
downloadAttachment(attachment.metadata.hash, false); downloadAttachment(attachment.metadata.hash, false);
@@ -117,7 +117,7 @@ const Actions = ({ attachment, setAttachments, fwdRef }) => {
}); });
} }
setAttachments([...db.attachments.all]); setAttachments();
setLoading({ setLoading({
name: null name: null
}); });
@@ -140,7 +140,7 @@ const Actions = ({ attachment, setAttachments, fwdRef }) => {
filename: value filename: value
}); });
setFilename(value); setFilename(value);
setAttachments([...db.attachments.all]); setAttachments();
} }
}, },
positiveText: "Rename" positiveText: "Rename"
@@ -152,8 +152,8 @@ const Actions = ({ attachment, setAttachments, fwdRef }) => {
name: "Delete", name: "Delete",
onPress: async () => { onPress: async () => {
await db.attachments.remove(attachment.metadata.hash, false); await db.attachments.remove(attachment.metadata.hash, false);
setAttachments([...db.attachments.all]); setAttachments();
eSendEvent(eCloseSheet, contextId); close();
}, },
icon: "delete-outline" icon: "delete-outline"
} }
@@ -362,8 +362,13 @@ const Actions = ({ attachment, setAttachments, fwdRef }) => {
Actions.present = (attachment, set, context) => { Actions.present = (attachment, set, context) => {
presentSheet({ presentSheet({
context: context, context: context,
component: (ref) => ( component: (ref, close) => (
<Actions fwdRef={ref} setAttachments={set} attachment={attachment} /> <Actions
fwdRef={ref}
setAttachments={set}
close={close}
attachment={attachment}
/>
) )
}); });
}; };

View File

@@ -132,7 +132,7 @@ export const AttachmentItem = ({
activeOpacity={0.9} activeOpacity={0.9}
onPress={() => { onPress={() => {
if (encryption || !pressable) return; if (encryption || !pressable) return;
db.fs.cancel(attachment.metadata.hash, currentProgress.type); db.fs.cancel(attachment.metadata.hash);
setCurrentProgress(null); setCurrentProgress(null);
}} }}
style={{ style={{

View File

@@ -68,7 +68,7 @@ export const AttachmentDialog = ({ note }) => {
!attachmentSearchValue.current || !attachmentSearchValue.current ||
attachmentSearchValue.current === "" attachmentSearchValue.current === ""
) { ) {
setAttachments([...attachments]); setAttachments(filterAttachments(currentFilter));
} }
clearTimeout(searchTimer.current); clearTimeout(searchTimer.current);
searchTimer.current = setTimeout(() => { searchTimer.current = setTimeout(() => {
@@ -77,13 +77,16 @@ export const AttachmentDialog = ({ note }) => {
attachmentSearchValue.current attachmentSearchValue.current
); );
if (results.length === 0) return; if (results.length === 0) return;
setAttachments(results);
setAttachments(filterAttachments(currentFilter, results));
}, 300); }, 300);
}; };
const renderItem = ({ item }) => ( const renderItem = ({ item }) => (
<AttachmentItem <AttachmentItem
setAttachments={setAttachments} setAttachments={() => {
setAttachments(filterAttachments(currentFilter));
}}
attachment={item} attachment={item}
context="attachments-list" context="attachments-list"
/> />
@@ -133,11 +136,12 @@ export const AttachmentDialog = ({ note }) => {
} }
]; ];
const filterAttachments = (type) => { const filterAttachments = (type, _attachments) => {
const attachments = note const attachments =
? db.attachments.ofNote(note.id, "all") _attachments || note
: [...(db.attachments.all || [])]; ? db.attachments.ofNote(note.id, "all")
isDocument; : [...(db.attachments.all || [])];
switch (type) { switch (type) {
case "all": case "all":
return attachments; return attachments;

View File

@@ -17,14 +17,16 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { useThemeColors } from "@notesnook/theme";
import React, { useEffect, useRef, useState } from "react"; import React, { useEffect, useRef, useState } from "react";
import { Platform, View } from "react-native"; import { Platform, View } from "react-native";
import { KeyboardAwareScrollView } from "react-native-keyboard-aware-scroll-view";
import useGlobalSafeAreaInsets from "../../hooks/use-global-safe-area-insets"; import useGlobalSafeAreaInsets from "../../hooks/use-global-safe-area-insets";
import { import {
eSubscribeEvent, eSubscribeEvent,
eUnSubscribeEvent eUnSubscribeEvent
} from "../../services/event-manager"; } from "../../services/event-manager";
import { useThemeColors } from "@notesnook/theme"; import { useUserStore } from "../../stores/use-user-store";
import { eCloseLoginDialog, eOpenLoginDialog } from "../../utils/events"; import { eCloseLoginDialog, eOpenLoginDialog } from "../../utils/events";
import { sleep } from "../../utils/time"; import { sleep } from "../../utils/time";
import BaseDialog from "../dialog/base-dialog"; import BaseDialog from "../dialog/base-dialog";
@@ -34,7 +36,6 @@ import { IconButton } from "../ui/icon-button";
import { hideAuth, initialAuthMode } from "./common"; import { hideAuth, initialAuthMode } from "./common";
import { Login } from "./login"; import { Login } from "./login";
import { Signup } from "./signup"; import { Signup } from "./signup";
import { KeyboardAwareScrollView } from "react-native-keyboard-aware-scroll-view";
export const AuthMode = { export const AuthMode = {
login: 0, login: 0,
@@ -68,6 +69,9 @@ const AuthModal = () => {
} }
const close = () => { const close = () => {
useUserStore.setState({
disableAppLockRequests: false
});
actionSheetRef.current?.hide(); actionSheetRef.current?.hide();
setCurrentAuthMode(AuthMode.login); setCurrentAuthMode(AuthMode.login);
setVisible(false); setVisible(false);
@@ -77,6 +81,11 @@ const AuthModal = () => {
<BaseDialog <BaseDialog
overlayOpacity={0} overlayOpacity={0}
statusBarTranslucent={false} statusBarTranslucent={false}
onShow={() => {
useUserStore.setState({
disableAppLockRequests: true
});
}}
onRequestClose={currentAuthMode !== AuthMode.welcomeSignup && close} onRequestClose={currentAuthMode !== AuthMode.welcomeSignup && close}
visible={true} visible={true}
onClose={close} onClose={close}
@@ -85,11 +94,14 @@ const AuthModal = () => {
background={colors.primary.background} background={colors.primary.background}
transparent={false} transparent={false}
animated={false} animated={false}
centered={false}
enableSheetKeyboardHandler
> >
<KeyboardAwareScrollView <KeyboardAwareScrollView
style={{ style={{
width: "100%" width: "100%"
}} }}
enableAutomaticScroll={false}
keyboardShouldPersistTaps="handled" keyboardShouldPersistTaps="handled"
> >
{currentAuthMode !== AuthMode.login ? ( {currentAuthMode !== AuthMode.login ? (

View File

@@ -46,6 +46,7 @@ import Input from "../ui/input";
import Heading from "../ui/typography/heading"; import Heading from "../ui/typography/heading";
import Paragraph from "../ui/typography/paragraph"; import Paragraph from "../ui/typography/paragraph";
import { LoginSteps, useLogin } from "./use-login"; import { LoginSteps, useLogin } from "./use-login";
import BaseDialog from "../dialog/base-dialog";
function getObfuscatedEmail(email) { function getObfuscatedEmail(email) {
if (!email) return ""; if (!email) return "";
@@ -68,7 +69,8 @@ export const SessionExpired = () => {
eSendEvent(eUserLoggedIn, true); eSendEvent(eUserLoggedIn, true);
setVisible(false); setVisible(false);
setFocused(false); setFocused(false);
} },
true
); );
const logout = async () => { const logout = async () => {
@@ -130,15 +132,20 @@ export const SessionExpired = () => {
return ( return (
visible && ( visible && (
<Modal <BaseDialog
transparent={false}
background={colors.primary.background}
bounce={false}
animated={false}
centered={false}
onShow={async () => { onShow={async () => {
await sleep(300); await sleep(300);
passwordInputRef.current?.focus(); passwordInputRef.current?.focus();
setFocused(true); setFocused(true);
}} }}
enableSheetKeyboardHandler={true}
visible={true} visible={true}
> >
<SheetProvider context="two_factor_verify" />
<View <View
style={{ style={{
width: focused ? "100%" : "99.9%", width: focused ? "100%" : "99.9%",
@@ -231,7 +238,9 @@ export const SessionExpired = () => {
</View> </View>
<Toast context="local" /> <Toast context="local" />
<Dialog context="session_expiry" /> <Dialog context="session_expiry" />
</Modal>
<SheetProvider context="two_factor_verify" />
</BaseDialog>
) )
); );
}; };

View File

@@ -33,7 +33,7 @@ export const LoginSteps = {
passwordAuth: 3 passwordAuth: 3
}; };
export const useLogin = (onFinishLogin) => { export const useLogin = (onFinishLogin, sessionExpired = false) => {
const [error, setError] = useState(false); const [error, setError] = useState(false);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const setUser = useUserStore((state) => state.setUser); const setUser = useUserStore((state) => state.setUser);
@@ -69,6 +69,7 @@ export const useLogin = (onFinishLogin) => {
switch (step) { switch (step) {
case LoginSteps.emailAuth: { case LoginSteps.emailAuth: {
const mfaInfo = await db.user.authenticateEmail(email.current); const mfaInfo = await db.user.authenticateEmail(email.current);
console.log("email auth", mfaInfo);
if (mfaInfo) { if (mfaInfo) {
TwoFactorVerification.present(async (mfa, callback) => { TwoFactorVerification.present(async (mfa, callback) => {
try { try {
@@ -101,7 +102,12 @@ export const useLogin = (onFinishLogin) => {
break; break;
} }
case LoginSteps.passwordAuth: { case LoginSteps.passwordAuth: {
await db.user.authenticatePassword(email.current, password.current); await db.user.authenticatePassword(
email.current,
password.current,
null,
sessionExpired
);
finishLogin(); finishLogin();
break; break;
} }

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/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import React, { useEffect } from "react"; import React, { useEffect, useRef, useState } from "react";
import { import {
KeyboardAvoidingView, KeyboardAvoidingView,
Modal, Modal,
@@ -31,6 +31,9 @@ import useIsFloatingKeyboard from "../../hooks/use-is-floating-keyboard";
import { useSettingStore } from "../../stores/use-setting-store"; import { useSettingStore } from "../../stores/use-setting-store";
import { BouncingView } from "../ui/transitions/bouncing-view"; import { BouncingView } from "../ui/transitions/bouncing-view";
import { ScopedThemeProvider } from "@notesnook/theme"; import { ScopedThemeProvider } from "@notesnook/theme";
import SettingsService from "../../services/settings";
import { useUserStore } from "../../stores/use-user-store";
import { useAppState } from "../../hooks/use-app-state";
const BaseDialog = ({ const BaseDialog = ({
visible, visible,
@@ -48,9 +51,13 @@ const BaseDialog = ({
bounce = true, bounce = true,
closeOnTouch = true, closeOnTouch = true,
useSafeArea = true, useSafeArea = true,
avoidKeyboardResize = false avoidKeyboardResize = false,
enableSheetKeyboardHandler = false
}) => { }) => {
const floating = useIsFloatingKeyboard(); const floating = useIsFloatingKeyboard();
const appState = useAppState();
const lockEvents = useRef(false);
const [internalVisible, setIntervalVisible] = useState(true);
useEffect(() => { useEffect(() => {
return () => { return () => {
@@ -58,14 +65,34 @@ const BaseDialog = ({
}; };
}, []); }, []);
useEffect(() => {
if (useUserStore.getState().disableAppLockRequests) return;
if (SettingsService.get().appLockMode === "background") {
if (appState === "background") {
setIntervalVisible(false);
if (useUserStore.getState().appLocked) {
lockEvents.current = true;
const unsub = useUserStore.subscribe((state) => {
if (!state.appLocked) {
setIntervalVisible(true);
unsub();
setTimeout(() => {
lockEvents.current = false;
});
}
});
}
}
}
}, [appState]);
const Wrapper = useSafeArea ? SafeAreaView : View; const Wrapper = useSafeArea ? SafeAreaView : View;
return ( return (
<ScopedThemeProvider value="dialog"> <ScopedThemeProvider value="dialog">
<Modal <Modal
visible={visible} visible={visible && internalVisible}
transparent={true} transparent={true}
animated
statusBarTranslucent={statusBarTranslucent} statusBarTranslucent={statusBarTranslucent}
supportedOrientations={[ supportedOrientations={[
"portrait", "portrait",
@@ -75,13 +102,17 @@ const BaseDialog = ({
"landscape-right" "landscape-right"
]} ]}
onShow={() => { onShow={() => {
if (lockEvents.current) return;
if (onShow) { if (onShow) {
onShow(); onShow();
useSettingStore.getState().setSheetKeyboardHandler(false); if (!enableSheetKeyboardHandler) {
useSettingStore.getState().setSheetKeyboardHandler(false);
}
} }
}} }}
animationType={animation} animationType={animation}
onRequestClose={() => { onRequestClose={() => {
if (lockEvents.current) return;
if (!closeOnTouch) return null; if (!closeOnTouch) return null;
useSettingStore.getState().setSheetKeyboardHandler(true); useSettingStore.getState().setSheetKeyboardHandler(true);
onRequestClose && onRequestClose(); onRequestClose && onRequestClose();
@@ -107,6 +138,7 @@ const BaseDialog = ({
style={[ style={[
styles.backdrop, styles.backdrop,
{ {
alignItems: centered ? "center" : undefined,
justifyContent: centered justifyContent: centered
? "center" ? "center"
: bottom : bottom
@@ -133,8 +165,7 @@ const styles = StyleSheet.create({
backdrop: { backdrop: {
width: "100%", width: "100%",
height: "100%", height: "100%",
justifyContent: "center", justifyContent: "center"
alignItems: "center"
}, },
overlayButton: { overlayButton: {
width: "100%", width: "100%",

View File

@@ -442,6 +442,7 @@ export class VaultDialog extends Component {
if (this.state.biometricUnlock && !this.state.isBiometryEnrolled) { if (this.state.biometricUnlock && !this.state.isBiometryEnrolled) {
await this._enrollFingerprint(this.password); await this._enrollFingerprint(this.password);
} }
if (this.state.goToEditor) { if (this.state.goToEditor) {
this._openInEditor(note); this._openInEditor(note);
} else if (this.state.share) { } else if (this.state.share) {
@@ -452,7 +453,6 @@ export class VaultDialog extends Component {
await this._copyNote(note); await this._copyNote(note);
} }
} catch (e) { } catch (e) {
console.log(e);
this._takeErrorAction(e); this._takeErrorAction(e);
} }
}; };
@@ -467,44 +467,40 @@ export class VaultDialog extends Component {
} }
async _enrollFingerprint(password) { async _enrollFingerprint(password) {
try { this.setState(
this.setState( {
{ loading: true
loading: true },
}, async () => {
async () => { try {
try { await db.vault.unlock(password);
await db.vault.unlock(password); await BiometricService.storeCredentials(password);
await BiometricService.storeCredentials(password); this.setState({
this.setState({ loading: false
loading: false });
}); eSendEvent("vaultUpdated");
eSendEvent("vaultUpdated"); ToastEvent.show({
ToastEvent.show({ heading: "Biometric unlocking enabled!",
heading: "Biometric unlocking enabled!", message: "Now you can unlock notes in vault with biometrics.",
message: "Now you can unlock notes in vault with biometrics.", type: "success",
type: "success", context: "global"
context: "global" });
}); this.close();
this.close(); } catch (e) {
} catch (e) { this.close();
ToastEvent.show({ ToastEvent.show({
heading: "Incorrect password", heading: "Incorrect password",
message: message:
"Please enter the correct vault password to enable biometrics.", "Please enter the correct vault password to enable biometrics.",
type: "error", type: "error",
context: "local" context: "local"
}); });
this.setState({ this.setState({
loading: false loading: false
}); });
return;
}
} }
); }
} catch (e) { );
this._takeErrorAction(e);
}
} }
async _createVault() { async _createVault() {

View File

@@ -99,8 +99,8 @@ const NoteItem = ({
dateBy = "dateCreated", dateBy = "dateCreated",
noOpen = false noOpen = false
}) => { }) => {
const currentEditingNote = useEditorStore( const isEditingNote = useEditorStore(
(state) => state.currentEditingNote (state) => state.currentEditingNote === item.id
); );
const { colors } = useThemeColors(); const { colors } = useThemeColors();
const compactMode = useIsCompactModeEnabled(item); const compactMode = useIsCompactModeEnabled(item);
@@ -112,8 +112,7 @@ const NoteItem = ({
const reminder = getUpcomingReminder(reminders); const reminder = getUpcomingReminder(reminders);
const noteColor = ColorValues[item.color?.toLowerCase()]; const noteColor = ColorValues[item.color?.toLowerCase()];
const tags = getTags(item); const tags = getTags(item);
const primaryColors = const primaryColors = isEditingNote ? colors.selected : colors.primary;
currentEditingNote === item.id ? colors.selected : colors.primary;
return ( return (
<> <>

View File

@@ -25,13 +25,13 @@ import { useEditorStore } from "../../../stores/use-editor-store";
export const Filler = ({ item }) => { export const Filler = ({ item }) => {
const { colors } = useThemeColors(); const { colors } = useThemeColors();
const currentEditingNote = useEditorStore( const isEditingNote = useEditorStore(
(state) => state.currentEditingNote (state) => state.currentEditingNote === item.id
); );
const [selected] = useIsSelected(item); const [selected] = useIsSelected(item);
return currentEditingNote === item.id || selected ? ( return isEditingNote || selected ? (
<View <View
style={{ style={{
position: "absolute", position: "absolute",
@@ -39,12 +39,11 @@ export const Filler = ({ item }) => {
height: "150%", height: "150%",
backgroundColor: colors.selected.background, backgroundColor: colors.selected.background,
borderLeftWidth: 5, borderLeftWidth: 5,
borderLeftColor: borderLeftColor: isEditingNote
currentEditingNote === item.id ? item.color
? item.color ? colors.static[item.color]
? colors.static[item.color] : colors.selected.accent
: colors.selected.accent : "transparent"
: "transparent"
}} }}
collapsable={false} collapsable={false}
/> />

View File

@@ -43,6 +43,9 @@ const SelectionWrapper = ({
const onLongPress = () => { const onLongPress = () => {
if (!useSelectionStore.getState().selectionMode) { if (!useSelectionStore.getState().selectionMode) {
useSelectionStore.setState({
selectedItemsList: []
});
useSelectionStore.getState().setSelectionMode(true); useSelectionStore.getState().setSelectionMode(true);
} }
useSelectionStore.getState().setSelectedItem(item); useSelectionStore.getState().setSelectedItem(item);

View File

@@ -245,13 +245,17 @@ const MergeConflicts = () => {
}; };
return !visible ? null : ( return !visible ? null : (
<Modal <BaseDialog
statusBarTranslucent statusBarTranslucent
transparent={false} transparent={false}
animationType="slide" animationType="slide"
animated={false}
bounce={false}
onRequestClose={() => { onRequestClose={() => {
close(); close();
}} }}
centered={false}
background={colors?.primary.background}
supportedOrientations={[ supportedOrientations={[
"portrait", "portrait",
"portrait-upside-down", "portrait-upside-down",
@@ -363,7 +367,7 @@ const MergeConflicts = () => {
</Animated.View> </Animated.View>
</View> </View>
</SafeAreaView> </SafeAreaView>
</Modal> </BaseDialog>
); );
}; };

View File

@@ -165,7 +165,12 @@ export const Component = ({ close, promo }) => {
}} }}
size={SIZE.md} size={SIZE.md}
> >
({pricing?.product?.localizedPrice} / mo) (
{Platform.OS === "android"
? pricing.product?.subscriptionOfferDetails[0].pricingPhases
.pricingPhaseList?.[0].formattedPrice
: pricing.product?.localizedPrice}{" "}
/ mo)
</Paragraph> </Paragraph>
)} )}

View File

@@ -48,23 +48,23 @@ export const Expiring = () => {
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
const [status, setStatus] = useState({ const [status, setStatus] = useState({
title: "Your trial is ending soon", title: "Your trial is ending soon",
offer: null, offer: "Get 30% off",
extend: true extend: true
}); });
const pricing = usePricing("yearly"); const pricing = usePricing("yearly");
const promo =
const promo = status.offer status.offer && pricing?.info
? { ? {
promoCode: promoCode:
pricing?.info?.discount > 30 pricing?.info?.discount > 30
? pricing.info.sku ? pricing.info.sku
: "com.streetwriters.notesnook.sub.yr.trialoffer", : "com.streetwriters.notesnook.sub.yr.trialoffer",
text: `GET ${ text: `GET ${
pricing?.info?.discount > 30 ? pricing?.info?.discount : 30 pricing?.info?.discount > 30 ? pricing?.info?.discount : 30
}% OFF on yearly`, }% OFF on yearly`,
discount: pricing?.info?.discount > 30 ? pricing?.info?.discount : 30 discount: pricing?.info?.discount > 30 ? pricing?.info?.discount : 30
} }
: null; : null;
useEffect(() => { useEffect(() => {
eSubscribeEvent(eOpenTrialEndingDialog, open); eSubscribeEvent(eOpenTrialEndingDialog, open);

View File

@@ -18,13 +18,29 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import React from "react"; import React from "react";
import { View } from "react-native"; import { Platform, View } from "react-native";
import { SIZE } from "../../utils/size"; import { SIZE } from "../../utils/size";
import { PressableButton } from "../ui/pressable"; import { PressableButton } from "../ui/pressable";
import Heading from "../ui/typography/heading"; import Heading from "../ui/typography/heading";
import Paragraph from "../ui/typography/paragraph"; import Paragraph from "../ui/typography/paragraph";
import RNIap from "react-native-iap";
export const PricingItem = ({ product, onPress, compact }) => { export const PricingItem = ({
product,
onPress,
compact,
strikethrough
}: {
product: {
type: "yearly" | "monthly";
data?: RNIap.Subscription;
info: string;
offerType?: "yearly" | "monthly";
};
strikethrough?: boolean;
onPress?: () => void;
compact?: boolean;
}) => {
return ( return (
<PressableButton <PressableButton
onPress={onPress} onPress={onPress}
@@ -36,8 +52,10 @@ export const PricingItem = ({ product, onPress, compact }) => {
paddingHorizontal: 12, paddingHorizontal: 12,
paddingVertical: compact ? 15 : 10, paddingVertical: compact ? 15 : 10,
width: compact ? null : "100%", width: compact ? null : "100%",
minWidth: 150 minWidth: 150,
opacity: strikethrough ? 0.7 : 1
}} }}
disabled={strikethrough}
> >
{!compact && ( {!compact && (
<View> <View>
@@ -53,8 +71,25 @@ export const PricingItem = ({ product, onPress, compact }) => {
)} )}
<View> <View>
<Paragraph size={SIZE.sm}> <Paragraph
<Heading size={SIZE.lg - 2}>{product?.data?.localizedPrice}/</Heading> style={{
textDecorationLine: strikethrough ? "line-through" : undefined
}}
size={SIZE.sm}
>
<Heading
style={{
textDecorationLine: strikethrough ? "line-through" : undefined
}}
size={SIZE.lg - 2}
>
{Platform.OS === "android"
? (product.data as RNIap.SubscriptionAndroid | undefined)
?.subscriptionOfferDetails[0].pricingPhases
.pricingPhaseList?.[0]?.formattedPrice
: (product.data as RNIap.SubscriptionIOS | undefined)
?.localizedPrice}
</Heading>
{product?.type === "yearly" || product?.offerType === "yearly" {product?.type === "yearly" || product?.offerType === "yearly"
? "/year" ? "/year"
: "/month"} : "/month"}

View File

@@ -20,7 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
import React, { useCallback, useEffect, useState } from "react"; import React, { useCallback, useEffect, useState } from "react";
import { ActivityIndicator, Platform, Text, View } from "react-native"; import { ActivityIndicator, Platform, Text, View } from "react-native";
import * as RNIap from "react-native-iap"; import * as RNIap from "react-native-iap";
import { db } from "../../common/database"; import { DatabaseLogger, db } from "../../common/database";
import { usePricing } from "../../hooks/use-pricing"; import { usePricing } from "../../hooks/use-pricing";
import { import {
eSendEvent, eSendEvent,
@@ -47,11 +47,29 @@ import Heading from "../ui/typography/heading";
import Paragraph from "../ui/typography/paragraph"; import Paragraph from "../ui/typography/paragraph";
import { Walkthrough } from "../walkthroughs"; import { Walkthrough } from "../walkthroughs";
import { PricingItem } from "./pricing-item"; import { PricingItem } from "./pricing-item";
import { useSettingStore } from "../../stores/use-setting-store";
const UUID_PREFIX = "0bdaea";
const UUID_VERSION = "4";
const UUID_VARIANT = "a";
function toUUID(str: string) {
return [
UUID_PREFIX + str.substring(0, 2), // 6 digit prefix + first 2 oid digits
str.substring(2, 6), // # next 4 oid digits
UUID_VERSION + str.substring(6, 9), // # 1 digit version(0x4) + next 3 oid digits
UUID_VARIANT + str.substring(9, 12), // # 1 digit variant(0b101) + 1 zero bit + next 3 oid digits
str.substring(12)
].join("-");
}
const promoCyclesMonthly = { const promoCyclesMonthly = {
1: "first month", 1: "first month",
2: "first 2 months", 2: "first 2 months",
3: "first 3 months" 3: "first 3 months",
4: "first 4 months",
5: "first 5 months",
6: "first 3 months"
}; };
const promoCyclesYearly = { const promoCyclesYearly = {
@@ -65,10 +83,24 @@ export const PricingPlans = ({
marginTop, marginTop,
heading = true, heading = true,
compact = false compact = false
}: {
promo?: {
promoCode: string;
};
marginTop?: any;
heading?: boolean;
compact?: boolean;
}) => { }) => {
const { colors } = useThemeColors(); const { colors } = useThemeColors();
const user = useUserStore((state) => state.user); const user = useUserStore((state) => state.user);
const [product, setProduct] = useState(null); const [product, setProduct] = useState<{
type: string;
offerType: "monthly" | "yearly";
data: RNIap.Subscription;
cycleText: string;
info: string;
}>();
const [buying, setBuying] = useState(false); const [buying, setBuying] = useState(false);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const userCanRequestTrial = const userCanRequestTrial =
@@ -90,27 +122,40 @@ export const PricingPlans = ({
} }
}, [promo?.promoCode]); }, [promo?.promoCode]);
const getPromo = async (code) => { const getPromo = async (code: string) => {
try { try {
let productId; let skuId: string;
if (code.startsWith("com.streetwriters.notesnook")) { if (code.startsWith("com.streetwriters.notesnook")) {
productId = code; skuId = code;
} else { } else {
productId = await db.offers.getCode(code.split(":")[0], Platform.OS); skuId = await db.offers?.getCode(code.split(":")[0], Platform.OS);
} }
let products = await PremiumService.getProducts(); const products = await PremiumService.getProducts();
let product = products.find((p) => p.productId === productId); const product = products.find((p) => p.productId === skuId);
if (!product) return false; if (!product) return false;
let isMonthly = product.productId.indexOf(".mo") > -1; const isMonthly = product.productId.indexOf(".mo") > -1;
let cycleText = isMonthly
const cycleText = isMonthly
? promoCyclesMonthly[ ? promoCyclesMonthly[
product.introductoryPriceCyclesAndroid || (Platform.OS === "android"
product.introductoryPriceNumberOfPeriodsIOS ? (product as RNIap.SubscriptionAndroid)
.subscriptionOfferDetails[0]?.pricingPhases
.pricingPhaseList?.[0].billingCycleCount
: parseInt(
(product as RNIap.SubscriptionIOS)
.introductoryPriceNumberOfPeriodsIOS as string
)) as keyof typeof promoCyclesMonthly
] ]
: promoCyclesYearly[ : promoCyclesYearly[
product.introductoryPriceCyclesAndroid || (Platform.OS === "android"
product.introductoryPriceNumberOfPeriodsIOS ? (product as RNIap.SubscriptionAndroid)
.subscriptionOfferDetails[0]?.pricingPhases
.pricingPhaseList?.[0].billingCycleCount
: parseInt(
(product as RNIap.SubscriptionIOS)
.introductoryPriceNumberOfPeriodsIOS as string
)) as keyof typeof promoCyclesYearly
]; ];
setProduct({ setProduct({
@@ -118,7 +163,7 @@ export const PricingPlans = ({
offerType: isMonthly ? "monthly" : "yearly", offerType: isMonthly ? "monthly" : "yearly",
data: product, data: product,
cycleText: cycleText, cycleText: cycleText,
info: "Pay monthly, cancel anytime" info: `Pay ${isMonthly ? "monthly" : "yearly"}, cancel anytime`
}); });
return true; return true;
} catch (e) { } catch (e) {
@@ -131,22 +176,41 @@ export const PricingPlans = ({
getSkus(); getSkus();
}, [getSkus]); }, [getSkus]);
const buySubscription = async (product) => { const buySubscription = async (product: RNIap.Subscription) => {
if (buying) return; if (buying || !product) return;
setBuying(true); setBuying(true);
try { try {
if (!user) { if (!user) {
setBuying(false); setBuying(false);
return; return;
} }
await RNIap.requestSubscription( useSettingStore.getState().setAppDidEnterBackgroundForAction(true);
product?.productId, const androidOfferToken =
false, Platform.OS === "android"
null, ? (product as RNIap.SubscriptionAndroid).subscriptionOfferDetails[0]
-1, .offerToken
user.id, : null;
user.id
DatabaseLogger.info(
`Subscription Requested initiated for user ${toUUID(user.id)}`
); );
await RNIap.requestSubscription({
sku: product?.productId,
obfuscatedAccountIdAndroid: user.id,
obfuscatedProfileIdAndroid: user.id,
appAccountToken: toUUID(user.id),
andDangerouslyFinishTransactionAutomaticallyIOS: false,
subscriptionOffers: androidOfferToken
? [
{
offerToken: androidOfferToken,
sku: product?.productId
}
]
: undefined
});
useSettingStore.getState().setAppDidEnterBackgroundForAction(false);
setBuying(false); setBuying(false);
eSendEvent(eCloseSheet); eSendEvent(eCloseSheet);
eSendEvent(eClosePremiumDialog); eSendEvent(eClosePremiumDialog);
@@ -167,6 +231,35 @@ export const PricingPlans = ({
} }
}; };
function getStandardPrice() {
if (!product) return;
const productType = product.offerType;
if (Platform.OS === "android") {
const pricingPhaseListItem = (product.data as RNIap.SubscriptionAndroid)
?.subscriptionOfferDetails[0]?.pricingPhases.pricingPhaseList?.[1];
if (!pricingPhaseListItem) {
const product =
productType === "monthly"
? monthlyPlan?.product
: yearlyPlan?.product;
return (product as RNIap.SubscriptionAndroid)
?.subscriptionOfferDetails[0]?.pricingPhases.pricingPhaseList?.[0]
?.formattedPrice;
}
return pricingPhaseListItem?.formattedPrice;
} else {
const productDefault =
productType === "monthly" ? monthlyPlan?.product : yearlyPlan?.product;
return (
(product.data as RNIap.SubscriptionIOS)?.localizedPrice ||
(productDefault as RNIap.SubscriptionIOS)?.localizedPrice
);
}
}
return loading ? ( return loading ? (
<View <View
style={{ style={{
@@ -198,7 +291,14 @@ export const PricingPlans = ({
}} }}
size={SIZE.lg} size={SIZE.lg}
> >
{PremiumService.getMontlySub().localizedPrice} / mo {(Platform.OS === "android"
? (monthlyPlan?.product as RNIap.SubscriptionAndroid | undefined)
?.subscriptionOfferDetails[0]?.pricingPhases
.pricingPhaseList?.[0]?.formattedPrice
: (monthlyPlan?.product as RNIap.SubscriptionIOS | undefined)
?.localizedPrice) ||
(PremiumService.getMontlySub() as any)?.localizedPrice}
/ mo
</Paragraph> </Paragraph>
<Button <Button
onPress={() => { onPress={() => {
@@ -218,7 +318,7 @@ export const PricingPlans = ({
<Button <Button
onPress={async () => { onPress={async () => {
try { try {
await db.user.activateTrial(); await db.user?.activateTrial();
eSendEvent(eClosePremiumDialog); eSendEvent(eClosePremiumDialog);
eSendEvent(eCloseSheet); eSendEvent(eCloseSheet);
await sleep(300); await sleep(300);
@@ -239,33 +339,91 @@ export const PricingPlans = ({
) : ( ) : (
<> <>
{product?.type === "promo" ? ( {product?.type === "promo" ? (
<Heading <View
style={{ style={{
paddingVertical: 15, paddingVertical: 15,
alignSelf: "center", alignItems: "center"
textAlign: "center"
}} }}
size={SIZE.lg - 4}
> >
{product.data.introductoryPrice} {product?.offerType === "monthly" ? (
<Paragraph <PricingItem
product={{
type: "monthly",
data: monthlyPlan?.product,
info: "Pay once a month, cancel anytime."
}}
strikethrough={true}
/>
) : (
<PricingItem
onPress={() => {
if (!monthlyPlan?.product) return;
buySubscription(monthlyPlan?.product);
}}
product={{
type: "yearly",
data: yearlyPlan?.product,
info: "Pay once a year, cancel anytime."
}}
strikethrough={true}
/>
)}
<Heading
style={{ style={{
textDecorationLine: "line-through", paddingTop: 15,
color: colors.secondary.paragraph fontSize: SIZE.lg
}} }}
size={SIZE.sm}
> >
({product.data.localizedPrice}) Special offer for you
</Paragraph>{" "} </Heading>
for {product.cycleText}
</Heading> <View
style={{
paddingVertical: 20,
paddingBottom: 10
}}
>
<Heading
style={{
alignSelf: "center",
textAlign: "center"
}}
size={SIZE.xxl}
>
{Platform.OS === "android"
? (product.data as RNIap.SubscriptionAndroid)
?.subscriptionOfferDetails[0].pricingPhases
.pricingPhaseList?.[0]?.formattedPrice
: (product.data as RNIap.SubscriptionIOS)
?.introductoryPrice ||
(product.data as RNIap.SubscriptionIOS)
?.localizedPrice}{" "}
{product?.cycleText
? `for ${product.cycleText}`
: product?.offerType}
</Heading>
{product?.cycleText ? (
<Paragraph
style={{
color: colors.secondary.paragraph,
alignSelf: "center",
textAlign: "center"
}}
size={SIZE.md}
>
then {getStandardPrice()} {product?.offerType}.
</Paragraph>
) : null}
</View>
</View>
) : null} ) : null}
{user && !product ? ( {user && !product ? (
<> <>
{heading || monthlyPlan?.info?.discount > 0 ? ( {heading || (monthlyPlan?.info?.discount || 0) > 0 ? (
<> <>
{monthlyPlan && monthlyPlan?.info?.discount > 0 ? ( {monthlyPlan && (monthlyPlan?.info?.discount || 0) > 0 ? (
<View <View
style={{ style={{
alignSelf: "center", alignSelf: "center",
@@ -273,7 +431,12 @@ export const PricingPlans = ({
marginBottom: 20 marginBottom: 20
}} }}
> >
<Heading color={colors.primary.accent}> <Heading
style={{
textAlign: "center"
}}
color={colors.primary.accent}
>
Get {monthlyPlan?.info?.discount}% off in{" "} Get {monthlyPlan?.info?.discount}% off in{" "}
{monthlyPlan?.info?.country} {monthlyPlan?.info?.country}
</Heading> </Heading>
@@ -300,12 +463,15 @@ export const PricingPlans = ({
}} }}
> >
<PricingItem <PricingItem
onPress={() => buySubscription(monthlyPlan?.product)} onPress={() => {
if (!monthlyPlan?.product) return;
buySubscription(monthlyPlan?.product);
}}
compact={compact} compact={compact}
product={{ product={{
type: "monthly", type: "monthly",
data: monthlyPlan?.product, data: monthlyPlan?.product,
info: "Pay monthly, cancel anytime." info: "Pay once a month, cancel anytime."
}} }}
/> />
@@ -319,12 +485,15 @@ export const PricingPlans = ({
)} )}
<PricingItem <PricingItem
onPress={() => buySubscription(yearlyPlan?.product)} onPress={() => {
if (!yearlyPlan?.product) return;
buySubscription(yearlyPlan?.product);
}}
compact={compact} compact={compact}
product={{ product={{
type: "yearly", type: "yearly",
data: yearlyPlan?.product, data: yearlyPlan?.product,
info: "Pay yearly" info: "Pay once a year, cancel anytime."
}} }}
/> />
</View> </View>
@@ -346,7 +515,7 @@ export const PricingPlans = ({
eSendEvent(eCloseSimpleDialog); eSendEvent(eCloseSimpleDialog);
setBuying(true); setBuying(true);
try { try {
if (!(await getPromo(value))) if (!(await getPromo(value as string)))
throw new Error("Error applying promo code"); throw new Error("Error applying promo code");
ToastEvent.show({ ToastEvent.show({
heading: "Discount applied!", heading: "Discount applied!",
@@ -358,7 +527,7 @@ export const PricingPlans = ({
setBuying(false); setBuying(false);
ToastEvent.show({ ToastEvent.show({
heading: "Promo code invalid or expired", heading: "Promo code invalid or expired",
message: e.message, message: (e as Error).message,
type: "error", type: "error",
context: "local" context: "local"
}); });
@@ -396,7 +565,7 @@ export const PricingPlans = ({
width={250} width={250}
style={{ style={{
paddingHorizontal: 12, paddingHorizontal: 12,
marginTop: 30, marginTop: product?.type === "promo" ? 0 : 30,
marginBottom: 10 marginBottom: 10
}} }}
/> />
@@ -427,7 +596,10 @@ export const PricingPlans = ({
) : ( ) : (
<> <>
<Button <Button
onPress={() => buySubscription(product.data)} onPress={() => {
if (!product?.data) return;
buySubscription(product.data);
}}
height={40} height={40}
width="50%" width="50%"
type="accent" type="accent"
@@ -436,7 +608,7 @@ export const PricingPlans = ({
<Button <Button
onPress={() => { onPress={() => {
setProduct(null); setProduct(undefined);
}} }}
style={{ style={{
marginTop: 5 marginTop: 5
@@ -500,7 +672,7 @@ export const PricingPlans = ({
textAlign: "center" textAlign: "center"
}} }}
> >
By subscribing, your will be charged on your Google Account, and By subscribing, you will be charged on your Google Account, and
your subscription will automatically renew until you cancel prior your subscription will automatically renew until you cancel prior
to the end of the then current period. to the end of the then current period.
</Paragraph> </Paragraph>
@@ -523,7 +695,7 @@ export const PricingPlans = ({
<Paragraph <Paragraph
size={SIZE.xs} size={SIZE.xs}
onPress={() => { onPress={() => {
openLinkInBrowser("https://notesnook.com/tos", colors) openLinkInBrowser("https://notesnook.com/tos")
.catch(() => {}) .catch(() => {})
.then(() => {}); .then(() => {});
}} }}
@@ -538,7 +710,7 @@ export const PricingPlans = ({
<Paragraph <Paragraph
size={SIZE.xs} size={SIZE.xs}
onPress={() => { onPress={() => {
openLinkInBrowser("https://notesnook.com/privacy", colors) openLinkInBrowser("https://notesnook.com/privacy")
.catch(() => {}) .catch(() => {})
.then(() => {}); .then(() => {});
}} }}

View File

@@ -101,6 +101,7 @@ const SheetProvider = ({ context = "global" }) => {
setVisible(false); setVisible(false);
setData(null); setData(null);
}} }}
keyboardHandlerDisabled={data?.keyboardHandlerDisabled}
bottomPadding={!data.noBottomPadding} bottomPadding={!data.noBottomPadding}
enableGesturesInScrollView={ enableGesturesInScrollView={
typeof data.enableGesturesInScrollView === "undefined" typeof data.enableGesturesInScrollView === "undefined"

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import React, { useCallback, useEffect, useRef, useState } from "react"; import React, { useCallback, useEffect, useRef, useState } from "react";
import { FlatList } from "react-native-actions-sheet"; import { FlashList } from "react-native-actions-sheet";
import { db } from "../../../common/database"; import { db } from "../../../common/database";
import { ListHeaderInputItem } from "./list-header-item.js"; import { ListHeaderInputItem } from "./list-header-item.js";
@@ -54,7 +54,7 @@ export const FilteredList = ({
}, [data, onChangeText]); }, [data, onChangeText]);
return ( return (
<FlatList <FlashList
{...restProps} {...restProps}
data={filtered} data={filtered}
ref={listRef} ref={listRef}

View File

@@ -161,9 +161,6 @@ const MoveNoteSheet = ({ note, actionSheetRef }) => {
: "deselected"; : "deselected";
if (itemState[notebook.id] === "selected") { if (itemState[notebook.id] === "selected") {
count++; count++;
contextValue.select(notebook);
} else {
contextValue.deselect(notebook);
} }
for (let topic of notebook.topics) { for (let topic of notebook.topics) {
itemState[topic.id] = state itemState[topic.id] = state
@@ -176,9 +173,6 @@ const MoveNoteSheet = ({ note, actionSheetRef }) => {
: "deselected"; : "deselected";
if (itemState[topic.id] === "selected") { if (itemState[topic.id] === "selected") {
count++; count++;
contextValue.select(topic);
} else {
contextValue.deselect(topic);
} }
} }
} }
@@ -189,7 +183,7 @@ const MoveNoteSheet = ({ note, actionSheetRef }) => {
} }
useItemSelectionStore.getState().setItemState(itemState); useItemSelectionStore.getState().setItemState(itemState);
}, },
[contextValue, getSelectedNotesCountInItem, selectedItemsList] [getSelectedNotesCountInItem, selectedItemsList]
); );
const getItemsForItem = (item) => { const getItemsForItem = (item) => {
@@ -214,7 +208,7 @@ const MoveNoteSheet = ({ note, actionSheetRef }) => {
} }
const updateItemState = useCallback(function (item, state) { const updateItemState = useCallback(function (item, state) {
const itemState = useItemSelectionStore.getState().itemState; const itemState = { ...useItemSelectionStore.getState().itemState };
const mergeState = { const mergeState = {
[item.id]: state [item.id]: state
}; };
@@ -370,56 +364,93 @@ const MoveNoteSheet = ({ note, actionSheetRef }) => {
</View> </View>
<SelectionProvider value={contextValue}> <SelectionProvider value={contextValue}>
<FilteredList <View
style={{ style={{
paddingHorizontal: 12, paddingHorizontal: 12,
maxHeight: dimensions.height * 0.85 maxHeight: dimensions.height * 0.85,
height: 50 * (notebooks.length + 2)
}} }}
ListEmptyComponent={ >
notebooks.length > 0 ? null : ( <FilteredList
<View ListEmptyComponent={
style={{ notebooks.length > 0 ? null : (
width: "100%", <View
height: "100%", style={{
justifyContent: "center", width: "100%",
alignItems: "center" height: "100%",
justifyContent: "center",
alignItems: "center"
}}
>
<Icon
name="book-outline"
color={colors.primary.icon}
size={100}
/>
<Paragraph style={{ marginBottom: 10 }}>
You do not have any notebooks.
</Paragraph>
</View>
)
}
estimatedItemSize={50}
data={notebooks}
hasHeaderSearch={true}
renderItem={({ item, index }) => (
<ListItem
item={item}
key={item.id}
index={index}
hasNotes={getSelectedNotesCountInItem(item) > 0}
sheetRef={actionSheetRef}
infoText={
<>
{item.topics.length === 1
? item.topics.length + " topic"
: item.topics.length + " topics"}
</>
}
getListItems={getItemsForItem}
getSublistItemProps={(topic) => ({
hasNotes: getSelectedNotesCountInItem(topic) > 0,
style: {
marginBottom: 0,
height: 40
},
onPress: (item) => {
const itemState =
useItemSelectionStore.getState().itemState;
const currentState = itemState[item.id];
if (currentState !== "selected") {
resetItemState("deselected");
contextValue.select(item);
} else {
contextValue.deselect(item);
}
},
key: item.id,
type: "transparent"
})}
icon={(expanded) => ({
name: expanded ? "chevron-up" : "chevron-down",
color: expanded
? colors.primary.accent
: colors.primary.paragraph
})}
onScrollEnd={() => {
actionSheetRef.current?.handleChildScrollEnd();
}} }}
> hasSubList={true}
<Icon hasHeaderSearch={false}
name="book-outline" type="grayBg"
color={colors.primary.icon} sublistItemType="topic"
size={100} onAddItem={(title) => {
/> return onAddTopic(title, item);
<Paragraph style={{ marginBottom: 10 }}> }}
You do not have any notebooks. onAddSublistItem={(item) => {
</Paragraph> openAddTopicDialog(item);
</View> }}
) onPress={(item) => {
}
data={notebooks}
hasHeaderSearch={true}
renderItem={({ item, index }) => (
<ListItem
item={item}
key={item.id}
index={index}
hasNotes={getSelectedNotesCountInItem(item) > 0}
sheetRef={actionSheetRef}
infoText={
<>
{item.topics.length === 1
? item.topics.length + " topic"
: item.topics.length + " topics"}
</>
}
getListItems={getItemsForItem}
getSublistItemProps={(topic) => ({
hasNotes: getSelectedNotesCountInItem(topic) > 0,
style: {
marginBottom: 0,
height: 40
},
onPress: (item) => {
const itemState = const itemState =
useItemSelectionStore.getState().itemState; useItemSelectionStore.getState().itemState;
const currentState = itemState[item.id]; const currentState = itemState[item.id];
@@ -429,47 +460,16 @@ const MoveNoteSheet = ({ note, actionSheetRef }) => {
} else { } else {
contextValue.deselect(item); contextValue.deselect(item);
} }
}, }}
key: item.id, />
type: "transparent" )}
})} itemType="notebook"
icon={(expanded) => ({ onAddItem={async (title) => {
name: expanded ? "chevron-up" : "chevron-down", return await onAddNotebook(title);
color: expanded }}
? colors.primary.accent ListFooterComponent={<View style={{ height: 20 }} />}
: colors.primary.paragraph />
})} </View>
onScrollEnd={() => {
actionSheetRef.current?.handleChildScrollEnd();
}}
hasSubList={true}
hasHeaderSearch={false}
type="grayBg"
sublistItemType="topic"
onAddItem={(title) => {
return onAddTopic(title, item);
}}
onAddSublistItem={(item) => {
openAddTopicDialog(item);
}}
onPress={(item) => {
const itemState = useItemSelectionStore.getState().itemState;
const currentState = itemState[item.id];
if (currentState !== "selected") {
resetItemState("deselected");
contextValue.select(item);
} else {
contextValue.deselect(item);
}
}}
/>
)}
itemType="notebook"
onAddItem={async (title) => {
return await onAddNotebook(title);
}}
ListFooterComponent={<View style={{ height: 20 }} />}
/>
</SelectionProvider> </SelectionProvider>
</View> </View>
</> </>

View File

@@ -273,6 +273,7 @@ export const ListItem = ({
alignSelf: "flex-end", alignSelf: "flex-end",
maxHeight: 250 maxHeight: 250
}} }}
estimatedItemSize={40}
itemType={sublistItemType} itemType={sublistItemType}
hasHeaderSearch={hasHeaderSearch} hasHeaderSearch={hasHeaderSearch}
renderItem={({ item, index }) => ( renderItem={({ item, index }) => (

View File

@@ -43,6 +43,7 @@ import Paragraph from "../../ui/typography/paragraph";
import { eSendEvent } from "../../../services/event-manager"; import { eSendEvent } from "../../../services/event-manager";
import { eCloseSheet } from "../../../utils/events"; import { eCloseSheet } from "../../../utils/events";
import { requestInAppReview } from "../../../services/app-review"; import { requestInAppReview } from "../../../services/app-review";
import { Dialog } from "../../dialog";
const ExportNotesSheet = ({ notes, update }) => { const ExportNotesSheet = ({ notes, update }) => {
const { colors } = useThemeColors(); const { colors } = useThemeColors();
@@ -97,6 +98,16 @@ const ExportNotesSheet = ({ notes, update }) => {
id: notesnook.ids.dialogs.export.md, id: notesnook.ids.dialogs.export.md,
pro: premium pro: premium
}, },
{
title: "Markdown + Frontmatter",
func: async () => {
await save("md-frontmatter");
},
icon: "language-markdown",
desc: "View in any text or markdown editor",
id: notesnook.ids.dialogs.export.md,
pro: premium
},
{ {
title: "Plain Text", title: "Plain Text",
func: async () => { func: async () => {
@@ -147,6 +158,8 @@ const ExportNotesSheet = ({ notes, update }) => {
</> </>
) : null} ) : null}
<Dialog context="export-notes" />
<View style={styles.buttonContainer}> <View style={styles.buttonContainer}>
{!exporting && !complete ? ( {!exporting && !complete ? (
actions.map((item) => ( actions.map((item) => (
@@ -178,7 +191,9 @@ const ExportNotesSheet = ({ notes, update }) => {
> >
<Icon <Icon
name={item.icon} name={item.icon}
color={item.pro ? colors.primary.accent : colors.primary.icon} color={
item.pro ? colors.primary.accent : colors.primary.icon
}
size={SIZE.xxxl + 10} size={SIZE.xxxl + 10}
/> />
</View> </View>
@@ -334,7 +349,8 @@ ExportNotesSheet.present = (notes, allNotes) => {
notes={allNotes ? db.notes.all : notes} notes={allNotes ? db.notes.all : notes}
update={update} update={update}
/> />
) ),
keyboardHandlerDisabled: true
}); });
}; };

View File

@@ -37,7 +37,7 @@ import Heading from "../../ui/typography/heading";
import Paragraph from "../../ui/typography/paragraph"; import Paragraph from "../../ui/typography/paragraph";
import { requestInAppReview } from "../../../services/app-review"; import { requestInAppReview } from "../../../services/app-review";
const PublishNoteSheet = ({ note: item, update }) => { const PublishNoteSheet = ({ note: item }) => {
const { colors } = useThemeColors(); const { colors } = useThemeColors();
const actionSheetRef = useRef(); const actionSheetRef = useRef();
@@ -48,8 +48,7 @@ const PublishNoteSheet = ({ note: item, update }) => {
const [note, setNote] = useState(item); const [note, setNote] = useState(item);
const [publishing, setPublishing] = useState(false); const [publishing, setPublishing] = useState(false);
const publishUrl = const publishUrl =
note && note && `https://monogr.ph/${db?.monographs.monograph(note?.id)}`;
`https://monograph.notesnook.com/${db?.monographs.monograph(note?.id)}`;
const isPublished = note && db?.monographs.isPublished(note?.id); const isPublished = note && db?.monographs.isPublished(note?.id);
const pwdInput = useRef(); const pwdInput = useRef();
const passwordValue = useRef(); const passwordValue = useRef();

View File

@@ -531,9 +531,7 @@ export default function ReminderSheet({
androidVariant="nativeAndroid" androidVariant="nativeAndroid"
is24hourSource="locale" is24hourSource="locale"
locale={ locale={
db.settings?.getTimeFormat() === "24-hour" db.settings?.getTimeFormat() === "24-hour" ? "en_GB" : "en_US"
? "en_GB.UTF8"
: "en_US.UTF8"
} }
mode={reminderMode === ReminderModes.Repeat ? "time" : "datetime"} mode={reminderMode === ReminderModes.Repeat ? "time" : "datetime"}
/> />

View File

@@ -17,15 +17,17 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import React from "react"; import { ScopedThemeProvider, useThemeColors } from "@notesnook/theme";
import React, { useEffect, useRef } from "react";
import { Platform, View } from "react-native"; import { Platform, View } from "react-native";
import ActionSheet from "react-native-actions-sheet"; import ActionSheet from "react-native-actions-sheet";
import useGlobalSafeAreaInsets from "../../../hooks/use-global-safe-area-insets"; import useGlobalSafeAreaInsets from "../../../hooks/use-global-safe-area-insets";
import { useSettingStore } from "../../../stores/use-setting-store"; import { useSettingStore } from "../../../stores/use-setting-store";
import { ScopedThemeProvider, useThemeColors } from "@notesnook/theme";
import { PremiumToast } from "../../premium/premium-toast"; import { PremiumToast } from "../../premium/premium-toast";
import { Toast } from "../../toast"; import { Toast } from "../../toast";
import { BouncingView } from "../transitions/bouncing-view"; import { useAppState } from "../../../hooks/use-app-state";
import SettingsService from "../../../services/settings";
import { useUserStore } from "../../../stores/use-user-store";
const SheetWrapper = ({ const SheetWrapper = ({
children, children,
@@ -35,12 +37,13 @@ const SheetWrapper = ({
onOpen, onOpen,
closeOnTouchBackdrop = true, closeOnTouchBackdrop = true,
onHasReachedTop, onHasReachedTop,
keyboardMode,
overlay, overlay,
overlayOpacity = 0.3, overlayOpacity = 0.3,
enableGesturesInScrollView = false, enableGesturesInScrollView = false,
bottomPadding = true bottomPadding = true,
keyboardHandlerDisabled
}) => { }) => {
const localRef = useRef(null);
const { colors } = useThemeColors("sheet"); const { colors } = useThemeColors("sheet");
const deviceMode = useSettingStore((state) => state.deviceMode); const deviceMode = useSettingStore((state) => state.deviceMode);
const sheetKeyboardHandler = useSettingStore( const sheetKeyboardHandler = useSettingStore(
@@ -50,6 +53,8 @@ const SheetWrapper = ({
const smallTablet = deviceMode === "smallTablet"; const smallTablet = deviceMode === "smallTablet";
const dimensions = useSettingStore((state) => state.dimensions); const dimensions = useSettingStore((state) => state.dimensions);
const insets = useGlobalSafeAreaInsets(); const insets = useGlobalSafeAreaInsets();
const appState = useAppState();
const lockEvents = useRef(false);
let width = dimensions.width > 600 ? 600 : 500; let width = dimensions.width > 600 ? 600 : 500;
const style = React.useMemo(() => { const style = React.useMemo(() => {
@@ -68,19 +73,41 @@ const SheetWrapper = ({
}, [colors.primary.background, largeTablet, smallTablet, width]); }, [colors.primary.background, largeTablet, smallTablet, width]);
const _onOpen = () => { const _onOpen = () => {
if (lockEvents.current) return;
onOpen && onOpen(); onOpen && onOpen();
}; };
const _onClose = async () => { const _onClose = async () => {
if (lockEvents.current) return;
if (onClose) { if (onClose) {
onClose(); onClose();
} }
}; };
useEffect(() => {
if (useUserStore.getState().disableAppLockRequests) return;
if (SettingsService.get().appLockMode === "background") {
if (appState === "background") {
const ref = fwdRef || localRef;
ref?.current?.hide();
if (useUserStore.getState().appLocked) {
lockEvents.current = true;
const unsub = useUserStore.subscribe((state) => {
if (!state.appLocked) {
ref?.current?.show();
unsub();
lockEvents.current = false;
}
});
}
}
}
}, [appState, fwdRef]);
return ( return (
<ScopedThemeProvider value="sheet"> <ScopedThemeProvider value="sheet">
<ActionSheet <ActionSheet
ref={fwdRef} ref={fwdRef || localRef}
testIDs={{ testIDs={{
backdrop: "sheet-backdrop" backdrop: "sheet-backdrop"
}} }}
@@ -94,8 +121,9 @@ const SheetWrapper = ({
initialOffsetFromBottom={1} initialOffsetFromBottom={1}
onPositionChanged={onHasReachedTop} onPositionChanged={onHasReachedTop}
closeOnTouchBackdrop={closeOnTouchBackdrop} closeOnTouchBackdrop={closeOnTouchBackdrop}
keyboardMode={keyboardMode} keyboardHandlerEnabled={
keyboardHandlerEnabled={sheetKeyboardHandler} keyboardHandlerDisabled ? false : sheetKeyboardHandler
}
closeOnPressBack={closeOnTouchBackdrop} closeOnPressBack={closeOnTouchBackdrop}
indicatorColor={colors.secondary.background} indicatorColor={colors.secondary.background}
onOpen={_onOpen} onOpen={_onOpen}

View File

@@ -188,7 +188,7 @@ export const useActions = ({ close = () => null, item }) => {
Notifications.displayNotification({ Notifications.displayNotification({
title: item.title, title: item.title,
message: item.headline || text, message: item.headline || text,
subtitle: item.headline || text, subtitle: "",
bigText: html, bigText: html,
ongoing: true, ongoing: true,
actions: ["UNPIN"], actions: ["UNPIN"],
@@ -550,15 +550,6 @@ export const useActions = ({ close = () => null, item }) => {
} }
async function exportNote() { async function exportNote() {
if (item.locked) {
ToastEvent.show({
heading: "Note is locked",
type: "error",
message: "Locked notes cannot be exported",
context: "local"
});
return;
}
ExportNotesSheet.present([item]); ExportNotesSheet.present([item]);
} }

View File

@@ -229,12 +229,25 @@ async function saveEditorState() {
MMKV.setString("appState", state); MMKV.setString("appState", state);
} }
} }
/**
*
* @param {RNIap.Purchase} subscription
*/
const onSuccessfulSubscription = async (subscription) => { const onSuccessfulSubscription = async (subscription) => {
console.log(
"Subscription success!",
subscription.transactionId,
subscription.obfuscatedAccountIdAndroid,
subscription.obfuscatedProfileIdAndroid
);
await PremiumService.subscriptions.set(subscription); await PremiumService.subscriptions.set(subscription);
await PremiumService.subscriptions.verify(subscription); await PremiumService.subscriptions.verify(subscription);
}; };
/**
*
* @param {RNIap.PurchaseError} error
*/
const onSubscriptionError = async (error) => { const onSubscriptionError = async (error) => {
ToastEvent.show({ ToastEvent.show({
heading: "Failed to subscribe", heading: "Failed to subscribe",
@@ -447,7 +460,6 @@ export const useAppEvents = () => {
} }
clearMessage(); clearMessage();
subscribeToIAPListeners();
if (!login) { if (!login) {
user = await db.user.fetchUser(); user = await db.user.fetchUser();
setUser(user); setUser(user);
@@ -466,7 +478,11 @@ export const useAppEvents = () => {
userEmailConfirmed: true userEmailConfirmed: true
}); });
} }
subscribeToIAPListeners();
} catch (e) { } catch (e) {
DatabaseLogger.error(e);
ToastEvent.error(e, "An error occurred", "global"); ToastEvent.error(e, "An error occurred", "global");
} }
@@ -490,14 +506,15 @@ export const useAppEvents = () => {
); );
const subscribeToIAPListeners = useCallback(async () => { const subscribeToIAPListeners = useCallback(async () => {
await RNIap.initConnection() if (Platform.OS === "android") {
.catch(() => null) try {
.then(async () => { await RNIap.flushFailedPurchasesCachedAsPendingAndroid();
refValues.current.subsriptionSuccessListener = } catch (e) {}
RNIap.purchaseUpdatedListener(onSuccessfulSubscription); }
refValues.current.subsriptionErrorListener = refValues.current.subsriptionSuccessListener =
RNIap.purchaseErrorListener(onSubscriptionError); RNIap.purchaseUpdatedListener(onSuccessfulSubscription);
}); refValues.current.subsriptionErrorListener =
RNIap.purchaseErrorListener(onSubscriptionError);
}, []); }, []);
const unSubscribeFromIAPListeners = () => { const unSubscribeFromIAPListeners = () => {
@@ -606,15 +623,20 @@ export const useAppEvents = () => {
}, [loading, onUserUpdated]); }, [loading, onUserUpdated]);
const initializeDatabase = useCallback(async () => { const initializeDatabase = useCallback(async () => {
if (!db.isInitialized) { try {
RNBootSplash.hide({ fade: true }); if (!db.isInitialized) {
DatabaseLogger.info("Initializing database"); RNBootSplash.hide({ fade: true });
await db.init(); DatabaseLogger.info("Initializing database");
await db.init();
}
if (IsDatabaseMigrationRequired()) return;
initialize();
setLoading(false);
Walkthrough.init();
} catch (e) {
DatabaseLogger.error(e);
ToastEvent.error(e, "Error initializing database", "global");
} }
if (IsDatabaseMigrationRequired()) return;
initialize();
setLoading(false);
Walkthrough.init();
}, [IsDatabaseMigrationRequired]); }, [IsDatabaseMigrationRequired]);
useEffect(() => { useEffect(() => {

View File

@@ -1,82 +0,0 @@
/*
This file is part of the Notesnook project (https://notesnook.com/)
Copyright (C) 2023 Streetwriters (Private) Limited
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import { useEffect, useState } from "react";
import { eSubscribeEvent, eUnSubscribeEvent } from "../services/event-manager";
import { useEditorStore } from "../stores/use-editor-store";
import { useTagStore } from "../stores/use-tag-store";
import { db } from "../common/database";
import { NoteType } from "app/utils/types";
import { useCallback } from "react";
/**
* A hook that injects/removes tags from tags bar in editor
*/
const useEditorTags = () => {
const currentEditingNote = useEditorStore(
(state) => state.currentEditingNote
);
const tags = useTagStore((state) => state.tags);
const [note, setNote] = useState<NoteType | null>(null);
const [noteTags, setNoteTags] = useState<string[]>([]);
const refreshNote = useCallback(() => {
const current = useEditorStore.getState().currentEditingNote;
if (!current) {
setNote(null);
setNoteTags([]);
return;
}
const note = db.notes?.note(current)?.data as NoteType;
setNote(note ? { ...note } : null);
getTags(note);
}, []);
useEffect(() => {
refreshNote();
}, [currentEditingNote, refreshNote, tags]);
const load = useCallback(() => {
if (!note) return;
// tiny.call(EditorWebView, renderTags(noteTags));
}, [note]);
useEffect(() => {
eSubscribeEvent("updateTags", load);
return () => {
eUnSubscribeEvent("updateTags", load);
};
}, [load, noteTags]);
function getTags(note: NoteType) {
if (!note || !note.tags) return [];
const tags = note.tags
.map((t) => (db.tags?.tag(t) ? { ...db.tags.tag(t) } : null))
.filter((t) => t !== null);
setNoteTags(tags);
}
useEffect(() => {
load();
}, [load, noteTags]);
return [];
};
export default useEditorTags;

View File

@@ -384,7 +384,16 @@ const _TabsHolder = () => {
}, []); }, []);
useEffect(() => { useEffect(() => {
changeNavigationBarColor(colors.primary.background, isDark, true); function updateSystemBars() {
changeNavigationBarColor(colors.primary.background, isDark, true);
StatusBar.setBackgroundColor("transparent");
StatusBar.setTranslucent(true);
StatusBar.setBarStyle(isDark ? "light-content" : "dark-content");
}
updateSystemBars();
setTimeout(() => {
updateSystemBars();
}, 1000);
}, [colors.primary.background, isDark]); }, [colors.primary.background, isDark]);
return ( return (
@@ -406,11 +415,7 @@ const _TabsHolder = () => {
: 0 : 0
}} }}
> >
<StatusBar <StatusBar translucent={true} backgroundColor="transparent" />
barStyle={isDark ? "light-content" : "dark-content"}
translucent={true}
backgroundColor="transparent"
/>
{!introCompleted ? ( {!introCompleted ? (
<NavigationStack /> <NavigationStack />

View File

@@ -16,7 +16,7 @@
"html-to-text": "9.0.5", "html-to-text": "9.0.5",
"phone": "^3.1.14", "phone": "^3.1.14",
"qclone": "^1.2.0", "qclone": "^1.2.0",
"react-native-actions-sheet": "0.9.0-alpha.23", "react-native-actions-sheet": "0.9.0-alpha.24",
"react-native-check-version": "https://github.com/flexible-agency/react-native-check-version", "react-native-check-version": "https://github.com/flexible-agency/react-native-check-version",
"react-native-drax": "^0.10.2", "react-native-drax": "^0.10.2",
"react-native-image-zoom-viewer": "^3.0.1", "react-native-image-zoom-viewer": "^3.0.1",
@@ -31,7 +31,8 @@
"url": "^0.11.0", "url": "^0.11.0",
"validator": "^13.5.2", "validator": "^13.5.2",
"zustand": "^3.6.0", "zustand": "^3.6.0",
"katex": "0.16.2" "katex": "0.16.2",
"@readme/data-urls": "3.0.0"
}, },
"sideEffects": false "sideEffects": false
} }

View File

@@ -45,6 +45,7 @@ import { EditorProps, useEditorType } from "./tiptap/types";
import { useEditor } from "./tiptap/use-editor"; import { useEditor } from "./tiptap/use-editor";
import { useEditorEvents } from "./tiptap/use-editor-events"; import { useEditorEvents } from "./tiptap/use-editor-events";
import { editorController } from "./tiptap/utils"; import { editorController } from "./tiptap/utils";
import { useThemeColors } from "@notesnook/theme";
const style: ViewStyle = { const style: ViewStyle = {
height: "100%", height: "100%",
@@ -93,35 +94,6 @@ const Editor = React.memo(
get: () => editor get: () => editor
})); }));
const onMediaDownloaded = useCallback(
({
hash,
groupId,
src,
attachmentType
}: {
hash: string;
groupId: string;
src: string;
attachmentType: string;
}) => {
if (groupId !== editor.note.current?.id) return;
editorController.current.markImageLoaded(hash);
if (attachmentType === "webclip") {
editor.commands.updateWebclip({
hash: hash,
src: src
});
} else {
editor.commands.updateImage({
hash: hash,
src: src
});
}
},
[editor.commands, editor.note]
);
const onError = useCallback(() => { const onError = useCallback(() => {
renderKey.current = renderKey.current =
renderKey.current === `editor-0` ? `editor-1` : `editor-0`; renderKey.current === `editor-0` ? `editor-1` : `editor-0`;
@@ -130,16 +102,11 @@ const Editor = React.memo(
}, [editor]); }, [editor]);
useEffect(() => { useEffect(() => {
const sub = [ const sub = [eSubscribeEvent("webview_reset", onError)];
eSubscribeEvent("webview_reset", onError),
EV.subscribe(EVENTS.mediaAttachmentDownloaded, onMediaDownloaded)
];
return () => { return () => {
sub.forEach((s) => s.unsubscribe()); sub.forEach((s) => s.unsubscribe());
EV.unsubscribe(EVENTS.mediaAttachmentDownloaded, onMediaDownloaded);
}; };
}, [onError, onMediaDownloaded]); }, [onError]);
useLayoutEffect(() => { useLayoutEffect(() => {
setImmediate(() => { setImmediate(() => {
@@ -167,7 +134,7 @@ const Editor = React.memo(
globalThis.noToolbar=${noToolbar}; globalThis.noToolbar=${noToolbar};
globalThis.noHeader=${noHeader}; globalThis.noHeader=${noHeader};
`} `}
injectedJavaScript={`globalThis.sessionId="${editor.sessionId}";`} useSharedProcessPool={false}
javaScriptEnabled={true} javaScriptEnabled={true}
focusable={true} focusable={true}
onContentProcessDidTerminate={onError} onContentProcessDidTerminate={onError}
@@ -210,6 +177,7 @@ export default Editor;
const ReadonlyButton = ({ editor }: { editor: useEditorType }) => { const ReadonlyButton = ({ editor }: { editor: useEditorType }) => {
const readonly = useEditorStore((state) => state.readonly); const readonly = useEditorStore((state) => state.readonly);
const keyboard = useKeyboard(); const keyboard = useKeyboard();
const { colors } = useThemeColors();
const onPress = async () => { const onPress = async () => {
if (editor.note.current) { if (editor.note.current) {
@@ -225,7 +193,7 @@ const ReadonlyButton = ({ editor }: { editor: useEditorType }) => {
name="pencil-lock" name="pencil-lock"
type="grayBg" type="grayBg"
onPress={onPress} onPress={onPress}
color="accent" color={colors.primary.accent}
customStyle={{ customStyle={{
position: "absolute", position: "absolute",
bottom: 60, bottom: 60,

View File

@@ -17,10 +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/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import type { import type { Attachment } from "@notesnook/editor/dist/extensions/attachment/index";
Attachment,
AttachmentProgress
} from "@notesnook/editor/dist/extensions/attachment/index";
import type { ImageAttributes } from "@notesnook/editor/dist/extensions/image/index"; import type { ImageAttributes } from "@notesnook/editor/dist/extensions/image/index";
import { createRef, RefObject } from "react"; import { createRef, RefObject } from "react";
import { Platform } from "react-native"; import { Platform } from "react-native";
@@ -113,7 +110,7 @@ typeof globalThis.statusBar !== "undefined" && statusBar.current.set({date:"",sa
}; };
setSessionId = async (id: string | null) => setSessionId = async (id: string | null) =>
await this.doAsync(`globalThis.sessionId = "${id}"`); await this.doAsync(`globalThis.sessionId = "${id}";`);
setStatus = async (date: string | undefined, saved: string) => setStatus = async (date: string | undefined, saved: string) =>
await this.doAsync( await this.doAsync(
@@ -203,17 +200,33 @@ typeof globalThis.statusBar !== "undefined" && statusBar.current.set({date:"",sa
); );
}; };
setAttachmentProgress = async (attachmentProgress: AttachmentProgress) => { setAttachmentProgress = async (attachmentProgress: Partial<Attachment>) => {
await this.doAsync( await this.doAsync(
`editor && editor.commands.setAttachmentProgress(${JSON.stringify( `editor && editor.commands.updateAttachment(${JSON.stringify(
attachmentProgress attachmentProgress
)})` )}, {
preventUpdate: true,
query: (attachment) => {
return attachment.hash === "${attachmentProgress.hash}";
}
})`
); );
}; };
insertImage = async (image: ImageAttributes) => { insertImage = async (
image: Omit<ImageAttributes, "bloburl"> & {
dataurl: string;
}
) => {
await this.doAsync( await this.doAsync(
`editor && editor.commands.insertImage(${JSON.stringify(image)})` `const image = toBlobURL("${image.dataurl}", "${image.hash}");
editor && editor.commands.insertImage({
...${JSON.stringify({
...image,
dataurl: undefined
})},
bloburl: image
})`
); );
}; };
@@ -225,11 +238,20 @@ typeof globalThis.statusBar !== "undefined" && statusBar.current.set({date:"",sa
); );
}; };
updateImage = async ({ src, hash }: Partial<ImageAttributes>) => { updateImage = async ({
hash,
dataurl
}: Partial<Omit<ImageAttributes, "bloburl">> & {
dataurl: string;
}) => {
await this.doAsync( await this.doAsync(
`editor && editor.commands.updateImage(${JSON.stringify({ `const image = toBlobURL("${dataurl}", "${hash}");
editor && editor.commands.updateImage(${JSON.stringify({
hash hash
})},${JSON.stringify({ dataurl: src, hash, preventUpdate: true })})` })}, {
...${JSON.stringify({ hash, preventUpdate: true })},
bloburl: image
})`
); );
}; };

View File

@@ -36,5 +36,6 @@ export const EventTypes = {
contentchange: "editor-event:content-change", contentchange: "editor-event:content-change",
reminders: "editor-event:reminders", reminders: "editor-event:reminders",
previewAttachment: "editor-event:preview-attachment", previewAttachment: "editor-event:preview-attachment",
copyToClipboard: "editor-events:copy-to-clipboard" copyToClipboard: "editor-events:copy-to-clipboard",
getAttachmentData: "editor-events:get-attachment-data"
}; };

View File

@@ -35,6 +35,7 @@ import { FILE_SIZE_LIMIT, IMAGE_SIZE_LIMIT } from "../../../utils/constants";
import { eCloseSheet } from "../../../utils/events"; import { eCloseSheet } from "../../../utils/events";
import { editorController, editorState } from "./utils"; import { editorController, editorState } from "./utils";
import { useSettingStore } from "../../../stores/use-setting-store"; import { useSettingStore } from "../../../stores/use-setting-store";
import filesystem from "../../../common/filesystem";
const showEncryptionSheet = (file) => { const showEncryptionSheet = (file) => {
presentSheet({ presentSheet({
@@ -230,6 +231,16 @@ const handleImageResponse = async (response, options) => {
}); });
let fileName = image.originalFileName || image.fileName; let fileName = image.originalFileName || image.fileName;
editorController.current?.commands.insertImage({
hash: hash,
mime: image.type,
title: fileName,
dataurl: b64,
size: image.fileSize,
filename: fileName
});
if (!(await attachFile(uri, hash, image.type, fileName, options))) return; if (!(await attachFile(uri, hash, image.type, fileName, options))) return;
const isPng = /(png)/g.test(image.type); const isPng = /(png)/g.test(image.type);
const isJpeg = /(jpeg|jpg)/g.test(image.type); const isJpeg = /(jpeg|jpg)/g.test(image.type);
@@ -243,15 +254,6 @@ const handleImageResponse = async (response, options) => {
} }
if (Platform.OS === "ios") await RNFetchBlob.fs.unlink(uri); if (Platform.OS === "ios") await RNFetchBlob.fs.unlink(uri);
editorController.current?.commands.insertImage({
hash: hash,
mime: image.type,
title: fileName,
dataurl: b64,
size: image.fileSize,
filename: fileName
});
}; };
export async function attachFile(uri, hash, type, filename, options) { export async function attachFile(uri, hash, type, filename, options) {
@@ -269,6 +271,10 @@ export async function attachFile(uri, hash, type, filename, options) {
return false; return false;
} }
if (!options.reupload && exists) {
options.reupload = (await filesystem.getUploadedFileSize(hash)) <= 0;
}
if (!exists || options?.reupload) { if (!exists || options?.reupload) {
let key = await db.attachments.generateKey(); let key = await db.attachments.generateKey();
encryptionInfo = await Sodium.encryptFile(key, { encryptionInfo = await Sodium.encryptFile(key, {

View File

@@ -97,6 +97,7 @@ export type SavePayload = {
type?: Content["type"]; type?: Content["type"];
sessionId?: string | null; sessionId?: string | null;
sessionHistoryId?: number; sessionHistoryId?: number;
ignoreEdit: boolean;
}; };
export type AppState = { export type AppState = {

View File

@@ -66,6 +66,7 @@ import { EditorMessage, EditorProps, useEditorType } from "./types";
import { EditorEvents, editorState } from "./utils"; import { EditorEvents, editorState } from "./utils";
import { useNoteStore } from "../../../stores/use-notes-store"; import { useNoteStore } from "../../../stores/use-notes-store";
import SettingsService from "../../../services/settings"; import SettingsService from "../../../services/settings";
import downloadAttachment from "../../../common/filesystem/download-attachment";
const publishNote = async (editor: useEditorType) => { const publishNote = async (editor: useEditorType) => {
const user = useUserStore.getState().user; const user = useUserStore.getState().user;
@@ -127,6 +128,8 @@ const showActionsheet = async (editor: useEditorType) => {
} }
}; };
type ContentMessage = { html: string; ignoreEdit: boolean };
export const useEditorEvents = ( export const useEditorEvents = (
editor: useEditorType, editor: useEditorType,
{ readonly: editorPropReadonly, noHeader, noToolbar }: Partial<EditorProps> { readonly: editorPropReadonly, noHeader, noToolbar }: Partial<EditorProps>
@@ -189,7 +192,7 @@ export const useEditorEvents = (
readonly: readonly || editorPropReadonly, readonly: readonly || editorPropReadonly,
tools: tools || getDefaultPresets().default, tools: tools || getDefaultPresets().default,
noHeader: noHeader, noHeader: noHeader,
noToolbar: readonly || editorPropReadonly || noToolbar, noToolbar: noToolbar,
doubleSpacedLines: doubleSpacedLines, doubleSpacedLines: doubleSpacedLines,
corsProxy: corsProxy, corsProxy: corsProxy,
fontSize: fontSize:
@@ -205,7 +208,6 @@ export const useEditorEvents = (
fullscreen, fullscreen,
isPremium, isPremium,
readonly, readonly,
editor.sessionId,
editor.loading, editor.loading,
deviceMode, deviceMode,
tools, tools,
@@ -229,6 +231,8 @@ export const useEditorEvents = (
logger.info("editor handled back event", editorHandledBack); logger.info("editor handled back event", editorHandledBack);
return; return;
} }
editorState().currentlyEditing = false;
editor.reset();
setTimeout(async () => { setTimeout(async () => {
if (deviceMode !== "mobile" && fullscreen) { if (deviceMode !== "mobile" && fullscreen) {
if (fullscreen) { if (fullscreen) {
@@ -241,14 +245,10 @@ export const useEditorEvents = (
editorState().movedAway = true; editorState().movedAway = true;
tabBarRef.current?.goToPage(0); tabBarRef.current?.goToPage(0);
} }
setImmediate(() => {
useEditorStore.getState().setCurrentlyEditingNote(null); setTimeout(() => {
setTimeout(() => { Navigation.queueRoutesForUpdate();
Navigation.queueRoutesForUpdate(); }, 500);
}, 500);
});
editorState().currentlyEditing = false;
editor.reset();
}, 1); }, 1);
}, [editor, deviceMode, fullscreen]); }, [editor, deviceMode, fullscreen]);
@@ -333,19 +333,25 @@ export const useEditorEvents = (
if (editorMessage.type === EventTypes.content) { if (editorMessage.type === EventTypes.content) {
editor.saveContent({ editor.saveContent({
type: editorMessage.type, type: editorMessage.type,
content: editorMessage.value as string, content: (editorMessage.value as ContentMessage).html,
ignoreEdit: (editorMessage.value as ContentMessage).ignoreEdit,
forSessionId: editorMessage.sessionId forSessionId: editorMessage.sessionId
}); });
} else if (editorMessage.type === EventTypes.title) { } else if (editorMessage.type === EventTypes.title) {
editor.saveContent({ editor.saveContent({
type: editorMessage.type, type: editorMessage.type,
title: editorMessage.value as string, title: editorMessage.value as string,
forSessionId: editorMessage.sessionId forSessionId: editorMessage.sessionId,
ignoreEdit: false
}); });
} }
if (editorMessage.type === EventTypes.back) {
return onBackPress();
}
if ( if (
editorMessage.sessionId !== editor.sessionId && editorMessage.sessionId !== editor.sessionId.current &&
editorMessage.type !== EditorEvents.status editorMessage.type !== EditorEvents.status
) { ) {
return; return;
@@ -415,6 +421,44 @@ export const useEditorEvents = (
break; break;
} }
case EventTypes.getAttachmentData: {
const attachment = (editorMessage.value as any)
.attachment as Attachment;
console.log(
"Getting attachment data:",
attachment.hash,
attachment.type
);
downloadAttachment(attachment.hash, true, {
base64: attachment.type === "image",
text: attachment.type === "web-clip",
silent: true,
groupId: editor.note.current?.id,
cache: true
} as any)
.then((data: any) => {
console.log(
"Got attachment data:",
!!data,
(editorMessage.value as any).resolverId
);
editor.postMessage(EditorEvents.attachmentData, {
resolverId: (editorMessage.value as any).resolverId,
data
});
})
.catch(() => {
console.log("Error downloading attachment data");
editor.postMessage(EditorEvents.attachmentData, {
resolverId: (editorMessage.value as any).resolverId,
data: undefined
});
});
break;
}
case EventTypes.pro: case EventTypes.pro:
if (editor.state.current?.isFocused) { if (editor.state.current?.isFocused) {
editor.state.current.isFocused = true; editor.state.current.isFocused = true;
@@ -431,9 +475,6 @@ export const useEditorEvents = (
editorState().isFullscreen = true; editorState().isFullscreen = true;
eSendEvent(eOpenFullscreenEditor); eSendEvent(eOpenFullscreenEditor);
break; break;
case EventTypes.back:
onBackPress();
break;
case EventTypes.link: case EventTypes.link:
openLinkInBrowser(editorMessage.value as string); openLinkInBrowser(editorMessage.value as string);
break; break;

View File

@@ -63,8 +63,7 @@ export const useEditor = (
const theme = useThemeEngineStore((state) => state.theme); const theme = useThemeEngineStore((state) => state.theme);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [sessionId, setSessionId] = useState<string>(makeSessionId()); const sessionIdRef = useRef(makeSessionId());
const sessionIdRef = useRef(sessionId);
const editorRef = useRef<WebView>(null); const editorRef = useRef<WebView>(null);
const currentNote = useRef<NoteType | null>(); const currentNote = useRef<NoteType | null>();
const currentContent = useRef<Content | null>(); const currentContent = useRef<Content | null>();
@@ -79,7 +78,6 @@ export const useEditor = (
const saveCount = useRef(0); const saveCount = useRef(0);
const lastContentChangeTime = useRef<number>(0); const lastContentChangeTime = useRef<number>(0);
const lock = useRef(false); const lock = useRef(false);
const loadedImages = useRef<{ [name: string]: boolean }>({});
const lockedSessionId = useRef<string>(); const lockedSessionId = useRef<string>();
const loadingState = useRef<string>(); const loadingState = useRef<string>();
@@ -99,10 +97,6 @@ export const useEditor = (
postMessage(EditorEvents.theme, theme); postMessage(EditorEvents.theme, theme);
}, [theme, postMessage]); }, [theme, postMessage]);
useEffect(() => {
sessionIdRef.current = sessionId;
}, [sessionId]);
useEffect(() => { useEffect(() => {
commands.setTags(currentNote.current); commands.setTags(currentNote.current);
}, [commands, tags]); }, [commands, tags]);
@@ -134,14 +128,12 @@ export const useEditor = (
const reset = useCallback( const reset = useCallback(
async (resetState = true, resetContent = true) => { async (resetState = true, resetContent = true) => {
currentNote.current?.id && currentNote.current?.id && db.fs?.cancel(currentNote.current.id);
db.fs?.cancel(currentNote.current.id, "download");
currentNote.current = null; currentNote.current = null;
loadedImages.current = {};
currentContent.current = null; currentContent.current = null;
clearTimeout(timers.current["loading-images"]);
sessionHistoryId.current = undefined; sessionHistoryId.current = undefined;
saveCount.current = 0; saveCount.current = 0;
loadingState.current = undefined;
lock.current = false; lock.current = false;
useEditorStore.getState().setReadonly(false); useEditorStore.getState().setReadonly(false);
resetContent && postMessage(EditorEvents.title, ""); resetContent && postMessage(EditorEvents.title, "");
@@ -151,8 +143,8 @@ export const useEditor = (
if (resetState) { if (resetState) {
const newSessionId = makeSessionId(); const newSessionId = makeSessionId();
sessionIdRef.current = newSessionId;
await commands.setSessionId(newSessionId); await commands.setSessionId(newSessionId);
setSessionId(newSessionId);
isDefaultEditor && isDefaultEditor &&
useEditorStore.getState().setCurrentlyEditingNote(null); useEditorStore.getState().setCurrentlyEditingNote(null);
@@ -170,7 +162,8 @@ export const useEditor = (
data, data,
type, type,
sessionId: currentSessionId, sessionId: currentSessionId,
sessionHistoryId: currentSessionHistoryId sessionHistoryId: currentSessionHistoryId,
ignoreEdit
}: SavePayload) => { }: SavePayload) => {
if ( if (
readonly || readonly ||
@@ -202,6 +195,12 @@ export const useEditor = (
}; };
noteData.title = title; noteData.title = title;
if (ignoreEdit) {
console.log("Ignoring edits...");
noteData.dateEdited = note?.dateEdited;
}
if (data) { if (data) {
noteData.content = { noteData.content = {
data: data, data: data,
@@ -291,58 +290,6 @@ export const useEditor = (
} }
}, []); }, []);
const getMediaToLoad = (previousContent?: string) => {
if (!currentNote.current?.id) return [];
const previousAttachments =
previousContent?.matchAll(/data-hash="(.+?)"/gm) || [];
const attachments =
currentContent.current?.data?.matchAll(/data-hash="(.+?)"/gm) || [];
const media: string[] = [];
const oldMatches = Array.from(previousAttachments).map((match) => match[1]);
const matches = Array.from(attachments).map((match) => match[1]);
for (let i = 0; i < matches.length; i++) {
const currentHash = matches[i];
const oldHash = oldMatches[i];
if (currentHash !== oldHash) {
media.push(currentHash);
loadedImages.current[currentHash] = false;
}
}
return media;
};
const markImageLoaded = (hash: string) => {
const attachment = loadedImages.current[hash];
if (typeof attachment === "boolean") {
loadedImages.current[hash] = true;
}
};
const loadImages = useCallback((previousContent?: string) => {
if (!currentNote.current?.id) return;
const timerId = "loading-images";
clearTimeout(timers.current[timerId]);
timers.current[timerId] = setTimeout(() => {
if (!currentNote.current?.id) return;
if (currentNote.current?.content?.isPreview) {
db.content?.downloadMedia(
currentNote.current?.id,
currentNote.current.content,
true
);
} else {
const media = getMediaToLoad(previousContent);
if (media.length > 0) {
db.attachments?.downloadMedia(currentNote.current?.id, media);
}
}
}, 1000);
}, []);
const loadNote = useCallback( const loadNote = useCallback(
async ( async (
item: Omit<NoteType, "type"> & { item: Omit<NoteType, "type"> & {
@@ -363,7 +310,6 @@ export const useEditor = (
if (item && item.type === "new") { if (item && item.type === "new") {
currentNote.current && (await reset()); currentNote.current && (await reset());
const nextSessionId = makeSessionId(item as NoteType); const nextSessionId = makeSessionId(item as NoteType);
setSessionId(nextSessionId);
sessionIdRef.current = nextSessionId; sessionIdRef.current = nextSessionId;
sessionHistoryId.current = Date.now(); sessionHistoryId.current = Date.now();
await commands.setSessionId(nextSessionId); await commands.setSessionId(nextSessionId);
@@ -405,23 +351,21 @@ export const useEditor = (
} }
lastContentChangeTime.current = item.dateEdited; lastContentChangeTime.current = item.dateEdited;
const nextSessionId = makeSessionId(item as NoteType); const nextSessionId = makeSessionId(item as NoteType);
sessionIdRef.current = nextSessionId;
lockedSessionId.current = nextSessionId; lockedSessionId.current = nextSessionId;
sessionHistoryId.current = Date.now(); sessionHistoryId.current = Date.now();
setSessionId(nextSessionId); await commands.setSessionId(nextSessionId);
commands.setSessionId(nextSessionId);
sessionIdRef.current = nextSessionId;
currentNote.current = item as NoteType; currentNote.current = item as NoteType;
await commands.setStatus(getFormattedDate(item.dateEdited), "Saved"); await commands.setStatus(getFormattedDate(item.dateEdited), "Saved");
await postMessage(EditorEvents.title, item.title); await postMessage(EditorEvents.title, item.title);
loadingState.current = currentContent.current?.data; loadingState.current = currentContent.current?.data;
if (currentContent.current?.data) {
await postMessage( await postMessage(
EditorEvents.html, EditorEvents.html,
currentContent.current?.data, currentContent.current?.data || "",
10000 10000
); );
}
loadingState.current = undefined; loadingState.current = undefined;
useEditorStore.getState().setReadonly(item.readonly); useEditorStore.getState().setReadonly(item.readonly);
await commands.setTags(currentNote.current); await commands.setTags(currentNote.current);
@@ -432,18 +376,9 @@ export const useEditor = (
} }
}, 300); }, 300);
overlay(false); overlay(false);
loadImages();
} }
}, },
[ [commands, isDefaultEditor, loadContent, overlay, postMessage, reset]
commands,
isDefaultEditor,
loadContent,
loadImages,
overlay,
postMessage,
reset
]
); );
const lockNoteWithVault = useCallback((note: NoteType) => { const lockNoteWithVault = useCallback((note: NoteType) => {
@@ -473,8 +408,6 @@ export const useEditor = (
lock.current = true; lock.current = true;
const previousContent = currentContent.current?.data;
if (data.type === "tiptap") { if (data.type === "tiptap") {
if (!currentNote.current.locked && isContentEncrypted) { if (!currentNote.current.locked && isContentEncrypted) {
lockNoteWithVault(note); lockNoteWithVault(note);
@@ -507,18 +440,8 @@ export const useEditor = (
} }
lock.current = false; lock.current = false;
if (data.type === "tiptap") {
loadImages(previousContent);
db.eventManager.subscribe(
EVENTS.syncCompleted,
() => {
loadImages(previousContent);
},
true
);
}
}, },
[loadImages, lockNoteWithVault, postMessage, commands] [lockNoteWithVault, postMessage, commands]
); );
useEffect(() => { useEffect(() => {
@@ -538,12 +461,14 @@ export const useEditor = (
title, title,
content, content,
type, type,
forSessionId forSessionId,
ignoreEdit
}: { }: {
title?: string; title?: string;
content?: string; content?: string;
type: string; type: string;
forSessionId: string; forSessionId: string;
ignoreEdit: boolean;
}) => { }) => {
if (lock.current || lockedSessionId.current === forSessionId) return; if (lock.current || lockedSessionId.current === forSessionId) return;
lastContentChangeTime.current = Date.now(); lastContentChangeTime.current = Date.now();
@@ -574,7 +499,8 @@ export const useEditor = (
type: "tiptap", type: "tiptap",
sessionId: forSessionId, sessionId: forSessionId,
id: noteId, id: noteId,
sessionHistoryId: sessionHistoryId.current sessionHistoryId: sessionHistoryId.current,
ignoreEdit
}; };
withTimer( withTimer(
noteId || "newnote", noteId || "newnote",
@@ -592,7 +518,7 @@ export const useEditor = (
} }
saveNote(params); saveNote(params);
}, },
150 ignoreEdit ? 0 : 150
); );
}, },
[withTimer, onChange, saveNote] [withTimer, onChange, saveNote]
@@ -638,7 +564,7 @@ export const useEditor = (
useEffect(() => { useEffect(() => {
state.current.saveCount = 0; state.current.saveCount = 0;
}, [sessionId, loading]); }, [loading]);
const onReady = useCallback(async () => { const onReady = useCallback(async () => {
if (!(await isEditorLoaded(editorRef, sessionIdRef.current))) { if (!(await isEditorLoaded(editorRef, sessionIdRef.current))) {
@@ -690,14 +616,12 @@ export const useEditor = (
loading, loading,
setLoading, setLoading,
state, state,
sessionId, sessionId: sessionIdRef,
setSessionId,
note: currentNote, note: currentNote,
onReady, onReady,
saveContent, saveContent,
onContentChanged, onContentChanged,
editorId: editorId, editorId: editorId,
markImageLoaded,
overlay, overlay,
postMessage postMessage
}; };

View File

@@ -50,7 +50,8 @@ export const EditorEvents: { [name: string]: string } = {
titleplaceholder: "native:titleplaceholder", titleplaceholder: "native:titleplaceholder",
logger: "native:logger", logger: "native:logger",
status: "native:status", status: "native:status",
keyboardShown: "native:keyboardShown" keyboardShown: "native:keyboardShown",
attachmentData: "native:attachment-data"
}; };
export function randId(prefix: string) { export function randId(prefix: string) {

View File

@@ -115,7 +115,7 @@ export const EditorWrapper = ({ width }) => {
style={{ height: 1, padding: 0, width: 1, position: "absolute" }} style={{ height: 1, padding: 0, width: 1, position: "absolute" }}
blurOnSubmit={false} blurOnSubmit={false}
/> />
<ProgressBar /> {/* <ProgressBar /> */}
<Editor key="editor" withController={true} /> <Editor key="editor" withController={true} />
</KeyboardAvoidingViewIOS> </KeyboardAvoidingViewIOS>
)} )}

View File

@@ -69,10 +69,10 @@ export const TrashIntervalPicker = createSettingsPicker({
db.settings.setTrashCleanupInterval(item); db.settings.setTrashCleanupInterval(item);
}, },
formatValue: (item) => { formatValue: (item) => {
return item === -1 ? "Never" : item + " days"; return item === -1 ? "Never" : item === 1 ? "Daily" : item + " days";
}, },
getItemKey: (item) => item.toString(), getItemKey: (item) => item.toString(),
options: [-1, 7, 30, 365], options: [-1, 1, 7, 30, 365],
compareValue: (current, item) => current === item, compareValue: (current, item) => current === item,
premium: true premium: true
}); });

View File

@@ -88,8 +88,8 @@ export const settingsGroups: SettingSection[] = [
return isBasic || !user.subscription?.type return isBasic || !user.subscription?.type
? "Subscribe to Pro" ? "Subscribe to Pro"
: isTrial : isTrial
? "Your free trial has started" ? "Your free trial has started"
: "Subscription details"; : "Subscription details";
}, },
type: "component", type: "component",
component: "subscription", component: "subscription",
@@ -111,16 +111,16 @@ export const settingsGroups: SettingSection[] = [
return user.subscription?.type === 2 return user.subscription?.type === 2
? "You signed up on " + startDate ? "You signed up on " + startDate
: user.subscription?.type === 1 : user.subscription?.type === 1
? "Your free trial will end on " + expiryDate ? "Your free trial will end on " + expiryDate
: user.subscription?.type === 6 : user.subscription?.type === 6
? subscriptionDaysLeft.time < -3 ? subscriptionDaysLeft.time < -3
? "Your subscription has ended" ? "Your subscription has ended"
: "Your account will be downgraded to Basic in 3 days" : "Your account will be downgraded to Basic in 3 days"
: user.subscription?.type === 7 : user.subscription?.type === 7
? `Your subscription will end on ${expiryDate}.` ? `Your subscription will end on ${expiryDate}.`
: user.subscription?.type === 5 : user.subscription?.type === 5
? `Your subscription will renew on ${expiryDate}.` ? `Your subscription will renew on ${expiryDate}.`
: "Never hesitate to choose privacy"; : "Never hesitate to choose privacy";
} }
}, },
{ {
@@ -892,16 +892,6 @@ export const settingsGroups: SettingSection[] = [
name: "Restore backup", name: "Restore backup",
description: "Restore backup from phone storage.", description: "Restore backup from phone storage.",
modifer: () => { modifer: () => {
const user = useUserStore.getState().user;
if (!user || !user?.email) {
ToastEvent.show({
heading: "Login required",
message: "Please log in to your account to restore backup",
type: "error",
context: "global"
});
return;
}
eSendEvent(eOpenRestoreDialog); eSendEvent(eOpenRestoreDialog);
} }
}, },

View File

@@ -42,6 +42,9 @@ export const Subscription = () => {
user?.subscription?.type !== SUBSCRIPTION_STATUS.PREMIUM && user?.subscription?.type !== SUBSCRIPTION_STATUS.PREMIUM &&
user?.subscription?.type !== SUBSCRIPTION_STATUS.BETA; user?.subscription?.type !== SUBSCRIPTION_STATUS.BETA;
const hasCancelledPremium =
SUBSCRIPTION_STATUS.PREMIUM_CANCELLED === user?.subscription?.type;
const subscriptionProviderInfo = const subscriptionProviderInfo =
SUBSCRIPTION_PROVIDER[user?.subscription?.provider]; SUBSCRIPTION_PROVIDER[user?.subscription?.provider];
@@ -63,10 +66,7 @@ export const Subscription = () => {
return; return;
} }
if ( if (hasCancelledPremium && Platform.OS === "android") {
user?.subscription?.type === SUBSCRIPTION_STATUS.PREMIUM_CANCELLED &&
Platform.OS === "android"
) {
if (user.subscription?.provider === 3) { if (user.subscription?.provider === 3) {
ToastEvent.show({ ToastEvent.show({
heading: "Subscribed on web", heading: "Subscribed on web",
@@ -88,6 +88,13 @@ export const Subscription = () => {
} }
}; };
function getPrice() {
return Platform.OS === "android"
? monthlyPlan?.product?.subscriptionOfferDetails[0].pricingPhases
.pricingPhaseList?.[0]?.formattedPrice
: monthlyPlan?.product?.localizedPrice;
}
return ( return (
<View> <View>
{isNotPro ? ( {isNotPro ? (
@@ -104,22 +111,16 @@ export const Subscription = () => {
title={ title={
!user?.isEmailConfirmed !user?.isEmailConfirmed
? "Confirm your email" ? "Confirm your email"
: user.subscription?.provider === 3 && : user.subscription?.provider === 3 && hasCancelledPremium
user.subscription?.type ===
SUBSCRIPTION_STATUS.PREMIUM_CANCELLED
? "Manage subscription from desktop app" ? "Manage subscription from desktop app"
: user.subscription?.type === : hasCancelledPremium &&
SUBSCRIPTION_STATUS.PREMIUM_CANCELLED &&
Platform.OS === "android" && Platform.OS === "android" &&
Config.GITHUB_RELEASE !== "true" Config.GITHUB_RELEASE !== "true"
? "Resubscribe from Google Playstore" ? "Resubscribe from Google Playstore"
: user.subscription?.type === SUBSCRIPTION_STATUS.PREMIUM_EXPIRED : user.subscription?.type ===
? `Resubscribe to Pro (${ SUBSCRIPTION_STATUS.PREMIUM_EXPIRED || hasCancelledPremium
monthlyPlan?.product?.localizedPrice || "$4.49" ? `Resubscribe to Pro (${getPrice() || "$4.49"} / mo)`
} / mo)` : `Get Pro (${getPrice() || "$4.49"} / mo)`
: `Get Pro (${
monthlyPlan?.product?.localizedPrice || "$4.49"
} / mo)`
} }
/> />
) : null} ) : null}

View File

@@ -65,7 +65,11 @@ const PLACEHOLDER_DATA = (trashCleanupInterval = 7) => ({
paragraph: paragraph:
trashCleanupInterval === -1 trashCleanupInterval === -1
? "Set automatic trash cleanup interval from Settings > Behaviour > Clean trash interval." ? "Set automatic trash cleanup interval from Settings > Behaviour > Clean trash interval."
: `Items in the trash will be permanently deleted after after ${trashCleanupInterval} days.`, : `Trash gets automatically cleaned up ${
trashCleanupInterval === 1
? "daily."
: `after ${trashCleanupInterval} days.`
}`,
button: null, button: null,
loading: "Loading trash items" loading: "Loading trash items"
}); });

View File

@@ -18,17 +18,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { decode, EntityLevel } from "entities"; import { decode, EntityLevel } from "entities";
import { zipSync } from "fflate";
import { Platform } from "react-native"; import { Platform } from "react-native";
import RNFetchBlob from "react-native-blob-util";
import RNHTMLtoPDF from "react-native-html-to-pdf-lite"; import RNHTMLtoPDF from "react-native-html-to-pdf-lite";
import * as ScopedStorage from "react-native-scoped-storage"; import * as ScopedStorage from "react-native-scoped-storage";
import RNFetchBlob from "react-native-blob-util"; import { zip } from "react-native-zip-archive";
import { DatabaseLogger, db } from "../common/database/index"; import { DatabaseLogger, db } from "../common/database/index";
import Storage from "../common/database/storage"; import Storage from "../common/database/storage";
import { convertNoteToText } from "../utils/note-to-text";
import { sleep } from "../utils/time";
import { sanitizeFilename } from "@notesnook/common"; import { sanitizeFilename } from "@notesnook/common";
import { presentDialog } from "../components/dialog/functions";
import { useSettingStore } from "../stores/use-setting-store";
import BiometicService from "./biometrics";
import { ToastEvent } from "./event-manager";
const MIMETypes = { const MIMETypes = {
txt: "text/plain", txt: "text/plain",
@@ -99,8 +101,8 @@ async function save(path, data, fileName, extension) {
return uri || path; return uri || path;
} }
async function makeHtml(note) { async function makeHtml(note, content) {
let html = await db.notes.note(note.id).export("html"); let html = await db.notes.note(note.id).export("html", content);
html = decode(html, { html = decode(html, {
level: EntityLevel.HTML level: EntityLevel.HTML
}); });
@@ -109,22 +111,27 @@ async function makeHtml(note) {
/** /**
* *
* @param {"txt" | "pdf" | "md" | "html"} type * @param {"txt" | "pdf" | "md" | "html" | "md-frontmatter"} type
*/ */
async function exportAs(type, note, bulk) { async function exportAs(type, note, bulk, content) {
let data; let data;
switch (type) { switch (type) {
case "html": case "html":
{ {
data = await makeHtml(note); data = await makeHtml(note, content);
} }
break; break;
case "md": case "md":
data = await db.notes.note(note.id).export("md"); data = await db.notes.note(note.id).export("md", content);
break;
case "md-frontmatter":
data = await db.notes
.note(note.id)
.export("md-frontmatter", content?.data);
break; break;
case "pdf": case "pdf":
{ {
let html = await makeHtml(note); let html = await makeHtml(note, content);
let fileName = sanitizeFilename(note.title + Date.now(), { let fileName = sanitizeFilename(note.title + Date.now(), {
replacement: "_" replacement: "_"
}); });
@@ -150,21 +157,84 @@ async function exportAs(type, note, bulk) {
} }
break; break;
case "txt": case "txt":
data = await convertNoteToText(note); {
data = await db.notes?.note(note.id).export("txt", content);
}
break; break;
} }
return data; return data;
} }
async function unlockVault() {
let biometry = await BiometicService.isBiometryAvailable();
let fingerprint = await BiometicService.hasInternetCredentials("nn_vault");
if (biometry && fingerprint) {
let credentials = await BiometicService.getCredentials(
"Unlock vault",
"Unlock vault to export locked notes"
);
if (credentials) {
return db.vault.unlock(credentials.password);
}
}
useSettingStore.getState().setSheetKeyboardHandler(false);
return new Promise((resolve) => {
setImmediate(() => {
presentDialog({
context: "export-notes",
input: true,
secureTextEntry: true,
positiveText: "Unlock",
title: "Unlock vault",
paragraph: "Some exported notes are locked, Unlock to export them",
inputPlaceholder: "Enter password",
positivePress: async (value) => {
const unlocked = await db.vault.unlock(value);
if (!unlocked) {
ToastEvent.show({
heading: "Invalid password",
message: "Please enter a valid password",
type: "error",
context: "local"
});
return false;
}
resolve(unlocked);
useSettingStore.getState().setSheetKeyboardHandler(true);
return true;
},
onClose: () => {
resolve(false);
useSettingStore.getState().setSheetKeyboardHandler(true);
}
});
});
});
}
/** /**
* *
* @param {"txt" | "pdf" | "md" | "html"} type * @param {"txt" | "pdf" | "md" | "html" | "md-frontmatter"} type
*/ */
async function exportNote(note, type) { async function exportNote(note, type) {
let content;
if (note.locked) {
try {
let unlocked = await unlockVault();
if (!unlocked) return null;
const unlockedNote = await db.vault.open(note.id);
content = unlockedNote.content;
} catch (e) {
DatabaseLogger.error(e);
}
}
let path = await getPath(FolderNames[type]); let path = await getPath(FolderNames[type]);
if (!path) return; if (!path) return;
let result = await exportAs(type, note);
let result = await exportAs(type, note, false, content);
if (!result) return null; if (!result) return null;
let fileName = sanitizeFilename(note.title + Date.now(), { let fileName = sanitizeFilename(note.title + Date.now(), {
replacement: "_" replacement: "_"
@@ -180,7 +250,7 @@ async function exportNote(note, type) {
filePath: path, filePath: path,
type: "text/plain", type: "text/plain",
name: "Text", name: "Text",
fileName: fileName + `.${type}` fileName: fileName + `.${type === "md-frontmatter" ? "md" : type}`
}; };
} }
@@ -192,11 +262,6 @@ function copyFileAsync(source, dest) {
}); });
} }
function zipsync(results) {
let data = zipSync(results);
return Buffer.from(data.buffer).toString("base64");
}
function getUniqueFileName(fileName, results) { function getUniqueFileName(fileName, results) {
const chunks = fileName.split("."); const chunks = fileName.split(".");
const ext = chunks.pop(); const ext = chunks.pop();
@@ -212,25 +277,114 @@ function getUniqueFileName(fileName, results) {
/** /**
* *
* @param {"txt" | "pdf" | "md" | "html"} type * @param {"txt" | "pdf" | "md" | "html" | "md-frontmatter"} type
*/ */
async function bulkExport(notes, type, callback) { async function bulkExport(notes, type, callback) {
let path = await getPath(FolderNames[type]); let path = await getPath(FolderNames[type]);
if (!path) return; if (!path) return;
const exportCacheFolder =
RNFetchBlob.fs.dirs.CacheDir + `/export_${Date.now()}`;
await RNFetchBlob.fs.mkdir(exportCacheFolder).catch((e) => console.log(e));
const mkdir = async (dir) => {
const folder = `${exportCacheFolder}/${dir}`;
if (!(await RNFetchBlob.fs.exists(folder))) {
await RNFetchBlob.fs.mkdir(folder);
}
};
const writeFile = async (path, result) => {
const cacheFilePath = exportCacheFolder + path;
await RNFetchBlob.fs.writeFile(
cacheFilePath,
result,
type === "pdf" ? "base64" : "utf8"
);
};
const results = {}; const results = {};
for (var i = 0; i < notes.length; i++) { for (var i = 0; i < notes.length; i++) {
try { try {
await sleep(1);
let note = notes[i]; let note = notes[i];
if (note.locked) continue; let content;
let result = await exportAs(type, note); if (note.locked) {
try {
let unlocked = !db.vault.unlocked ? await unlockVault() : true;
if (!unlocked) {
continue;
}
const unlockedNote = await db.vault.open(note.id);
content = unlockedNote.content;
} catch (e) {
DatabaseLogger.error(e);
continue;
}
}
let result = await exportAs(type, note, true, content);
let fileName = sanitizeFilename(note.title, { let fileName = sanitizeFilename(note.title, {
replacement: "_" replacement: "_"
}); });
if (result) { if (result) {
results[getUniqueFileName(fileName + `.${type}`, results)] = const notebooks = [
Buffer.from(result, type === "pdf" ? "base64" : "utf-8"); ...(db.relations
?.to({ id: note.id, type: "note" }, "notebook")
.map((notebook) => ({
title: notebook.title
})) || []),
...(note.notebooks || []).map((ref) => {
const notebook = db.notebooks?.notebook(ref.id);
const topics = notebook?.topics.all || [];
return {
title: notebook?.title,
topics: ref.topics
.map((topicId) => topics.find((topic) => topic.id === topicId))
.filter(Boolean)
};
})
];
for (const notebook of notebooks) {
results[notebook.title] = results[notebook.title] || {};
await mkdir(notebook.title);
if (notebook.topics && notebook.topics.length) {
for (const topic of notebook.topics) {
results[notebook.title][topic.title] =
results[notebook.title][topic.title] || {};
await mkdir(`${notebook.title}/${topic.title}`);
const exportedNoteName = getUniqueFileName(
fileName + `.${type}`,
results[notebook.title][topic.title]
);
results[notebook.title][topic.title][exportedNoteName] = true;
writeFile(
`/${notebook.title}/${topic.title}/${exportedNoteName}`,
result
);
}
} else {
const exportedNoteName = getUniqueFileName(
fileName + `.${type}`,
results[notebook.title]
);
results[notebook.title][exportedNoteName] = true;
writeFile(`/${notebook.title}/${exportedNoteName}`, result);
}
}
if (!notebooks.length) {
const exportedNoteName = getUniqueFileName(
fileName + `.${type}`,
results
);
results[exportedNoteName] = true;
writeFile(`/${exportedNoteName}`, result);
}
} }
callback(`${i + 1}/${notes.length}`); callback(`${i + 1}/${notes.length}`);
} catch (e) { } catch (e) {
@@ -241,26 +395,24 @@ async function bulkExport(notes, type, callback) {
try { try {
callback("zipping"); callback("zipping");
await sleep(1); const zipOutputPath =
const zipped = zipsync(results); Platform.OS === "ios"
? path + `/${fileName}`
: RNFetchBlob.fs.dirs.CacheDir + `/${fileName}`;
await zip(exportCacheFolder, zipOutputPath);
callback("saving to disk"); callback("saving to disk");
await sleep(1); if (Platform.OS === "android") {
if (Platform.OS === "ios") {
RNFetchBlob.fs.writeFile(path + `/${fileName}`, zipped, "base64");
} else {
const templFile = RNFetchBlob.fs.dirs.CacheDir + `/${fileName}`;
await RNFetchBlob.fs.writeFile(templFile, zipped, "base64");
const file = await ScopedStorage.createFile( const file = await ScopedStorage.createFile(
path, path,
fileName, fileName,
"application/zip" "application/zip"
); );
path = file.uri; path = file.uri;
await copyFileAsync("file://" + templFile, path); await copyFileAsync("file://" + zipOutputPath, path);
await RNFetchBlob.fs.unlink(templFile); await RNFetchBlob.fs.unlink(zipOutputPath);
callback(); callback();
} }
RNFetchBlob.fs.unlink(exportCacheFolder);
} catch (e) { } catch (e) {
DatabaseLogger.error(e); DatabaseLogger.error(e);
} }

View File

@@ -39,6 +39,10 @@ import { eSendEvent, presentSheet, ToastEvent } from "./event-manager";
import SettingsService from "./settings"; import SettingsService from "./settings";
let premiumStatus = 0; let premiumStatus = 0;
/**
* @type {RNIap.Subscription[]}
*/
let products = []; let products = [];
let user = null; let user = null;
@@ -68,7 +72,9 @@ async function setPremiumStatus() {
} }
try { try {
await RNIap.initConnection(); await RNIap.initConnection();
products = await RNIap.getSubscriptions(itemSkus); products = await RNIap.getSubscriptions({
skus: itemSkus
});
} catch (e) { } catch (e) {
console.log("subscriptions: ", e); console.log("subscriptions: ", e);
} }
@@ -223,12 +229,21 @@ const showVerifyEmailDialog = () => {
}; };
const subscriptions = { const subscriptions = {
get: async () => { /**
*
* @returns {RNIap.Purchase} subscription
*/
get: () => {
if (Platform.OS === "android") return; if (Platform.OS === "android") return;
let _subscriptions = MMKV.getString("subscriptionsIOS"); let _subscriptions = MMKV.getString("subscriptionsIOS");
if (!_subscriptions) return []; if (!_subscriptions) return [];
return JSON.parse(_subscriptions); return JSON.parse(_subscriptions);
}, },
/**
*
* @param {RNIap.Purchase} subscription
* @returns
*/
set: async (subscription) => { set: async (subscription) => {
if (Platform.OS === "android") return; if (Platform.OS === "android") return;
let _subscriptions = MMKV.getString("subscriptionsIOS"); let _subscriptions = MMKV.getString("subscriptionsIOS");
@@ -263,6 +278,10 @@ const subscriptions = {
MMKV.setString("subscriptionsIOS", JSON.stringify(_subscriptions)); MMKV.setString("subscriptionsIOS", JSON.stringify(_subscriptions));
} }
}, },
/**
*
* @param {RNIap.Purchase} subscription
*/
verify: async (subscription) => { verify: async (subscription) => {
if (Platform.OS === "android") return; if (Platform.OS === "android") return;
@@ -280,12 +299,16 @@ const subscriptions = {
"Content-Type": "application/json" "Content-Type": "application/json"
} }
}; };
console.log("Subscription.verify", requestData);
try { try {
let result = await fetch( let result = await fetch(
"https://payments.streetwriters.co/apple/verify", __DEV__
? "http://192.168.43.5:4264/apple/verify"
: "https://payments.streetwriters.co/apple/verify",
requestData requestData
); );
console.log("Subscribed", result);
let text = await result.text(); let text = await result.text();
if (!result.ok) { if (!result.ok) {
@@ -293,6 +316,8 @@ const subscriptions = {
await subscriptions.clear(subscription); await subscriptions.clear(subscription);
} }
return; return;
} else {
await subscriptions.clear(subscription);
} }
} catch (e) { } catch (e) {
console.log("subscription error", e); console.log("subscription error", e);
@@ -302,15 +327,18 @@ const subscriptions = {
}, },
clear: async (_subscription) => { clear: async (_subscription) => {
if (Platform.OS === "android") return; if (Platform.OS === "android") return;
let _subscriptions = await subscriptions.get(); let _subscriptions = subscriptions.get();
let subscription = null; let subscription = null;
if (_subscription) { if (_subscription) {
subscription = _subscription; subscription = _subscription;
} else { } else {
subscription = _subscriptions.length > 0 ? _subscriptions[0] : null; subscription = _subscriptions.length > 0 ? _subscriptions[0] : null;
} }
if (subscription) { if (subscription) {
await RNIap.finishTransaction(subscription.transactionId); await RNIap.finishTransaction({
purchase: subscription
});
await RNIap.clearTransactionIOS(); await RNIap.clearTransactionIOS();
await subscriptions.remove(subscription.transactionId); await subscriptions.remove(subscription.transactionId);
} }

View File

@@ -68,8 +68,7 @@ export const useAttachmentStore = create<AttachmentStore>((set, get) => ({
if (!progress) return; if (!progress) return;
editorController.current?.commands.setAttachmentProgress({ editorController.current?.commands.setAttachmentProgress({
hash: hash, hash: hash,
progress: 100, progress: 100
type: progress[hash]?.type || "download"
}); });
progress[hash] = null; progress[hash] = null;
set({ progress: { ...progress } }); set({ progress: { ...progress } });
@@ -80,10 +79,11 @@ export const useAttachmentStore = create<AttachmentStore>((set, get) => ({
progress[hash] = { sent, total, hash, recieved, type }; progress[hash] = { sent, total, hash, recieved, type };
const progressPercentage = const progressPercentage =
type === "upload" ? sent / total : recieved / total; type === "upload" ? sent / total : recieved / total;
editorController.current?.commands.setAttachmentProgress({ editorController.current?.commands.setAttachmentProgress({
hash: hash, hash: hash,
progress: Math.round(Math.max(progressPercentage * 100, 0)), //@ts-ignore
type: type progress: Math.round(Math.max(progressPercentage * 100, 0))
}); });
set({ progress: { ...progress } }); set({ progress: { ...progress } });
}, },

View File

@@ -75,7 +75,7 @@ export const SUBSCRIPTION_STATUS_STRINGS = {
2: Platform.OS === "ios" ? "Pro" : "Beta", 2: Platform.OS === "ios" ? "Pro" : "Beta",
5: "Pro", 5: "Pro",
6: "Expired", 6: "Expired",
7: "Pro" 7: "Pro (cancelled)"
}; };
export const SUBSCRIPTION_PROVIDER = { export const SUBSCRIPTION_PROVIDER = {

View File

@@ -67,15 +67,10 @@ export const deleteItems = async (item, context) => {
}); });
return; return;
} }
if (
item &&
item.id &&
useSelectionStore.getState().selectedItemsList.length === 0
) {
useSelectionStore.getState().setSelectedItem(item);
}
const { selectedItemsList } = useSelectionStore.getState(); const selectedItemsList = item
? [item]
: useSelectionStore.getState().selectedItemsList;
let notes = selectedItemsList.filter((i) => i.type === "note"); let notes = selectedItemsList.filter((i) => i.type === "note");
let notebooks = selectedItemsList.filter((i) => i.type === "notebook"); let notebooks = selectedItemsList.filter((i) => i.type === "notebook");
@@ -179,7 +174,9 @@ export const deleteItems = async (item, context) => {
}); });
} }
Navigation.queueRoutesForUpdate(); Navigation.queueRoutesForUpdate();
useSelectionStore.getState().clearSelection(); if (!item) {
useSelectionStore.getState().clearSelection();
}
useMenuStore.getState().setMenuPins(); useMenuStore.getState().setMenuPins();
useMenuStore.getState().setColorNotes(); useMenuStore.getState().setColorNotes();
SearchService.updateAndSearch(); SearchService.updateAndSearch();

View File

@@ -61,7 +61,10 @@ export const getGithubVersion = async () => {
if (!res?.ok) return null; if (!res?.ok) return null;
const data = (await res?.json()) as GithubRelease[]; const data = (await res?.json()) as GithubRelease[];
const versions = data?.filter((tag) => tag.tag_name.endsWith("android")); const versions = data?.filter(
(tag) =>
tag.tag_name.endsWith("android") && !tag.tag_name.endsWith("beta-android")
);
const latestVersion = versions[0]; const latestVersion = versions[0];
const version = latestVersion.tag_name.replace("-android", ""); const version = latestVersion.tag_name.replace("-android", "");
return { return {

View File

@@ -21,7 +21,7 @@ import Sodium from "@ammarahmed/react-native-sodium";
import { isImage } from "@notesnook/core/dist/utils/filename"; import { isImage } from "@notesnook/core/dist/utils/filename";
import { Platform } from "react-native"; import { Platform } from "react-native";
import RNFetchBlob from "react-native-blob-util"; import RNFetchBlob from "react-native-blob-util";
import { db } from "../common/database"; import { DatabaseLogger, db } from "../common/database";
import { IOS_APPGROUPID } from "./constants"; import { IOS_APPGROUPID } from "./constants";
const santizeUri = (uri) => { const santizeUri = (uri) => {
@@ -57,6 +57,7 @@ export async function attachFile(uri, hash, type, filename, options) {
return true; return true;
} catch (e) { } catch (e) {
if (Platform.OS === "ios") RNFetchBlob.fs.unlink(uri).catch(console.log); if (Platform.OS === "ios") RNFetchBlob.fs.unlink(uri).catch(console.log);
DatabaseLogger.error(e, "Attach file error");
console.log("attach file error: ", e); console.log("attach file error: ", e);
return false; return false;
} }
@@ -66,17 +67,37 @@ async function createNotes(bundle) {
const sessionId = bundle.note.sessionId; const sessionId = bundle.note.sessionId;
const id = await db.notes.add(bundle.note); const id = await db.notes.add(bundle.note);
for (const item of bundle.notebooks) { if (!bundle.notebooks || !bundle.notebooks.length) {
if (item.type === "notebook") { const defaultNotebook = db.settings?.getDefaultNotebook();
db.relations.add(item, { id, type: "note" }); if (defaultNotebook) {
} else { if (!defaultNotebook.topic) {
db.notes.addToNotebook( db.relations.add(
{ { type: "notebook", id: defaultNotebook.id },
id: item.notebookId, { id, type: "note" }
topic: item.id );
}, } else {
id db.notes.addToNotebook(
); {
id: defaultNotebook?.id,
topic: defaultNotebook.topic
},
id
);
}
}
} else {
for (const item of bundle.notebooks) {
if (item.type === "notebook") {
db.relations.add(item, { id, type: "note" });
} else {
db.notes.addToNotebook(
{
id: item.notebookId,
topic: item.id
},
id
);
}
} }
} }
@@ -87,26 +108,31 @@ async function createNotes(bundle) {
uri: uri, uri: uri,
type: "cache" type: "cache"
}); });
await attachFile(uri, hash, file.type, file.name, { const attached = await attachFile(uri, hash, file.type, file.name, {
type: "cache", type: "cache",
id: id, id: id,
appGroupId: IOS_APPGROUPID appGroupId: IOS_APPGROUPID
}); });
let content = ``; let content = ``;
if (isImage(file.type)) {
content = `<img data-hash="${hash}" data-mime="${file.type}" data-filename="${file.name}" />`; if (attached) {
} else { if (isImage(file.type)) {
content = `<p><span data-hash="${hash}" data-mime="${file.type}" data-filename="${file.name}" data-size="${file.size}" /></p>`; content = `<img data-hash="${hash}" data-mime="${file.type}" data-filename="${file.name}" />`;
} else {
content = `<p><span data-hash="${hash}" data-mime="${file.type}" data-filename="${file.name}" data-size="${file.size}" /></p>`;
}
const rawContent = await db.content.raw(
db.notes.note(id).data?.contentId
);
await db.notes.add({
id: id,
content: {
type: "tiptap",
data: rawContent?.data ? rawContent?.data + content : content
},
sessionId: sessionId
});
} }
const rawContent = await db.content.raw(db.notes.note(id).data?.contentId);
await db.notes.add({
id: id,
content: {
type: "tiptap",
data: rawContent?.data ? rawContent?.data + content : content
},
sessionId: sessionId
});
} }
} }

View File

@@ -30,36 +30,10 @@ import {
elementByText, elementByText,
sleep, sleep,
notVisibleByText, notVisibleByText,
visibleById visibleById,
createNotebook
} from "./utils"; } from "./utils";
export async function createNotebook(
title = "Notebook 1",
description = true,
topic = true,
topicCount = 1
) {
await tapByText("Add your first notebook");
await elementById(notesnook.ids.dialogs.notebook.inputs.title).typeText(
title
);
if (description) {
await elementById(
notesnook.ids.dialogs.notebook.inputs.description
).typeText(`Description of ${title}`);
}
if (topic) {
for (let i = 1; i <= topicCount; i++) {
await elementById(notesnook.ids.dialogs.notebook.inputs.topic).typeText(
i === 1 ? "Topic" : "Topic " + i
);
await tapById("topic-add-button");
}
}
await tapByText("Save");
await sleep(500);
}
// async function addTopic(title = "Topic") { // async function addTopic(title = "Topic") {
// await tapById(notesnook.buttons.add); // await tapById(notesnook.buttons.add);
// await elementById("input-title").typeText(title); // await elementById("input-title").typeText(title);

View File

@@ -18,7 +18,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import { notesnook } from "../test.ids"; import { notesnook } from "../test.ids";
import { createNotebook } from "./notebook.e2e";
import { import {
tapById, tapById,
visibleByText, visibleByText,
@@ -27,7 +26,8 @@ import {
tapByText, tapByText,
notVisibleByText, notVisibleByText,
sleep, sleep,
navigate navigate,
createNotebook
} from "./utils"; } from "./utils";
async function sortBy(sorting, elementText = "Default") { async function sortBy(sorting, elementText = "Default") {

View File

@@ -129,8 +129,36 @@ async function matchSnapshot(element, name) {
}); });
} }
async function createNotebook(
title = "Notebook 1",
description = true,
topic = true,
topicCount = 1
) {
await tapByText("Add your first notebook");
await elementById(notesnook.ids.dialogs.notebook.inputs.title).typeText(
title
);
if (description) {
await elementById(
notesnook.ids.dialogs.notebook.inputs.description
).typeText(`Description of ${title}`);
}
if (topic) {
for (let i = 1; i <= topicCount; i++) {
await elementById(notesnook.ids.dialogs.notebook.inputs.topic).typeText(
i === 1 ? "Topic" : "Topic " + i
);
await tapById("topic-add-button");
}
}
await tapByText("Save");
await sleep(500);
}
export { export {
matchSnapshot, matchSnapshot,
createNotebook,
prepare, prepare,
LaunchApp, LaunchApp,
createNote, createNote,

View File

@@ -111,7 +111,7 @@ android {
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
multiDexEnabled true multiDexEnabled true
versionCode 2063 versionCode 2076
versionName getNpmVersion() versionName getNpmVersion()
testBuildType System.getProperty('testBuildType', 'debug') testBuildType System.getProperty('testBuildType', 'debug')
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'

View File

@@ -8,6 +8,10 @@ import com.ammarahmed.mmkv.MMKV;
public class OnClearFromRecentService extends Service { public class OnClearFromRecentService extends Service {
static {
System.loadLibrary("rnmmkv");
}
@Override @Override
public IBinder onBind(Intent intent) { public IBinder onBind(Intent intent) {
return null; return null;
@@ -15,7 +19,6 @@ public class OnClearFromRecentService extends Service {
@Override @Override
public int onStartCommand(Intent intent, int flags, int startId) { public int onStartCommand(Intent intent, int flags, int startId) {
return START_NOT_STICKY; return START_NOT_STICKY;
} }
@@ -31,8 +34,10 @@ public class OnClearFromRecentService extends Service {
MMKV mmkv = MMKV.mmkvWithID("default",MMKV.SINGLE_PROCESS_MODE); MMKV mmkv = MMKV.mmkvWithID("default",MMKV.SINGLE_PROCESS_MODE);
mmkv.removeValueForKey("appState"); mmkv.removeValueForKey("appState");
stopSelf(); stopSelf();
} catch (Exception e) { } catch (UnsatisfiedLinkError e) {
} catch (Exception e) {
} }
//System.exit(0); //System.exit(0);
} }

View File

@@ -5,7 +5,7 @@
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
<item name="android:windowDisablePreview">true</item> <item name="android:windowDisablePreview">true</item>
<item name="android:editTextBackground">@drawable/edit_text</item> <item name="android:editTextBackground">@drawable/edit_text</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:datePickerDialogTheme">@style/DialogDatePicker.Theme</item> <item name="android:datePickerDialogTheme">@style/DialogDatePicker.Theme</item>
</style> </style>
@@ -20,6 +20,7 @@
<style name="BootTheme" parent="Theme.SplashScreen"> <style name="BootTheme" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@color/bootsplash_background</item> <item name="windowSplashScreenBackground">@color/bootsplash_background</item>
<item name="windowSplashScreenAnimatedIcon">@mipmap/bootsplash_logo_dark</item> <item name="windowSplashScreenAnimatedIcon">@mipmap/bootsplash_logo_dark</item>
<item name="android:navigationBarColor">@color/bootsplash_background</item>
<item name="postSplashScreenTheme">@style/AppTheme</item> <item name="postSplashScreenTheme">@style/AppTheme</item>
</style> </style>
@@ -31,6 +32,7 @@
<item name="android:windowIsFloating">true</item> <item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">true</item> <item name="android:backgroundDimEnabled">true</item>
<item name="android:editTextBackground">@drawable/edit_text</item> <item name="android:editTextBackground">@drawable/edit_text</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
</style> </style>
<style name="DialogDatePicker.Theme" parent="Theme.AppCompat.Light.Dialog"> <style name="DialogDatePicker.Theme" parent="Theme.AppCompat.Light.Dialog">

View File

@@ -5,7 +5,7 @@
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
<item name="android:windowDisablePreview">true</item> <item name="android:windowDisablePreview">true</item>
<item name="android:editTextBackground">@drawable/edit_text</item> <item name="android:editTextBackground">@drawable/edit_text</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:datePickerDialogTheme">@style/DialogDatePicker.Theme</item> <item name="android:datePickerDialogTheme">@style/DialogDatePicker.Theme</item>
</style> </style>
@@ -20,6 +20,7 @@
<style name="BootTheme" parent="Theme.SplashScreen"> <style name="BootTheme" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@color/bootsplash_background</item> <item name="windowSplashScreenBackground">@color/bootsplash_background</item>
<item name="windowSplashScreenAnimatedIcon">@mipmap/bootsplash_logo</item> <item name="windowSplashScreenAnimatedIcon">@mipmap/bootsplash_logo</item>
<item name="android:navigationBarColor">@color/bootsplash_background</item>
<item name="postSplashScreenTheme">@style/AppTheme</item> <item name="postSplashScreenTheme">@style/AppTheme</item>
</style> </style>
@@ -31,6 +32,7 @@
<item name="android:windowIsFloating">true</item> <item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">true</item> <item name="android:backgroundDimEnabled">true</item>
<item name="android:editTextBackground">@drawable/edit_text</item> <item name="android:editTextBackground">@drawable/edit_text</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
</style> </style>
<style name="DialogDatePicker.Theme" parent="Theme.AppCompat.Light.Dialog"> <style name="DialogDatePicker.Theme" parent="Theme.AppCompat.Light.Dialog">

View File

@@ -7,7 +7,7 @@ buildscript {
minSdkVersion = 21 minSdkVersion = 21
compileSdkVersion = 33 compileSdkVersion = 33
targetSdkVersion = 33 targetSdkVersion = 33
ext.kotlinVersion = '1.6.10' ext.kotlinVersion = '1.8.0'
androidXAnnotation = "1.1.0" androidXAnnotation = "1.1.0"
androidXCoreVersion = "1.7.0" androidXCoreVersion = "1.7.0"
androidXCore = "1.7.0" androidXCore = "1.7.0"

View File

@@ -1,3 +1,10 @@
- New backup format nnbackupz with upto 90% smaller backups - Support for exporting locked notes
- Improve UI of code blocks & language selection popup - Maintain directory structure in exports based on Notebooks/Topics
- Fixed some bugs in sync v2 - Match color of navigation bar in sheets with app theme
- Improved image loading and show progress when loading images
- Support for setting trash interval to daily
- Fix android app UI issues with RTL languages
- Fix pasting links in editor
- Other Bug fixes and performance improvements
Thank you for using Notesnook!

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>provisioningProfiles</key>
<dict>
<key>org.streetwriters.notesnook</key>
<string>Notesnook App Distribution 2024</string>
<key>org.streetwriters.notesnook.notewidget</key>
<string>Notesnook Widget Distribution 2024</string>
<key>org.streetwriters.notesnook.share</key>
<string>Notesnook Share Distribution 2024</string>
</dict>
</dict>
</plist>

View File

@@ -14,13 +14,13 @@
2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
2DCD954D1E0B4F2C00145EB5 /* NotesnookTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* NotesnookTests.m */; }; 2DCD954D1E0B4F2C00145EB5 /* NotesnookTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* NotesnookTests.m */; };
6510626F27042891009661C3 /* OpenSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6552012F27019F7700A43C51 /* OpenSans-Regular.ttf */; };
6510627627042895009661C3 /* OpenSans-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6552012E27019F6E00A43C51 /* OpenSans-SemiBold.ttf */; };
6510E6D72877215700DACAA9 /* build.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 6510E6D62877215700DACAA9 /* build.bundle */; }; 6510E6D72877215700DACAA9 /* build.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 6510E6D62877215700DACAA9 /* build.bundle */; };
6515C42F2580AA3000E83E39 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6515C42E2580AA2F00E83E39 /* StoreKit.framework */; }; 6515C42F2580AA3000E83E39 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6515C42E2580AA2F00E83E39 /* StoreKit.framework */; };
6517B7C12B6838EB0079FF37 /* OpenSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6517B7BE2B6838EB0079FF37 /* OpenSans-Regular.ttf */; };
6517B7C22B6838EB0079FF37 /* OpenSans-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6517B7BF2B6838EB0079FF37 /* OpenSans-SemiBold.ttf */; };
6517B7C32B6838EB0079FF37 /* OpenSans-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6517B7C02B6838EB0079FF37 /* OpenSans-Bold.ttf */; };
6529A13E279BC4C70048D4A8 /* BootSplash.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6529A13D279BC4C70048D4A8 /* BootSplash.storyboard */; }; 6529A13E279BC4C70048D4A8 /* BootSplash.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6529A13D279BC4C70048D4A8 /* BootSplash.storyboard */; };
6593E4A3281C345400492C50 /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6593E4A2281C345400492C50 /* AppDelegate.mm */; }; 6593E4A3281C345400492C50 /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6593E4A2281C345400492C50 /* AppDelegate.mm */; };
659670B22A2754FD00C5D2AF /* OpenSans-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 659670B12A2754FD00C5D2AF /* OpenSans-Bold.ttf */; };
659BE46725E11A5100E05671 /* notesnook-text.png in Resources */ = {isa = PBXBuildFile; fileRef = 659BE46625E11A5100E05671 /* notesnook-text.png */; }; 659BE46725E11A5100E05671 /* notesnook-text.png in Resources */ = {isa = PBXBuildFile; fileRef = 659BE46625E11A5100E05671 /* notesnook-text.png */; };
65AA857925E6DDEC00772A01 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AA857825E6DDEC00772A01 /* WidgetKit.framework */; }; 65AA857925E6DDEC00772A01 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AA857825E6DDEC00772A01 /* WidgetKit.framework */; };
65AA857B25E6DDEC00772A01 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AA857A25E6DDEC00772A01 /* SwiftUI.framework */; }; 65AA857B25E6DDEC00772A01 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AA857A25E6DDEC00772A01 /* SwiftUI.framework */; };
@@ -110,12 +110,12 @@
4C4AF691C324D95337F2FB0A /* libPods-Make Note.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Make Note.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 4C4AF691C324D95337F2FB0A /* libPods-Make Note.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Make Note.a"; sourceTree = BUILT_PRODUCTS_DIR; };
6510E6D62877215700DACAA9 /* build.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = build.bundle; path = "../../../../packages/editor-mobile/build.bundle"; sourceTree = "<group>"; }; 6510E6D62877215700DACAA9 /* build.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = build.bundle; path = "../../../../packages/editor-mobile/build.bundle"; sourceTree = "<group>"; };
6515C42E2580AA2F00E83E39 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; 6515C42E2580AA2F00E83E39 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; };
6517B7BE2B6838EB0079FF37 /* OpenSans-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "OpenSans-Regular.ttf"; path = "../../../../packages/editor-mobile/public/fonts/OpenSans-Regular.ttf"; sourceTree = "<group>"; };
6517B7BF2B6838EB0079FF37 /* OpenSans-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "OpenSans-SemiBold.ttf"; path = "../../../../packages/editor-mobile/public/fonts/OpenSans-SemiBold.ttf"; sourceTree = "<group>"; };
6517B7C02B6838EB0079FF37 /* OpenSans-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "OpenSans-Bold.ttf"; path = "../../../../packages/editor-mobile/public/fonts/OpenSans-Bold.ttf"; sourceTree = "<group>"; };
6529A13D279BC4C70048D4A8 /* BootSplash.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = BootSplash.storyboard; path = Notesnook/BootSplash.storyboard; sourceTree = "<group>"; }; 6529A13D279BC4C70048D4A8 /* BootSplash.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = BootSplash.storyboard; path = Notesnook/BootSplash.storyboard; sourceTree = "<group>"; };
6529D2B0257B4A2900B49BC3 /* NotesnookDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = NotesnookDebug.entitlements; path = Notesnook/NotesnookDebug.entitlements; sourceTree = "<group>"; }; 6529D2B0257B4A2900B49BC3 /* NotesnookDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = NotesnookDebug.entitlements; path = Notesnook/NotesnookDebug.entitlements; sourceTree = "<group>"; };
6552012E27019F6E00A43C51 /* OpenSans-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "OpenSans-SemiBold.ttf"; path = "../android/app/src/main/assets/fonts/OpenSans-SemiBold.ttf"; sourceTree = "<group>"; };
6552012F27019F7700A43C51 /* OpenSans-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "OpenSans-Regular.ttf"; path = "../android/app/src/main/assets/fonts/OpenSans-Regular.ttf"; sourceTree = "<group>"; };
6593E4A2281C345400492C50 /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = Notesnook/AppDelegate.mm; sourceTree = "<group>"; }; 6593E4A2281C345400492C50 /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = Notesnook/AppDelegate.mm; sourceTree = "<group>"; };
659670B12A2754FD00C5D2AF /* OpenSans-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "OpenSans-Bold.ttf"; path = "../android/app/src/main/assets/fonts/OpenSans-Bold.ttf"; sourceTree = "<group>"; };
659BE46625E11A5100E05671 /* notesnook-text.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "notesnook-text.png"; path = "Notesnook/Images.xcassets/notesnook-text.png"; sourceTree = "<group>"; }; 659BE46625E11A5100E05671 /* notesnook-text.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "notesnook-text.png"; path = "Notesnook/Images.xcassets/notesnook-text.png"; sourceTree = "<group>"; };
65A7F34F255689AD00699170 /* Notesnook.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = Notesnook.entitlements; path = Notesnook/Notesnook.entitlements; sourceTree = "<group>"; }; 65A7F34F255689AD00699170 /* Notesnook.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = Notesnook.entitlements; path = Notesnook/Notesnook.entitlements; sourceTree = "<group>"; };
65AA857725E6DDEC00772A01 /* NotesWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NotesWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 65AA857725E6DDEC00772A01 /* NotesWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NotesWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -293,13 +293,13 @@
83CBB9F61A601CBA00E9B192 = { 83CBB9F61A601CBA00E9B192 = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
6517B7C02B6838EB0079FF37 /* OpenSans-Bold.ttf */,
6517B7BE2B6838EB0079FF37 /* OpenSans-Regular.ttf */,
6517B7BF2B6838EB0079FF37 /* OpenSans-SemiBold.ttf */,
65C400DD2A80B68D00AA3DF5 /* MaterialCommunityIcons.ttf */, 65C400DD2A80B68D00AA3DF5 /* MaterialCommunityIcons.ttf */,
65C149862A61151B005C40F1 /* extension.bundle */, 65C149862A61151B005C40F1 /* extension.bundle */,
6510E6D62877215700DACAA9 /* build.bundle */, 6510E6D62877215700DACAA9 /* build.bundle */,
65EC5B71272A7EE200FB3748 /* NotesWidgetExtensionDebug.entitlements */, 65EC5B71272A7EE200FB3748 /* NotesWidgetExtensionDebug.entitlements */,
6552012F27019F7700A43C51 /* OpenSans-Regular.ttf */,
659670B12A2754FD00C5D2AF /* OpenSans-Bold.ttf */,
6552012E27019F6E00A43C51 /* OpenSans-SemiBold.ttf */,
65D145C429DC30470056FE7D /* MaterialCommunityIcons.ttf */, 65D145C429DC30470056FE7D /* MaterialCommunityIcons.ttf */,
13B07FAE1A68108700A75B9A /* Notesnook */, 13B07FAE1A68108700A75B9A /* Notesnook */,
832341AE1AAA6A7D00B99B32 /* Libraries */, 832341AE1AAA6A7D00B99B32 /* Libraries */,
@@ -542,12 +542,12 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
65C400DE2A80B68D00AA3DF5 /* MaterialCommunityIcons.ttf in Resources */, 65C400DE2A80B68D00AA3DF5 /* MaterialCommunityIcons.ttf in Resources */,
6510626F27042891009661C3 /* OpenSans-Regular.ttf in Resources */,
659670B22A2754FD00C5D2AF /* OpenSans-Bold.ttf in Resources */,
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
6517B7C32B6838EB0079FF37 /* OpenSans-Bold.ttf in Resources */,
6517B7C22B6838EB0079FF37 /* OpenSans-SemiBold.ttf in Resources */,
6529A13E279BC4C70048D4A8 /* BootSplash.storyboard in Resources */, 6529A13E279BC4C70048D4A8 /* BootSplash.storyboard in Resources */,
6510E6D72877215700DACAA9 /* build.bundle in Resources */, 6510E6D72877215700DACAA9 /* build.bundle in Resources */,
6510627627042895009661C3 /* OpenSans-SemiBold.ttf in Resources */, 6517B7C12B6838EB0079FF37 /* OpenSans-Regular.ttf in Resources */,
659BE46725E11A5100E05671 /* notesnook-text.png in Resources */, 659BE46725E11A5100E05671 /* notesnook-text.png in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@@ -997,7 +997,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2056; CURRENT_PROJECT_VERSION = 2067;
DEVELOPMENT_TEAM = 53CWBG3QUC; DEVELOPMENT_TEAM = 53CWBG3QUC;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
@@ -1071,7 +1071,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 2.6.5; MARKETING_VERSION = 2.6.15;
OTHER_LDFLAGS = ( OTHER_LDFLAGS = (
"$(inherited)", "$(inherited)",
"-ObjC", "-ObjC",
@@ -1102,7 +1102,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 2056; CURRENT_PROJECT_VERSION = 2067;
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 53CWBG3QUC; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 53CWBG3QUC;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
@@ -1176,7 +1176,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 2.6.5; MARKETING_VERSION = 2.6.15;
ONLY_ACTIVE_ARCH = NO; ONLY_ACTIVE_ARCH = NO;
OTHER_LDFLAGS = ( OTHER_LDFLAGS = (
"$(inherited)", "$(inherited)",
@@ -1186,7 +1186,7 @@
PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook; PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook;
PRODUCT_NAME = Notesnook; PRODUCT_NAME = Notesnook;
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Notesnook Distribution 2023"; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Notesnook App Distribution 2024";
SWIFT_OBJC_BRIDGING_HEADER = "Notesnook-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Notesnook-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
@@ -1335,7 +1335,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2056; CURRENT_PROJECT_VERSION = 2067;
DEBUG_INFORMATION_FORMAT = dwarf; DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 53CWBG3QUC; DEVELOPMENT_TEAM = 53CWBG3QUC;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
@@ -1347,7 +1347,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 2.6.5; MARKETING_VERSION = 2.6.15;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.notewidget; PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.notewidget;
@@ -1378,7 +1378,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 2056; CURRENT_PROJECT_VERSION = 2067;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 53CWBG3QUC; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 53CWBG3QUC;
@@ -1391,12 +1391,12 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 2.6.5; MARKETING_VERSION = 2.6.15;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.notewidget; PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.notewidget;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Notesnook Widget Distribution 2023"; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Notesnook Widget Distribution 2024";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
SWIFT_COMPILATION_MODE = wholemodule; SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_OPTIMIZATION_LEVEL = "-O";
@@ -1421,7 +1421,7 @@
CODE_SIGN_ENTITLEMENTS = "Make Note/Make Note.entitlements"; CODE_SIGN_ENTITLEMENTS = "Make Note/Make Note.entitlements";
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2056; CURRENT_PROJECT_VERSION = 2067;
DEBUG_INFORMATION_FORMAT = dwarf; DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 53CWBG3QUC; DEVELOPMENT_TEAM = 53CWBG3QUC;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
@@ -1495,7 +1495,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 2.6.5; MARKETING_VERSION = 2.6.15;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.share; PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.share;
@@ -1526,7 +1526,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 2056; CURRENT_PROJECT_VERSION = 2067;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = ""; DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 53CWBG3QUC; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 53CWBG3QUC;
@@ -1601,12 +1601,12 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 2.6.5; MARKETING_VERSION = 2.6.15;
MTL_FAST_MATH = YES; MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.share; PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.share;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Notesnook Share Distribution 2023"; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "Notesnook Share Distribution 2024";
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
SWIFT_OBJC_BRIDGING_HEADER = "Make Note/Make Note-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Make Note/Make Note-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;

View File

@@ -327,7 +327,7 @@ PODS:
- React-Core - React-Core
- react-native-keep-awake (1.2.0): - react-native-keep-awake (1.2.0):
- React-Core - React-Core
- react-native-mmkv-storage (0.10.0-alpha.9): - react-native-mmkv-storage (0.10.0-alpha.11):
- MMKV (~> 1.3.1) - MMKV (~> 1.3.1)
- React - React
- React-Core - React-Core
@@ -477,7 +477,7 @@ PODS:
- React-Core - React-Core
- RNGestureHandler (2.12.0): - RNGestureHandler (2.12.0):
- React-Core - React-Core
- RNIap (7.5.6): - RNIap (12.11.0):
- React-Core - React-Core
- RNKeychain (4.0.5): - RNKeychain (4.0.5):
- React - React
@@ -875,7 +875,7 @@ SPEC CHECKSUMS:
react-native-image-resizer: 00ceb0e05586c7aadf061eea676957a6c2ec60fa react-native-image-resizer: 00ceb0e05586c7aadf061eea676957a6c2ec60fa
react-native-in-app-review: db8bb167a5f238e7ceca5c242d6b36ce8c4404a4 react-native-in-app-review: db8bb167a5f238e7ceca5c242d6b36ce8c4404a4
react-native-keep-awake: caee3ff89eaa21dfe29010f0d143566874a04441 react-native-keep-awake: caee3ff89eaa21dfe29010f0d143566874a04441
react-native-mmkv-storage: d4ad55ab411b7f0d4e6269d801b31821ef48970b react-native-mmkv-storage: e798639f91601896f1c84f4eb3d6f19af2f4a160
react-native-netinfo: ccbe1085dffd16592791d550189772e13bf479e2 react-native-netinfo: ccbe1085dffd16592791d550189772e13bf479e2
react-native-notification-sounds: da78c828fe1bcbb92d8b505d5261890ed315ff39 react-native-notification-sounds: da78c828fe1bcbb92d8b505d5261890ed315ff39
react-native-orientation: f1caf84d65f1a4fd4511a18f2b924e634ad7a628 react-native-orientation: f1caf84d65f1a4fd4511a18f2b924e634ad7a628
@@ -911,7 +911,7 @@ SPEC CHECKSUMS:
RNFileViewer: ce7ca3ac370e18554d35d6355cffd7c30437c592 RNFileViewer: ce7ca3ac370e18554d35d6355cffd7c30437c592
RNFlashList: 399bf6a0db68f594ad2c86aaff3ea39564f39f8a RNFlashList: 399bf6a0db68f594ad2c86aaff3ea39564f39f8a
RNGestureHandler: dec4645026e7401a0899f2846d864403478ff6a5 RNGestureHandler: dec4645026e7401a0899f2846d864403478ff6a5
RNIap: d248609d1b8937e63bd904e865c318e9b1457eff RNIap: fc9af04ee706894a80c9d8f979bae930b0dee191
RNKeychain: 840f8e6f13be0576202aefcdffd26a4f54bfe7b5 RNKeychain: 840f8e6f13be0576202aefcdffd26a4f54bfe7b5
RNNotifee: 2ae3c18196e6f307fa62ae5c8e5305dea03ff147 RNNotifee: 2ae3c18196e6f307fa62ae5c8e5305dea03ff147
RNPrivacySnapshot: 8eaf571478a353f2e5184f5c803164f22428b023 RNPrivacySnapshot: 8eaf571478a353f2e5184f5c803164f22428b023
@@ -931,4 +931,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: b0cadd188aa428b98d1eaa0b84b3b6208e714119 PODFILE CHECKSUM: b0cadd188aa428b98d1eaa0b84b3b6208e714119
COCOAPODS: 1.12.1 COCOAPODS: 1.14.2

File diff suppressed because one or more lines are too long

View File

@@ -40,11 +40,11 @@
"react-native-get-random-values": "^1.7.0", "react-native-get-random-values": "^1.7.0",
"react-native-gzip": "1.1.0", "react-native-gzip": "1.1.0",
"react-native-html-to-pdf-lite": "^0.9.1", "react-native-html-to-pdf-lite": "^0.9.1",
"react-native-iap": "7.5.6", "react-native-iap": "12.11.0",
"react-native-image-picker": "4.1.2", "react-native-image-picker": "4.1.2",
"react-native-in-app-review": "4.3.3", "react-native-in-app-review": "4.3.3",
"react-native-keychain": "4.0.5", "react-native-keychain": "4.0.5",
"react-native-mmkv-storage": "^0.10.0-alpha.9", "react-native-mmkv-storage": "^0.10.0-alpha.11",
"react-native-modal-datetime-picker": "14.0.0", "react-native-modal-datetime-picker": "14.0.0",
"react-native-navigation-bar-color": "2.0.2", "react-native-navigation-bar-color": "2.0.2",
"react-native-notification-sounds": "0.5.5", "react-native-notification-sounds": "0.5.5",

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "@notesnook/mobile", "name": "@notesnook/mobile",
"version": "2.6.5", "version": "2.6.16",
"private": true, "private": true,
"license": "GPL-3.0-or-later", "license": "GPL-3.0-or-later",
"workspaces": [ "workspaces": [
@@ -10,6 +10,7 @@
"scripts": { "scripts": {
"postinstall": "patch-package && node ./scripts/optimize-fonts.mjs", "postinstall": "patch-package && node ./scripts/optimize-fonts.mjs",
"run-android": "cd native && react-native run-android --active-arch-only", "run-android": "cd native && react-native run-android --active-arch-only",
"build": "echo 'No build script defined'",
"run-ios": "cd native && react-native run-ios", "run-ios": "cd native && react-native run-ios",
"start": "cd native && react-native start", "start": "cd native && react-native start",
"repack": "cd native && react-native webpack-start", "repack": "cd native && react-native webpack-start",
@@ -41,6 +42,7 @@
"@trpc/react-query": "10.38.3", "@trpc/react-query": "10.38.3",
"@trpc/server": "10.38.3", "@trpc/server": "10.38.3",
"react": "18.2.0", "react": "18.2.0",
"react-native": "0.72.0" "react-native": "0.72.0",
"react-native-iap": "12.11.0"
} }
} }

View File

@@ -7,7 +7,8 @@ index 0000000..0d259dd
+o/classes +o/classes
diff --git a/node_modules/react-native-vector-icons/android/build/.transforms/f1314fc28eaff1170375cbb76465cb24/transformed/classes/classes.dex b/node_modules/react-native-vector-icons/android/build/.transforms/f1314fc28eaff1170375cbb76465cb24/transformed/classes/classes.dex diff --git a/node_modules/react-native-vector-icons/android/build/.transforms/f1314fc28eaff1170375cbb76465cb24/transformed/classes/classes.dex b/node_modules/react-native-vector-icons/android/build/.transforms/f1314fc28eaff1170375cbb76465cb24/transformed/classes/classes.dex
new file mode 100644 new file mode 100644
index 0000000..e69de29 index 0000000..d4bdd72
Binary files /dev/null and b/node_modules/react-native-vector-icons/android/build/.transforms/f1314fc28eaff1170375cbb76465cb24/transformed/classes/classes.dex differ
diff --git a/node_modules/react-native-vector-icons/android/build/generated/source/buildConfig/debug/com/oblador/vectoricons/BuildConfig.java b/node_modules/react-native-vector-icons/android/build/generated/source/buildConfig/debug/com/oblador/vectoricons/BuildConfig.java diff --git a/node_modules/react-native-vector-icons/android/build/generated/source/buildConfig/debug/com/oblador/vectoricons/BuildConfig.java b/node_modules/react-native-vector-icons/android/build/generated/source/buildConfig/debug/com/oblador/vectoricons/BuildConfig.java
new file mode 100644 new file mode 100644
index 0000000..52a02e0 index 0000000..52a02e0
@@ -84,10 +85,12 @@ index 0000000..9e26dfe
\ No newline at end of file \ No newline at end of file
diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/compile_library_classes_jar/debug/classes.jar b/node_modules/react-native-vector-icons/android/build/intermediates/compile_library_classes_jar/debug/classes.jar diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/compile_library_classes_jar/debug/classes.jar b/node_modules/react-native-vector-icons/android/build/intermediates/compile_library_classes_jar/debug/classes.jar
new file mode 100644 new file mode 100644
index 0000000..e69de29 index 0000000..77c2a69
Binary files /dev/null and b/node_modules/react-native-vector-icons/android/build/intermediates/compile_library_classes_jar/debug/classes.jar differ
diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/compile_r_class_jar/debug/R.jar b/node_modules/react-native-vector-icons/android/build/intermediates/compile_r_class_jar/debug/R.jar diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/compile_r_class_jar/debug/R.jar b/node_modules/react-native-vector-icons/android/build/intermediates/compile_r_class_jar/debug/R.jar
new file mode 100644 new file mode 100644
index 0000000..e69de29 index 0000000..bd4434a
Binary files /dev/null and b/node_modules/react-native-vector-icons/android/build/intermediates/compile_r_class_jar/debug/R.jar differ
diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/compile_symbol_list/debug/R.txt b/node_modules/react-native-vector-icons/android/build/intermediates/compile_symbol_list/debug/R.txt diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/compile_symbol_list/debug/R.txt b/node_modules/react-native-vector-icons/android/build/intermediates/compile_symbol_list/debug/R.txt
new file mode 100644 new file mode 100644
index 0000000..5347f17 index 0000000..5347f17
@@ -2050,11 +2053,11 @@ index 0000000..5347f17
+int xml rn_dev_preferences 0x0 +int xml rn_dev_preferences 0x0
diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/node_modules/react-native-vector-icons/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/node_modules/react-native-vector-icons/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
new file mode 100644 new file mode 100644
index 0000000..2dd0b63 index 0000000..c671bf3
--- /dev/null --- /dev/null
+++ b/node_modules/react-native-vector-icons/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +++ b/node_modules/react-native-vector-icons/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
@@ -0,0 +1 @@ @@ -0,0 +1 @@
+#Wed Aug 02 11:28:45 PKT 2023 +#Mon Oct 02 09:47:12 PKT 2023
diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/node_modules/react-native-vector-icons/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/node_modules/react-native-vector-icons/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml
new file mode 100644 new file mode 100644
index 0000000..08d62cc index 0000000..08d62cc
@@ -2093,16 +2096,20 @@ index 0000000..ef96fe3
\ No newline at end of file \ No newline at end of file
diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/BuildConfig.class b/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/BuildConfig.class diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/BuildConfig.class b/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/BuildConfig.class
new file mode 100644 new file mode 100644
index 0000000..e69de29 index 0000000..1276d6a
Binary files /dev/null and b/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/BuildConfig.class differ
diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsModule$Errors.class b/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsModule$Errors.class diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsModule$Errors.class b/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsModule$Errors.class
new file mode 100644 new file mode 100644
index 0000000..e69de29 index 0000000..3348b06
Binary files /dev/null and b/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsModule$Errors.class differ
diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsModule.class b/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsModule.class diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsModule.class b/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsModule.class
new file mode 100644 new file mode 100644
index 0000000..e69de29 index 0000000..de0d974
Binary files /dev/null and b/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsModule.class differ
diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsPackage.class b/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsPackage.class diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsPackage.class b/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsPackage.class
new file mode 100644 new file mode 100644
index 0000000..e69de29 index 0000000..07a935e
Binary files /dev/null and b/node_modules/react-native-vector-icons/android/build/intermediates/javac/debug/classes/com/oblador/vectoricons/VectorIconsPackage.class differ
diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/local_only_symbol_list/debug/R-def.txt b/node_modules/react-native-vector-icons/android/build/intermediates/local_only_symbol_list/debug/R-def.txt diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/local_only_symbol_list/debug/R-def.txt b/node_modules/react-native-vector-icons/android/build/intermediates/local_only_symbol_list/debug/R-def.txt
new file mode 100644 new file mode 100644
index 0000000..78ac5b8 index 0000000..78ac5b8
@@ -2174,7 +2181,8 @@ index 0000000..0be2a09
\ No newline at end of file \ No newline at end of file
diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar b/node_modules/react-native-vector-icons/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar b/node_modules/react-native-vector-icons/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar
new file mode 100644 new file mode 100644
index 0000000..e69de29 index 0000000..f0a7660
Binary files /dev/null and b/node_modules/react-native-vector-icons/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar differ
diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt b/node_modules/react-native-vector-icons/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt diff --git a/node_modules/react-native-vector-icons/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt b/node_modules/react-native-vector-icons/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt
new file mode 100644 new file mode 100644
index 0000000..873e0a9 index 0000000..873e0a9
@@ -3661,7 +3669,8 @@ index 0000000..f4f75c1
+ INJECTED from /Users/ammarahmed/Repos/apps/notesnook/apps/mobile/node_modules/react-native-vector-icons/android/src/main/AndroidManifest.xml + INJECTED from /Users/ammarahmed/Repos/apps/notesnook/apps/mobile/node_modules/react-native-vector-icons/android/src/main/AndroidManifest.xml
diff --git a/node_modules/react-native-vector-icons/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin b/node_modules/react-native-vector-icons/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin diff --git a/node_modules/react-native-vector-icons/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin b/node_modules/react-native-vector-icons/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin
new file mode 100644 new file mode 100644
index 0000000..e69de29 index 0000000..26da0e3
Binary files /dev/null and b/node_modules/react-native-vector-icons/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin differ
diff --git a/node_modules/react-native-vector-icons/fonts.gradle b/node_modules/react-native-vector-icons/fonts.gradle diff --git a/node_modules/react-native-vector-icons/fonts.gradle b/node_modules/react-native-vector-icons/fonts.gradle
index 5485fac..ef3ccb3 100644 index 5485fac..ef3ccb3 100644
--- a/node_modules/react-native-vector-icons/fonts.gradle --- a/node_modules/react-native-vector-icons/fonts.gradle
@@ -3678,7 +3687,7 @@ index 5485fac..ef3ccb3 100644
generateAssetsTask.dependsOn(fontCopyTask) generateAssetsTask.dependsOn(fontCopyTask)
} }
diff --git a/node_modules/react-native-vector-icons/glyphmaps/MaterialCommunityIcons.json b/node_modules/react-native-vector-icons/glyphmaps/MaterialCommunityIcons.json diff --git a/node_modules/react-native-vector-icons/glyphmaps/MaterialCommunityIcons.json b/node_modules/react-native-vector-icons/glyphmaps/MaterialCommunityIcons.json
index c06a819..0962de1 100644 index c06a819..13c76cc 100644
--- a/node_modules/react-native-vector-icons/glyphmaps/MaterialCommunityIcons.json --- a/node_modules/react-native-vector-icons/glyphmaps/MaterialCommunityIcons.json
+++ b/node_modules/react-native-vector-icons/glyphmaps/MaterialCommunityIcons.json +++ b/node_modules/react-native-vector-icons/glyphmaps/MaterialCommunityIcons.json
@@ -1,6598 +1 @@ @@ -1,6598 +1 @@
@@ -10281,7 +10290,7 @@ index c06a819..0962de1 100644
- "blank": 63116 - "blank": 63116
-} -}
\ No newline at end of file \ No newline at end of file
+{"menu":983900,"lock-open-outline":983872,"key-outline":986582,"pin-off-outline":985392,"pin-outline":985393,"star-off":984273,"star-outline":984274,"link-variant-remove":987393,"link-variant":983865,"bell":983194,"bell-off-outline":985745,"check":983340,"magnify":983881,"plus":984085,"view-list-outline":988299,"view-list":984434,"play":984074,"pause":984036,"notebook-outline":986815,"text-short":985513,"radiobox-marked":984126,"radiobox-blank":984125,"sort-descending":984253,"information":983804,"sort-ascending":984252,"alert":983078,"arrow-right":983124,"bookmark-outline":983235,"checkbox-marked":983346,"checkbox-blank-outline":983345,"unfold-less-horizontal":984398,"minus-circle":983926,"vibrate":984422,"volume-high":984446,"checkbox-blank-circle-outline":983344,"check-circle-outline":984545,"chevron-up":983363,"chevron-down":983360,"calendar":983277,"book-outline":985956,"pound":984099,"clock-plus-outline":989282,"cloud-upload-outline":985982,"export":983559,"message-badge-outline":989506,"square-edit-outline":985356,"content-copy":983439,"delete-restore":985113,"share-variant":984215,"pencil-lock":984046,"sync-off":984296,"content-duplicate":983441,"theme-light-dark":984334,"pencil":984043,"clock-outline":983376,"attachment":983142,"history":983770,"notebook":985134,"bookmark":983232,"minus-circle-outline":983927,"delete-outline":985575,"delete":983476,"link":983863,"cloud-upload":983399,"star":984270,"key":983814,"account-outline":983059,"email":983534,"backup-restore":983151,"update":984752,"android":983090,"web":984479,"home-variant-outline":986023,"text-box-multiple-outline":985784,"download":983514,"circle-small":985567,"upload":984402,"file-check":983574,"form-textbox":984590,"fingerprint":983607,"file":983572,"alert-circle-outline":984534,"check-all":983341,"shield-key-outline":986053,"arrow-left":983117,"message-plus-outline":987323,"email-outline":983536,"cellphone-key":985422,"dots-vertical":983513,"close":983382,"chevron-right":983362,"emoticon-wink":986232,"sync":984294,"shield":984216,"billboard":987152,"cellphone":983324,"cellphone-lock":985423,"lock":983870,"file-lock":983585,"image-multiple":983801,"harddisk":983754,"file-cabinet":985782,"refresh":984144,"emoticon":986216,"palette":984024,"pin":984067,"format-bold":983652,"table":984299,"language-markdown":983892,"gesture-tap-button":987816,"send-lock":985069,"bomb":984721,"file-pdf-box":983590,"language-html5":983837,"clipboard-text-outline":985656,"invert-colors":983809,"crown":983461,"select-all":984198,"minus":983924,"information-outline":983805,"cog-outline":985275,"arrow-top-right-thick":985542,"checkbox-blank-circle":983343,"sync-alert":984295,"note":983962,"dots-horizontal":983512,"shield-lock":985501,"chevron-left":983361,"account-cog":988016,"two-factor-authentication":985519,"logout":983875,"autorenew":983146,"shape":985137,"circle-half":988053,"brightness-6":983263,"note-edit-outline":989058,"format-line-spacing":983672,"format-size":983679,"format-font":984790,"radar":984119,"arrow-decision-outline":985534,"eye-off-outline":984785,"folder":983627,"bell-outline":983196,"bell-ring":983198,"bug":983268,"mail":986811,"file-document":983577,"mastodon":985809,"twitter":984388,"discord":984687,"open-source-initiative":986030,"monitor":983929,"chart-timeline":984686,"cellphone-arrow-down":985557,"alpha-v":985859,"alert-circle":983080,"reload":984147,"card-text":985975,"open-in-new":984012,"eye":983560,"drag":983515,"menu-down":983901} +{"menu":983900,"lock-open-outline":983872,"key-outline":986582,"pin-off-outline":985392,"pin-outline":985393,"star-off":984273,"star-outline":984274,"link-variant-remove":987393,"link-variant":983865,"bell":983194,"bell-off-outline":985745,"check":983340,"magnify":983881,"plus":984085,"view-list-outline":988299,"view-list":984434,"play":984074,"pause":984036,"notebook-outline":986815,"text-short":985513,"radiobox-marked":984126,"radiobox-blank":984125,"sort-descending":984253,"information":983804,"sort-ascending":984252,"alert":983078,"arrow-right":983124,"bookmark-outline":983235,"checkbox-marked":983346,"checkbox-blank-outline":983345,"unfold-less-horizontal":984398,"minus-circle":983926,"vibrate":984422,"volume-high":984446,"checkbox-blank-circle-outline":983344,"check-circle-outline":984545,"chevron-up":983363,"chevron-down":983360,"calendar":983277,"minus-circle-outline":983927,"close-circle-outline":983386,"qrcode":984114,"text":985512,"cloud":983391,"book-outline":985956,"pound":984099,"clock-plus-outline":989282,"cloud-upload-outline":985982,"export":983559,"message-badge-outline":989506,"square-edit-outline":985356,"content-copy":983439,"delete-restore":985113,"share-variant":984215,"pencil-lock":984046,"sync-off":984296,"content-duplicate":983441,"theme-light-dark":984334,"pencil":984043,"clock-outline":983376,"attachment":983142,"history":983770,"notebook":985134,"bookmark":983232,"delete-outline":985575,"delete":983476,"link":983863,"cloud-upload":983399,"star":984270,"key":983814,"account-outline":983059,"email":983534,"backup-restore":983151,"update":984752,"android":983090,"web":984479,"home-variant-outline":986023,"text-box-multiple-outline":985784,"download":983514,"arrow-left":983117,"dots-horizontal":983512,"chevron-right":983362,"close":983382,"cellphone-key":985422,"message-plus-outline":987323,"email-outline":983536,"shield-lock":985501,"chevron-left":983361,"minus":983924,"crown":983461,"account-cog":988016,"two-factor-authentication":985519,"information-outline":983805,"logout":983875,"autorenew":983146,"sync-alert":984295,"shape":985137,"circle-half":988053,"brightness-6":983263,"note-edit-outline":989058,"format-line-spacing":983672,"format-size":983679,"format-font":984790,"radar":984119,"arrow-decision-outline":985534,"fingerprint":983607,"eye-off-outline":984785,"folder":983627,"lock":983870,"form-textbox":984590,"bell-outline":983196,"bell-ring":983198,"bug":983268,"mail":986811,"file-document":983577,"mastodon":985809,"twitter":984388,"discord":984687,"open-source-initiative":986030,"monitor":983929,"chart-timeline":984686,"cellphone-arrow-down":985557,"alpha-v":985859,"circle-small":985567,"upload":984402,"file-check":983574,"file":983572,"alert-circle-outline":984534,"check-all":983341,"shield-key-outline":986053,"dots-vertical":983513,"emoticon-wink":986232,"sync":984294,"shield":984216,"billboard":987152,"cellphone":983324,"cellphone-lock":985423,"file-lock":983585,"image-multiple":983801,"harddisk":983754,"file-cabinet":985782,"refresh":984144,"emoticon":986216,"palette":984024,"pin":984067,"format-bold":983652,"table":984299,"language-markdown":983892,"gesture-tap-button":987816,"send-lock":985069,"bomb":984721,"file-pdf-box":983590,"language-html5":983837,"clipboard-text-outline":985656,"invert-colors":983809,"select-all":984198,"cog-outline":985275,"arrow-top-right-thick":985542,"checkbox-blank-circle":983343,"note":983962,"drag":983515,"menu-down":983901,"alert-circle":983080,"reload":984147,"card-text":985975,"open-in-new":984012,"eye":983560}
\ No newline at end of file \ No newline at end of file
diff --git a/node_modules/react-native-vector-icons/glyphmaps/MaterialCommunityIcons.old.json b/node_modules/react-native-vector-icons/glyphmaps/MaterialCommunityIcons.old.json diff --git a/node_modules/react-native-vector-icons/glyphmaps/MaterialCommunityIcons.old.json b/node_modules/react-native-vector-icons/glyphmaps/MaterialCommunityIcons.old.json
new file mode 100644 new file mode 100644

View File

@@ -65,7 +65,12 @@ const EXTRA_ICON_NAMES = [
"check-circle-outline", "check-circle-outline",
"chevron-up", "chevron-up",
"chevron-down", "chevron-down",
"calendar" "calendar",
"minus-circle-outline",
"close-circle-outline",
"qrcode",
"text",
"cloud"
]; ];
const __filename = fileURLToPath(import.meta.url); const __filename = fileURLToPath(import.meta.url);

View File

@@ -21,7 +21,7 @@ import ShareExtension from "@ammarahmed/react-native-share-extension";
import { getPreviewData } from "@flyerhq/react-native-link-preview"; import { getPreviewData } from "@flyerhq/react-native-link-preview";
import { formatBytes } from "@notesnook/common"; import { formatBytes } from "@notesnook/common";
import { isImage } from "@notesnook/core/dist/utils/filename"; import { isImage } from "@notesnook/core/dist/utils/filename";
import { parseHTML } from "@notesnook/core/dist/utils/html-parser"; import { useThemeColors } from "@notesnook/theme";
import React, { useCallback, useEffect, useRef, useState } from "react"; import React, { useCallback, useEffect, useRef, useState } from "react";
import { import {
ActivityIndicator, ActivityIndicator,
@@ -53,10 +53,9 @@ import { getElevationStyle } from "../app/utils/elevation";
import { eOnLoadNote } from "../app/utils/events"; import { eOnLoadNote } from "../app/utils/events";
import { NoteBundle } from "../app/utils/note-bundle"; import { NoteBundle } from "../app/utils/note-bundle";
import { Editor } from "./editor"; import { Editor } from "./editor";
import { HtmlLoadingWebViewAgent, fetchHandle } from "./fetch-webview";
import { Search } from "./search"; import { Search } from "./search";
import { initDatabase, useShareStore } from "./store"; import { initDatabase, useShareStore } from "./store";
import { useThemeColors } from "@notesnook/theme";
import { HtmlLoadingWebViewAgent, fetchHandle } from "./fetch-webview";
const getLinkPreview = (url) => { const getLinkPreview = (url) => {
return getPreviewData(url, 5000); return getPreviewData(url, 5000);

View File

@@ -15,7 +15,9 @@
"@notesnook/theme": ["../../packages/theme"], "@notesnook/theme": ["../../packages/theme"],
"@types/react": ["./node_modules/@types/react"] "@types/react": ["./node_modules/@types/react"]
}, },
"incremental": true "incremental": true,
"maxNodeModuleJsDepth": 5,
"downlevelIteration": true
}, },
"exclude": ["native"] "exclude": ["native"]
} }

View File

@@ -1377,7 +1377,7 @@
}, },
"../web": { "../web": {
"name": "@notesnook/web", "name": "@notesnook/web",
"version": "2.6.5", "version": "2.6.15",
"license": "GPL-3.0-or-later", "license": "GPL-3.0-or-later",
"dependencies": { "dependencies": {
"@aws-sdk/util-base64-browser": "^3.208.0", "@aws-sdk/util-base64-browser": "^3.208.0",
@@ -1388,7 +1388,7 @@
"@emotion/react": "11.11.1", "@emotion/react": "11.11.1",
"@mdi/js": "^7.2.96", "@mdi/js": "^7.2.96",
"@mdi/react": "^1.6.1", "@mdi/react": "^1.6.1",
"@notesnook-importer/core": "^1.7.1", "@notesnook-importer/core": "^2.0.0",
"@notesnook/common": "file:../../packages/common", "@notesnook/common": "file:../../packages/common",
"@notesnook/core": "file:../../packages/core", "@notesnook/core": "file:../../packages/core",
"@notesnook/crypto": "file:../../packages/crypto", "@notesnook/crypto": "file:../../packages/crypto",
@@ -1408,6 +1408,7 @@
"@theme-ui/core": "^0.14.7", "@theme-ui/core": "^0.14.7",
"@trpc/client": "10.38.3", "@trpc/client": "10.38.3",
"@trpc/react-query": "10.38.3", "@trpc/react-query": "10.38.3",
"@zip.js/zip.js": "^2.7.32",
"allotment": "^1.19.0", "allotment": "^1.19.0",
"axios": "^1.3.4", "axios": "^1.3.4",
"clipboard-polyfill": "4.0.0", "clipboard-polyfill": "4.0.0",
@@ -1446,6 +1447,7 @@
"devDependencies": { "devDependencies": {
"@babel/core": "^7.22.5", "@babel/core": "^7.22.5",
"@playwright/test": "^1.36.2", "@playwright/test": "^1.36.2",
"@swc/core": "1.3.61",
"@trpc/server": "10.38.3", "@trpc/server": "10.38.3",
"@types/babel__core": "^7.20.1", "@types/babel__core": "^7.20.1",
"@types/file-saver": "^2.0.5", "@types/file-saver": "^2.0.5",
@@ -1456,7 +1458,8 @@
"@types/react-dom": "17.0.2", "@types/react-dom": "17.0.2",
"@types/react-modal": "3.13.1", "@types/react-modal": "3.13.1",
"@types/tinycolor2": "^1.4.3", "@types/tinycolor2": "^1.4.3",
"@vitejs/plugin-react-swc": "^3.3.2", "@types/wicg-file-system-access": "^2020.9.6",
"@vitejs/plugin-react-swc": "3.3.2",
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
"buffer": "^6.0.3", "buffer": "^6.0.3",
"chalk": "^4.1.0", "chalk": "^4.1.0",
@@ -1470,14 +1473,14 @@
"otplib": "^12.0.1", "otplib": "^12.0.1",
"react": "17.0.2", "react": "17.0.2",
"react-dom": "17.0.2", "react-dom": "17.0.2",
"rollup": "^3.27.0", "rollup": "^3.29.4",
"rollup-plugin-visualizer": "^5.9.2", "rollup-plugin-visualizer": "^5.9.2",
"swc-plugin-react-remove-properties": "^0.1.4", "swc-plugin-react-remove-properties": "^0.1.4",
"vite": "^4.3.9", "vite": "^4.5.0",
"vite-plugin-env-compatible": "^1.1.1", "vite-plugin-env-compatible": "^1.1.1",
"vite-plugin-pwa": "^0.16.3", "vite-plugin-pwa": "^0.16.3",
"vite-plugin-svgr": "^3.2.0", "vite-plugin-svgr": "^3.2.0",
"vitest": "^0.32.0", "vitest": "^0.34.6",
"workbox-core": "^7.0.0", "workbox-core": "^7.0.0",
"workbox-expiration": "^7.0.0", "workbox-expiration": "^7.0.0",
"workbox-precaching": "^7.0.0", "workbox-precaching": "^7.0.0",
@@ -2406,15 +2409,6 @@
"@trpc/server": "10.38.3" "@trpc/server": "10.38.3"
} }
}, },
"node_modules/@trpc/server": {
"version": "10.38.3",
"resolved": "https://registry.npmjs.org/@trpc/server/-/server-10.38.3.tgz",
"integrity": "sha512-9s8/kwo2IDB5hwB2SKZZrfevRhdb1f9fdXtIYd3lbQuf2jQaC/LyQuHaIQjDQoUx9updBfsHXcFFPiCP1DL6pg==",
"funding": [
"https://trpc.io/sponsor"
],
"peer": true
},
"node_modules/@types/babel__core": { "node_modules/@types/babel__core": {
"version": "7.20.1", "version": "7.20.1",
"dev": true, "dev": true,

View File

@@ -171,7 +171,7 @@ export class EditorModel {
await this.tagInput.fill(tag); await this.tagInput.fill(tag);
await this.tagInput.press("Enter"); await this.tagInput.press("Enter");
await this.tags await this.tags
.locator(":scope", { hasText: new RegExp(`^${tag}$`) }) .locator("span", { hasText: new RegExp(`^${tag}$`) })
.waitFor(); .waitFor();
} }
} }
@@ -181,7 +181,7 @@ export class EditorModel {
const count = await this.tags.count(); const count = await this.tags.count();
for (let i = 0; i < count; ++i) { for (let i = 0; i < count; ++i) {
const item = this.tags.nth(i); const item = this.tags.nth(i);
const tag = await item.textContent(); const tag = await item.locator("span").textContent();
if (tag) tags.push(tag); if (tag) tags.push(tag);
} }
return tags; return tags;

View File

@@ -8,8 +8,11 @@
content="This is Test 1Test 1Test 1Test 1Test 1Test 1Test 1Test 1Test 1Test 1" content="This is Test 1Test 1Test 1Test 1Test 1Test 1Test 1Test 1Test 1Test 1"
/> />
<title>Test 1 - Notesnook</title> <title>Test 1 - Notesnook</title>
<meta name="created-on" content="xxx" /> <meta name="created-at" content="22-12-2023 11:33 AM" />
<meta name="last-edited-on" content="xxx" /> <meta name="updated-at" content="22-12-2023 11:33 AM" />
<link rel="stylesheet" href="https://app.notesnook.com/assets/editor-styles.css?d=0"> <link rel="stylesheet" href="https://app.notesnook.com/assets/editor-styles.css?d=0">
@@ -25,6 +28,11 @@
color: #202124; color: #202124;
font-family: "Open Sans", "Noto Sans", Frutiger, Calibri, Myriad, Arial, Ubuntu, Helvetica, -apple-system, BlinkMacSystemFont, sans-serif; font-family: "Open Sans", "Noto Sans", Frutiger, Calibri, Myriad, Arial, Ubuntu, Helvetica, -apple-system, BlinkMacSystemFont, sans-serif;
} }
.math-block {
padding-top: 20px;
padding-bottom: 20px;
}
h1, h1,
h2, h2,

View File

@@ -2,6 +2,3 @@
This is Test 1Test 1Test 1Test 1Test 1Test 1Test 1Test 1Test 1Test 1 This is Test 1Test 1Test 1Test 1Test 1Test 1Test 1Test 1Test 1Test 1
---

40353
apps/web/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{ {
"name": "@notesnook/web", "name": "@notesnook/web",
"description": "Your private note taking space", "description": "Your private note taking space",
"version": "2.6.6", "version": "2.6.15",
"private": true, "private": true,
"main": "./src/app.js", "main": "./src/app.js",
"homepage": "https://notesnook.com/", "homepage": "https://notesnook.com/",
@@ -16,7 +16,7 @@
"@emotion/react": "11.11.1", "@emotion/react": "11.11.1",
"@mdi/js": "^7.2.96", "@mdi/js": "^7.2.96",
"@mdi/react": "^1.6.1", "@mdi/react": "^1.6.1",
"@notesnook-importer/core": "^1.7.1", "@notesnook-importer/core": "^2.0.0",
"@notesnook/common": "file:../../packages/common", "@notesnook/common": "file:../../packages/common",
"@notesnook/core": "file:../../packages/core", "@notesnook/core": "file:../../packages/core",
"@notesnook/crypto": "file:../../packages/crypto", "@notesnook/crypto": "file:../../packages/crypto",
@@ -36,6 +36,7 @@
"@theme-ui/core": "^0.14.7", "@theme-ui/core": "^0.14.7",
"@trpc/client": "10.38.3", "@trpc/client": "10.38.3",
"@trpc/react-query": "10.38.3", "@trpc/react-query": "10.38.3",
"@zip.js/zip.js": "^2.7.32",
"allotment": "^1.19.0", "allotment": "^1.19.0",
"axios": "^1.3.4", "axios": "^1.3.4",
"clipboard-polyfill": "4.0.0", "clipboard-polyfill": "4.0.0",
@@ -74,6 +75,7 @@
"devDependencies": { "devDependencies": {
"@babel/core": "^7.22.5", "@babel/core": "^7.22.5",
"@playwright/test": "^1.36.2", "@playwright/test": "^1.36.2",
"@swc/core": "1.3.61",
"@trpc/server": "10.38.3", "@trpc/server": "10.38.3",
"@types/babel__core": "^7.20.1", "@types/babel__core": "^7.20.1",
"@types/file-saver": "^2.0.5", "@types/file-saver": "^2.0.5",
@@ -84,7 +86,8 @@
"@types/react-dom": "17.0.2", "@types/react-dom": "17.0.2",
"@types/react-modal": "3.13.1", "@types/react-modal": "3.13.1",
"@types/tinycolor2": "^1.4.3", "@types/tinycolor2": "^1.4.3",
"@vitejs/plugin-react-swc": "^3.3.2", "@types/wicg-file-system-access": "^2020.9.6",
"@vitejs/plugin-react-swc": "3.3.2",
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
"buffer": "^6.0.3", "buffer": "^6.0.3",
"chalk": "^4.1.0", "chalk": "^4.1.0",
@@ -98,14 +101,14 @@
"otplib": "^12.0.1", "otplib": "^12.0.1",
"react": "17.0.2", "react": "17.0.2",
"react-dom": "17.0.2", "react-dom": "17.0.2",
"rollup": "^3.27.0", "rollup": "^3.29.4",
"rollup-plugin-visualizer": "^5.9.2", "rollup-plugin-visualizer": "^5.9.2",
"swc-plugin-react-remove-properties": "^0.1.4", "swc-plugin-react-remove-properties": "^0.1.4",
"vite": "^4.3.9", "vite": "^4.5.0",
"vite-plugin-env-compatible": "^1.1.1", "vite-plugin-env-compatible": "^1.1.1",
"vite-plugin-pwa": "^0.16.3", "vite-plugin-pwa": "^0.16.3",
"vite-plugin-svgr": "^3.2.0", "vite-plugin-svgr": "^3.2.0",
"vitest": "^0.32.0", "vitest": "^0.34.6",
"workbox-core": "^7.0.0", "workbox-core": "^7.0.0",
"workbox-expiration": "^7.0.0", "workbox-expiration": "^7.0.0",
"workbox-precaching": "^7.0.0", "workbox-precaching": "^7.0.0",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

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