mirror of
https://github.com/streetwriters/notesnook.git
synced 2026-09-01 11:39:21 +02:00
Compare commits
255 Commits
v2.6.6
...
fix-github
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5e68dd129e | ||
|
|
2350d0e41d | ||
|
|
fbd5c8e3cd | ||
|
|
ee5c4077fe | ||
|
|
47bbfc618e | ||
|
|
b377329a8b | ||
|
|
ae8bcf3865 | ||
|
|
2f67611829 | ||
|
|
058c612f4f | ||
|
|
be8df90ccb | ||
|
|
aa730b5b93 | ||
|
|
34bbcf6387 | ||
|
|
33c3c78e2f | ||
|
|
bf144dcda4 | ||
|
|
284ebdb86f | ||
|
|
9dac4cf7f4 | ||
|
|
fb973a5514 | ||
|
|
f9226510f9 | ||
|
|
5c0a964699 | ||
|
|
41ffaab3dc | ||
|
|
764c721f1d | ||
|
|
3d267f91ef | ||
|
|
f10f28a7f8 | ||
|
|
8d04f89a18 | ||
|
|
9d1374dcd4 | ||
|
|
094a65e514 | ||
|
|
372da979e1 | ||
|
|
d3371326f2 | ||
|
|
57452bd0e6 | ||
|
|
993b8460bf | ||
|
|
081201aa42 | ||
|
|
270e6778d1 | ||
|
|
2074320583 | ||
|
|
cd90030616 | ||
|
|
807bd683b7 | ||
|
|
35929026a4 | ||
|
|
41eb94ee47 | ||
|
|
ba51e110ad | ||
|
|
ecad06d249 | ||
|
|
19a151f637 | ||
|
|
7c4a6f1e17 | ||
|
|
bc88e953d1 | ||
|
|
7d89ec676a | ||
|
|
c8f8bcca93 | ||
|
|
9fa904e849 | ||
|
|
05cc947cb4 | ||
|
|
a20a683b17 | ||
|
|
5fc43c931e | ||
|
|
0879c3b4d6 | ||
|
|
2eded71de3 | ||
|
|
9e30ee50b8 | ||
|
|
08621a5873 | ||
|
|
17f5bd28ba | ||
|
|
4558c0b2eb | ||
|
|
a442677e91 | ||
|
|
95666bee36 | ||
|
|
c4232ac95a | ||
|
|
0283037289 | ||
|
|
b6fd0df715 | ||
|
|
f53fb58024 | ||
|
|
21d452308d | ||
|
|
823608cca1 | ||
|
|
f3a0b998e4 | ||
|
|
a47a38b16b | ||
|
|
a184c53dd5 | ||
|
|
a3464255ec | ||
|
|
088c6670a9 | ||
|
|
27840b9bd6 | ||
|
|
ae819504f0 | ||
|
|
af792e394c | ||
|
|
76a4d5c2a5 | ||
|
|
4e23acd608 | ||
|
|
3c65dcdd8b | ||
|
|
efea6e3972 | ||
|
|
185cca7880 | ||
|
|
fbded93405 | ||
|
|
674881b873 | ||
|
|
248fb6dd2d | ||
|
|
3211e7a149 | ||
|
|
08496c699e | ||
|
|
060fa25814 | ||
|
|
a6b1effc77 | ||
|
|
5cf9c4808e | ||
|
|
d5a44067fd | ||
|
|
0de463526f | ||
|
|
5fd79875ef | ||
|
|
bdb19ad325 | ||
|
|
7a12efc823 | ||
|
|
2f3bddf860 | ||
|
|
6127eb97af | ||
|
|
86386e14f3 | ||
|
|
9cc17c29f6 | ||
|
|
a31e863c7b | ||
|
|
15a32ac83a | ||
|
|
fa5b84ec0d | ||
|
|
7905584eac | ||
|
|
afc9b96a11 | ||
|
|
4e6466fc18 | ||
|
|
233baf78ce | ||
|
|
42d0bee37f | ||
|
|
ccadab6a10 | ||
|
|
bfe5a5cb96 | ||
|
|
88fc24c4cf | ||
|
|
8be4fea7a3 | ||
|
|
a3d39d8b6d | ||
|
|
ff36f0259a | ||
|
|
d13654088a | ||
|
|
8a6b97c757 | ||
|
|
d71e0c109b | ||
|
|
7e345303fe | ||
|
|
d881bdb77c | ||
|
|
4961102d8f | ||
|
|
4f2ab4f1da | ||
|
|
7540e34366 | ||
|
|
4d7a8b9ea0 | ||
|
|
812ecf93c8 | ||
|
|
74d99d97bc | ||
|
|
5bbc453268 | ||
|
|
d71b9edc7f | ||
|
|
134904b551 | ||
|
|
3eeb292d70 | ||
|
|
04125bbb98 | ||
|
|
cfc3a8341c | ||
|
|
cbb0a511a8 | ||
|
|
dff1c7ed32 | ||
|
|
7987ef81a6 | ||
|
|
8d8d4ee782 | ||
|
|
3a50c73cab | ||
|
|
4ee0071eca | ||
|
|
248192f404 | ||
|
|
e56b766c3a | ||
|
|
170b2b24ab | ||
|
|
50137e0994 | ||
|
|
8b5babd5f8 | ||
|
|
39e83200c8 | ||
|
|
ead0e0107e | ||
|
|
1c888bd4fd | ||
|
|
ff92530339 | ||
|
|
ee38032403 | ||
|
|
2ce245659a | ||
|
|
2c635eb4d7 | ||
|
|
d653223df0 | ||
|
|
290b0dfc78 | ||
|
|
06bb9e654b | ||
|
|
576fe78e33 | ||
|
|
0c16bfb5ff | ||
|
|
a101dbdf31 | ||
|
|
682609044f | ||
|
|
c0a7fb3a5c | ||
|
|
a153aa791c | ||
|
|
76b3dd1f96 | ||
|
|
8b9e2c8526 | ||
|
|
0dc2d14736 | ||
|
|
fc5dada701 | ||
|
|
f34060c4e0 | ||
|
|
006a239680 | ||
|
|
c6ed4bcab1 | ||
|
|
b0fe967087 | ||
|
|
3f32673b0a | ||
|
|
0525cecaee | ||
|
|
7d84a9582b | ||
|
|
289acd8ab6 | ||
|
|
bb6d9f604b | ||
|
|
c20a8232cd | ||
|
|
c886212e89 | ||
|
|
799ae111ae | ||
|
|
2a990979a0 | ||
|
|
2d1071117b | ||
|
|
aefce1ee67 | ||
|
|
64d10f5050 | ||
|
|
95b9edca62 | ||
|
|
06c8422cbe | ||
|
|
177d8b5112 | ||
|
|
39afa98fce | ||
|
|
5bc1ad4ba5 | ||
|
|
0b1223976c | ||
|
|
3873758fe5 | ||
|
|
3c876cb1d8 | ||
|
|
0a1a16c197 | ||
|
|
3c56325fa6 | ||
|
|
e5db3353ae | ||
|
|
3416ba4eaa | ||
|
|
cdb69bf553 | ||
|
|
1aff6d0d55 | ||
|
|
67b7bdcea3 | ||
|
|
9b6a6de415 | ||
|
|
8325246a56 | ||
|
|
3d11fb5e3f | ||
|
|
4627a58a52 | ||
|
|
e557047af1 | ||
|
|
8b4cea7339 | ||
|
|
ba5e35ec5c | ||
|
|
f53817e94d | ||
|
|
846efc5351 | ||
|
|
0149d00d64 | ||
|
|
275f9730f1 | ||
|
|
43bc954989 | ||
|
|
c88bc722e1 | ||
|
|
ec6fc6839e | ||
|
|
8383c93292 | ||
|
|
37d8d85935 | ||
|
|
95db7c6329 | ||
|
|
636783335f | ||
|
|
f88431ded4 | ||
|
|
91b0de0580 | ||
|
|
a5704ad75c | ||
|
|
ba8c09a7d9 | ||
|
|
dbe4015655 | ||
|
|
76237ad7dd | ||
|
|
dbfb1168fb | ||
|
|
830d28fbe5 | ||
|
|
c6def2a8fe | ||
|
|
ebc95fcea7 | ||
|
|
f78cfe59e8 | ||
|
|
a2cbc93d34 | ||
|
|
4728f14e8c | ||
|
|
e94b431d58 | ||
|
|
0ac5e2b995 | ||
|
|
365764e3e3 | ||
|
|
8d2b5aa3de | ||
|
|
9a031a4a43 | ||
|
|
d412679fd7 | ||
|
|
22c52d4432 | ||
|
|
9e5bdf9e33 | ||
|
|
7253eca5c0 | ||
|
|
b1f3dc29c5 | ||
|
|
8e3df8d41b | ||
|
|
efad22c00a | ||
|
|
b7690f13b1 | ||
|
|
6e1739da2e | ||
|
|
77ab423041 | ||
|
|
96a8e885d3 | ||
|
|
2b917c7eca | ||
|
|
942d2f7a4e | ||
|
|
75142ff1b2 | ||
|
|
74172dc3fa | ||
|
|
848fdda8d7 | ||
|
|
3895569a0c | ||
|
|
0aac29ca76 | ||
|
|
25f9eece8d | ||
|
|
0e22b8ab2c | ||
|
|
577c2ce6cd | ||
|
|
5b9cb8ca4b | ||
|
|
2eda93c0c2 | ||
|
|
d916adf2e3 | ||
|
|
1f065bcbb2 | ||
|
|
3efdd9505e | ||
|
|
ab3f5f6a6c | ||
|
|
9027be7bbb | ||
|
|
7b08b5c035 | ||
|
|
4a557c67b7 | ||
|
|
a6ebe092e8 | ||
|
|
9759e1b396 | ||
|
|
b6147ca5a1 | ||
|
|
83887db77a |
28
.github/workflows/android.publish.yml
vendored
28
.github/workflows/android.publish.yml
vendored
@@ -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: |
|
||||||
|
|||||||
30
.github/workflows/desktop.publish.yml
vendored
30
.github/workflows/desktop.publish.yml
vendored
@@ -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
67
.github/workflows/ios.publish.yml
vendored
Normal 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
|
||||||
4
.github/workflows/web.beta.publish.yml
vendored
4
.github/workflows/web.beta.publish.yml
vendored
@@ -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/**"
|
||||||
|
|||||||
40
.github/workflows/web.v3-beta.publish.yml
vendored
Normal file
40
.github/workflows/web.v3-beta.publish.yml
vendored
Normal 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
3
.gitignore
vendored
@@ -9,4 +9,5 @@ nx-cloud.env
|
|||||||
.env.local
|
.env.local
|
||||||
.nyc_output
|
.nyc_output
|
||||||
site
|
site
|
||||||
node_modules.backup
|
node_modules.backup
|
||||||
|
.nx
|
||||||
258
apps/desktop/package-lock.json
generated
258
apps/desktop/package-lock.json
generated
@@ -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"
|
||||||
|
|||||||
@@ -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
60
apps/desktop/sign.js
Normal 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"
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
74
apps/desktop/src/utils/desktop-integration.ts
Normal file
74
apps/desktop/src/utils/desktop-integration.ts
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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 = () => {
|
||||||
|
|||||||
@@ -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 };
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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,
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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(() => {
|
||||||
|
|||||||
@@ -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}
|
||||||
|
/>
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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={{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 ? (
|
||||||
|
|||||||
@@ -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>
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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%",
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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 (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -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}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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"}
|
||||||
@@ -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(() => {});
|
||||||
}}
|
}}
|
||||||
@@ -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"
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -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 }) => (
|
||||||
|
|||||||
@@ -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
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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"}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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(() => {
|
||||||
|
|||||||
@@ -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;
|
|
||||||
@@ -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 />
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
})`
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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, {
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -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
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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"
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 } });
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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") {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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!
|
||||||
Binary file not shown.
15
apps/mobile/native/ios/ExportOptions.plist
Normal file
15
apps/mobile/native/ios/ExportOptions.plist
Normal 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>
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
@@ -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",
|
||||||
|
|||||||
947
apps/mobile/package-lock.json
generated
947
apps/mobile/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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"]
|
||||||
}
|
}
|
||||||
|
|||||||
24
apps/theme-builder/package-lock.json
generated
24
apps/theme-builder/package-lock.json
generated
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
40353
apps/web/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -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
Reference in New Issue
Block a user