diff --git a/apps/mobile/app/app.tsx b/apps/mobile/app/app.tsx index 859889967..1c9323b84 100644 --- a/apps/mobile/app/app.tsx +++ b/apps/mobile/app/app.tsx @@ -69,7 +69,7 @@ const App = (props: { configureMode: "note-preview" }) => { setTimeout(async () => { await Notifications.get(); if (SettingsService.get().notifNotes) { - Notifications.pinQuickNote(true); + Notifications.pinQuickNote(); } TipManager.init(); }, 100); diff --git a/apps/mobile/app/common/filesystem/io.ts b/apps/mobile/app/common/filesystem/io.ts index 9551a24ed..2c6b84e64 100644 --- a/apps/mobile/app/common/filesystem/io.ts +++ b/apps/mobile/app/common/filesystem/io.ts @@ -222,15 +222,21 @@ export async function deleteCacheFileByName(name: string) { } export async function deleteDCacheFiles() { - await createCacheDir(); - const files = await RNFetchBlob.fs.ls(cacheDir); - for (const file of files) { - if (file.includes("_dcache") || file.startsWith("NN_")) { - await RNFetchBlob.fs.unlink(file).catch(() => { - /* empty */ - }); + try { + await createCacheDir(); + const files = await RNFetchBlob.fs.ls(cacheDir); + for (const file of files) { + if ( + file.includes("_dcache") || + file.startsWith("NN_") || + file.endsWith(".pdf") + ) { + await RNFetchBlob.fs.unlink(file).catch(() => { + /* empty */ + }); + } } - } + } catch (e) {} } export async function getCachePathForFile(filename: string) { diff --git a/apps/mobile/app/common/filesystem/utils.ts b/apps/mobile/app/common/filesystem/utils.ts index 6575587cb..04db1a456 100644 --- a/apps/mobile/app/common/filesystem/utils.ts +++ b/apps/mobile/app/common/filesystem/utils.ts @@ -161,10 +161,10 @@ export async function checkUpload( size === 0 ? `File size is 0.` : size === -1 - ? `File verification check failed.` - : expectedSize !== decryptedLength - ? `File size mismatch. Expected ${size} bytes but got ${decryptedLength} bytes.` - : undefined; + ? `File verification check failed.` + : expectedSize !== decryptedLength + ? `File size mismatch. Expected ${size} bytes but got ${decryptedLength} bytes.` + : undefined; if (error) throw new Error(error); } @@ -189,3 +189,7 @@ export async function checkAndCreateDir(path: string) { } return dir; } + +export const santizeUri = (uri: string) => { + return Platform.OS === "ios" ? decodeURI(uri).replace("file:///", "/") : uri; +}; diff --git a/apps/mobile/app/components/dialogs/pdf-preview/index.jsx b/apps/mobile/app/components/dialogs/pdf-preview/index.jsx index ffaf7090b..f8e404f4d 100644 --- a/apps/mobile/app/components/dialogs/pdf-preview/index.jsx +++ b/apps/mobile/app/components/dialogs/pdf-preview/index.jsx @@ -23,6 +23,7 @@ import React, { useCallback, useEffect, useRef, useState } from "react"; import { Dimensions, TextInput, View } from "react-native"; import Orientation from "react-native-orientation-locker"; import Pdf from "react-native-pdf"; +import FileViewer from "react-native-file-viewer"; import { MMKV } from "../../../common/database/mmkv"; import downloadAttachment from "../../../common/filesystem/download-attachment"; import { deleteCacheFileByPath, exists } from "../../../common/filesystem/io"; @@ -43,6 +44,7 @@ import SheetProvider from "../../sheet-provider"; import { IconButton } from "../../ui/icon-button"; import { ProgressBarComponent } from "../../ui/svg/lazy"; import Paragraph from "../../ui/typography/paragraph"; +import ReactNativeBlobUtil from "react-native-blob-util"; const WIN_WIDTH = Dimensions.get("window").width; const WIN_HEIGHT = Dimensions.get("window").height; @@ -117,8 +119,11 @@ const PDFPreview = () => { setVisible(false); return; } - const path = `${cacheDir}/${uri}`; + let path = `${cacheDir}/${attachment.filename}`; snapshotValue.current = snapshot.current; + await ReactNativeBlobUtil.fs + .mv(`${cacheDir}/${uri}`, path) + .catch(console.log); setPDFSource("file://" + path); setLoading(false); }, 100); @@ -127,7 +132,7 @@ const PDFPreview = () => { ); const close = () => { - deleteCacheFileByPath(pdfSource); + deleteCacheFileByPath(pdfSource.replace("file://", "")); setPDFSource(null); setVisible(false); setPassword(""); @@ -157,7 +162,12 @@ const PDFPreview = () => { return ( visible && ( - + @@ -223,45 +233,48 @@ const PDFPreview = () => { - { - setCurrentPage(event.nativeEvent.text); - pdfRef.current?.setPage(parseInt(event.nativeEvent.text)); - }} - blurOnSubmit - /> - /{numPages} - - - + > + { + setCurrentPage(event.nativeEvent.text); + pdfRef.current?.setPage( + parseInt(event.nativeEvent.text) + ); + }} + blurOnSubmit + /> + + /{numPages} + + { downloadAttachment(attachment.hash, false); }} /> + { + FileViewer.open(pdfSource, { + showOpenWithDialog: true, + showAppsSuggestions: true + }); + }} + /> {pdfSource ? ( diff --git a/apps/mobile/app/hooks/use-app-events.tsx b/apps/mobile/app/hooks/use-app-events.tsx index 3a13f5414..5498a4b7b 100644 --- a/apps/mobile/app/hooks/use-app-events.tsx +++ b/apps/mobile/app/hooks/use-app-events.tsx @@ -107,6 +107,7 @@ import { fluidTabsRef } from "../utils/global-refs"; import { NotesnookModule } from "../utils/notesnook-module"; import { sleep } from "../utils/time"; import useFeatureManager from "./use-feature-manager"; +import { deleteDCacheFiles } from "../common/filesystem/io"; const onCheckSyncStatus = async (type: SyncStatusEvent) => { const { disableSync, disableAutoSync } = SettingsService.get(); @@ -179,6 +180,7 @@ const onAppOpenedFromURL = async (event: { if (id) { const note = await db.notes.note(id); if (note) { + editorState().initialLoadCalled = true; eSendEvent(eOnLoadNote, { item: note }); @@ -504,11 +506,9 @@ const initializeDatabase = async (password?: string) => { await setAppMessage(); useSettingStore.getState().setAppLoading(false); Notifications.setupReminders(true); - if (SettingsService.get().notifNotes) { - Notifications.pinQuickNote(false); - } DatabaseLogger.info("Database initialized"); Notifications.restorePinnedNotes(); + deleteDCacheFiles(); } Walkthrough.init(); }; diff --git a/apps/mobile/app/screens/editor/tiptap/picker.ts b/apps/mobile/app/screens/editor/tiptap/picker.ts index 84f8ef55f..648c9d76e 100644 --- a/apps/mobile/app/screens/editor/tiptap/picker.ts +++ b/apps/mobile/app/screens/editor/tiptap/picker.ts @@ -22,10 +22,10 @@ import { isFeatureAvailable } from "@notesnook/common"; import { isImage } from "@notesnook/core"; import { strings } from "@notesnook/intl"; import { - pick as pickFile, DocumentPickerOptions, - DocumentPickerResponse, - keepLocalCopy + keepLocalCopy, + KeepLocalCopyResponse, + pick as pickFile } from "@react-native-documents/picker"; import { basename } from "pathe"; import { Platform } from "react-native"; @@ -35,31 +35,13 @@ import { DatabaseLogger, db } from "../../../common/database"; import filesystem from "../../../common/filesystem"; import { compressToFile } from "../../../common/filesystem/compress"; import AttachImage from "../../../components/dialogs/attach-image-dialog"; -import { - ToastManager, - eSendEvent, - presentSheet -} from "../../../services/event-manager"; +import { ToastManager } from "../../../services/event-manager"; import PremiumService from "../../../services/premium"; import { useSettingStore } from "../../../stores/use-setting-store"; import { useUserStore } from "../../../stores/use-user-store"; -import { eCloseSheet } from "../../../utils/events"; import { useTabStore } from "./use-tab-store"; import { editorController, editorState } from "./utils"; - -const showEncryptionSheet = (file: DocumentPickerResponse) => { - presentSheet({ - title: strings.encryptingAttachment(), - paragraph: strings.encryptingAttachmentDesc(file.name || ""), - icon: "attachment" - }); -}; - -const santizeUri = (uri: string) => { - uri = decodeURI(uri); - uri = Platform.OS === "ios" ? uri.replace("file:///", "/") : uri; - return uri; -}; +import { santizeUri } from "../../../common/filesystem/utils"; type PickerOptions = { noteId?: string; @@ -80,7 +62,7 @@ const file = async (fileOptions: PickerOptions) => { await db.attachments.generateKey(); let file; - let fileCopyUri; + let fileCopyUri: KeepLocalCopyResponse[0]; let fileName; try { useSettingStore.getState().setAppDidEnterBackgroundForAction(true); @@ -97,12 +79,10 @@ const file = async (fileOptions: PickerOptions) => { }); fileCopyUri = result[0]; } catch (e) { + DatabaseLogger.error(e as Error, "Error picking file"); return; } - let uri = - Platform.OS === "ios" ? fileCopyUri.sourceUri || file.uri : file.uri; - const featureResult = await isFeatureAvailable("fileSize", file.size || 0); if (!featureResult.isAllowed) { ToastManager.show({ @@ -122,8 +102,7 @@ const file = async (fileOptions: PickerOptions) => { return; } - uri = Platform.OS === "ios" ? santizeUri(uri) : uri; - showEncryptionSheet(file); + let uri = santizeUri(fileCopyUri.localUri); const hash = await Sodium.hashFile({ uri: uri, type: "url" @@ -139,7 +118,8 @@ const file = async (fileOptions: PickerOptions) => { ) { throw new Error("Failed to attach file"); } - if (Platform.OS === "ios") await RNFetchBlob.fs.unlink(uri); + + await RNFetchBlob.fs.unlink(uri); if ( fileOptions.tabId !== undefined && @@ -173,10 +153,7 @@ const file = async (fileOptions: PickerOptions) => { } else { throw new Error("Failed to attach file, no tabId is set"); } - - eSendEvent(eCloseSheet); } catch (e) { - eSendEvent(eCloseSheet); ToastManager.show({ heading: (e as Error).message, type: "error", diff --git a/apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx b/apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx index 0792b32b6..1ff484c9c 100644 --- a/apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx +++ b/apps/mobile/app/screens/editor/tiptap/use-editor-events.tsx @@ -664,7 +664,8 @@ export const useEditorEvents = ( if (note) { eSendEvent(eOnLoadNote, { item: note, - tabId: editorMessage.tabId + tabId: editorMessage.tabId, + loadedFromEditor: true }); } } else { @@ -675,7 +676,8 @@ export const useEditorEvents = ( if (note) { eSendEvent(eOnLoadNote, { item: note, - tabId: editorMessage.tabId + tabId: editorMessage.tabId, + loadedFromEditor: true }); } } diff --git a/apps/mobile/app/screens/editor/tiptap/use-editor.ts b/apps/mobile/app/screens/editor/tiptap/use-editor.ts index ea1afaee8..478b7dfeb 100644 --- a/apps/mobile/app/screens/editor/tiptap/use-editor.ts +++ b/apps/mobile/app/screens/editor/tiptap/use-editor.ts @@ -508,9 +508,17 @@ export const useEditor = ( newTab?: boolean; refresh?: boolean; searchResultIndex?: number; + loadedFromEditor?: boolean; }) => { loadNoteMutex.runExclusive(async () => { - if (!event) return; + if ( + !event || + (event.loadedFromEditor && + event.item && + event.item?.id !== useTabStore.getState().getCurrentNoteId()) + ) { + return; + } if (event.blockId) { blockIdRef.current = event.blockId; } @@ -669,7 +677,7 @@ export const useEditor = ( state.current.currentlyEditing = true; if (!tabLocked) { await loadContent(item); - } else { + } else if (fluidTabsRef.current?.page() === "editor") { commands.focus(tabId!); } @@ -719,6 +727,7 @@ export const useEditor = ( }, 300); } postMessage(NativeEvents.theme, theme); + console.log("load finished", event.item?.id); }); }, [ diff --git a/apps/mobile/app/screens/settings/restore-backup/index.tsx b/apps/mobile/app/screens/settings/restore-backup/index.tsx index eea8372f0..46dfd076d 100644 --- a/apps/mobile/app/screens/settings/restore-backup/index.tsx +++ b/apps/mobile/app/screens/settings/restore-backup/index.tsx @@ -367,7 +367,6 @@ export const RestoreBackup = () => { disableAppLockRequests: true }); const file = await pick(); - const fileCopy = await keepLocalCopy({ destination: "cachesDirectory", files: [ @@ -390,10 +389,7 @@ export const RestoreBackup = () => { }, 1000); restoreBackup({ - uri: - Platform.OS === "android" - ? (("file://" + fileCopy[0].sourceUri) as string) - : (fileCopy[0].sourceUri as string), + uri: fileCopy[0].localUri, deleteFile: true }); }, diff --git a/apps/mobile/app/screens/settings/settings-data.tsx b/apps/mobile/app/screens/settings/settings-data.tsx index 5bb57d3f4..afd94a195 100644 --- a/apps/mobile/app/screens/settings/settings-data.tsx +++ b/apps/mobile/app/screens/settings/settings-data.tsx @@ -1329,7 +1329,7 @@ export const settingsGroups: SettingSection[] = [ if (settings.notifNotes) { Notifications.unpinQuickNote(); } else { - Notifications.pinQuickNote(false); + Notifications.pinQuickNote(); } SettingsService.set({ notifNotes: !settings.notifNotes diff --git a/apps/mobile/app/screens/settings/theme-selector.tsx b/apps/mobile/app/screens/settings/theme-selector.tsx index 2aed75334..a6e2a3076 100644 --- a/apps/mobile/app/screens/settings/theme-selector.tsx +++ b/apps/mobile/app/screens/settings/theme-selector.tsx @@ -16,6 +16,8 @@ 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 . */ +import { LegendList } from "@legendapp/list"; +import { strings } from "@notesnook/intl"; import { THEME_COMPATIBILITY_VERSION, ThemeDefinition, @@ -29,7 +31,6 @@ import type { ThemesRouter } from "@notesnook/themes-server"; import { keepLocalCopy, pick } from "@react-native-documents/picker"; -import Icon from "react-native-vector-icons/MaterialCommunityIcons"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { createTRPCProxyClient, httpBatchLink } from "@trpc/client"; import { createTRPCReact } from "@trpc/react-query"; @@ -40,24 +41,24 @@ import { TouchableOpacity, View } from "react-native"; +import ReactNativeBlobUtil from "react-native-blob-util"; +import Icon from "react-native-vector-icons/MaterialCommunityIcons"; import { DatabaseLogger, db } from "../../common/database"; +import { santizeUri } from "../../common/filesystem/utils"; import SheetProvider from "../../components/sheet-provider"; import { Button } from "../../components/ui/button"; +import { IconButton } from "../../components/ui/icon-button"; import Input from "../../components/ui/input"; +import { Pressable } from "../../components/ui/pressable"; import Heading from "../../components/ui/typography/heading"; import Paragraph from "../../components/ui/typography/paragraph"; import { ToastManager, presentSheet } from "../../services/event-manager"; import { useThemeStore } from "../../stores/use-theme-store"; -import { defaultBorderRadius, AppFontSize } from "../../utils/size"; +import { getColorLinearShade } from "../../utils/colors"; import { getElevationStyle } from "../../utils/elevation"; import { MenuItemsList } from "../../utils/menu-items"; -import { IconButton } from "../../components/ui/icon-button"; -import { Pressable } from "../../components/ui/pressable"; -import { getColorLinearShade } from "../../utils/colors"; -import { strings } from "@notesnook/intl"; +import { AppFontSize, defaultBorderRadius } from "../../utils/size"; import { DefaultAppStyles } from "../../utils/styles"; -import { LegendList } from "@legendapp/list"; -import ReactNativeBlobUtil from "react-native-blob-util"; const THEME_SERVER_URL = "https://themes-api.notesnook.com"; //@ts-ignore @@ -429,12 +430,16 @@ function ThemeSelector() { }); if (copiedFile[0].status !== "success") return; + const themeJsonCopiedPath = santizeUri( + copiedFile[0].localUri + ); + const themeJson = await ReactNativeBlobUtil.fs.readFile( - copiedFile[0].localUri, + themeJsonCopiedPath, "utf8" ); ReactNativeBlobUtil.fs - .unlink(copiedFile[0].localUri) + .unlink(themeJsonCopiedPath) .catch(() => {}); const json = JSON.parse(themeJson); const result = validateTheme(json); diff --git a/apps/mobile/app/services/background-sync.ts b/apps/mobile/app/services/background-sync.ts index f1cbc5647..a747d31ea 100644 --- a/apps/mobile/app/services/background-sync.ts +++ b/apps/mobile/app/services/background-sync.ts @@ -114,7 +114,7 @@ async function onBackgroundSyncStarted() { } await Notifications.setupReminders(); if (SettingsService.get().notifNotes) { - Notifications.pinQuickNote(false); + Notifications.pinQuickNote(); } Notifications.restorePinnedNotes(); NotePreviewWidget.updateNotes(); @@ -142,7 +142,7 @@ const onBoot = async () => { await Notifications.setupReminders(); if (SettingsService.get().notifNotes) { - Notifications.pinQuickNote(false); + Notifications.pinQuickNote(); } Notifications.restorePinnedNotes(); NotePreviewWidget.updateNotes(); diff --git a/apps/mobile/app/services/biometrics.ts b/apps/mobile/app/services/biometrics.ts index 2b07d0671..870730028 100644 --- a/apps/mobile/app/services/biometrics.ts +++ b/apps/mobile/app/services/biometrics.ts @@ -76,11 +76,11 @@ async function getCredentials(title?: string, description?: string) { const options = Platform.select({ ios: { fallbackEnabled: false, - description: description + description: description || title || "Unlock" }, android: { title: title, - description: description, + description: description || "Unlock", deviceCredentialAllowed: false } }); @@ -132,11 +132,11 @@ async function validateUser(title: string, description?: string) { Platform.select({ ios: { fallbackEnabled: false, - description: title + description: title || "Unlock" }, android: { title: title, - description: description, + description: description || "Unlock", deviceCredentialAllowed: false } }) as AuthenticateIOS diff --git a/apps/mobile/app/services/notifications.ts b/apps/mobile/app/services/notifications.ts index f24fa6d97..651d4fb4e 100644 --- a/apps/mobile/app/services/notifications.ts +++ b/apps/mobile/app/services/notifications.ts @@ -109,6 +109,15 @@ async function initDatabase() { const onEvent = async ({ type, detail }: Event) => { await initDatabase(); const { notification, pressAction, input } = detail; + if ( + type === EventType.DISMISSED && + Platform.OS === "android" && + notification?.id === "notesnook_note_input" && + SettingsService.getProperty("notifNotes") + ) { + pinQuickNote(); + } + if (type === EventType.DELIVERED && Platform.OS === "android") { if (notification?.id) { const reminder = await db.reminders?.reminder( @@ -438,6 +447,7 @@ async function scheduleNotification( async function loadNote(id: string, jump: boolean) { if (!id || id === "notesnook_note_input") return; + editorState().initialLoadCalled = true; const note = await db.notes.note(id); if (!note) return; if (!DDS.isTab && jump) { @@ -502,7 +512,8 @@ async function displayNotification({ ongoing, reply_placeholder_text, reply_button_text, - id + id, + channelId = "default" }: { title?: string; message: string; @@ -513,6 +524,7 @@ async function displayNotification({ reply_placeholder_text?: string; reply_button_text?: string; id?: string; + channelId?: "silent" | "vibrate" | "urgent" | "default"; }) { useUserStore.setState({ disableAppLockRequests: true @@ -537,7 +549,7 @@ async function displayNotification({ ongoing: ongoing, smallIcon: "ic_stat_name", localOnly: true, - channelId: await getChannelId("default"), + channelId: await getChannelId(channelId), autoCancel: false, pressAction: { id: "default", @@ -884,7 +896,7 @@ function init() { notifee.onForegroundEvent(onEvent); } -async function pinQuickNote(launch: boolean) { +async function pinQuickNote() { useUserStore.setState({ disableAppLockRequests: true }); @@ -896,14 +908,13 @@ async function pinQuickNote(launch: boolean) { return; } get().then((items) => { - const notification = items.filter((n) => n.id === "notesnook_note_input"); - if (notification && launch) { - return; - } + const notification = items.find((n) => n.id === "notesnook_note_input"); + if (notification) return; displayNotification({ title: strings.quickNoteTitle(), message: strings.quickNoteContent(), ongoing: true, + channelId: "silent", actions: ["ReplyInput", strings.hide()], reply_button_text: strings.takeNote(), reply_placeholder_text: strings.quickNotePlaceholder(), @@ -1030,6 +1041,7 @@ async function pinNote(id: string) { subtitle: "", bigText: html, ongoing: true, + channelId: "silent", actions: [strings.unpin()], id: note.id }); @@ -1040,9 +1052,13 @@ async function pinNote(id: string) { async function restorePinnedNotes() { const pinnedNotes = PinnedNotesStorage.get(); - for (const id of pinnedNotes) { - pinNote(id); - } + Notifications.get().then(() => { + for (const id of pinnedNotes) { + if (!isNotePinned(id)) { + pinNote(id); + } + } + }); } async function clearPinnedNotes() { diff --git a/apps/mobile/ios/Podfile.lock b/apps/mobile/ios/Podfile.lock index 3fcf11898..307f65aba 100644 --- a/apps/mobile/ios/Podfile.lock +++ b/apps/mobile/ios/Podfile.lock @@ -1887,7 +1887,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - react-native-document-picker (11.0.1): + - react-native-document-picker (11.0.3): - boost - DoubleConversion - fast_float @@ -2004,7 +2004,7 @@ PODS: - React - react-native-orientation-locker (1.7.0): - React-Core - - react-native-pager-view (6.9.1): + - react-native-pager-view (8.0.0): - boost - DoubleConversion - fast_float @@ -2031,8 +2031,9 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - SocketRocket + - SwiftUIIntrospect (~> 1.0) - Yoga - - react-native-pdf (6.7.7): + - react-native-pdf (7.0.3): - boost - DoubleConversion - fast_float @@ -3413,6 +3414,7 @@ PODS: - pop (~> 1.0) - SocketRocket (0.7.1) - SSZipArchive (2.4.3) + - SwiftUIIntrospect (1.3.0) - SwiftyRSA (1.7.0): - SwiftyRSA/ObjC (= 1.7.0) - SwiftyRSA/ObjC (1.7.0) @@ -3568,6 +3570,7 @@ SPEC REPOS: - SDWebImage - SocketRocket - SSZipArchive + - SwiftUIIntrospect - SwiftyRSA - TOCropViewController @@ -3891,7 +3894,7 @@ SPEC CHECKSUMS: react-native-blob-util: 7946b7e13acf0da5e849dc2f73fcfebe1d981699 react-native-config: 963b5efabc864cf69412e54b5de49b6a23e4af03 react-native-date-picker: 4f4f40f6e65798038bb4b1bff47890c2be69c2e6 - react-native-document-picker: 254467fec90f263dfc4828210daf3e8baa4fcb81 + react-native-document-picker: d624d3d9bd9311da87f6f7b64aa44f69927d8543 react-native-fingerprint-scanner: d5e143a361f3f01858e9c45141ddcabc4fd57055 react-native-get-random-values: d16467cf726c618e9c7a8c3c39c31faa2244bbba react-native-gzip: 794e0e964a0d9e1dfd1773fee938adb4d4310e26 @@ -3903,8 +3906,8 @@ SPEC CHECKSUMS: react-native-netinfo: cec9c4e86083cb5b6aba0e0711f563e2fbbff187 react-native-notification-sounds: ce106d58df0dd384bccbd2e84fb53accab7cc068 react-native-orientation-locker: cc6f357b289a2e0dd2210fea0c52cb8e0727fdaa - react-native-pager-view: a0516effb17ca5120ac2113bfd21b91130ad5748 - react-native-pdf: c586da0d19c14e6d859e62bf957851687fba0f25 + react-native-pager-view: d7d2aa47f54343bf55fdcee3973503dd27c2bd37 + react-native-pdf: edc236298f13f1609e42d41e45b8b6ea88ed10f9 react-native-quick-sqlite: 1ed8d3db1e22a8604d006be69f06053382e93bb0 react-native-safe-area-context: c6e2edd1c1da07bdce287fa9d9e60c5f7b514616 react-native-screenguard: 9fc3b4ad5b97783fc0832638fae0dce51272c661 @@ -3973,6 +3976,7 @@ SPEC CHECKSUMS: SexyTooltip: 5c9b4dec52bfb317938cb0488efd9da3717bb6fd SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 SSZipArchive: fe6a26b2a54d5a0890f2567b5cc6de5caa600aef + SwiftUIIntrospect: fee9aa07293ee280373a591e1824e8ddc869ba5d SwiftyRSA: 8c6dd1ea7db1b8dc4fb517a202f88bb1354bc2c6 TOCropViewController: 797deaf39c90e6e9ddd848d88817f6b9a8a09888 toolbar-android: c426ed5bd3dcccfed20fd79533efc0d1ae0ef018 diff --git a/apps/mobile/package-lock.json b/apps/mobile/package-lock.json index f9c14b8d9..647be16a4 100644 --- a/apps/mobile/package-lock.json +++ b/apps/mobile/package-lock.json @@ -1,12 +1,12 @@ { "name": "@notesnook/mobile", - "version": "3.3.10-beta.6", + "version": "3.3.11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@notesnook/mobile", - "version": "3.3.10-beta.6", + "version": "3.3.11", "hasInstallScript": true, "license": "GPL-3.0-or-later", "dependencies": { @@ -42,7 +42,7 @@ "@react-native-community/datetimepicker": "^8.4.5", "@react-native-community/netinfo": "^11.4.1", "@react-native-community/toolbar-android": "^0.2.1", - "@react-native-documents/picker": "^11.0.1", + "@react-native-documents/picker": "^11.0.3", "@react-native-masked-view/masked-view": "^0.3.2", "@react-navigation/elements": "^1.3.3", "@react-navigation/native": "^6.0.10", @@ -102,8 +102,8 @@ "react-native-navigation-bar-color": "2.0.2", "react-native-notification-sounds": "0.5.5", "react-native-orientation-locker": "^1.7.0", - "react-native-pager-view": "^6.5.1", - "react-native-pdf": "6.7.7", + "react-native-pager-view": "^8.0.0", + "react-native-pdf": "^7.0.3", "react-native-privacy-snapshot": "github:standardnotes/react-native-privacy-snapshot", "react-native-progress": "5.0.0", "react-native-qrcode-svg": "^6.0.6", @@ -118,7 +118,7 @@ "react-native-share": "^12.0.3", "react-native-svg": "^15.12.0", "react-native-swiper-flatlist": "3.2.2", - "react-native-tab-view": "^4.1.3", + "react-native-tab-view": "^4.2.2", "react-native-theme-switch-animation": "^0.6.0", "react-native-tooltips": "^1.0.3", "react-native-url-polyfill": "^2.0.0", @@ -4853,9 +4853,9 @@ } }, "node_modules/@react-native-documents/picker": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@react-native-documents/picker/-/picker-11.0.1.tgz", - "integrity": "sha512-aUq4MHGO/f8BslCFFx9OXz9NLLmcLkYAXp5PAEVau31v7obItPpb71Fe84bxpGV6gALIvGlGgSm6W9kEyU4toA==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@react-native-documents/picker/-/picker-11.0.3.tgz", + "integrity": "sha512-q+vQNT1NtZcFGwsDpTwMKNNcgOEq6foFDGlPQVt8H7KaEjCjC+wTGdXuVSe8JJr2uO9xZR6kJ7aRHReZ4XDRBw==", "license": "MIT", "peerDependencies": { "react": "*", @@ -17743,9 +17743,9 @@ } }, "node_modules/react-native-pager-view": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.9.1.tgz", - "integrity": "sha512-uUT0MMMbNtoSbxe9pRvdJJKEi9snjuJ3fXlZhG8F2vVMOBJVt/AFtqMPUHu9yMflmqOr08PewKzj9EPl/Yj+Gw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-8.0.0.tgz", + "integrity": "sha512-oAwlWT1lhTkIs9HhODnjNNl/owxzn9DP1MbP+az6OTUdgbmzA16Up83sBH8NRKwrH8rNm7iuWnX1qMqiiWOLhg==", "license": "MIT", "peerDependencies": { "react": "*", @@ -17753,9 +17753,9 @@ } }, "node_modules/react-native-pdf": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/react-native-pdf/-/react-native-pdf-6.7.7.tgz", - "integrity": "sha512-D0ga/eyPsVWSPEBm622sGVZLl3gibxPmfm2cxsLcUrZ4WDSGR5HyGmvvWaR/m9wXEyIbD4J6q9qzuG6yObcSXw==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/react-native-pdf/-/react-native-pdf-7.0.3.tgz", + "integrity": "sha512-zDtF6CGXPAfGptQZqX7LQK3CVQrIGsD+rYuBnMK0sVmd8mrq7ciwmWXINT+d92emMtZ7+PLnx1IQZIdsh0fphA==", "license": "MIT", "dependencies": { "crypto-js": "4.2.0", @@ -17959,9 +17959,9 @@ } }, "node_modules/react-native-tab-view": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/react-native-tab-view/-/react-native-tab-view-4.2.0.tgz", - "integrity": "sha512-TUbh7Yr0tE/99t1pJQLbQ+4/Px67xkT7/r3AhfV+93Q3WoUira0Lx7yuKUP2C118doqxub8NCLERwcqsHr29nQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/react-native-tab-view/-/react-native-tab-view-4.2.2.tgz", + "integrity": "sha512-NXtrG6OchvbGjsvbySJGVocXxo4Y2vA17ph4rAaWtA2jh+AasD8OyikKBRg2SmllEfeQ+GEhcKe8kulHv8BhTg==", "license": "MIT", "dependencies": { "use-latest-callback": "^0.2.4" diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 853885488..45d19fe93 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -58,7 +58,7 @@ "@react-native-community/datetimepicker": "^8.4.5", "@react-native-community/netinfo": "^11.4.1", "@react-native-community/toolbar-android": "^0.2.1", - "@react-native-documents/picker": "^11.0.1", + "@react-native-documents/picker": "^11.0.3", "@react-native-masked-view/masked-view": "^0.3.2", "@react-navigation/elements": "^1.3.3", "@react-navigation/native": "^6.0.10", @@ -118,8 +118,8 @@ "react-native-navigation-bar-color": "2.0.2", "react-native-notification-sounds": "0.5.5", "react-native-orientation-locker": "^1.7.0", - "react-native-pager-view": "^6.5.1", - "react-native-pdf": "6.7.7", + "react-native-pager-view": "^8.0.0", + "react-native-pdf": "^7.0.3", "react-native-privacy-snapshot": "github:standardnotes/react-native-privacy-snapshot", "react-native-progress": "5.0.0", "react-native-qrcode-svg": "^6.0.6", @@ -134,7 +134,7 @@ "react-native-share": "^12.0.3", "react-native-svg": "^15.12.0", "react-native-swiper-flatlist": "3.2.2", - "react-native-tab-view": "^4.1.3", + "react-native-tab-view": "^4.2.2", "react-native-theme-switch-animation": "^0.6.0", "react-native-tooltips": "^1.0.3", "react-native-url-polyfill": "^2.0.0", @@ -208,4 +208,4 @@ "engines": { "node": ">=20" } -} \ No newline at end of file +} diff --git a/apps/mobile/rspack.config.js b/apps/mobile/rspack.config.js index 907d10184..a0d760e66 100644 --- a/apps/mobile/rspack.config.js +++ b/apps/mobile/rspack.config.js @@ -155,39 +155,8 @@ module.exports = (env) => { type: "javascript/auto" }, ...Repack.getAssetTransformRules({ - inline: true - }), - - /** - * This loader handles all static assets (images, video, audio and others), so that you can - * use (reference) them inside your application. - * - * If you wan to handle specific asset type manually, filter out the extension - * from `ASSET_EXTENSIONS`, for example: - * ``` - * Repack.ASSET_EXTENSIONS.filter((ext) => ext !== 'svg') - * ``` - */ - { - test: Repack.getAssetExtensionsRegExp( - Repack.ASSET_EXTENSIONS.filter((ext) => ext !== "svg") - ), - use: { - loader: "@callstack/repack/assets-loader" - } - }, - { - test: /\.svg$/, - use: [ - { - loader: "@svgr/webpack", - options: { - native: true, - dimensions: false - } - } - ] - } + inline: false + }) ] }, plugins: [