diff --git a/package-lock.json b/package-lock.json index 4e6e1ae6..2388898a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -60,6 +60,7 @@ "react-native-modal-datetime-picker": "^10.2.0", "react-native-onesignal": "^3.9.0", "react-native-paper": "^2.16.0", + "react-native-permissions": "^3.0.5", "react-native-phone-call": "^1.0.9", "react-native-popup-dialog": "^0.18.3", "react-native-progress": "^3.6.0", @@ -11118,6 +11119,21 @@ "react-native-vector-icons": "*" } }, + "node_modules/react-native-permissions": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-3.1.0.tgz", + "integrity": "sha512-Y/kAU8cUTNhX5CLxfAG96ItEjjmwvyqnVBie38Gj8HoomXQcKM+ToFmq/rPt+DOziCq7YFKinn9AIlnLBiV3AQ==", + "peerDependencies": { + "react": ">=16.13.1", + "react-native": ">=0.63.3", + "react-native-windows": ">=0.62.0" + }, + "peerDependenciesMeta": { + "react-native-windows": { + "optional": true + } + } + }, "node_modules/react-native-phone-call": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/react-native-phone-call/-/react-native-phone-call-1.0.9.tgz", @@ -23373,6 +23389,12 @@ "react-native-safe-area-view": "^0.12.0" } }, + "react-native-permissions": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-3.1.0.tgz", + "integrity": "sha512-Y/kAU8cUTNhX5CLxfAG96ItEjjmwvyqnVBie38Gj8HoomXQcKM+ToFmq/rPt+DOziCq7YFKinn9AIlnLBiV3AQ==", + "requires": {} + }, "react-native-phone-call": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/react-native-phone-call/-/react-native-phone-call-1.0.9.tgz", diff --git a/package.json b/package.json index 7d823ff3..8bcec548 100755 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ "react-native-modal-datetime-picker": "^10.2.0", "react-native-onesignal": "^3.9.0", "react-native-paper": "^2.16.0", + "react-native-permissions": "^3.0.5", "react-native-phone-call": "^1.0.9", "react-native-popup-dialog": "^0.18.3", "react-native-progress": "^3.6.0", diff --git a/redux/insurance/insurance.actions.js b/redux/insurance/insurance.actions.js index e468baab..5c3c0134 100644 --- a/redux/insurance/insurance.actions.js +++ b/redux/insurance/insurance.actions.js @@ -9,6 +9,8 @@ import InsuranceActions from './insurance.type'; import { getInsuranceListUrl, getInsurancePrimeAmountUrl, + getUserByIdQRCodeUrl, + getUserByNameOrNumberUrl, subscribeInsuranceUrl, uploadInsuranceImagetUrl } from "../../webservice/IlinkConstants"; @@ -221,3 +223,61 @@ export const fetchAddBeneficiaryToSubscription = (id, data) => { onError: fetchAddBeneficiaryToSubscriptionError, }); }; + +/************************************************************/ +export const fetchGetUserByIdQRCodePending = () => ({ + type: InsuranceActions.GET_USER_BY_ID_QR_CODE_PENDING, +}); + +export const fetchGetUserByIdQRCodeReset = () => ({ + type: InsuranceActions.GET_USER_BY_ID_QR_CODE_RESET, +}); + +export const fetchGetUserByIdQRCodeSuccess = (authkey: any) => ({ + type: InsuranceActions.GET_USER_BY_ID_QR_CODE_SUCCESS, + payload: authkey, +}); + +export const fetchGetUserByIdQRCodeError = (error: any) => ({ + type: InsuranceActions.GET_USER_BY_ID_QR_CODE_ERROR, + payload: error, +}); + +export const fetchGetUserByIdQRCode = (network_id, id) => { + return ApiAction({ + url: `${getUserByIdQRCodeUrl}?network_id=${network_id}&${id}`, + method: 'GET', + onLoading: fetchGetUserByIdQRCodePending, + onSuccess: fetchGetUserByIdQRCodeSuccess, + onError: fetchGetUserByIdQRCodeError, + }); +}; + +/************************************************************/ +export const fetchGetUserByNameOrNumberPending = () => ({ + type: InsuranceActions.GET_USER_BY_NAME_OR_NUMBER_PENDING, +}); + +export const fetchGetUserByNameOrNumberReset = () => ({ + type: InsuranceActions.GET_USER_BY_NAME_OR_NUMBER_RESET, +}); + +export const fetchGetUserByNameOrNumberSuccess = (authkey: any) => ({ + type: InsuranceActions.GET_USER_BY_NAME_OR_NUMBER_SUCCESS, + payload: authkey, +}); + +export const fetchGetUserByNameOrNumberError = (error: any) => ({ + type: InsuranceActions.GET_USER_BY_NAME_OR_NUMBER_ERROR, + payload: error, +}); + +export const fetchGetUserByNameOrNumber = (network_id, id) => { + return ApiAction({ + url: `${getUserByNameOrNumberUrl}?network_id=${network_id}&${id}`, + method: 'GET', + onLoading: fetchGetUserByNameOrNumberPending, + onSuccess: fetchGetUserByNameOrNumberSuccess, + onError: fetchGetUserByNameOrNumberError, + }); +}; diff --git a/redux/insurance/insurance.reducer.js b/redux/insurance/insurance.reducer.js index 4b6a4aa1..4545dac3 100644 --- a/redux/insurance/insurance.reducer.js +++ b/redux/insurance/insurance.reducer.js @@ -227,3 +227,63 @@ export const addBeneficiaryToSubscriptionReducer = (state = INITIAL_STATE, actio } }; + +export const getUserByIdQRCodeReducer = (state = INITIAL_STATE, action: InsuranceActions) => { + switch (action.type) { + case InsuranceActions.GET_USER_BY_ID_QR_CODE_PENDING: + return { + ...state, + loading: true + } + case InsuranceActions.GET_USER_BY_ID_QR_CODE_SUCCESS: + return { + loading: false, + result: action.payload, + error: null + } + case InsuranceActions.GET_USER_BY_ID_QR_CODE_ERROR: + return { + ...state, + loading: false, + result: null, + error: action.payload + } + + case InsuranceActions.GET_USER_BY_ID_QR_CODE_RESET: + return INITIAL_STATE; + + default: + return state + + } +}; + +export const getUserByNameOrNumberReducer = (state = INITIAL_STATE, action: InsuranceActions) => { + switch (action.type) { + case InsuranceActions.GET_USER_BY_NAME_OR_NUMBER_PENDING: + return { + ...state, + loading: true + } + case InsuranceActions.GET_USER_BY_NAME_OR_NUMBER_SUCCESS: + return { + loading: false, + result: action.payload, + error: null + } + case InsuranceActions.GET_USER_BY_NAME_OR_NUMBER_ERROR: + return { + ...state, + loading: false, + result: null, + error: action.payload + } + + case InsuranceActions.GET_USER_BY_NAME_OR_NUMBER_RESET: + return INITIAL_STATE; + + default: + return state + + } +}; diff --git a/redux/insurance/insurance.selector.js b/redux/insurance/insurance.selector.js index 1f5b8365..8ae80bf9 100644 --- a/redux/insurance/insurance.selector.js +++ b/redux/insurance/insurance.selector.js @@ -14,6 +14,8 @@ const selectUploadInsuranceImagesReducerReducer = (state) => state.uploadInsuran const selectGetSubscriptionListReducerReducer = (state) => state.subscriptionList; const selectActivatePaySubscriptionReducer = (state) => state.activatePaySubscription; const selectAddBeneficiaryToSubscriptionReducer = (state) => state.addBeneficiaryToSubscription; +const selectGetUserByIdQRCodeReducer = (state) => state.getUserByIdQRCodeReducer; +const selectGetUserByNameOrNumberReducer = (state) => state.getUserByNameOrNumberReducer; export const selectInsuranceList = createSelector( [selectInsuranceListReducer], @@ -49,3 +51,12 @@ export const selectActivatePaySubscription = createSelector( [selectActivatePaySubscriptionReducer], (activatePaySubscription) => activatePaySubscription ); + +export const selectGetUserByIdQRCode = createSelector( + [selectGetUserByIdQRCodeReducer], + (getUserByIdQRCode) => getUserByIdQRCode +); +export const selectGetUserByNameOrNumber = createSelector( + [selectGetUserByNameOrNumberReducer], + (getUserByNameOrNumber) => getUserByNameOrNumber +); diff --git a/redux/insurance/insurance.type.js b/redux/insurance/insurance.type.js index 925f6e80..ec88f6da 100644 --- a/redux/insurance/insurance.type.js +++ b/redux/insurance/insurance.type.js @@ -41,6 +41,16 @@ const InsuranceActions = { ADD_BENEFICIARY_TO_SUBSCRIPTION_ERROR: 'ADD_BENEFICIARY_TO_SUBSCRIPTION_ERROR', ADD_BENEFICIARY_TO_SUBSCRIPTION_RESET: 'ADD_BENEFICIARY_TO_SUBSCRIPTION_RESET', + GET_USER_BY_ID_QR_CODE_PENDING: 'GET_USER_BY_ID_QR_CODE_PENDING', + GET_USER_BY_ID_QR_CODE_SUCCESS: 'GET_USER_BY_ID_QR_CODE_SUCCESS', + GET_USER_BY_ID_QR_CODE_ERROR: 'GET_USER_BY_ID_QR_CODE_ERROR', + GET_USER_BY_ID_QR_CODE_RESET: 'GET_USER_BY_ID_QR_CODE_RESET', + + GET_USER_BY_NAME_OR_NUMBER_PENDING: 'GET_USER_BY_NAME_OR_NUMBER_PENDING', + GET_USER_BY_NAME_OR_NUMBER_SUCCESS: 'GET_USER_BY_NAME_OR_NUMBER_SUCCESS', + GET_USER_BY_NAME_OR_NUMBER_ERROR: 'GET_USER_BY_NAME_OR_NUMBER_ERROR', + GET_USER_BY_NAME_OR_NUMBER_RESET: 'GET_USER_BY_NAME_OR_NUMBER_RESET', + } export default InsuranceActions; diff --git a/redux/reducers/index.js b/redux/reducers/index.js index f7e12ecc..25855f55 100755 --- a/redux/reducers/index.js +++ b/redux/reducers/index.js @@ -55,6 +55,8 @@ import { addBeneficiaryToSubscriptionReducer, getInsurancePrimeAmountReducer, getSubscriptionListReducer, + getUserByIdQRCodeReducer, + getUserByNameOrNumberReducer, insuranceListReducer, subscribeInsuranceReducer, uploadInsuranceImagesReducer @@ -151,7 +153,9 @@ const rootReducer = persistCombineReducers(persistConfig, { uploadInsuranceImagesReducer: uploadInsuranceImagesReducer, subscriptionList: getSubscriptionListReducer, activatePaySubscription: activatePaySubscriptionReducer, - addBeneficiaryToSubscription: addBeneficiaryToSubscriptionReducer + addBeneficiaryToSubscription: addBeneficiaryToSubscriptionReducer, + getUserByIdQRCodeReducer: getUserByIdQRCodeReducer, + getUserByNameOrNumberReducer: getUserByNameOrNumberReducer, }); export default rootReducer; diff --git a/screens/wallet/WalletDetail.js b/screens/wallet/WalletDetail.js index e7b87926..f86aa8cc 100755 --- a/screens/wallet/WalletDetail.js +++ b/screens/wallet/WalletDetail.js @@ -1336,7 +1336,44 @@ class WalletDetail extends Component { {I18n.t('TRANSACTIONS')} + {(wallet.type === "ilink_sante") && + + + { + this.props.navigation.push(route.walletOptionSelect, { + optionSelect: optionNanoSanteAgentScreen, + wallet, + lottie: { + source: require("./../../datas/json/cedit-cards.json"), + loop: true + }, + isNanoSanteAgent: true + }); + }} + activeOpacity={0.9}> + + + + + + + {I18n.t('NANO_SANTE')} + + + + + + + + } + + {(wallet.type === "ilink-world" || wallet.type === "ilink") && @@ -1436,7 +1473,7 @@ class WalletDetail extends Component { - + } {isIlinkWorldWallet(wallet.type) && <> @@ -1481,37 +1518,6 @@ class WalletDetail extends Component { - - { - this.props.navigation.push(route.walletOptionSelect, { - optionSelect: optionNanoSanteAgentScreen, - wallet, - lottie: { - source: require("./../../datas/json/cedit-cards.json"), - loop: true - }, - isNanoSanteAgent: true - }); - }} - activeOpacity={0.9}> - - - - - - - {I18n.t('NANO_SANTE')} - - - - - - diff --git a/screens/wallet/agent/SaisirFeuilleSoinScreen.js b/screens/wallet/agent/SaisirFeuilleSoinScreen.js index 4ab1cef5..48853b1b 100644 --- a/screens/wallet/agent/SaisirFeuilleSoinScreen.js +++ b/screens/wallet/agent/SaisirFeuilleSoinScreen.js @@ -8,7 +8,9 @@ import React, {useEffect, useRef, useState} from 'react'; import { ActivityIndicator, + Alert, Dimensions, + FlatList, Keyboard, KeyboardAvoidingView, Platform, @@ -30,13 +32,24 @@ import { fetchActivePaySubscription, fetchActivePaySubscriptionReset, fetchGetSubscriptionList, - fetchGetSubscriptionListReset + fetchGetSubscriptionListReset, + fetchGetUserByIdQRCode, + fetchGetUserByIdQRCodeReset, + fetchGetUserByNameOrNumber, + fetchGetUserByNameOrNumberReset } from "../../../redux/insurance/insurance.actions"; import DropdownAlert from "react-native-dropdownalert"; import {readUser} from "../../../webservice/AuthApi"; import TextInput from "../../../components/TextInput"; import {createStructuredSelector} from "reselect"; -import {selectActivatePaySubscription, selectSubscriptionList} from "../../../redux/insurance/insurance.selector"; +import { + selectActivatePaySubscription, + selectGetUserByIdQRCode, + selectGetUserByIdQRCodeReducer, + selectGetUserByNameOrNumber, + selectGetUserByNameOrNumberReducer, + selectSubscriptionList +} from "../../../redux/insurance/insurance.selector"; import StepHeader from "../../../components/StepHeaderComponent"; import Wizard from "react-native-wizard"; import Icon from "react-native-vector-icons/FontAwesome5"; @@ -49,6 +62,8 @@ import Modal from "react-native-modal"; import DateTimePicker from "@react-native-community/datetimepicker"; import QRCodeScanner from "react-native-qrcode-scanner"; import {RNCamera} from "react-native-camera"; +import * as Utils from "../../../utils/UtilsFunction"; +import {store} from "../../../redux/store"; let moment = require('moment-timezone'); @@ -211,6 +226,10 @@ const SaisirFeuilleSoinScreen = ({ fetchGetSubscriptionList, subscriptionList, fetchActivePaySubscription, + fetchGetUserByIdQRCode, + fetchGetUserByNameOrNumber, + getUserByNameOrNumber, + getUserByIdQRCode, navigation }) => { @@ -222,6 +241,11 @@ const SaisirFeuilleSoinScreen = ({ const [showQRCodeScanner, setShowQRCodeScanner] = useState(false); const [showDateAccidentPicker, setShowDateAccidentPicker] = useState(false); + const [wallet] = useState(store.getState().walletDetailReducer.result.response); + + const [isNumeroAssureSearch, setIsNumeroAssureSearch] = useState(true); + const [isNomAssureSearch, setIsNomAssureSearch] = useState(false); + const [dateDebutGrossesse, setDateDebutGrossesse] = useState(null); const [dateFinGrossesse, setDateFinGrossesse] = useState(null); const [isGrossesse, setIsGrossesse] = useState(false); @@ -229,12 +253,14 @@ const SaisirFeuilleSoinScreen = ({ const [showDateFinGrossessePicker, setShowDateFinGrossessePicker] = useState(false); const [user, setUser] = useState(null); + const [assure, setAssure] = useState(null); const wizard = useRef(); const [isFirstStep, setIsFirstStep] = useState(true); const [isLastStep, setIsLastStep] = useState(false); const [currentStep, setCurrentStep] = useState(1); const [modalPrestation, setModalPrestation] = useState(false); const [modalPrescription, setModalPrescription] = useState(false); + const [modalListAssure, setModalListAssure] = useState(false); const [statutPatientOption] = useState([ {label: I18n.t('AYANT_DROITS'), value: "M"}, @@ -270,14 +296,43 @@ const SaisirFeuilleSoinScreen = ({ }); dispatch(fetchGetSubscriptionListReset()); dispatch(fetchActivePaySubscriptionReset()); + dispatch(fetchGetUserByNameOrNumberReset()); + dispatch(fetchGetUserByIdQRCodeReset()); }, []); useEffect(() => { if (user !== null) { - console.log("user", user.id); + console.log("user", user); } }, [user]); + useEffect(() => { + console.log("getUserByNameOrNumber.result", getUserByNameOrNumber); + if (getUserByNameOrNumber.result !== null) { + if (getUserByNameOrNumber.result.response.length > 0) { + setModalListAssure(true); + //wizard.current.next(); + } else { + dropDownAlertRef.alertWithType( + 'warn', + I18n.t('EMPTY_LIST'), + I18n.t('NO_ASSURE_MATCH_SEARCH'), + ); + //dispatch(fetchGetUserByNameOrNumberReset()); + } + + } + + if (getUserByNameOrNumber.error) { + dropDownAlertRef.alertWithType( + 'error', + I18n.t('ERROR_LABEL'), + Utils.getErrorMsg(getUserByNameOrNumber), + ); + dispatch(fetchGetUserByNameOrNumberReset()); + } + }, [getUserByNameOrNumber]); + console.log("Date accident", dateAccident); const SaisirFeuilleSoinSchema = Yup.object().shape({ @@ -366,8 +421,6 @@ const SaisirFeuilleSoinScreen = ({ const renderDialogQRCodeScanner = () => { - const {resultSearchUserByName, errorGetAvisImposition} = this.props; - console.log("resultGetAvisImposition", resultSearchUserByName); return ( @@ -699,6 +752,80 @@ const SaisirFeuilleSoinScreen = ({ ); + const renderListAssure = () => ( + + + { + setModalListAssure(false); + }} + swipeDirection={['down']} + style={styles.bottomModal}> + + + + + + {I18n.t('LIST_ASSURE')} + + index} + renderItem={({item, index}) => { + return ( + { + if (item.state !== 'PAID') { + Alert.alert(I18n.t('ERROR_LABEL'), I18n.t('ASSURE_NON_EN_REGLE'), + [{ + text: I18n.t('OK'), onPress: () => { + } + }]); + } else { + setAssure(item); + setModalListAssure(false); + setFieldValue( + 'lastname_patient', + item.user.lastname, + ); + setFieldValue( + 'firstname_patient', + item.user.firstname, + ); + dispatch(fetchGetUserByNameOrNumberReset()); + wizard.current.next(); + } + }}> + + {`${item.user.firstname} ${item.user.lastname}`} + + + ) + }}/> + + + + + + + + ) + const { handleChange, handleSubmit, @@ -725,15 +852,24 @@ const SaisirFeuilleSoinScreen = ({ }); const onNext = () => { + console.log("currentStep", currentStep); + console.log("values", values); switch (currentStep) { - case 1: - return ( - errors.numero_assure - ); + case 0: + if (values.numero_assure !== '') { + if (getUserByNameOrNumber.result === null) { + if (isNumeroAssureSearch) + fetchGetUserByNameOrNumber(wallet.id_network, `&phone=${values.numero_assure}`); + else + fetchGetUserByNameOrNumber(wallet.id_network, `&name=${values.numero_assure}`) + console.log("errors", errors); + } + } + return false; break; default: - return false; + return true; } }; @@ -744,7 +880,7 @@ const SaisirFeuilleSoinScreen = ({ } @@ -769,10 +905,11 @@ const SaisirFeuilleSoinScreen = ({ }}> { + setIsNumeroAssureSearch(!isNumeroAssureSearch); }} /> { handleSubmit(e); - wizard.current.next(); + if (onNext()) + wizard.current.next(); }}> - {subscriptionList.loading ? + {(subscriptionList.loading || getUserByNameOrNumber.loading || getUserByIdQRCode.loading) ? : @@ -1188,12 +1327,16 @@ const SaisirFeuilleSoinScreen = ({ const mapStateToProps = createStructuredSelector({ subscriptionList: selectSubscriptionList, - activatePaySubscription: selectActivatePaySubscription + activatePaySubscription: selectActivatePaySubscription, + getUserByNameOrNumber: selectGetUserByNameOrNumber, + getUserByIdQRCode: selectGetUserByIdQRCode, }); export default connect(mapStateToProps, { fetchActivePaySubscription, fetchGetSubscriptionList, + fetchGetUserByIdQRCode, + fetchGetUserByNameOrNumber })( SaisirFeuilleSoinScreen, ); diff --git a/utils/i18n/fr.json b/utils/i18n/fr.json index 3f2715ff..a144c672 100755 --- a/utils/i18n/fr.json +++ b/utils/i18n/fr.json @@ -640,5 +640,12 @@ "EXONERE": "Exonéré", "DATE_ACCIDENT": "Date accident", "DATE_DEBUT_GROSSESSE": "Date début de grossesse", - "DATE_FIN_GROSSESSE": "Date fin de grossesse" + "DATE_FIN_GROSSESSE": "Date fin de grossesse", + "SCAN": "Scanner", + "BRING_YOUR_CAMERA_CLOSER_TO_SCAN_QR_CODE": "Approchez votre caméra du QR Code afin de le scanner", + "CLOSE": "Fermer", + "EMPTY_LIST": "Liste vide", + "NO_ASSURE_MATCH_SEARCH": "Aucun assuré ne correspond à la recherche", + "LIST_ASSURE": "Liste des assurés", + "ASSURE_NON_EN_REGLE": "Assuré non en règle" } diff --git a/webservice/IlinkConstants.js b/webservice/IlinkConstants.js index 4fb26693..949f801b 100755 --- a/webservice/IlinkConstants.js +++ b/webservice/IlinkConstants.js @@ -82,6 +82,8 @@ export const linkBankAccountUrl = testBaseUrl + '/walletService/wallets/users/li export const payBillUrl = testBaseUrl + '/walletService/transactions/ilink'; export const getInsuranceListUrl = testBaseUrl + '/nanoSanteService/insurances'; +export const getUserByIdQRCodeUrl = testBaseUrl + '/nanoSanteService/qrcode/read'; +export const getUserByNameOrNumberUrl = testBaseUrl + '/nanoSanteService/insured'; export const subscribeInsuranceUrl = testBaseUrl + '/nanoSanteService/insurances/subscriptions'; export const getInsurancePrimeAmountUrl = testBaseUrl + '/nanoSanteService/insurances/subscriptions/bonus-amount'; export const uploadInsuranceImagetUrl = 'https://test.ilink-app.com:8086/insurances/subscriptions/upload-images'; diff --git a/yarn.lock b/yarn.lock index c3ff5c56..31383226 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7191,6 +7191,11 @@ "resolved" "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-2.2.2.tgz" "version" "2.2.2" +"react-native-permissions@^3.0.5": + "integrity" "sha512-Y/kAU8cUTNhX5CLxfAG96ItEjjmwvyqnVBie38Gj8HoomXQcKM+ToFmq/rPt+DOziCq7YFKinn9AIlnLBiV3AQ==" + "resolved" "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-3.1.0.tgz" + "version" "3.1.0" + "react-native-phone-call@^1.0.9": "integrity" "sha512-OPWYg8qeWNG/U4bWGMAKcQTH/ifqJnsvUPCH4lOkvWFHbQS3fbH5M8rFhXCzcfS0GVNzHhZX9ZByMM368TFAUQ==" "resolved" "https://registry.npmjs.org/react-native-phone-call/-/react-native-phone-call-1.0.9.tgz" @@ -7405,7 +7410,7 @@ "resolved" "https://registry.npmjs.org/react-native-wizard/-/react-native-wizard-2.1.0.tgz" "version" "2.1.0" -"react-native@*", "react-native@^0.0.0-0 || ^0.60.6 || ^0.61.5 || ^0.62.2 || ^0.63.2 || ^0.64.0 || ^0.65.0 || ^0.66.0 || 1000.0.0", "react-native@^0.41.2", "react-native@^0.56.0", "react-native@^0.57.8", "react-native@^0.61.0", "react-native@>= 0.51", "react-native@>=0.11", "react-native@>=0.40.0", "react-native@>=0.44", "react-native@>=0.44.1", "react-native@>=0.45.0", "react-native@>=0.46", "react-native@>=0.47.0", "react-native@>=0.50.0", "react-native@>=0.57", "react-native@>=0.59", "react-native@>=0.60.0", "react-native@>=0.65.1", "react-native@0.61.5": +"react-native@*", "react-native@^0.0.0-0 || ^0.60.6 || ^0.61.5 || ^0.62.2 || ^0.63.2 || ^0.64.0 || ^0.65.0 || ^0.66.0 || 1000.0.0", "react-native@^0.41.2", "react-native@^0.56.0", "react-native@^0.57.8", "react-native@^0.61.0", "react-native@>= 0.51", "react-native@>=0.11", "react-native@>=0.40.0", "react-native@>=0.44", "react-native@>=0.44.1", "react-native@>=0.45.0", "react-native@>=0.46", "react-native@>=0.47.0", "react-native@>=0.50.0", "react-native@>=0.57", "react-native@>=0.59", "react-native@>=0.60.0", "react-native@>=0.63.3", "react-native@>=0.65.1", "react-native@0.61.5": "integrity" "sha512-MXqE3NoGO0T3dUKIKkIppijBhRRMpfN6ANbhMXHDuyfA+fSilRWgCwYgR/YNCC7ntECoJYikKaNTUBB0DeQy6Q==" "resolved" "https://registry.npmjs.org/react-native/-/react-native-0.61.5.tgz" "version" "0.61.5" @@ -7553,7 +7558,7 @@ "raf" "^3.1.0" "tween-functions" "^1.0.1" -"react@*", "react@^0.14.0 || ^15.0.0 || ^16.0.0", "react@^15.3.0 || ^16.0.0", "react@^16.0", "react@^16.0.0", "react@^16.8", "react@^16.8.3", "react@>= 16.0 || < 17.0", "react@>=15.3.1", "react@>=15.3.1 || >=16.0.0-beta.5", "react@>=16.3.0", "react@>=16.8.0", "react@>=16.8.6", "react@16.7.0", "react@16.9.0": +"react@*", "react@^0.14.0 || ^15.0.0 || ^16.0.0", "react@^15.3.0 || ^16.0.0", "react@^16.0", "react@^16.0.0", "react@^16.8", "react@^16.8.3", "react@>= 16.0 || < 17.0", "react@>=15.3.1", "react@>=15.3.1 || >=16.0.0-beta.5", "react@>=16.13.1", "react@>=16.3.0", "react@>=16.8.0", "react@>=16.8.6", "react@16.7.0", "react@16.9.0": "integrity" "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==" "resolved" "https://registry.npmjs.org/react/-/react-16.9.0.tgz" "version" "16.9.0"