mirror of
https://github.com/standardnotes/mobile.git
synced 2026-04-20 22:29:12 -04:00
refactor: smart tags to smart views (#562)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 (
|
||||
<Fragment>
|
||||
@@ -310,7 +315,7 @@ export const MainSideMenu = React.memo(({ drawerRef }: Props) => {
|
||||
) : index === 1 ? (
|
||||
<SideMenuSection title="Views">
|
||||
<TagSelectionList
|
||||
contentType={ContentType.SmartTag}
|
||||
contentType={ContentType.SmartView}
|
||||
onTagSelect={item.onTagSelect}
|
||||
selectedTags={item.selectedTags}
|
||||
/>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<SNTag[] | SNSmartTag[]>(() =>
|
||||
contentType === ContentType.SmartTag ? application!.getSmartTags() : []
|
||||
const [tags, setTags] = useState<SNTag[] | SmartView[]>(() =>
|
||||
contentType === ContentType.SmartView ? application!.getSmartViews() : []
|
||||
);
|
||||
const displayOptionsSet = useRef<boolean>(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<SNTag | SNSmartTag> = ({ item }) => {
|
||||
const renderItem: ListRenderItem<SNTag | SmartView> = ({ 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}
|
||||
/>
|
||||
|
||||
123
yarn.lock
123
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"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user