From 28eaeca46ea69c0ea00dd8712eecea18b0c311ad Mon Sep 17 00:00:00 2001 From: Mo Date: Sun, 27 Feb 2022 14:44:45 -0600 Subject: [PATCH] refactor: smart tags to smart views (#562) --- ios/Podfile.lock | 8 +- package.json | 8 +- src/lib/application_state.ts | 39 ++++--- src/screens/Notes/Notes.tsx | 35 +++--- src/screens/SideMenu/MainSideMenu.tsx | 29 ++--- src/screens/SideMenu/NoteSideMenu.tsx | 10 +- src/screens/SideMenu/TagSelectionList.tsx | 46 ++++---- yarn.lock | 123 +++++++++++----------- 8 files changed, 164 insertions(+), 134 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 405421ee..01c6bffb 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -289,7 +289,7 @@ PODS: - React-Core - react-native-segmented-control (2.2.2): - React-Core - - react-native-sodium-jsi (1.0.0): + - react-native-sodium-jsi (1.1.3): - React-Core - react-native-static-server (0.5.0): - GCDWebServer (~> 3.0) @@ -640,7 +640,7 @@ SPEC CHECKSUMS: boost: a7c83b31436843459a1961bfd74b96033dc77234 BugsnagReactNative: d6988f685aae2de5ecda1f5ca39f03661759d416 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 - DoubleConversion: cf9b38bf0b2d048436d9a82ad2abe1404f11e7de + DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662 FBLazyVector: e5569e42a1c79ca00521846c223173a57aca1fe1 FBReactNativeSpec: fe08c1cd7e2e205718d77ad14b34957cce949b58 Flipper: 30e8eeeed6abdc98edaf32af0cda2f198be4b733 @@ -654,7 +654,7 @@ SPEC CHECKSUMS: FlipperKit: d8d346844eca5d9120c17d441a2f38596e8ed2b9 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4 - glog: 73c2498ac6884b13ede40eda8228cb1eee9d9d62 + glog: 5337263514dd6f09803962437687240c5dc39aa4 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 OpenSSL-Universal: 1aa4f6a6ee7256b83db99ec1ccdaa80d10f9af9b RCT-Folly: a21c126816d8025b547704b777a2ba552f3d9fa9 @@ -675,7 +675,7 @@ SPEC CHECKSUMS: react-native-mail: 5fe7239a5b5c1e858d425501c03d1ab977434122 react-native-safe-area-context: b6e0e284002381d2ff29fa4fff42b4d8282e3c94 react-native-segmented-control: 65df6cd0619b780b3843d574a72d4c7cec396097 - react-native-sodium-jsi: 546d6caf98889940311af86752e97f3757c75263 + react-native-sodium-jsi: e86fb6bc2f48b5148c1339b07b18a7f3799d17a3 react-native-static-server: 201b2a945a35096be3ae7f43e367c65bcbd61343 react-native-version-info: 36490da17d2c6b5cc21321c70e433784dee7ed0b react-native-webview: e89bf2dba26a04cda967814df3ed1be99f291233 diff --git a/package.json b/package.json index e1e6d142..531cf900 100644 --- a/package.json +++ b/package.json @@ -26,12 +26,12 @@ "@react-navigation/native": "^5.9.3", "@react-navigation/stack": "^5.14.3", "@standardnotes/components": "^1.7.6", - "@standardnotes/features": "^1.33.0", - "@standardnotes/payloads": "^1.1.0", + "@standardnotes/features": "^1.33.1", + "@standardnotes/payloads": "^1.1.2", "@standardnotes/react-native-textview": "1.0.1", "@standardnotes/react-native-utils": "1.0.1", "@standardnotes/sncrypto-common": "1.7.1", - "@standardnotes/snjs": "2.65.0", + "@standardnotes/snjs": "2.65.3", "@standardnotes/stylekit": "5.9.0", "js-base64": "^3.5.2", "moment": "^2.29.1", @@ -54,7 +54,7 @@ "react-native-screens": "3.4.0", "react-native-search-bar": "standardnotes/react-native-search-bar#7d2139d", "react-native-search-box": "standardnotes/react-native-search-box#c0de5bab18cb418fef75ef2c2cd921304142e492", - "react-native-sodium-jsi": "1.1.1", + "react-native-sodium-jsi": "1.1.3", "react-native-static-server": "standardnotes/react-native-static-server#d0c4cb0feae233634ef26fc33118f258192c7b7d", "react-native-store-review": "^0.1.5", "react-native-svg": "^12.1.1", diff --git a/src/lib/application_state.ts b/src/lib/application_state.ts index 52e1a766..53d8684d 100644 --- a/src/lib/application_state.ts +++ b/src/lib/application_state.ts @@ -10,12 +10,13 @@ import { NoteViewController, PayloadSource, removeFromArray, + SmartView, SNNote, - SNSmartTag, SNTag, SNUserPrefs, StorageKey, StorageValueModes, + SystemViewId, } from '@standardnotes/snjs'; import { AppState, @@ -37,7 +38,6 @@ import { PrefKey } from './preferences_manager'; const pjson = require('../../package.json'); const { PlatformConstants } = NativeModules; -// eslint-disable-next-line no-shadow export enum AppStateType { LosingFocus = 1, EnteringBackground = 2, @@ -48,13 +48,11 @@ export enum AppStateType { PreferencesChanged = 7, } -// eslint-disable-next-line no-shadow export enum LockStateType { Locked = 1, Unlocked = 2, } -// eslint-disable-next-line no-shadow export enum AppStateEventType { KeyboardChangeEvent = 1, TabletModeChange = 2, @@ -66,19 +64,16 @@ export type TabletModeChangeData = { old_isInTabletMode: boolean; }; -// eslint-disable-next-line no-shadow export enum UnlockTiming { Immediately = 'immediately', OnQuit = 'on-quit', } -// eslint-disable-next-line no-shadow export enum PasscodeKeyboardType { Default = 'default', Numeric = 'numeric', } -// eslint-disable-next-line no-shadow export enum MobileStorageKey { PasscodeKeyboardTypeKey = 'passcodeKeyboardType', } @@ -104,7 +99,7 @@ export class ApplicationState extends ApplicationService { keyboardHeight?: number; appEventObersever: any; selectedTagRestored = false; - selectedTag: SNTag = this.application.getSmartTags()[0]; + selectedTag: SNTag | SmartView = this.application.getSmartViews()[0]; userPreferences?: SNUserPrefs; tabletMode: boolean = false; ignoreStateChanges: boolean = false; @@ -170,7 +165,7 @@ export class ApplicationState extends ApplicationService { const savedTag = (this.application.findItem(savedTagUuid) as SNTag) || - this.application.getSmartTags().find(tag => tag.uuid === savedTagUuid); + this.application.getSmartViews().find(tag => tag.uuid === savedTagUuid); if (savedTag) { this.setSelectedTag(savedTag, false); this.selectedTagRestored = true; @@ -281,7 +276,7 @@ export class ApplicationState extends ApplicationService { */ async createEditor(title?: string) { const selectedTagUuid = this.selectedTag - ? this.selectedTag.isSmartTag + ? this.selectedTag instanceof SmartView ? undefined : this.selectedTag.uuid : undefined; @@ -389,9 +384,21 @@ export class ApplicationState extends ApplicationService { } if (note.deleted) { this.closeEditor(editor); - } else if (note.trashed && !this.selectedTag?.isTrashTag) { + } else if ( + note.trashed && + !( + this.selectedTag instanceof SmartView && + this.selectedTag.uuid === SystemViewId.TrashedNotes + ) + ) { this.closeEditor(editor); - } else if (note.archived && !this.selectedTag?.isArchiveTag) { + } else if ( + note.archived && + !( + this.selectedTag instanceof SmartView && + this.selectedTag.uuid === SystemViewId.ArchivedNotes + ) + ) { this.closeEditor(editor); } } @@ -437,7 +444,7 @@ export class ApplicationState extends ApplicationService { /** * Set selected @SNTag */ - public setSelectedTag(tag: SNTag, saveSelection: boolean = true) { + public setSelectedTag(tag: SNTag | SmartView, saveSelection: boolean = true) { if (this.selectedTag.uuid === tag.uuid) { return; } @@ -468,9 +475,9 @@ export class ApplicationState extends ApplicationService { /** * @returns notes this tag references */ - public getTagNotes(tag: SNTag) { - if (tag.isSmartTag) { - return this.application.notesMatchingSmartTag(tag as SNSmartTag); + public getTagNotes(tag: SNTag | SmartView) { + if (tag instanceof SmartView) { + return this.application.notesMatchingSmartView(tag); } else { return this.application.referencesForItem(tag).filter(ref => { return ref.content_type === ContentType.Note; diff --git a/src/screens/Notes/Notes.tsx b/src/screens/Notes/Notes.tsx index 14b045c1..dead4622 100644 --- a/src/screens/Notes/Notes.tsx +++ b/src/screens/Notes/Notes.tsx @@ -13,7 +13,10 @@ import { CollectionSort, ContentType, NotesDisplayCriteria, + SmartView, SNNote, + SNTag, + SystemViewId, } from '@standardnotes/snjs'; import { ICON_ADD } from '@Style/icons'; import { ThemeService } from '@Style/theme_service'; @@ -109,7 +112,7 @@ export const Notes = React.memo( const haveDisplayOptions = useRef(false); const protectionsEnabled = useRef( application!.hasProtectionSources() && - !application!.hasUnprotectedAccessSession() + !application!.hasUnprotectedAccessSession() ); const reloadTitle = useCallback( @@ -127,7 +130,7 @@ export const Notes = React.memo( : `${resultCount} search results`; } else if (selectedTag) { title = selectedTag.title; - if (selectedTag.parentId) { + if (selectedTag instanceof SNTag && selectedTag.parentId) { const parents = application!.getTagParentChain(selectedTag); const hierarchy = parents.map(tag => tag.title).join(' ⫽ '); subTitle = hierarchy.length > 0 ? `in ${hierarchy}` : undefined; @@ -244,10 +247,10 @@ export const Notes = React.memo( const searchQuery = searchText || searchFilter ? { - query: searchFilter?.toLowerCase() ?? searchText.toLowerCase(), - includeProtectedNoteText: - includeProtected ?? includeProtectedNoteText, - } + query: searchFilter?.toLowerCase() ?? searchText.toLowerCase(), + includeProtectedNoteText: + includeProtected ?? includeProtectedNoteText, + } : undefined; let applyFilters = false; @@ -261,7 +264,8 @@ export const Notes = React.memo( sortProperty: sortOptions?.sortBy ?? (sortBy! as CollectionSort), sortDirection: sortOptions?.sortReverse ?? sortReverse! ? 'asc' : 'dsc', - tags: tag ? [tag] : [], + tags: tag instanceof SNTag ? [tag] : [], + views: tag instanceof SmartView ? [tag] : [], searchQuery: searchQuery, includeArchived: applyFilters && (includeArchived ?? includeArchivedNotes), @@ -340,7 +344,13 @@ export const Notes = React.memo( }, ]; - if (!selectedTag?.isArchiveTag && !selectedTag?.isTrashTag) { + const isArchiveView = + selectedTag instanceof SmartView && + selectedTag.uuid === SystemViewId.ArchivedNotes; + const isTrashView = + selectedTag instanceof SmartView && + selectedTag.uuid === SystemViewId.TrashedNotes; + if (!isArchiveView && !isTrashView) { setSearchOptions([ ...options, { @@ -431,10 +441,11 @@ export const Notes = React.memo( .getActiveNoteController()?.note; if (activeNote) { const discarded = activeNote.deleted || activeNote.trashed; - if ( - discarded && - !application?.getAppState().selectedTag?.isTrashTag - ) { + const isTrashView = + application?.getAppState().selectedTag instanceof SmartView && + application?.getAppState().selectedTag.uuid === + SystemViewId.TrashedNotes; + if (discarded && !isTrashView) { selectNextOrCreateNew(renderedNotes); } } else { diff --git a/src/screens/SideMenu/MainSideMenu.tsx b/src/screens/SideMenu/MainSideMenu.tsx index d022e957..62c3f2be 100644 --- a/src/screens/SideMenu/MainSideMenu.tsx +++ b/src/screens/SideMenu/MainSideMenu.tsx @@ -2,7 +2,7 @@ import { AppStateType } from '@Lib/application_state'; import { useNavigation } from '@react-navigation/native'; import { ApplicationContext } from '@Root/ApplicationContext'; import { SCREEN_SETTINGS } from '@Screens/screens'; -import { ContentType, SNTag, SNTheme } from '@standardnotes/snjs'; +import { ContentType, SmartView, SNTag, SNTheme } from '@standardnotes/snjs'; import { CustomActionSheetOption, useCustomActionSheet, @@ -33,7 +33,11 @@ import { useStyles, } from './MainSideMenu.styled'; import { SideMenuHero } from './SideMenuHero'; -import { SideMenuOptionIconDescriptionType, SideMenuOption, SideMenuSection } from './SideMenuSection'; +import { + SideMenuOption, + SideMenuOptionIconDescriptionType, + SideMenuSection, +} from './SideMenuSection'; import { TagSelectionList } from './TagSelectionList'; type Props = { @@ -243,7 +247,7 @@ export const MainSideMenu = React.memo(({ drawerRef }: Props) => { ]); const onTagSelect = useCallback( - async (tag: SNTag) => { + async (tag: SNTag | SmartView) => { if (tag.conflictOf) { application!.changeAndSaveItem(tag.uuid, mutator => { mutator.conflictOf = undefined; @@ -263,11 +267,11 @@ export const MainSideMenu = React.memo(({ drawerRef }: Props) => { const outOfSyncPressed = async () => { const confirmed = await application!.alertService!.confirm( "We've detected that the data in the current application session may " + - 'not match the data on the server. This can happen due to poor ' + - 'network conditions, or if a large note fails to download on your ' + - 'device. To resolve this issue, we recommend first creating a backup ' + - 'of your data in the Settings screen, then signing out of your account ' + - 'and signing back in.', + 'not match the data on the server. This can happen due to poor ' + + 'network conditions, or if a large note fails to download on your ' + + 'device. To resolve this issue, we recommend first creating a backup ' + + 'of your data in the Settings screen, then signing out of your account ' + + 'and signing back in.', 'Potentially Out of Sync', 'Open Settings', undefined @@ -277,9 +281,10 @@ export const MainSideMenu = React.memo(({ drawerRef }: Props) => { } }; - const selectedTags = useMemo(() => (selectedTag ? [selectedTag] : []), [ - selectedTag, - ]); + const selectedTags: SNTag[] | SmartView[] = useMemo( + () => (selectedTag ? ([selectedTag] as SNTag[] | SmartView[]) : []), + [selectedTag] + ); return ( @@ -310,7 +315,7 @@ export const MainSideMenu = React.memo(({ drawerRef }: Props) => { ) : index === 1 ? ( diff --git a/src/screens/SideMenu/NoteSideMenu.tsx b/src/screens/SideMenu/NoteSideMenu.tsx index 65f11795..1ecaec5a 100644 --- a/src/screens/SideMenu/NoteSideMenu.tsx +++ b/src/screens/SideMenu/NoteSideMenu.tsx @@ -21,9 +21,9 @@ import { NoteMutator, NoteViewController, PayloadSource, + SmartView, SNComponent, SNNote, - SNSmartTag, SNTag, } from '@standardnotes/snjs'; import { useCustomActionSheet } from '@Style/custom_action_sheet'; @@ -53,7 +53,11 @@ import DrawerLayout from 'react-native-gesture-handler/DrawerLayout'; import Icon from 'react-native-vector-icons/Ionicons'; import { ThemeContext } from 'styled-components/native'; import { SafeAreaContainer, useStyles } from './NoteSideMenu.styled'; -import { SideMenuOption, SideMenuOptionIconDescriptionType, SideMenuSection } from './SideMenuSection'; +import { + SideMenuOption, + SideMenuOptionIconDescriptionType, + SideMenuSection, +} from './SideMenuSection'; import { TagSelectionList } from './TagSelectionList'; function sortAlphabetically(array: SNComponent[]): SNComponent[] { @@ -560,7 +564,7 @@ export const NoteSideMenu = React.memo((props: Props) => { ]); const onTagSelect = useCallback( - async (tag: SNTag | SNSmartTag) => { + async (tag: SNTag | SmartView) => { const isSelected = selectedTags.findIndex(selectedTag => selectedTag.uuid === tag.uuid) > -1; diff --git a/src/screens/SideMenu/TagSelectionList.tsx b/src/screens/SideMenu/TagSelectionList.tsx index 0d8e4019..2e6e7004 100644 --- a/src/screens/SideMenu/TagSelectionList.tsx +++ b/src/screens/SideMenu/TagSelectionList.tsx @@ -2,11 +2,12 @@ import { useNavigation } from '@react-navigation/native'; import { ApplicationContext } from '@Root/ApplicationContext'; import { AppStackNavigationProp } from '@Root/AppStack'; import { SCREEN_COMPOSE, SCREEN_INPUT_MODAL_TAG } from '@Screens/screens'; +import { SideMenuOptionIconDescriptionType } from '@Screens/SideMenu/SideMenuSection'; import { ButtonType, CollectionSort, ContentType, - SNSmartTag, + SmartView, SNTag, } from '@standardnotes/snjs'; import { useCustomActionSheet } from '@Style/custom_action_sheet'; @@ -20,12 +21,11 @@ import React, { import { FlatList, ListRenderItem } from 'react-native'; import { SideMenuCell } from './SideMenuCell'; import { EmptyPlaceholder } from './TagSelectionList.styled'; -import {SideMenuOptionIconDescriptionType} from "@Screens/SideMenu/SideMenuSection"; type Props = { - contentType: ContentType.Tag | ContentType.SmartTag; - onTagSelect: (tag: SNTag | SNSmartTag) => void; - selectedTags: SNTag[] | SNSmartTag[]; + contentType: ContentType.Tag | ContentType.SmartView; + onTagSelect: (tag: SNTag | SmartView) => void; + selectedTags: SNTag[] | SmartView[]; emptyPlaceholder?: string; hasBottomPadding?: boolean; }; @@ -46,14 +46,14 @@ export const TagSelectionList = React.memo( const { showActionSheet } = useCustomActionSheet(); // State - const [tags, setTags] = useState(() => - contentType === ContentType.SmartTag ? application!.getSmartTags() : [] + const [tags, setTags] = useState(() => + contentType === ContentType.SmartView ? application!.getSmartViews() : [] ); const displayOptionsSet = useRef(false); const reloadTags = useCallback(() => { - if (contentType === ContentType.SmartTag) { - setTags(application!.getSmartTags()); + if (contentType === ContentType.SmartView) { + setTags(application!.getSmartViews()); } else { setTags(application!.getDisplayableItems(contentType) as SNTag[]); } @@ -72,7 +72,7 @@ export const TagSelectionList = React.memo( if (matchingTag.deleted) { application .getAppState() - .setSelectedTag(application!.getSmartTags()[0], true); + .setSelectedTag(application!.getSmartViews()[0], true); } } } @@ -95,7 +95,7 @@ export const TagSelectionList = React.memo( return removeStreamTags; }, [application, contentType, streamTags]); - const onTagLongPress = (tag: SNTag | SNSmartTag) => { + const onTagLongPress = (tag: SNTag | SmartView) => { showActionSheet(tag.title, [ { text: 'Rename', @@ -120,15 +120,15 @@ export const TagSelectionList = React.memo( ]); }; - const isRootTag = (tag: SNTag | SNSmartTag): boolean => - !(application?.getTagParent(tag) || false); - const isRegularTag = (tag: SNTag | SNSmartTag): boolean => - tag.content_type === ContentType.Tag; + const isRootTag = (tag: SNTag | SmartView): boolean => + tag instanceof SmartView || !application?.getTagParent(tag); const showFolders = contentType === ContentType.Tag; - const renderedTags = showFolders ? tags.filter(isRootTag) : tags; + const renderedTags = showFolders + ? (tags as SNTag[]).filter(isRootTag) + : tags; - const renderItem: ListRenderItem = ({ item }) => { + const renderItem: ListRenderItem = ({ item }) => { if (!application) { return null; } @@ -138,17 +138,19 @@ export const TagSelectionList = React.memo( title = 'Unable to Decrypt'; } - let children: (SNTag | SNSmartTag)[] = []; + let children: SNTag[] = []; - if (showFolders && isRegularTag(item)) { + if (showFolders && item instanceof SNTag) { const rawChildren = application .getTagChildren(item) .map(tag => tag.uuid); - children = tags.filter(tag => rawChildren.includes(tag.uuid)); + children = (tags as SNTag[]).filter((tag: SNTag) => + rawChildren.includes(tag.uuid) + ); } const isSelected = selectedTags.some( - selectedTag => selectedTag.uuid === item.uuid + (selectedTag: SNTag | SmartView) => selectedTag.uuid === item.uuid ); return ( @@ -191,7 +193,7 @@ export const TagSelectionList = React.memo( initialNumToRender={10} windowSize={10} maxToRenderPerBatch={10} - data={renderedTags} + data={renderedTags as SNTag[]} keyExtractor={item => item.uuid} renderItem={renderItem} /> diff --git a/yarn.lock b/yarn.lock index 9e49680c..fba04d82 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2526,56 +2526,56 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@standardnotes/applications@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@standardnotes/applications/-/applications-1.1.0.tgz#544604c6cc7c7792c1a547176f3f05159055d037" - integrity sha512-j+oWTMa4xTlr0DPg/fa6HOm1gYcBCDfCQEokrkjNHKeCUp1vQc9+BSqFkedww6/XLpRmSM0WoD7+nLnA/fk+nA== +"@standardnotes/applications@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@standardnotes/applications/-/applications-1.1.1.tgz#c57b9e192436d43963b36919ab44d1c626838151" + integrity sha512-C3K1dzjLG/kG4BCXMhCaL5xBnLXIaElkxZRxmg3Xrnh2XqtO7IbEsrjii8VxdYvjbhCEriFXLgghcSyHujaTTA== dependencies: - "@standardnotes/common" "^1.15.0" + "@standardnotes/common" "^1.15.1" -"@standardnotes/auth@^3.17.0": - version "3.17.0" - resolved "https://registry.yarnpkg.com/@standardnotes/auth/-/auth-3.17.0.tgz#05b1a2a46071fa6fdc96e4642c95cdbf27f506da" - integrity sha512-CEwBalNNhj1/ciST4gxMbPz3UD9B8BZBcv0HXRMRO/zOV8qsHr8Rt+n0vaJGSama809U0QAnBv8tEheHWaJ41Q== +"@standardnotes/auth@^3.17.1": + version "3.17.1" + resolved "https://registry.yarnpkg.com/@standardnotes/auth/-/auth-3.17.1.tgz#eda5f3e156c990c59407ce5a17f043a5caefe5f9" + integrity sha512-A3y20NeXa5MU5jxTlM1rxD6eMWe6K7WdWsANIiJceuFUx2jisX2esZyJluGZ2Pi3dwhMuOzmoX8iRgk3eUmkgg== dependencies: - "@standardnotes/common" "^1.15.0" + "@standardnotes/common" "^1.15.1" jsonwebtoken "^8.5.1" -"@standardnotes/common@^1.15.0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@standardnotes/common/-/common-1.15.0.tgz#3216d8683bcf79db2df33e536f1691fb48d61fc9" - integrity sha512-L+3iIyLrS2aHS4ZLGWOZiZFXcI0661nlW912eMH5nW88TM5F2w2mdm4jr2mbEBbDoVL/AHnrexrRKCwk+vV+kQ== +"@standardnotes/common@^1.15.1": + version "1.15.1" + resolved "https://registry.yarnpkg.com/@standardnotes/common/-/common-1.15.1.tgz#e028ca719e9c4c1acbf8867be5f97599275c7490" + integrity sha512-OQTDsB+DatNyRplzx6SUasOTWFdwJZXkJkyDUr1rb1HnPz/VQpHYaQh5pRNHt7OHe002373rQZPAweHBlmEoDg== "@standardnotes/components@^1.7.6": version "1.7.6" resolved "https://registry.yarnpkg.com/@standardnotes/components/-/components-1.7.6.tgz#6dcce572b32580a6df9091422d96c9c0b6917174" integrity sha512-5lSYNKpO1tQRD6PMOs0IVTmPhfUh33+h6HQZdbWyCmjUk99QE86cI6IC8LnPh5rjHKG+jkfwgVzBKrR3QS/eQw== -"@standardnotes/domain-events@^2.23.16": - version "2.23.16" - resolved "https://registry.yarnpkg.com/@standardnotes/domain-events/-/domain-events-2.23.16.tgz#54b1df25a08f5dec782751da47b370dc82366988" - integrity sha512-FHtW0Po1+CjrxWuM1fjGuycIPcisFPqxawOfgnBbEFyCDkJaMC1jPuLufgkWvlfDHL5yd5xpuXSWgJZyZ3nxYw== +"@standardnotes/domain-events@^2.23.17": + version "2.23.17" + resolved "https://registry.yarnpkg.com/@standardnotes/domain-events/-/domain-events-2.23.17.tgz#b2256ad7711003fb1790ac53548e8db37df38b4c" + integrity sha512-9qhQFydyi0ZNw2u2tAAp53Gbz1VLRwDX4S7FK4vT3sSoHTmkvkI354ETcgDBlZuIMZSo7AwthKu3wZTCz3jvMA== dependencies: - "@standardnotes/auth" "^3.17.0" - "@standardnotes/features" "^1.33.0" + "@standardnotes/auth" "^3.17.1" + "@standardnotes/features" "^1.33.1" -"@standardnotes/features@^1.33.0": - version "1.33.0" - resolved "https://registry.yarnpkg.com/@standardnotes/features/-/features-1.33.0.tgz#34e98d27f76b70afadecd36ae52af97b5bca8203" - integrity sha512-HBW1FEvKyk2IshXp8urQvJad+Duin2DBEJkpFzroLu89TJM5k8IMO7LdMjNNM9J+R18C9FqzF4aSP2mGTfn7Pw== +"@standardnotes/features@^1.33.1": + version "1.33.1" + resolved "https://registry.yarnpkg.com/@standardnotes/features/-/features-1.33.1.tgz#0269acf6672396cd7015b8df7f559f600de4dd08" + integrity sha512-TeZJ8nfaVMi1RGCNhGoXtzbhLuODf8fmceuMdZGMJYJEE6eEIr/YvqpDp1tYO/xCsvboZgRdwVmC7D5jPPmIwg== dependencies: - "@standardnotes/auth" "^3.17.0" - "@standardnotes/common" "^1.15.0" + "@standardnotes/auth" "^3.17.1" + "@standardnotes/common" "^1.15.1" -"@standardnotes/payloads@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@standardnotes/payloads/-/payloads-1.1.0.tgz#3853dfd7a8cd50d1a7f9ad064144eba7818d36cd" - integrity sha512-QsGdbmpINIJrTGoEkouQFfe5+z4t3LXi3JgTC7RdLQ74KvLJjvS6cv/ccDvRxrbyjlF43fzZtKK9oFY7lBlp1g== +"@standardnotes/payloads@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@standardnotes/payloads/-/payloads-1.1.2.tgz#6cb7819ab5fedc17d2e90a703015d0a46e350643" + integrity sha512-uV7cKkgP7eqfqyzvsd8r3t+DOGFkWIYNT8bGqYvTSrj+gjIGVSPhqL//oN1iUTvFUtcFTJHVLO2eirE2xcn/0A== dependencies: - "@standardnotes/applications" "^1.1.0" - "@standardnotes/common" "^1.15.0" - "@standardnotes/features" "^1.33.0" - "@standardnotes/utils" "^1.2.0" + "@standardnotes/applications" "^1.1.1" + "@standardnotes/common" "^1.15.1" + "@standardnotes/features" "^1.33.1" + "@standardnotes/utils" "^1.2.1" "@standardnotes/react-native-textview@1.0.1": version "1.0.1" @@ -2587,14 +2587,14 @@ resolved "https://registry.yarnpkg.com/@standardnotes/react-native-utils/-/react-native-utils-1.0.1.tgz#acaf80ac9abc6d074d2f283dcd6ace88ba86df5e" integrity sha512-In9v6RfK+FRexfIYHs1WhFHMX8xYmtDlIw3dAkSU0IpmxRmV/Dobj4fENYVOBWjYfYKF8fgBFFpC+W+mv/zu/Q== -"@standardnotes/services@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@standardnotes/services/-/services-1.2.0.tgz#027e66a4497331a68f6ed065534d92ff2e8b3002" - integrity sha512-PRmntaylTLtZPsmlxQ0uWhrgSnvMUZGHhQfkQxsPmHhEjDGmBfcIEWagCVrcpm7MJInbC+raWhVMnb/rhxXEfA== +"@standardnotes/services@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@standardnotes/services/-/services-1.2.1.tgz#7f1ddd3a16cd1c8dc43d3466fbe936a28d6d5eeb" + integrity sha512-b8Nw20SSg3Xr34hHoDQPxWNJ6Xgnswrjfg2paYPHXclP1Qwvo7OpiqdcjMntZ88UftvY1bFZJvqF1xrak7TJFA== dependencies: - "@standardnotes/applications" "^1.1.0" - "@standardnotes/common" "^1.15.0" - "@standardnotes/utils" "^1.2.0" + "@standardnotes/applications" "^1.1.1" + "@standardnotes/common" "^1.15.1" + "@standardnotes/utils" "^1.2.1" "@standardnotes/settings@^1.11.3": version "1.11.3" @@ -2606,20 +2606,21 @@ resolved "https://registry.yarnpkg.com/@standardnotes/sncrypto-common/-/sncrypto-common-1.7.1.tgz#2feead118e83b605696b2bc46a0986cbf577f855" integrity sha512-KAT/bZdbgLzDG8gOeuV07ObnYVE3kBoIK3dtRwlRfal3+BuiXE6JxaSblsophjTLG4i38/sBZ0Ex+UTZoebkug== -"@standardnotes/snjs@2.65.0": - version "2.65.0" - resolved "https://registry.yarnpkg.com/@standardnotes/snjs/-/snjs-2.65.0.tgz#69489923e9354a5cc71b958ede34e6fb4dc67a65" - integrity sha512-AqHHO6AA0WK7WY6uaztWAMe5HImlh6EueLVF8qX5uBJM3Qxbqg6WK+MOoXlDI/HLRUl992BLIcIgl9Azr6C5rQ== +"@standardnotes/snjs@2.65.3": + version "2.65.3" + resolved "https://registry.yarnpkg.com/@standardnotes/snjs/-/snjs-2.65.3.tgz#a5a769c3aabb80623cd62e3f861a865c1f376bf8" + integrity sha512-5kCJ53IKwhdZ9/hWpwmBnJlQ5kVSvAtrqfOf23Y/wHBhBmqSbaME3WtwUcvDS+MNZ1DH2ikv/iGkElAC+aClVw== dependencies: - "@standardnotes/applications" "^1.1.0" - "@standardnotes/auth" "^3.17.0" - "@standardnotes/common" "^1.15.0" - "@standardnotes/domain-events" "^2.23.16" - "@standardnotes/features" "^1.33.0" - "@standardnotes/services" "^1.2.0" + "@standardnotes/applications" "^1.1.1" + "@standardnotes/auth" "^3.17.1" + "@standardnotes/common" "^1.15.1" + "@standardnotes/domain-events" "^2.23.17" + "@standardnotes/features" "^1.33.1" + "@standardnotes/payloads" "^1.1.2" + "@standardnotes/services" "^1.2.1" "@standardnotes/settings" "^1.11.3" "@standardnotes/sncrypto-common" "^1.7.1" - "@standardnotes/utils" "^1.2.0" + "@standardnotes/utils" "^1.2.1" "@standardnotes/stylekit@5.9.0": version "5.9.0" @@ -2631,12 +2632,12 @@ "@svgr/webpack" "^6.2.1" prop-types "^15.7.2" -"@standardnotes/utils@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@standardnotes/utils/-/utils-1.2.0.tgz#0cb537a860c831f90c8abaa6c2690268cd753129" - integrity sha512-y4IBdpOY/OpuGrlbG/TMaXvEPJ0jiMq2u5xBsKLq0Zf8AmYxTAioDnQcK+Y/qaDO0J8oPHiElZuTY+C4wkjLfA== +"@standardnotes/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@standardnotes/utils/-/utils-1.2.1.tgz#226c679f5f91713c58f8ec0e837ea4586b234b3c" + integrity sha512-6lCzDsps9jh+CcgAeyPjwVaZG7VYCqKl5+Qp6mLUyFbqBIylg4ZW3VXvjjfw8DYY1LgHZtCTIHTuDdXCDuGm+w== dependencies: - "@standardnotes/common" "^1.15.0" + "@standardnotes/common" "^1.15.1" dompurify "^2.3.4" lodash "^4.17.19" @@ -8329,10 +8330,10 @@ react-native-search-box@standardnotes/react-native-search-box#c0de5bab18cb418fef dependencies: prop-types "^15.5.10" -react-native-sodium-jsi@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/react-native-sodium-jsi/-/react-native-sodium-jsi-1.1.1.tgz#8b19f3fc87053ef99f8ff1ee720bdeaf34641b0a" - integrity sha512-V4yiCgJd9GqkHawVg5cMi7nmtBzfZvNBtPOSwLIBq9x5UbxDT+b7VuWzHT+4UlpLm8g0NVqvOqsIzm9GDQ7SLA== +react-native-sodium-jsi@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/react-native-sodium-jsi/-/react-native-sodium-jsi-1.1.3.tgz#163e9bbd3dfb7ee312eeb579c45ad3274203115b" + integrity sha512-HdCdxfahCf4PkGDyO2uNwLNiunbh1yolMpsIBmq8Fhn3mNXEevWeZyu9KMtBqxmG5SjhJ+ZoFLm0TPiM6gqJYQ== dependencies: "@standardnotes/sncrypto-common" "^1.7.1"