weechatRN

Weechat relay client for iOS using websockets https://github.com/mhoran/weechatRN
git clone http://git.hanabi.in/repos/weechatRN.git
Log | Files | Refs | README | LICENSE

commit 1f37c0583063ac892e0024dc222b7d5253b5ad79
parent 22b4b85f1daf22286ab74079ee77c8eadc4be23a
Author: Matthew Horan <matt@matthoran.com>
Date:   Sun, 27 Sep 2020 13:56:54 -0400

Tweak tsconfig.json and address some errors

Diffstat:
Mjest.config.js | 5++++-
Mpackage.json | 5+++--
Msrc/lib/helpers/parse-text-args.ts | 31+++++++++++++++++++------------
Msrc/lib/weechat/color-formatter.tsx | 30+++++++++++++++++-------------
Msrc/lib/weechat/colors.ts | 12++++++------
Msrc/usecase/App.tsx | 107++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/usecase/ConnectionGate.tsx | 9+++++----
Msrc/usecase/buffers/ui/Buffer.tsx | 7++++---
Msrc/usecase/buffers/ui/BufferContainer.tsx | 36++++++++++++++++++++++--------------
Msrc/usecase/buffers/ui/BufferLine.tsx | 3++-
Msrc/usecase/buffers/ui/BufferListItem.tsx | 6+++---
Msrc/usecase/buffers/ui/themes/Default.tsx | 6+++---
Msrc/usecase/login/LoginForm.tsx | 28++++++++++++++--------------
Mtsconfig.json | 19+++++++++++++++----
Myarn.lock | 32+++++++++++++++++++++++++-------
15 files changed, 196 insertions(+), 140 deletions(-)

