1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-24 10:27:10 +02:00

Merge branch 'feature/mobile-sorting' of https://github.com/jcgurango/joplin into jcgurango-feature/mobile-sorting

This commit is contained in:
Laurent Cozic 2023-07-06 18:42:22 +01:00
commit 1c5bb8f195
7 changed files with 346 additions and 47 deletions

View File

@ -1,15 +1,19 @@
const React = require('react');
import { Component } from 'react';
import { Component, FunctionComponent } from 'react';
import { connect } from 'react-redux';
import { FlatList, Text, StyleSheet, Button, View } from 'react-native';
import { FlatList, Text, StyleSheet, Button, View, ViewStyle, TextStyle, ImageStyle, PanResponder } from 'react-native';
import { FolderEntity, NoteEntity } from '@joplin/lib/services/database/types';
import { AppState } from '../utils/types';
import DraggableFlatList, { ScaleDecorator } from 'react-native-draggable-flatlist';
import Setting from '@joplin/lib/models/Setting';
const { _ } = require('@joplin/lib/locale');
const { NoteItem } = require('./note-item.js');
const { themeStyle } = require('./global-style.js');
const { dialogs } = require('../utils/dialogs.js');
const DialogBox = require('react-native-dialogbox').default;
interface NoteListProps {
themeId: string;
@ -19,17 +23,91 @@ interface NoteListProps {
folders: FolderEntity[];
noteSelectionEnabled?: boolean;
selectedFolderId?: string;
onSorted: (sortedId: string, newIndex: number)=> void;
}
class NoteListComponent extends Component<NoteListProps> {
interface NoteListState {
items: NoteEntity[];
selectedItemIds: string[];
}
interface NoteItemWrapperProps {
note: NoteEntity;
dialogbox: any;
drag: ()=> Promise<void>;
isActive: boolean;
style: ViewStyle | TextStyle | ImageStyle;
noteSelectionEnabled?: boolean;
dispatch: (payload: any)=> void;
}
const NoteItemWrapper: FunctionComponent<NoteItemWrapperProps> = ({
note,
drag,
isActive,
style,
dialogbox,
noteSelectionEnabled,
dispatch,
}) => {
if (Setting.value('notes.sortOrder.field') !== 'order') {
drag = async () => {
const doIt = await dialogs.confirmRef(dialogbox, `${_('To manually sort the notes, the sort order must be changed to "%s" in the menu "%s" > "%s"', _('Custom order'), _('View'), _('Sort notes by'))}\n\n${_('Do you want to do this')}`);
if (doIt) {
Setting.setValue('notes.sortOrder.field', 'order');
}
};
}
const panResponder = React.useRef(
PanResponder.create({
// Ask to be the responder:
onStartShouldSetPanResponder: () => false,
onStartShouldSetPanResponderCapture: () => false,
onMoveShouldSetPanResponder: (_) => true,
onMoveShouldSetPanResponderCapture: (_) => true,
onPanResponderGrant: () => {
void drag();
},
onShouldBlockNativeResponder: () => false,
})
).current;
return (
<View style={style} {...panResponder.panHandlers}>
<NoteItem
note={note}
onLongPress={() => {
dispatch({
type: noteSelectionEnabled ? 'NOTE_SELECTION_TOGGLE' : 'NOTE_SELECTION_START',
id: note.id,
});
}}
disabled={isActive}
/>
</View>
);
};
const ConnectedNoteItemWrapper = connect((state: AppState) => {
return {
noteSelectionEnabled: state.noteSelectionEnabled,
};
})(NoteItemWrapper);
class NoteListComponent extends Component<NoteListProps, NoteListState> {
private rootRef_: FlatList;
private styles_: Record<string, StyleSheet.NamedStyles<any>>;
/** DialogBox isn't a type, so we can't use it here */
private dialogbox: any;
public constructor(props: NoteListProps) {
super(props);
this.state = {
items: [],
items: props.items || [],
selectedItemIds: [],
};
this.rootRef_ = null;
@ -45,7 +123,7 @@ class NoteListComponent extends Component<NoteListProps> {
if (this.styles_[themeId]) return this.styles_[themeId];
this.styles_ = {};
const styles = {
const styles: Record<string, ViewStyle | TextStyle | ImageStyle> = {
noItemMessage: {
paddingLeft: theme.marginLeft,
paddingRight: theme.marginRight,
@ -55,8 +133,22 @@ class NoteListComponent extends Component<NoteListProps> {
color: theme.color,
textAlign: 'center',
},
selectAction: {
flex: 1,
paddingLeft: theme.marginLeft,
// Reverse the color 4 to use for e.x. white text over blue bg
backgroundColor: theme.color4,
justifyContent: 'center',
},
actionText: {
// Reverse the color 4 to use for e.x. white text over blue bg
color: theme.backgroundColor4,
fontSize: theme.fontSize,
},
noteContainer: {
backgroundColor: theme.backgroundColor,
},
noNotebookView: {
},
};
@ -77,18 +169,51 @@ class NoteListComponent extends Component<NoteListProps> {
if (this.rootRef_ && newProps.notesSource !== this.props.notesSource) {
this.rootRef_.scrollToOffset({ offset: 0, animated: false });
}
this.setState({
items: newProps.items || [],
});
}
public render() {
public renderMainContent() {
// `enableEmptySections` is to fix this warning: https://github.com/FaridSafi/react-native-gifted-listview/issues/39
if (this.props.items.length) {
return <FlatList
ref={ref => (this.rootRef_ = ref)}
data={this.props.items}
renderItem={({ item }) => <NoteItem note={item} />}
keyExtractor={item => item.id}
/>;
return (
<View style={{ flex: 1 }}>
<DraggableFlatList
ref={(ref: any) => (this.rootRef_ = ref)}
data={this.state.items}
renderItem={({ item, drag, isActive }) => (
<ScaleDecorator>
<ConnectedNoteItemWrapper
note={item}
drag={drag}
isActive={isActive}
style={this.styles().noteContainer}
dialogbox={this.dialogbox}
/>
</ScaleDecorator>
)}
keyExtractor={item => item.id}
onDragEnd={async ({ data, to, from }) => {
if (this.props.selectedFolderId) {
this.setState({ items: data });
if (this.props.onSorted) {
let newIndex = to;
if (to > from) {
newIndex++;
}
this.props.onSorted(data[to].id, newIndex);
}
}
}}
/>
</View>
);
} else {
if (!this.props.folders.length) {
const noItemMessage = _('You currently have no notebooks.');
@ -104,15 +229,27 @@ class NoteListComponent extends Component<NoteListProps> {
}
}
}
public render() {
return (
<>
{this.renderMainContent()}
<DialogBox
ref={(dialogbox: any) => {
this.dialogbox = dialogbox;
}}
/>
</>
);
}
}
const NoteList = connect((state: AppState) => {
return {
items: state.notes,
folders: state.folders,
selectedFolderId: state.selectedFolderId,
notesSource: state.notesSource,
themeId: state.settings.theme,
noteSelectionEnabled: state.noteSelectionEnabled,
};
})(NoteListComponent);

View File

@ -98,10 +98,9 @@ class NoteItemComponent extends Component {
onLongPress() {
if (!this.props.note) return;
this.props.dispatch({
type: this.props.noteSelectionEnabled ? 'NOTE_SELECTION_TOGGLE' : 'NOTE_SELECTION_START',
id: this.props.note.id,
});
if (this.props.onLongPress) {
this.props.onLongPress();
}
}
render() {
@ -132,7 +131,7 @@ class NoteItemComponent extends Component {
const noteTitle = Note.displayTitle(note);
return (
<TouchableOpacity onPress={() => this.onPress()} onLongPress={() => this.onLongPress()} activeOpacity={0.5}>
<TouchableOpacity onPress={() => this.onPress()} onLongPress={() => this.onLongPress()} disabled={this.props.disabled} activeOpacity={0.5}>
<View style={selectionWrapperStyle}>
<View style={opacityStyle}>
<View style={listItemStyle}>

View File

@ -69,6 +69,8 @@ class NotesScreenComponent extends BaseScreenComponent<any> {
Setting.setValue(r.name, r.value);
};
this.noteList_onSort = this.noteList_onSort.bind(this);
this.backHandler = () => {
if (this.dialogbox && this.dialogbox.state && this.dialogbox.state.isVisible) {
this.dialogbox.close();
@ -113,7 +115,7 @@ class NotesScreenComponent extends BaseScreenComponent<any> {
}
}
public async refreshNotes(props: any = null) {
public async refreshNotes(props: any = null, force?: boolean) {
if (props === null) props = this.props;
const options = {
@ -131,7 +133,7 @@ class NotesScreenComponent extends BaseScreenComponent<any> {
parentId: parent.id,
});
if (source === props.notesSource) return;
if (source === props.notesSource && !force) return;
let notes = [];
if (props.notesParentType === 'Folder') {
@ -149,6 +151,18 @@ class NotesScreenComponent extends BaseScreenComponent<any> {
});
}
private async noteList_onSort(sortedId: string, newIndex: number) {
await Note.insertNotesAt(
this.props.selectedFolderId,
[sortedId],
newIndex,
this.props.uncompletedTodosOnTop,
this.props.showCompletedTodos
);
await this.refreshNotes(null, true);
}
public newNoteNavigate = async (folderId: string, isTodo: boolean) => {
const newNote = await Note.save({
parent_id: folderId,
@ -254,7 +268,7 @@ class NotesScreenComponent extends BaseScreenComponent<any> {
return (
<View style={rootStyle}>
<ScreenHeader title={iconString + title} showBackButton={false} parentComponent={thisComp} sortButton_press={this.sortButton_press} folderPickerOptions={this.folderPickerOptions()} showSearchButton={true} showSideMenuButton={true} />
<NoteList />
<NoteList onSorted={this.noteList_onSort} />
{actionButtonComp}
<DialogBox
ref={(dialogbox: any) => {

View File

@ -343,7 +343,7 @@ PODS:
- React-Core
- react-native-camera/RN (4.2.1):
- React-Core
- react-native-document-picker (8.2.1):
- react-native-document-picker (8.2.0):
- React-Core
- react-native-fingerprint-scanner (6.0.0):
- React
@ -351,7 +351,7 @@ PODS:
- React-Core
- react-native-get-random-values (1.9.0):
- React-Core
- react-native-image-picker (5.3.1):
- react-native-image-picker (5.4.2):
- React-Core
- react-native-image-resizer (1.4.5):
- React-Core
@ -473,6 +473,8 @@ PODS:
- React-Core
- RNFS (2.20.0):
- React-Core
- RNGestureHandler (2.12.0):
- React-Core
- RNLocalize (3.0.0):
- React-Core
- RNQuickAction (0.3.13):
@ -580,6 +582,7 @@ DEPENDENCIES:
- RNExitApp (from `../node_modules/react-native-exit-app`)
- RNFileViewer (from `../node_modules/react-native-file-viewer`)
- RNFS (from `../node_modules/react-native-fs`)
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
- RNLocalize (from `../node_modules/react-native-localize`)
- RNQuickAction (from `../node_modules/react-native-quick-actions`)
- RNSecureRandom (from `../node_modules/react-native-securerandom`)
@ -724,6 +727,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-file-viewer"
RNFS:
:path: "../node_modules/react-native-fs"
RNGestureHandler:
:path: "../node_modules/react-native-gesture-handler"
RNLocalize:
:path: "../node_modules/react-native-localize"
RNQuickAction:
@ -777,11 +782,11 @@ SPEC CHECKSUMS:
React-logger: ef2269b3afa6ba868da90496c3e17a4ec4f4cee0
react-native-alarm-notification: 0732f97be04975a23ba60e675bdb961a0aaf6aa6
react-native-camera: 3eae183c1d111103963f3dd913b65d01aef8110f
react-native-document-picker: 69ca2094d8780cfc1e7e613894d15290fdc54bba
react-native-document-picker: 495c444c0c773c6e83a5d91165890ecb1c0a399a
react-native-fingerprint-scanner: ac6656f18c8e45a7459302b84da41a44ad96dbbe
react-native-geolocation: 0f7fe8a4c2de477e278b0365cce27d089a8c5903
react-native-get-random-values: dee677497c6a740b71e5612e8dbd83e7539ed5bb
react-native-image-picker: ec9b713e248760bfa0f879f0715391de4651a7cb
react-native-image-picker: 77f552291e993f3fdcdf48cc3c280ef7f11789c8
react-native-image-resizer: d9fb629a867335bdc13230ac2a58702bb8c8828f
react-native-netinfo: ccbe1085dffd16592791d550189772e13bf479e2
react-native-rsa-native: 12132eb627797529fdb1f0d22fd0f8f9678df64a
@ -811,6 +816,7 @@ SPEC CHECKSUMS:
RNExitApp: c4e052df2568b43bec8a37c7cd61194d4cfee2c3
RNFileViewer: ce7ca3ac370e18554d35d6355cffd7c30437c592
RNFS: 4ac0f0ea233904cb798630b3c077808c06931688
RNGestureHandler: dec4645026e7401a0899f2846d864403478ff6a5
RNLocalize: 5944c97d2fe8150913a51ddd5eab4e23a82bd80d
RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93
RNSecureRandom: 07efbdf2cd99efe13497433668e54acd7df49fef

View File

@ -44,12 +44,15 @@
"react-native-action-button": "2.8.5",
"react-native-camera": "4.2.1",
"react-native-dialogbox": "0.6.10",
"react-native-document-picker": "8.2.1",
"react-native-document-picker": "8.2.0",
"react-native-draggable-flatlist": "4.0.1",
"react-native-drawer-layout": "3.2.0",
"react-native-dropdownalert": "4.5.1",
"react-native-exit-app": "1.1.0",
"react-native-file-viewer": "2.1.5",
"react-native-fingerprint-scanner": "6.0.0",
"react-native-fs": "2.20.0",
"react-native-gesture-handler": "2.12.0",
"react-native-get-random-values": "1.9.0",
"react-native-image-picker": "5.4.2",
"react-native-image-resizer": "1.4.5",

View File

@ -116,6 +116,7 @@ import ProfileEditor from './components/ProfileSwitcher/ProfileEditor';
import sensorInfo, { SensorInfo } from './components/biometrics/sensorInfo';
import { getCurrentProfile } from '@joplin/lib/services/profileConfig';
import { getDatabaseName, getProfilesRootDir, getResourceDir, setDispatch } from './services/profiles';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
const logger = Logger.create('root');
@ -1033,20 +1034,22 @@ class AppComponent extends React.Component {
// Wrap everything in a PaperProvider -- this allows using components from react-native-paper
return (
<PaperProvider theme={{
...paperTheme,
version: 3,
colors: {
...paperTheme.colors,
onPrimaryContainer: theme.color5,
primaryContainer: theme.backgroundColor5,
surfaceVariant: theme.backgroundColor,
onSurfaceVariant: theme.color,
primary: theme.color,
},
}}>
{mainContent}
</PaperProvider>
<GestureHandlerRootView style={{ flex: 1 }}>
<PaperProvider theme={{
...paperTheme,
version: 3,
colors: {
...paperTheme.colors,
onPrimaryContainer: theme.color5,
primaryContainer: theme.backgroundColor5,
surfaceVariant: theme.backgroundColor,
onSurfaceVariant: theme.color,
primary: theme.color,
},
}}>
{mainContent}
</PaperProvider>
</GestureHandlerRootView>
);
}
}

149
yarn.lock
View File

@ -1404,6 +1404,25 @@ __metadata:
languageName: node
linkType: hard
"@babel/helper-create-class-features-plugin@npm:^7.22.5":
version: 7.22.6
resolution: "@babel/helper-create-class-features-plugin@npm:7.22.6"
dependencies:
"@babel/helper-annotate-as-pure": ^7.22.5
"@babel/helper-environment-visitor": ^7.22.5
"@babel/helper-function-name": ^7.22.5
"@babel/helper-member-expression-to-functions": ^7.22.5
"@babel/helper-optimise-call-expression": ^7.22.5
"@babel/helper-replace-supers": ^7.22.5
"@babel/helper-skip-transparent-expression-wrappers": ^7.22.5
"@babel/helper-split-export-declaration": ^7.22.6
"@nicolo-ribaudo/semver-v6": ^6.3.3
peerDependencies:
"@babel/core": ^7.0.0
checksum: 10412e8a509a607cde6137288d3f12b1f91acd374e29e6dd6a277b67217e9f4c932a0acd89eeda837c8432916df775a8af6321aeb8d8b131ccdbf7688208dda1
languageName: node
linkType: hard
"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.5":
version: 7.22.5
resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.5"
@ -1564,6 +1583,15 @@ __metadata:
languageName: node
linkType: hard
"@babel/helper-split-export-declaration@npm:^7.22.6":
version: 7.22.6
resolution: "@babel/helper-split-export-declaration@npm:7.22.6"
dependencies:
"@babel/types": ^7.22.5
checksum: e141cace583b19d9195f9c2b8e17a3ae913b7ee9b8120246d0f9ca349ca6f03cb2c001fd5ec57488c544347c0bb584afec66c936511e447fd20a360e591ac921
languageName: node
linkType: hard
"@babel/helper-string-parser@npm:^7.22.5":
version: 7.22.5
resolution: "@babel/helper-string-parser@npm:7.22.5"
@ -1578,7 +1606,7 @@ __metadata:
languageName: node
linkType: hard
"@babel/helper-validator-option@npm:^7.18.6, @babel/helper-validator-option@npm:^7.22.5":
"@babel/helper-validator-option@npm:^7.18.6, @babel/helper-validator-option@npm:^7.21.0, @babel/helper-validator-option@npm:^7.22.5":
version: 7.22.5
resolution: "@babel/helper-validator-option@npm:7.22.5"
checksum: bbeca8a85ee86990215c0424997438b388b8d642d69b9f86c375a174d3cdeb270efafd1ff128bc7a1d370923d13b6e45829ba8581c027620e83e3a80c5c414b3
@ -2084,6 +2112,17 @@ __metadata:
languageName: node
linkType: hard
"@babel/plugin-syntax-typescript@npm:^7.22.5":
version: 7.22.5
resolution: "@babel/plugin-syntax-typescript@npm:7.22.5"
dependencies:
"@babel/helper-plugin-utils": ^7.22.5
peerDependencies:
"@babel/core": ^7.0.0-0
checksum: 8ab7718fbb026d64da93681a57797d60326097fd7cb930380c8bffd9eb101689e90142c760a14b51e8e69c88a73ba3da956cb4520a3b0c65743aee5c71ef360a
languageName: node
linkType: hard
"@babel/plugin-transform-arrow-functions@npm:^7.0.0, @babel/plugin-transform-arrow-functions@npm:^7.18.6":
version: 7.22.5
resolution: "@babel/plugin-transform-arrow-functions@npm:7.22.5"
@ -2542,6 +2581,20 @@ __metadata:
languageName: node
linkType: hard
"@babel/plugin-transform-typescript@npm:^7.21.0":
version: 7.22.5
resolution: "@babel/plugin-transform-typescript@npm:7.22.5"
dependencies:
"@babel/helper-annotate-as-pure": ^7.22.5
"@babel/helper-create-class-features-plugin": ^7.22.5
"@babel/helper-plugin-utils": ^7.22.5
"@babel/plugin-syntax-typescript": ^7.22.5
peerDependencies:
"@babel/core": ^7.0.0-0
checksum: d12f1ca1ef1f2a54432eb044d2999705d1205ebe211c2a7f05b12e8eb2d2a461fd7657b5486b2f2f1efe7c0c0dc8e80725b767073d40fe4ae059a7af057b05e4
languageName: node
linkType: hard
"@babel/plugin-transform-unicode-escapes@npm:^7.18.10":
version: 7.22.5
resolution: "@babel/plugin-transform-unicode-escapes@npm:7.22.5"
@ -2691,6 +2744,19 @@ __metadata:
languageName: node
linkType: hard
"@babel/preset-typescript@npm:^7.17.12":
version: 7.21.0
resolution: "@babel/preset-typescript@npm:7.21.0"
dependencies:
"@babel/helper-plugin-utils": ^7.20.2
"@babel/helper-validator-option": ^7.21.0
"@babel/plugin-transform-typescript": ^7.21.0
peerDependencies:
"@babel/core": ^7.0.0-0
checksum: 6e1f4d7294de2678fbaf36035e98847b2be432f40fe7a1204e5e45b8b05bcbe22902fe0d726e16af14de5bc08987fae28a7899871503fd661050d85f58755af6
languageName: node
linkType: hard
"@babel/register@npm:^7.13.16":
version: 7.18.9
resolution: "@babel/register@npm:7.18.9"
@ -3386,6 +3452,15 @@ __metadata:
languageName: node
linkType: hard
"@egjs/hammerjs@npm:^2.0.17":
version: 2.0.17
resolution: "@egjs/hammerjs@npm:2.0.17"
dependencies:
"@types/hammerjs": ^2.0.36
checksum: 8945137cec5837edd70af3f2e0ea621543eb0aa3b667e6269ec6485350f4d120c2434b37c7c30b1cf42a65275dd61c1f24626749c616696d3956ac0c008c4766
languageName: node
linkType: hard
"@electron/get@npm:^1.14.1":
version: 1.14.1
resolution: "@electron/get@npm:1.14.1"
@ -4403,12 +4478,15 @@ __metadata:
react-native-action-button: 2.8.5
react-native-camera: 4.2.1
react-native-dialogbox: 0.6.10
react-native-document-picker: 8.2.1
react-native-document-picker: 8.2.0
react-native-draggable-flatlist: 4.0.1
react-native-drawer-layout: 3.2.0
react-native-dropdownalert: 4.5.1
react-native-exit-app: 1.1.0
react-native-file-viewer: 2.1.5
react-native-fingerprint-scanner: 6.0.0
react-native-fs: 2.20.0
react-native-gesture-handler: 2.12.0
react-native-get-random-values: 1.9.0
react-native-image-picker: 5.4.2
react-native-image-resizer: 1.4.5
@ -5942,6 +6020,15 @@ __metadata:
languageName: node
linkType: hard
"@nicolo-ribaudo/semver-v6@npm:^6.3.3":
version: 6.3.3
resolution: "@nicolo-ribaudo/semver-v6@npm:6.3.3"
bin:
semver: bin/semver.js
checksum: 8290855b1591477d2298364541fda64fafd4acc110b387067a71c9b05f4105c0a4ac079857ae9cd107c42ee884e8724a406b5116f069575e02d7ab87a35a5272
languageName: node
linkType: hard
"@nodelib/fs.scandir@npm:2.1.5":
version: 2.1.5
resolution: "@nodelib/fs.scandir@npm:2.1.5"
@ -7369,6 +7456,13 @@ __metadata:
languageName: node
linkType: hard
"@types/hammerjs@npm:^2.0.36":
version: 2.0.41
resolution: "@types/hammerjs@npm:2.0.41"
checksum: d16fbd688fc9b18cc270abe8dea8d4c50ef7bd8375e593d92c233d299387933a6b003c8db69819344833052458bc5f9ef1b472001277a49f095928d184356006
languageName: node
linkType: hard
"@types/hoist-non-react-statics@npm:*, @types/hoist-non-react-statics@npm:^3.3.0, @types/hoist-non-react-statics@npm:^3.3.1":
version: 3.3.1
resolution: "@types/hoist-non-react-statics@npm:3.3.1"
@ -27918,9 +28012,9 @@ __metadata:
languageName: node
linkType: hard
"react-native-document-picker@npm:8.2.1":
version: 8.2.1
resolution: "react-native-document-picker@npm:8.2.1"
"react-native-document-picker@npm:8.2.0":
version: 8.2.0
resolution: "react-native-document-picker@npm:8.2.0"
dependencies:
invariant: ^2.2.4
peerDependencies:
@ -27930,7 +28024,34 @@ __metadata:
peerDependenciesMeta:
react-native-windows:
optional: true
checksum: 575d3bec391044fdaf8d4d740a115a0b3e5cbafdb893ce19157b0c5fefb052c208b9db6d352e171d358c723612e47fe67cda4634a60d3a245a30ff103b1cb84c
checksum: a33beddf8c90b6eb9314e2b880cdb27a7e4e1bcf47191786132df43568c09b9e5402a7405c470fa03ddcfab2c0b58c9b536ef50e65a56dadf24e7202c5220834
languageName: node
linkType: hard
"react-native-draggable-flatlist@npm:4.0.1":
version: 4.0.1
resolution: "react-native-draggable-flatlist@npm:4.0.1"
dependencies:
"@babel/preset-typescript": ^7.17.12
peerDependencies:
react-native: ">=0.64.0"
react-native-gesture-handler: ">=2.0.0"
react-native-reanimated: ">=2.8.0"
checksum: f904e3f30737a883b683e12e119856188e81d7b6cd8811e38124353630391326385bec040a3c200a06535bcd4bbbe973e504c2e0546f7aa4cc96aa573787813d
languageName: node
linkType: hard
"react-native-drawer-layout@npm:3.2.0":
version: 3.2.0
resolution: "react-native-drawer-layout@npm:3.2.0"
dependencies:
use-latest-callback: ^0.1.5
peerDependencies:
react: "*"
react-native: "*"
react-native-gesture-handler: ">= 1.0.0"
react-native-reanimated: ">= 1.0.0"
checksum: 67237e650e1245297ec08b9cf90c74aed25dfefbf66c972dae6be5913df78d98f04c5e90e98e396e8ea2b97eca8df0db1872a7608509e29f86491b5d3db36b3a
languageName: node
linkType: hard
@ -27984,6 +28105,22 @@ __metadata:
languageName: node
linkType: hard
"react-native-gesture-handler@npm:2.12.0":
version: 2.12.0
resolution: "react-native-gesture-handler@npm:2.12.0"
dependencies:
"@egjs/hammerjs": ^2.0.17
hoist-non-react-statics: ^3.3.0
invariant: ^2.2.4
lodash: ^4.17.21
prop-types: ^15.7.2
peerDependencies:
react: "*"
react-native: "*"
checksum: 5147357b3212e269d0b8003e1be9e0993d0770f4880f1a8f52d2d61512c4569c48ec7b866d0a9ee44038785c29e0f84fbb99fd18a8e09552a25910c71602d788
languageName: node
linkType: hard
"react-native-get-random-values@npm:1.9.0":
version: 1.9.0
resolution: "react-native-get-random-values@npm:1.9.0"