diff --git a/.eslintignore b/.eslintignore index 5e4ff0d20c..d581bd7799 100644 --- a/.eslintignore +++ b/.eslintignore @@ -920,6 +920,15 @@ packages/app-mobile/components/NoteEditor/types.js.map packages/app-mobile/components/SelectDateTimeDialog.d.ts packages/app-mobile/components/SelectDateTimeDialog.js packages/app-mobile/components/SelectDateTimeDialog.js.map +packages/app-mobile/components/SideMenu.d.ts +packages/app-mobile/components/SideMenu.js +packages/app-mobile/components/SideMenu.js.map +packages/app-mobile/components/getResponsiveValue.d.ts +packages/app-mobile/components/getResponsiveValue.js +packages/app-mobile/components/getResponsiveValue.js.map +packages/app-mobile/components/getResponsiveValue.test.d.ts +packages/app-mobile/components/getResponsiveValue.test.js +packages/app-mobile/components/getResponsiveValue.test.js.map packages/app-mobile/components/screens/ConfigScreen.d.ts packages/app-mobile/components/screens/ConfigScreen.js packages/app-mobile/components/screens/ConfigScreen.js.map diff --git a/.gitignore b/.gitignore index c05c36ff66..d1f4bac226 100644 --- a/.gitignore +++ b/.gitignore @@ -909,6 +909,15 @@ packages/app-mobile/components/NoteEditor/types.js.map packages/app-mobile/components/SelectDateTimeDialog.d.ts packages/app-mobile/components/SelectDateTimeDialog.js packages/app-mobile/components/SelectDateTimeDialog.js.map +packages/app-mobile/components/SideMenu.d.ts +packages/app-mobile/components/SideMenu.js +packages/app-mobile/components/SideMenu.js.map +packages/app-mobile/components/getResponsiveValue.d.ts +packages/app-mobile/components/getResponsiveValue.js +packages/app-mobile/components/getResponsiveValue.js.map +packages/app-mobile/components/getResponsiveValue.test.d.ts +packages/app-mobile/components/getResponsiveValue.test.js +packages/app-mobile/components/getResponsiveValue.test.js.map packages/app-mobile/components/screens/ConfigScreen.d.ts packages/app-mobile/components/screens/ConfigScreen.js packages/app-mobile/components/screens/ConfigScreen.js.map @@ -2206,3 +2215,6 @@ packages/tools/website/utils/types.d.ts packages/tools/website/utils/types.js packages/tools/website/utils/types.js.map # AUTO-GENERATED - EXCLUDED TYPESCRIPT BUILD +packages/app-mobile/components/get-responsive-value.test.js +packages/app-mobile/components/get-responsive-value.test.js +packages/app-mobile/components/get-responsive-value.test.js diff --git a/package.json b/package.json index 24600df11a..c8d241f8e3 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,7 @@ "typescript": "4.0.5" }, "dependencies": { + "@types/fs-extra": "^9.0.13", "http-server": "^0.12.3", "node-gyp": "^8.4.1", "nodemon": "^2.0.9" diff --git a/packages/app-mobile/components/SideMenu.ts b/packages/app-mobile/components/SideMenu.ts new file mode 100644 index 0000000000..e215abac0e --- /dev/null +++ b/packages/app-mobile/components/SideMenu.ts @@ -0,0 +1,22 @@ +const { connect } = require('react-redux'); +const SideMenu_ = require('react-native-side-menu-updated').default; +import { Dimensions } from 'react-native'; +import { State } from '@joplin/lib/reducer'; + +class SideMenuComponent extends SideMenu_ { + onLayoutChange(e: any) { + const { width, height } = e.nativeEvent.layout; + const openMenuOffsetPercentage = this.props.openMenuOffset / Dimensions.get('window').width; + const openMenuOffset = width * openMenuOffsetPercentage; + const hiddenMenuOffset = width * this.state.hiddenMenuOffsetPercentage; + this.setState({ width, height, openMenuOffset, hiddenMenuOffset }); + } +} + +const SideMenu = connect((state: State) => { + return { + isOpen: state.showSideMenu, + }; +})(SideMenuComponent); + +export default SideMenu; diff --git a/packages/app-mobile/components/getResponsiveValue.test.ts b/packages/app-mobile/components/getResponsiveValue.test.ts new file mode 100644 index 0000000000..4cdf9d6347 --- /dev/null +++ b/packages/app-mobile/components/getResponsiveValue.test.ts @@ -0,0 +1,63 @@ +import getResponsiveValue, { ValueMap } from './getResponsiveValue'; +import { Dimensions } from 'react-native'; + +type testCase = [ ValueMap, number[] ]; + +const testCases: testCase[] = [ + // [ valueMap, outputs ] + [{ sm: 40 }, [40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40]], + [{ sm: 40, md: 70 }, [40, 40, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70]], + [{ sm: 40, md: 70, lg: 90 }, [40, 40, 70, 70, 70, 90, 90, 90, 90, 90, 90, 90, 90]], + [{ sm: 40, md: 70, lg: 90, xl: 110 }, [40, 40, 70, 70, 70, 90, 90, 90, 110, 110, 110, 110, 110]], + [{ sm: 40, md: 70, lg: 90, xl: 110, xxl: 130 }, [40, 40, 70, 70, 70, 90, 90, 90, 110, 110, 110, 130, 130]], + [{ md: 70 }, [70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70]], + [{ lg: 90 }, [90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90]], + [{ xl: 110 }, [110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110]], + [{ xxl: 130 }, [130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130]], + [{ sm: 10, lg: 50 }, [10, 10, 10, 10, 10, 50, 50, 50, 50, 50, 50, 50, 50]], + [{ sm: 10, xl: 50 }, [10, 10, 10, 10, 10, 10, 10, 10, 50, 50, 50, 50, 50]], + [{ sm: 10, xxl: 50 }, [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 50, 50]], + [{ md: 30, lg: 50 }, [30, 30, 30, 30, 30, 50, 50, 50, 50, 50, 50, 50, 50]], + [{ md: 30, xl: 50 }, [30, 30, 30, 30, 30, 30, 30, 30, 50, 50, 50, 50, 50]], + [{ md: 30, xxl: 50 }, [30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 50, 50]], + [{ xl: 30, xxl: 50 }, [30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 50, 50]], +]; + +describe('getResponsiveValue', () => { + + test('Should throw exception if value map is an empty object', () => { + const input = {}; + expect(() => getResponsiveValue(input)).toThrow('valueMap cannot be an empty object!'); + }); + + test('Should return correct values', () => { + const mockReturnValues = [ + { width: 400 }, + { width: 480 }, + { width: 481 }, + { width: 600 }, + { width: 768 }, + { width: 769 }, + { width: 900 }, + { width: 1024 }, + { width: 1025 }, + { width: 1115 }, + { width: 1200 }, + { width: 1201 }, + { width: 1300 }, + ]; + + for (let i = 0; i < testCases.length; i++) { + const input = testCases[i][0]; + + for (let j = 0; j < mockReturnValues.length; j++) { + // Mock the device width values returned by Dimensions.get() using 'mockReturnValues' for better test coverage + Dimensions.get = jest.fn().mockReturnValue(mockReturnValues[j]); + const output: number = testCases[i][1][j]; + expect(getResponsiveValue(input)).toBe(output); + } + + } + }); + +}); diff --git a/packages/app-mobile/components/getResponsiveValue.ts b/packages/app-mobile/components/getResponsiveValue.ts new file mode 100644 index 0000000000..55b77bee08 --- /dev/null +++ b/packages/app-mobile/components/getResponsiveValue.ts @@ -0,0 +1,60 @@ +// getResponsiveValue() returns the corresponding value for +// a particular device screen width based on a valueMap argument +// and breakpoints. +// +// Breakpoints: +// sm: < 481px +// md: >= 481px +// lg: >= 769px +// xl: >= 1025px +// xxl: >= 1201px +// +// Eg. [ 10, 15, 20, 25, 30 ] means { sm: 10, md: 15, lg: 20, xl: 25, xxl: 30 } +// [10] and [10, 15] are equivalent to { sm: 10 } and { sm: 10, md: 15 } respectively +// +// More Info: https://discourse.joplinapp.org/t/week-4-report/26117 +import { Dimensions } from 'react-native'; + +export interface ValueMap { + // Value to use on small-width displays + sm?: number; + // Value to use on medium-width displays + md?: number; + // Value to use on large-width displays + lg?: number; + // Value to use on extra-large width displays + xl?: number; + // Value to use on extra-extra-large width displays + xxl?: number; +} + +export default function getResponsiveValue(valueMap: ValueMap): number { + if (Object.keys(valueMap).length === 0) { + throw 'valueMap cannot be an empty object!'; + } + + const width = Dimensions.get('window').width; + let value: number; + const { sm, md, lg, xl, xxl } = valueMap; + + // This handles cases where certain values are omitted + value = sm ?? md ?? lg ?? xl ?? xxl; + + if (width >= 481) { + value = md ?? value; + } + + if (width >= 769) { + value = lg ?? value; + } + + if (width >= 1025) { + value = xl ?? value; + } + + if (width >= 1201) { + value = xxl ?? value; + } + + return value; +} diff --git a/packages/app-mobile/components/side-menu.js b/packages/app-mobile/components/side-menu.js deleted file mode 100644 index b30ee1d522..0000000000 --- a/packages/app-mobile/components/side-menu.js +++ /dev/null @@ -1,12 +0,0 @@ -const { connect } = require('react-redux'); -const SideMenu_ = require('react-native-side-menu').default; - -class SideMenuComponent extends SideMenu_ {} - -const MySideMenu = connect(state => { - return { - isOpen: state.showSideMenu, - }; -})(SideMenuComponent); - -module.exports = { SideMenu: MySideMenu }; diff --git a/packages/app-mobile/jest.config.js b/packages/app-mobile/jest.config.js index 91b910b523..ba1e91f68e 100644 --- a/packages/app-mobile/jest.config.js +++ b/packages/app-mobile/jest.config.js @@ -1,17 +1,19 @@ -// Test configuration -// See https://jestjs.io/docs/configuration#testenvironment-string +module.exports = { + preset: 'react-native', -const config = { - preset: 'ts-jest', - - // File extensions for imports, in order of precedence: - // prefer importing from .ts or .tsx to importing from .js - // files. - moduleFileExtensions: [ + 'moduleFileExtensions': [ 'ts', 'tsx', 'js', ], -}; -module.exports = config; + 'transform': { + '\\.(ts|tsx)$': 'ts-jest', + }, + + testMatch: ['**/*.test.(ts|tsx)'], + + testPathIgnorePatterns: ['/node_modules/'], + + slowTestThreshold: 40, +}; diff --git a/packages/app-mobile/package.json b/packages/app-mobile/package.json index 92576f480a..ec92e68e52 100644 --- a/packages/app-mobile/package.json +++ b/packages/app-mobile/package.json @@ -9,11 +9,11 @@ "android": "react-native run-android", "build": "gulp build", "tsc": "tsc --project tsconfig.json", - "test": "jest", - "test-ci": "yarn test", "watch": "tsc --watch --preserveWatchOutput --project tsconfig.json", "clean": "node tools/clean.js", "buildInjectedJs": "gulp buildInjectedJs", + "test": "jest", + "test-ci": "yarn test", "watchInjectedJs": "gulp watchInjectedJs", "postinstall": "jetify && yarn run build" }, @@ -55,7 +55,7 @@ "react-native-rsa-native": "^2.0.4", "react-native-securerandom": "^1.0.0-rc.0", "react-native-share": "^7.2.1", - "react-native-side-menu": "^1.1.3", + "react-native-side-menu-updated": "^1.3.2", "react-native-sqlite-storage": "^5.0.0", "react-native-url-polyfill": "^1.3.0", "react-native-vector-icons": "^7.1.0", @@ -96,7 +96,7 @@ "fs-extra": "^8.1.0", "gulp": "^4.0.2", "jest": "^28.1.1", - "jest-environment-jsdom": "^28.1.1", + "jest-environment-jsdom": "^28.1.3", "jetifier": "^1.6.5", "jsdom": "^20.0.0", "metro-react-native-babel-preset": "^0.66.2", diff --git a/packages/app-mobile/root.tsx b/packages/app-mobile/root.tsx index cfac4ed4db..128802be8a 100644 --- a/packages/app-mobile/root.tsx +++ b/packages/app-mobile/root.tsx @@ -28,7 +28,8 @@ import SyncTargetJoplinServer from '@joplin/lib/SyncTargetJoplinServer'; import SyncTargetJoplinCloud from '@joplin/lib/SyncTargetJoplinCloud'; import SyncTargetOneDrive from '@joplin/lib/SyncTargetOneDrive'; const VersionInfo = require('react-native-version-info').default; -const { AppState, Keyboard, NativeModules, BackHandler, Animated, View, StatusBar, Linking, Platform } = require('react-native'); +const { AppState, Keyboard, NativeModules, BackHandler, Animated, View, StatusBar, Linking, Platform, Dimensions } = require('react-native'); +import getResponsiveValue from './components/getResponsiveValue'; import NetInfo from '@react-native-community/netinfo'; const DropdownAlert = require('react-native-dropdownalert').default; const AlarmServiceDriver = require('./services/AlarmServiceDriver').default; @@ -64,7 +65,7 @@ const { OneDriveLoginScreen } = require('./components/screens/onedrive-login.js' import EncryptionConfigScreen from './components/screens/encryption-config'; const { DropboxLoginScreen } = require('./components/screens/dropbox-login.js'); const { MenuContext } = require('react-native-popup-menu'); -const { SideMenu } = require('./components/side-menu.js'); +import SideMenu from './components/SideMenu'; const { SideMenuContent } = require('./components/side-menu-content.js'); const { SideMenuContentNote } = require('./components/side-menu-content-note.js'); const { DatabaseDriverReactNative } = require('./utils/database-driver-react-native'); @@ -684,6 +685,7 @@ class AppComponent extends React.Component { this.state = { sideMenuContentOpacity: new Animated.Value(0), + sideMenuWidth: this.getSideMenuWidth(), }; this.lastSyncStarted_ = defaultState.syncStarted; @@ -701,6 +703,8 @@ class AppComponent extends React.Component { void this.handleShareData(); } }; + + this.handleScreenWidthChange_ = this.handleScreenWidthChange_.bind(this); } // 2020-10-08: It seems the initialisation code is quite fragile in general and should be kept simple. @@ -769,6 +773,7 @@ class AppComponent extends React.Component { }); AppState.addEventListener('change', this.onAppStateChange_); + this.unsubscribeScreenWidthChangeHandler_ = Dimensions.addEventListener('change', this.handleScreenWidthChange_); await this.handleShareData(); @@ -783,6 +788,12 @@ class AppComponent extends React.Component { public componentWillUnmount() { AppState.removeEventListener('change', this.onAppStateChange_); Linking.removeEventListener('url', this.handleOpenURL_); + + if (this.unsubscribeScreenWidthChangeHandler_) { + this.unsubscribeScreenWidthChangeHandler_.remove(); + this.unsubscribeScreenWidthChangeHandler_ = null; + } + if (this.unsubscribeNetInfoHandler_) this.unsubscribeNetInfoHandler_(); } @@ -828,6 +839,10 @@ class AppComponent extends React.Component { } } + private async handleScreenWidthChange_() { + this.setState({ sideMenuWidth: this.getSideMenuWidth() }); + } + public UNSAFE_componentWillReceiveProps(newProps: any) { if (newProps.syncStarted !== this.lastSyncStarted_) { if (!newProps.syncStarted) FoldersScreenUtils.refreshFolders(); @@ -843,6 +858,18 @@ class AppComponent extends React.Component { }); } + private getSideMenuWidth = () => { + const sideMenuWidth = getResponsiveValue({ + sm: 250, + md: 260, + lg: 270, + xl: 280, + xxl: 290, + }); + + return sideMenuWidth; + }; + public render() { if (this.props.appState !== 'ready') return null; const theme = themeStyle(this.props.themeId); @@ -872,6 +899,7 @@ class AppComponent extends React.Component { Config: { screen: ConfigScreen }, }; + // const statusBarStyle = theme.appearance === 'light-content'; const statusBarStyle = 'light-content'; @@ -880,6 +908,7 @@ class AppComponent extends React.Component { this.sideMenu_change(isOpen)} onSliding={(percent: number) => { diff --git a/packages/app-mobile/tsconfig.json b/packages/app-mobile/tsconfig.json index 3f1848058e..6f91f4aa32 100644 --- a/packages/app-mobile/tsconfig.json +++ b/packages/app-mobile/tsconfig.json @@ -5,12 +5,14 @@ "**/*.tsx", ], "exclude": [ + //Files that don't need transpilation "**/node_modules", - - // Files that don't need transpilation - "gulpfile.ts", - "tools/*.ts", "**/*.test.ts", "**/*.test.tsx", + "gulpfile.ts", + "tools/*.ts", ], + "compilerOptions": { + "types": ["jest", "node"] + } } diff --git a/yarn.lock b/yarn.lock index 34ca650eb7..6f513bc210 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1061,9 +1061,9 @@ __metadata: linkType: hard "@babel/compat-data@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/compat-data@npm:7.18.6" - checksum: fd73a1bd7bc29be5528d2ef78248929ed3ee72e0edb69cef6051e0aad0bf8087594db6cd9e981f0d7f5bfc274fdbb77306d8abea8ceb71e95c18afc3ebd81828 + version: 7.18.8 + resolution: "@babel/compat-data@npm:7.18.8" + checksum: 3096aafad74936477ebdd039bcf342fba84eb3100e608f3360850fb63e1efa1c66037c4824f814d62f439ab47d25164439343a6e92e9b4357024fdf571505eb9 languageName: node linkType: hard @@ -1135,6 +1135,17 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.18.7": + version: 7.18.9 + resolution: "@babel/generator@npm:7.18.9" + dependencies: + "@babel/types": ^7.18.9 + "@jridgewell/gen-mapping": ^0.3.2 + jsesc: ^2.5.1 + checksum: 1c271e0c6f33e59f7845d88a1b0b9b0dce88164e80dec9274a716efa54c260e405e9462b160843e73f45382bf5b24d8e160e0121207e480c29b30e2ed0eb16d4 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.16.0": version: 7.16.0 resolution: "@babel/helper-annotate-as-pure@npm:7.16.0" @@ -1336,8 +1347,8 @@ __metadata: linkType: hard "@babel/helper-module-transforms@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-module-transforms@npm:7.18.6" + version: 7.18.8 + resolution: "@babel/helper-module-transforms@npm:7.18.8" dependencies: "@babel/helper-environment-visitor": ^7.18.6 "@babel/helper-module-imports": ^7.18.6 @@ -1345,9 +1356,9 @@ __metadata: "@babel/helper-split-export-declaration": ^7.18.6 "@babel/helper-validator-identifier": ^7.18.6 "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.6 - "@babel/types": ^7.18.6 - checksum: 75d90be9ecd314fe2f1b668ce065d7e8b3dff82eddea88480259c5d4bd54f73a909d0998909ffe734a44ba8be85ba233359033071cc800db209d37173bd26db2 + "@babel/traverse": ^7.18.8 + "@babel/types": ^7.18.8 + checksum: 6aaf436d14495050987b9e0b30259ca58b02cc2466edd0c5d6883d92867e2cc2a311afe5815d5e10ef2511af1fb200de0e593f797b25a6d9a2bb49722bc16d95 languageName: node linkType: hard @@ -1535,12 +1546,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/parser@npm:7.18.6" +"@babel/parser@npm:^7.18.6, @babel/parser@npm:^7.18.8": + version: 7.18.8 + resolution: "@babel/parser@npm:7.18.8" bin: parser: ./bin/babel-parser.js - checksum: 533ffc26667b7e2e0d87ae11368d90b6a3a468734d6dfe9c4697c24f48373cf9cc35ee08e416728f087fc56531b68022f752097941feddc60e0223d69a4d4cad + checksum: b8426083f753a000bdb4929cb18c6ce5b68c23759245bf123515bf86cacb9f6e7ff61341a6e0d01a779a9a8a826c86062a0f4db424b88b5b51f67e121985d400 languageName: node linkType: hard @@ -2265,21 +2276,21 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.18.6, @babel/traverse@npm:^7.7.2": - version: 7.18.6 - resolution: "@babel/traverse@npm:7.18.6" +"@babel/traverse@npm:^7.18.6, @babel/traverse@npm:^7.18.8, @babel/traverse@npm:^7.7.2": + version: 7.18.8 + resolution: "@babel/traverse@npm:7.18.8" dependencies: "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.18.6 + "@babel/generator": ^7.18.7 "@babel/helper-environment-visitor": ^7.18.6 "@babel/helper-function-name": ^7.18.6 "@babel/helper-hoist-variables": ^7.18.6 "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/parser": ^7.18.6 - "@babel/types": ^7.18.6 + "@babel/parser": ^7.18.8 + "@babel/types": ^7.18.8 debug: ^4.1.0 globals: ^11.1.0 - checksum: 5427a9db63984b2600f62b257dab18e3fc057997b69d708573bfc88eb5eacd6678fb24fddba082d6ac050734b8846ce110960be841ea1e461d66e2cde72b6b07 + checksum: c406e01f45f13a666083f6e4ea32d2d5e20ce3a51ea48f6c8fe9d6a0469069f857af06866749959c4396f191393e39e7e6e7b2a8769afca7f50ca1046d6172bd languageName: node linkType: hard @@ -2293,13 +2304,23 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.18.6, @babel/types@npm:^7.18.7": - version: 7.18.7 - resolution: "@babel/types@npm:7.18.7" +"@babel/types@npm:^7.18.6, @babel/types@npm:^7.18.7, @babel/types@npm:^7.18.8": + version: 7.18.8 + resolution: "@babel/types@npm:7.18.8" dependencies: "@babel/helper-validator-identifier": ^7.18.6 to-fast-properties: ^2.0.0 - checksum: 3114ce161c4ebcb70271e168aa5af5cecedf3278209161d5ba6124bd3f9cb02e3f3ace587ad1b53f7baa153b6b3714720721c72a9ef3ec451663862f9cc1f014 + checksum: a485531faa9ff3b83ea94ba6502321dd66e39202c46d7765e4336cb4aff2ff69ebc77d97b17e21331a8eedde1f5490ce00e8a430c1041fc26854d636e6701919 + languageName: node + linkType: hard + +"@babel/types@npm:^7.18.9": + version: 7.18.9 + resolution: "@babel/types@npm:7.18.9" + dependencies: + "@babel/helper-validator-identifier": ^7.18.6 + to-fast-properties: ^2.0.0 + checksum: f0e0147267895fd8a5b82133e711ce7ce99941f3ce63647e0e3b00656a7afe48a8aa48edbae27543b701794d2b29a562a08f51f88f41df401abce7c3acc5e13a languageName: node linkType: hard @@ -4054,7 +4075,7 @@ __metadata: fs-extra: ^8.1.0 gulp: ^4.0.2 jest: ^28.1.1 - jest-environment-jsdom: ^28.1.1 + jest-environment-jsdom: ^28.1.3 jetifier: ^1.6.5 joplin-rn-alarm-notification: ^1.0.5 jsc-android: 241213.1.0 @@ -4082,7 +4103,7 @@ __metadata: react-native-rsa-native: ^2.0.4 react-native-securerandom: ^1.0.0-rc.0 react-native-share: ^7.2.1 - react-native-side-menu: ^1.1.3 + react-native-side-menu-updated: ^1.3.2 react-native-sqlite-storage: ^5.0.0 react-native-url-polyfill: ^1.3.0 react-native-vector-icons: ^7.1.0 @@ -6422,7 +6443,7 @@ __metadata: languageName: node linkType: hard -"@types/fs-extra@npm:^9.0.11, @types/fs-extra@npm:^9.0.6": +"@types/fs-extra@npm:^9.0.11, @types/fs-extra@npm:^9.0.13, @types/fs-extra@npm:^9.0.6": version: 9.0.13 resolution: "@types/fs-extra@npm:9.0.13" dependencies: @@ -6583,13 +6604,13 @@ __metadata: linkType: hard "@types/jsdom@npm:^16.2.4": - version: 16.2.14 - resolution: "@types/jsdom@npm:16.2.14" + version: 16.2.15 + resolution: "@types/jsdom@npm:16.2.15" dependencies: "@types/node": "*" - "@types/parse5": "*" + "@types/parse5": ^6.0.3 "@types/tough-cookie": "*" - checksum: 12bb926fa74ea07c0ba0bfd5bf185ac0fd771b28666a5e8784b9af4bb96bb0c51fc5f494eff7da1d3cd804e4757f640a23c344c1cd5d188f95ab0ab51770d88b + checksum: e038335321bef42ebf220aaf597e186e2eec8de6107ce7a70de1c046a84c1fbb42d454e195a20383a6870b18c7ef6fa6b73812a626f88a4a2ef1f711d2e2e13c languageName: node linkType: hard @@ -6810,7 +6831,7 @@ __metadata: languageName: node linkType: hard -"@types/parse5@npm:*": +"@types/parse5@npm:*, @types/parse5@npm:^6.0.3": version: 6.0.3 resolution: "@types/parse5@npm:6.0.3" checksum: ddb59ee4144af5dfcc508a8dcf32f37879d11e12559561e65788756b95b33e6f03ea027d88e1f5408f9b7bfb656bf630ace31a2169edf44151daaf8dd58df1b7 @@ -10412,9 +10433,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001359": - version: 1.0.30001363 - resolution: "caniuse-lite@npm:1.0.30001363" - checksum: 8dfcb2fa97724349cbbe61d988810bd90bfb40106a289ed6613188fa96dd1f5885c7e9924e46bb30a641bd1579ec34096fdc2b21b47d8500f8a2bfb0db069323 + version: 1.0.30001365 + resolution: "caniuse-lite@npm:1.0.30001365" + checksum: 5d043006e9bd9de1ae06c0e12c31997f0ed26f889f47ea6403dc2d08f46a5bd4bf0fe1a5b1099561fc447201ddf13083f277de68829e77fd238ff2af8c05e0a6 languageName: node linkType: hard @@ -14235,9 +14256,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.172": - version: 1.4.184 - resolution: "electron-to-chromium@npm:1.4.184" - checksum: 9bcbe2b2405d9907fa40fc1472074cf591027de1dc447c3f3c6a2a6fa7d4525c68d0943e66054e55f57b5b15e83c2e10521fe9c1481e4322f28ff9e5b240fd53 + version: 1.4.186 + resolution: "electron-to-chromium@npm:1.4.186" + checksum: 9f87db963070473702c0a999dc4066fdd12abff0b2b98dfae1c7492b62fe3feb42bae64ff7fd837e4e347dab043a411e82cab64ada902726b782c60bf9fc40de languageName: node linkType: hard @@ -20467,22 +20488,6 @@ __metadata: languageName: node linkType: hard -"jest-environment-jsdom@npm:^28.1.1": - version: 28.1.2 - resolution: "jest-environment-jsdom@npm:28.1.2" - dependencies: - "@jest/environment": ^28.1.2 - "@jest/fake-timers": ^28.1.2 - "@jest/types": ^28.1.1 - "@types/jsdom": ^16.2.4 - "@types/node": "*" - jest-mock: ^28.1.1 - jest-util: ^28.1.1 - jsdom: ^19.0.0 - checksum: 73388b5cde4ce4b49cdb36746211b46c416a75b070837faefd4c907fe5095b2a7b197f753e10ee110c4b8f43571ffc277b65b3ca48f01ec0fbc74525274a19fc - languageName: node - linkType: hard - "jest-environment-jsdom@npm:^28.1.3": version: 28.1.3 resolution: "jest-environment-jsdom@npm:28.1.3" @@ -21220,21 +21225,7 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:^28.0.0, jest-util@npm:^28.1.1": - version: 28.1.1 - resolution: "jest-util@npm:28.1.1" - dependencies: - "@jest/types": ^28.1.1 - "@types/node": "*" - chalk: ^4.0.0 - ci-info: ^3.2.0 - graceful-fs: ^4.2.9 - picomatch: ^2.2.3 - checksum: bca1601099d6a4c3c4ba997b8c035a698f23b9b04a0a284a427113f7d0399f7402ba9f4d73812328e6777bf952bf93dfe3d3edda6380a6ca27cdc02768d601e0 - languageName: node - linkType: hard - -"jest-util@npm:^28.1.3": +"jest-util@npm:^28.0.0, jest-util@npm:^28.1.3": version: 28.1.3 resolution: "jest-util@npm:28.1.3" dependencies: @@ -21248,6 +21239,20 @@ __metadata: languageName: node linkType: hard +"jest-util@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-util@npm:28.1.1" + dependencies: + "@jest/types": ^28.1.1 + "@types/node": "*" + chalk: ^4.0.0 + ci-info: ^3.2.0 + graceful-fs: ^4.2.9 + picomatch: ^2.2.3 + checksum: bca1601099d6a4c3c4ba997b8c035a698f23b9b04a0a284a427113f7d0399f7402ba9f4d73812328e6777bf952bf93dfe3d3edda6380a6ca27cdc02768d601e0 + languageName: node + linkType: hard + "jest-validate@npm:^26.5.2, jest-validate@npm:^26.6.2": version: 26.6.2 resolution: "jest-validate@npm:26.6.2" @@ -25162,9 +25167,9 @@ __metadata: linkType: hard "node-releases@npm:^2.0.5": - version: 2.0.5 - resolution: "node-releases@npm:2.0.5" - checksum: e85d949addd19f8827f32569d2be5751e7812ccf6cc47879d49f79b5234ff4982225e39a3929315f96370823b070640fb04d79fc0ddec8b515a969a03493a42f + version: 2.0.6 + resolution: "node-releases@npm:2.0.6" + checksum: e86a926dc9fbb3b41b4c4a89d998afdf140e20a4e8dbe6c0a807f7b2948b42ea97d7fd3ad4868041487b6e9ee98409829c6e4d84a734a4215dff060a7fbeb4bf languageName: node linkType: hard @@ -28116,12 +28121,12 @@ __metadata: languageName: node linkType: hard -"react-native-side-menu@npm:^1.1.3": - version: 1.1.3 - resolution: "react-native-side-menu@npm:1.1.3" +"react-native-side-menu-updated@npm:^1.3.2": + version: 1.3.2 + resolution: "react-native-side-menu-updated@npm:1.3.2" dependencies: prop-types: ^15.5.10 - checksum: 8064708149c964bddfef345e61c64639fd219bcd8da2d14acb3031bcd572f6951b088e1dfbbb0cf40717e117ba894e5d30eb628be629875360c1d374e1e05077 + checksum: 5d7ae7d2b372c80d9f7a3472f945daa6c11b43f00193ebec92fdb40ee853e86f522686736aa6a510a4fb09479c8eb7e4f14b53ad117d7e23749cd58c3c9d6cb7 languageName: node linkType: hard @@ -29490,6 +29495,7 @@ __metadata: resolution: "root@workspace:." dependencies: "@seiyab/eslint-plugin-react-hooks": ^4.5.1-alpha.5 + "@types/fs-extra": ^9.0.13 "@typescript-eslint/eslint-plugin": ^4.6.0 "@typescript-eslint/parser": ^4.6.0 cspell: ^5.20.0