diff --git a/jest.config.js b/jest.config.js @@ -15,7 +15,10 @@ module.exports = { ], globals: { 'ts-jest': { - babelConfig: true + babelConfig: true, + tsConfig: { + strict: false + } } } } diff --git a/package.json b/package.json @@ -9,7 +9,6 @@ "lint": "eslint . --ext .ts --ext .tsx" }, "dependencies": { - "@types/lodash": "^4.14.106", "date-fns": "^1.29.0", "expo": "^39.0.0", "expo-notifications": "~0.7.2", @@ -18,7 +17,7 @@ "react": "16.13.1", "react-native": "https://github.com/expo/react-native/archive/sdk-39.0.0.tar.gz", "react-native-drawer-layout-polyfill": "^2.0.0", - "react-native-parsed-text": "^0.0.21", + "react-native-parsed-text": "^0.0.22", "react-redux": "^7.2.0", "redux": "^4.0.5", "redux-persist": "^5.9.1", @@ -27,8 +26,10 @@ "devDependencies": { "@babel/core": "^7.2.2", "@types/jest": "^25.2.1", + "@types/lodash": "^4.14.106", "@types/react": "~16.9.35", "@types/react-native": "~0.63.2", + "@types/react-redux": "^7.1.9", "@typescript-eslint/eslint-plugin": "^4.2.0", "@typescript-eslint/parser": "^4.2.0", "babel-jest": "^25.3.0", diff --git a/src/lib/helpers/parse-text-args.ts b/src/lib/helpers/parse-text-args.ts @@ -1,4 +1,11 @@ -export const getParseArgs = (style, onPress, onLongPress) => { +import { TextStyle } from 'react-native'; +import { ParseShape } from 'react-native-parsed-text'; + +export const getParseArgs = ( + style: TextStyle, + onPress: (type: string, text: string) => void, + onLongPress: (type: string, text: string) => void +): ParseShape[] => { const baseObj = { style }; @@ -6,27 +13,27 @@ export const getParseArgs = (style, onPress, onLongPress) => { return [ { ...baseObj, - onPress: arg => onPress("url", arg), - onLongPress: arg => onLongPress("url", arg), - type: "url" + onPress: (arg) => onPress('url', arg), + onLongPress: (arg) => onLongPress('url', arg), + type: 'url' }, { ...baseObj, - onPress: arg => onPress("channel", arg), - onLongPress: arg => onLongPress("channel", arg), + onPress: (arg) => onPress('channel', arg), + onLongPress: (arg) => onLongPress('channel', arg), pattern: /#(\w+)/ }, { ...baseObj, - onPress: arg => onPress("phone", arg), - onLongPress: arg => onLongPress("phone", arg), - type: "phone" + onPress: (arg) => onPress('phone', arg), + onLongPress: (arg) => onLongPress('phone', arg), + type: 'phone' }, { ...baseObj, - onPress: arg => onPress("email", arg), - onLongPress: arg => onLongPress("email", arg), - type: "email" + onPress: (arg) => onPress('email', arg), + onLongPress: (arg) => onLongPress('email', arg), + type: 'email' } ]; }; diff --git a/src/lib/weechat/color-formatter.tsx b/src/lib/weechat/color-formatter.tsx @@ -1,7 +1,7 @@ -import { TextStyle, TextProperties } from "react-native"; +import { TextStyle, TextProperties } from 'react-native'; -import { WeeChatProtocol } from "./parser"; -import { ceb, cwb, cob, cef, cwf, cof } from "./colors"; +import { WeeChatProtocol } from './parser'; +import { ceb, cwb, cob, cef, cwf, cof } from './colors'; type AttributedStringNode = { attrs: { @@ -15,25 +15,29 @@ type AttributedStringNode = { type WeechatColorAttribute = { name: string; - type: "option" | "weechat" | "ext"; + type: 'option' | 'weechat' | 'ext'; }; -const getBgColor = (colorAttr: WeechatColorAttribute): TextStyle => { - if (colorAttr.type === "ext") { +const getBgColor = ( + colorAttr: WeechatColorAttribute +): TextStyle | undefined => { + if (colorAttr.type === 'ext') { return { backgroundColor: ceb[colorAttr.name] }; - } else if (colorAttr.type === "weechat") { + } else if (colorAttr.type === 'weechat') { return { backgroundColor: cwb[colorAttr.name] }; - } else if (colorAttr.type === "option") { + } else if (colorAttr.type === 'option') { return cob[colorAttr.name]; } }; -const getFgColor = (colorAttr: WeechatColorAttribute): TextStyle => { - if (colorAttr.type === "ext") { +const getFgColor = ( + colorAttr: WeechatColorAttribute +): TextStyle | undefined => { + if (colorAttr.type === 'ext') { return { color: cef[colorAttr.name] }; - } else if (colorAttr.type === "weechat") { + } else if (colorAttr.type === 'weechat') { return { color: cwf[colorAttr.name] }; - } else if (colorAttr.type === "option") { + } else if (colorAttr.type === 'option') { return cof[colorAttr.name]; } }; @@ -43,7 +47,7 @@ export const renderWeechatFormat = (input: string): TextProperties[] => { input ) as AttributedStringNode[]; - return formattedNode.map(node => ({ + return formattedNode.map((node) => ({ children: node.text, style: [getBgColor(node.bgColor), getFgColor(node.fgColor)] })); diff --git a/src/lib/weechat/colors.ts b/src/lib/weechat/colors.ts @@ -3,7 +3,7 @@ /****************************/ /* style options, foreground */ -export const cof = { +export const cof: Record<string, Record<string, string>> = { separator: { color: "#68b5d4" }, chat: { color: "#d9d9d9" }, chat_time: { color: "#f7f7f7" }, @@ -46,7 +46,7 @@ export const cof = { }; /* style options, background */ -export const cob = { +export const cob: Record<string, Record<string, string>> = { separator: {}, chat: {}, chat_time: { color: "#999" }, @@ -85,7 +85,7 @@ export const cob = { }; /* WeeChat colors, foreground */ -export const cwf = { +export const cwf: Record<string, string> = { default: "#d9d9d9", black: "#000000", darkgray: "#5d5d5d", @@ -106,7 +106,7 @@ export const cwf = { }; /* WeeChat colors, background */ -export const cwb = { +export const cwb: Record<string, string> = { default: "transparent", black: "#000000", darkgray: "#5d5d5d", @@ -127,7 +127,7 @@ export const cwb = { }; /* extended colors, foreground */ -export const cef = { +export const cef: Record<string, string> = { "0": "#000000" /* 000 Black */, "1": "#c0656e" /* 001 DarkRed */, "2": "#00cd00" /* 002 DarkGreen */, @@ -386,7 +386,7 @@ export const cef = { "255": "#eeeeee" /* 255 Grey93 */ }; /* extended colors, background */ -export const ceb = { +export const ceb: Record<string, string> = { "0": "#000000" /* 000 Black */, "1": "#c0656e" /* 001 DarkRed */, "2": "#00cd00" /* 002 DarkGreen */, diff --git a/src/usecase/App.tsx b/src/usecase/App.tsx @@ -1,4 +1,4 @@ -import * as React from "react"; +import * as React from 'react'; import { SafeAreaView, View, @@ -9,28 +9,43 @@ import { Keyboard, Dimensions, Platform -} from "react-native"; -import { connect } from "react-redux"; -import * as _ from "lodash"; +} from 'react-native'; +import { connect, ConnectedProps } from 'react-redux'; +import * as _ from 'lodash'; import DrawerLayout from 'react-native-drawer-layout-polyfill'; -import BufferContainer from "./buffers/ui/BufferContainer"; -import BufferList from "./buffers/ui/BufferList"; -import { StoreState } from "../store"; -import { registerForPushNotificationsAsync } from "../lib/helpers/push-notifications" +import BufferContainer from './buffers/ui/BufferContainer'; +import BufferList from './buffers/ui/BufferList'; +import { StoreState } from '../store'; +import { registerForPushNotificationsAsync } from '../lib/helpers/push-notifications'; -interface Props { - buffers: { [key: string]: WeechatBuffer }; - currentBufferId: string | null; - currentBuffer: WeechatBuffer | null; - hasHighlights: boolean; +const connector = connect((state: StoreState) => { + const currentBufferId = state.app.currentBufferId; + const currentBuffer = + (currentBufferId && state.buffers[currentBufferId]) || null; + + const numHighlights = _.values(state.hotlists).reduce( + (sum, hlist) => sum + hlist.highlight, + 0 + ); + + return { + buffers: state.buffers, + currentBufferId: currentBuffer && currentBufferId, + currentBuffer, + hasHighlights: numHighlights > 0 + }; +}); + +type PropsFromRedux = ConnectedProps<typeof connector>; + +type Props = PropsFromRedux & { disconnect: () => void; fetchBufferInfo: (bufferId: string) => void; sendMessageToBuffer: (fullBufferName: string, message: string) => void; clearHotlistForBuffer: (fullBufferName: string) => void; - dispatch: (any) => void; -} +}; interface State { showTopic: boolean; @@ -50,11 +65,11 @@ class App extends React.Component<Props, State> { const smallerAxisSize = Math.min(height, width); const isLandscape = width > height; const isTablet = smallerAxisSize >= 600; - const appBarHeight = Platform.OS === 'ios' ? isLandscape ? 32 : 44 : 56; + const appBarHeight = Platform.OS === 'ios' ? (isLandscape ? 32 : 44) : 56; const maxWidth = isTablet ? 320 : 280; return Math.min(smallerAxisSize - appBarHeight, maxWidth); - } + }; state: State = { showTopic: false, @@ -67,7 +82,7 @@ class App extends React.Component<Props, State> { this.drawer.closeDrawer(); if (currentBufferId !== buffer.id) { this.props.dispatch({ - type: "CHANGE_CURRENT_BUFFER", + type: 'CHANGE_CURRENT_BUFFER', bufferId: buffer.id }); this.props.clearHotlistForBuffer(buffer.full_name); @@ -76,7 +91,7 @@ class App extends React.Component<Props, State> { }; toggleShowTopic = () => { - this.setState(state => ({ + this.setState((state) => ({ showTopic: !state.showTopic })); }; @@ -96,7 +111,7 @@ class App extends React.Component<Props, State> { if (this.state.drawerWidth !== this.drawerWidth()) { this.setState({ drawerWidth: this.drawerWidth() }); } - } + }; componentDidMount() { Dimensions.addEventListener('change', this.updateWidth); @@ -134,7 +149,7 @@ class App extends React.Component<Props, State> { const sidebar = () => ( <BufferList - buffers={_.orderBy(_.values(buffers), ["number"])} + buffers={_.orderBy(_.values(buffers), ['number'])} currentBufferId={currentBufferId} onSelectBuffer={this.changeCurrentBuffer} /> @@ -143,11 +158,12 @@ class App extends React.Component<Props, State> { return ( <View style={styles.container}> <DrawerLayout - ref={ d => (this.drawer = d) } + ref={(d: DrawerLayout) => (this.drawer = d)} renderNavigationView={sidebar} keyboardDismissMode={'on-drag'} drawerWidth={drawerWidth} - useNativeAnimations={true}> + useNativeAnimations={true} + > <SafeAreaView style={styles.container}> <View style={styles.topbar}> <View style={styles.channels}> @@ -159,7 +175,7 @@ class App extends React.Component<Props, State> { style={[ styles.channelsButtonText, hasHighlights && { - color: "#ffcf7f" + color: '#ffcf7f' } ]} > @@ -177,7 +193,7 @@ class App extends React.Component<Props, State> { style={styles.channelsButton} onPress={this.props.disconnect} > - <Image source={require("./icons/eject.png")} /> + <Image source={require('./icons/eject.png')} /> </TouchableOpacity> </View> </View> @@ -194,29 +210,14 @@ class App extends React.Component<Props, State> { } } -export default connect((state: StoreState) => { - const currentBufferId = state.app.currentBufferId; - const currentBuffer = currentBufferId && state.buffers[currentBufferId]; - - const numHighlights = _.values(state.hotlists).reduce( - (sum, hlist) => sum + hlist.highlight, - 0 - ); - - return { - buffers: state.buffers, - currentBufferId: currentBuffer && currentBufferId, - currentBuffer, - hasHighlights: numHighlights > 0 - }; -})(App); +export default connector(App); const styles = StyleSheet.create({ topbar: { - flexDirection: "row", - backgroundColor: "#333", - justifyContent: "space-between", - alignItems: "center", + flexDirection: 'row', + backgroundColor: '#333', + justifyContent: 'space-between', + alignItems: 'center', paddingBottom: 10 }, channels: { @@ -228,20 +229,20 @@ const styles = StyleSheet.create({ width: 40 }, channelsButtonText: { - textAlign: "center", + textAlign: 'center', fontSize: 20, - fontFamily: "Gill Sans", - color: "#eee", - fontWeight: "bold" + fontFamily: 'Gill Sans', + color: '#eee', + fontWeight: 'bold' }, topbarText: { - color: "#eee", - fontFamily: "Thonburi", - fontWeight: "bold", + color: '#eee', + fontFamily: 'Thonburi', + fontWeight: 'bold', fontSize: 15 }, container: { flex: 1, - backgroundColor: "#333" + backgroundColor: '#333' } }); diff --git a/src/usecase/ConnectionGate.tsx b/src/usecase/ConnectionGate.tsx @@ -1,12 +1,13 @@ -import * as React from "react"; -import { connect } from "react-redux"; -import LoginForm from "./login/LoginForm"; -import { StoreState } from "../store"; +import * as React from 'react'; +import { connect } from 'react-redux'; +import LoginForm from './login/LoginForm'; +import { StoreState } from '../store'; interface Props { connecting: boolean; connected: boolean; onConnect: (hostname: string, password: string, ssl: boolean) => void; + children: React.ReactNode; } class ConnectionGate extends React.Component<Props> { diff --git a/src/usecase/buffers/ui/Buffer.tsx b/src/usecase/buffers/ui/Buffer.tsx @@ -1,17 +1,18 @@ import * as React from 'react'; import { FlatList, ListRenderItem } from 'react-native'; -import * as _ from 'lodash'; import BufferLine from './BufferLine'; +import { ParseShape } from 'react-native-parsed-text'; interface Props { lines: WeechatLine[]; onLongPress: () => void; - parseArgs: any; + parseArgs: ParseShape[]; bufferId: string; } -const keyExtractor = (line: WeechatLine) => _.last(line.pointers); +const keyExtractor = (line: WeechatLine) => + line.pointers[line.pointers.length - 1]; export default class Buffer extends React.PureComponent<Props> { renderBuffer: ListRenderItem<WeechatLine> = ({ item }) => { diff --git a/src/usecase/buffers/ui/BufferContainer.tsx b/src/usecase/buffers/ui/BufferContainer.tsx @@ -11,7 +11,7 @@ import { LayoutAnimation } from 'react-native'; -import { connect } from 'react-redux'; +import { connect, ConnectedProps } from 'react-redux'; import ParsedText from 'react-native-parsed-text'; import Buffer from './Buffer'; @@ -21,14 +21,21 @@ import { renderWeechatFormat } from '../../../lib/weechat/color-formatter'; import { StoreState } from '../../../store'; import UndoTextInput from './UndoTextInput'; -interface Props { +const connector = connect( + (state: StoreState, { bufferId }: { bufferId: string | null }) => ({ + lines: (bufferId && state.lines[bufferId]) || [], + nicklist: (bufferId && state.nicklists[bufferId]) || [] + }) +); + +type PropsFromRedux = ConnectedProps<typeof connector>; + +type Props = PropsFromRedux & { buffer: WeechatBuffer | null; - lines: WeechatLine[]; - nicklist: WeechatNicklist[]; - bufferId: string; + bufferId: string | null; showTopic: boolean; sendMessage: (message: string) => void; -} +}; interface State { showTabButton: boolean; @@ -47,7 +54,7 @@ class BufferContainer extends React.Component<Props, State> { }; tabCompleteInProgress = false; - tabCompleteMatches: WeechatNicklist[]; + tabCompleteMatches: WeechatNicklist[] = []; tabCompleteIndex = 0; tabCompleteWordStart = 0; tabCompleteWordEnd = 0; @@ -72,7 +79,7 @@ class BufferContainer extends React.Component<Props, State> { }); } - handleOnLongPress(type, text) { + handleOnLongPress(type: string, text: string) { ActionSheetIOS.showShareActionSheetWithOptions( { url: formatUrl(type, text), @@ -83,7 +90,7 @@ class BufferContainer extends React.Component<Props, State> { ); } - handleOnPress(type, text) { + handleOnPress(type: string, text: string) { console.log(type, text); if (type === 'channel') { // this.props.dispatch(changeCurrentBuffer(text)); @@ -149,7 +156,11 @@ class BufferContainer extends React.Component<Props, State> { this.tabCompleteInProgress = true; }; - handleSelectionChange = ({ nativeEvent: { selection } }) => { + handleSelectionChange = ({ + nativeEvent: { selection } + }: { + nativeEvent: { selection: { start: number; end: number } }; + }) => { this.setState({ selection }); }; @@ -209,10 +220,7 @@ class BufferContainer extends React.Component<Props, State> { } } -export default connect((state: StoreState, { bufferId }: Props) => ({ - lines: state.lines[bufferId] || [], - nicklist: state.nicklists[bufferId] || [] -}))(BufferContainer); +export default connector(BufferContainer); const styles = StyleSheet.create({ topbar: { diff --git a/src/usecase/buffers/ui/BufferLine.tsx b/src/usecase/buffers/ui/BufferLine.tsx @@ -1,11 +1,12 @@ import * as React from 'react'; +import { ParseShape } from 'react-native-parsed-text'; import Default from './themes/Default'; interface Props { line: WeechatLine; onLongPress: (line: WeechatLine) => void; - parseArgs: any; + parseArgs: ParseShape[]; } export default class BufferLine extends React.PureComponent<Props> { diff --git a/src/usecase/buffers/ui/BufferListItem.tsx b/src/usecase/buffers/ui/BufferListItem.tsx @@ -10,12 +10,12 @@ import { interface Props { buffer: WeechatBuffer; hotlist: Hotlist; - currentBufferId: string; + currentBufferId: string | null; onSelectBuffer: (b: WeechatBuffer) => void; } export default class BufferListItem extends React.Component<Props> { - getBufferViewStyleFromProps = (): TextStyle => { + getBufferViewStyleFromProps = (): TextStyle | null => { const { currentBufferId, buffer, hotlist } = this.props; if (currentBufferId === buffer.id) { @@ -29,7 +29,7 @@ export default class BufferListItem extends React.Component<Props> { } }; - getBufferTextStyleFromProps = (): TextStyle => { + getBufferTextStyleFromProps = (): TextStyle | null => { const { currentBufferId, buffer, hotlist } = this.props; if (currentBufferId === buffer.id) { diff --git a/src/usecase/buffers/ui/themes/Default.tsx b/src/usecase/buffers/ui/themes/Default.tsx @@ -1,14 +1,14 @@ import * as React from 'react'; import { StyleSheet, Text, TouchableHighlight, View } from 'react-native'; -import ParsedText from 'react-native-parsed-text'; +import ParsedText, { ParseShape } from 'react-native-parsed-text'; import { renderWeechatFormat } from '../../../../lib/weechat/color-formatter'; import { formatDate } from '../../../../lib/helpers/date-formatter'; interface Props { line: WeechatLine; - onLongPress: (WeechatLine) => void; - parseArgs: any; + onLongPress: (line: WeechatLine) => void; + parseArgs: ParseShape[]; } export default class BufferLine extends React.Component<Props> { diff --git a/src/usecase/login/LoginForm.tsx b/src/usecase/login/LoginForm.tsx @@ -10,18 +10,23 @@ import { StatusBar, TouchableOpacity } from 'react-native'; -import { connect } from 'react-redux'; +import { connect, ConnectedProps } from 'react-redux'; import { StoreState } from '../../store'; -interface Props { +const connector = connect((state: StoreState) => ({ + hostname: state.connection.hostname || '', + password: state.connection.password || '', + ssl: state.connection.ssl, + filterBuffers: state.connection.filterBuffers +})); + +type PropsFromRedux = ConnectedProps<typeof connector>; + +type Props = PropsFromRedux & { onConnect: (hostname: string, password: string, ssl: boolean) => void; connecting: boolean; - hostname: string; - password: string; - ssl: boolean; - filterBuffers: boolean; - dispatch: (any) => void; -} +}; + interface State { hostname: string; password: string; @@ -133,12 +138,7 @@ class LoginForm extends React.Component<Props, State> { } } -export default connect((state: StoreState) => ({ - hostname: state.connection.hostname, - password: state.connection.password, - ssl: state.connection.ssl, - filterBuffers: state.connection.filterBuffers -}))(LoginForm); +export default connector(LoginForm); const styles = StyleSheet.create({ container: { diff --git a/tsconfig.json b/tsconfig.json @@ -1,10 +1,21 @@ { "compilerOptions": { - "target": "es2015", + "allowJs": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "isolatedModules": true, "jsx": "react", - "noEmit": true, + "lib": ["es6"], "moduleResolution": "node", - "importHelpers": true + "noEmit": true, + "strict": true, + "target": "esnext", + "skipLibCheck": true }, - "exclude": ["node_modules"] + "exclude": [ + "node_modules", + "babel.config.js", + "metro.config.js", + "jest.config.js" + ] } diff --git a/yarn.lock b/yarn.lock @@ -2215,6 +2215,14 @@ dependencies: "@types/node" "*" +"@types/hoist-non-react-statics@^3.3.0": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -2280,6 +2288,16 @@ dependencies: "@types/react" "*" +"@types/react-redux@^7.1.9": + version "7.1.9" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.9.tgz#280c13565c9f13ceb727ec21e767abe0e9b4aec3" + integrity sha512-mpC0jqxhP4mhmOl3P4ipRsgTgbNofMRXJb08Ms6gekViLj61v1hOZEKWDCyWsdONr6EjEA6ZHXC446wdywDe0w== + dependencies: + "@types/hoist-non-react-statics" "^3.3.0" + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + redux "^4.0.0" + "@types/react@*": version "16.9.34" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.34.tgz#f7d5e331c468f53affed17a8a4d488cd44ea9349" @@ -7689,7 +7707,7 @@ prompts@^2.0.1, prompts@^2.2.1: kleur "^3.0.3" sisteransi "^1.0.4" -prop-types@^15.5.10, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.7.x: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -7765,12 +7783,12 @@ react-native-drawer-layout@2.0.0, "react-native-drawer-layout@https://github.com version "2.0.0" resolved "https://github.com/mhoran/react-native-drawer-layout#91a2476383751c56019d6ac3f61fb1d16606ae65" -react-native-parsed-text@^0.0.21: - version "0.0.21" - resolved "https://registry.yarnpkg.com/react-native-parsed-text/-/react-native-parsed-text-0.0.21.tgz#86cf233aedc7a848b801b674c81d6b5ee37162df" - integrity sha512-0oqnn7/2TxkQW+6z7MN8SrPdEldDlDYScCK4QfHRsCmzllZFeBfdGNdYaIkSX35JWN++SSq7VBfHR74pUDmb2A== +react-native-parsed-text@^0.0.22: + version "0.0.22" + resolved "https://registry.yarnpkg.com/react-native-parsed-text/-/react-native-parsed-text-0.0.22.tgz#a23c756eaa5d6724296814755085127f9072e5f5" + integrity sha512-hfD83RDXZf9Fvth3DowR7j65fMnlqM9PpxZBGWkzVcUTFtqe6/yPcIoIAgrJbKn6YmtzkivmhWE2MCE4JKBXrQ== dependencies: - prop-types "^15.5.10" + prop-types "^15.7.x" react-native-safe-area-context@3.1.4: version "3.1.4" @@ -7901,7 +7919,7 @@ redux-thunk@^2.2.0: resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== -redux@^4.0.5: +redux@^4.0.0, redux@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==