check coverage amount okÃ

This commit is contained in:
Brice Zele 2022-02-28 10:41:54 +01:00
parent 7c73883e84
commit 38868291b8
32 changed files with 4849 additions and 1696 deletions

22
App.js
View File

@ -97,6 +97,10 @@ import DemandeAutorisationSoinScreen from "./screens/wallet/user/DemandeAutorisa
import DeleteBeneficiaryScreen from "./screens/wallet/user/DeleteBeneficiaryScreen";
import StopSubscriptionScreen from "./screens/wallet/user/StopSubscriptionScreen";
import RenewAssuranceScreen from "./screens/wallet/user/RenewAssuranceScreen";
import WebviewScreen from "./screens/WebviewScreen";
import HistoriqueNanoSanteAgentScreen from "./screens/wallet/agent/HistoriqueNanoSanteAgentScreen";
import HistoriqueNanoSanteSuperHyperScreen from "./screens/wallet/agent/HistoriqueNanoSanteSuperHyperScreen";
import PDFViewerScreen from "./screens/PdfViewerScreen";
const instructions = Platform.select({
@ -220,7 +224,9 @@ const AppStack = createDrawerNavigator({
adhererGroupNanoCredit: AdhererGroupNanoCredit,
askNanoCredit: AskNanoCredit,
refundNanoCreditUser: RefundNanoCreditUser,
casserEpargneUser: CasserEpargneUser
casserEpargneUser: CasserEpargneUser,
webviewScreen: WebviewScreen,
PDFViewerScreen: PDFViewerScreen,
})
}, {
@ -233,6 +239,7 @@ const AppAgentStack = createDrawerNavigator({
sta: createStackNavigator({
home: Home,
useraccount: UserAccount,
webviewScreen: WebviewScreen,
walletSelect: WalletSelect,
createIdentification: CreateIdentification,
validateIdentification: ValidateIdentification,
@ -292,6 +299,8 @@ const AppAgentStack = createDrawerNavigator({
envoieWalletToBankAgent: EnvoieWalletToBankAgent,
createGroupNanoCredit: CreateGroupNanoCredit,
cautionNanoCreditAgent: CautionNanoCreditAgent,
historiqueNanoSanteAgentScreen: HistoriqueNanoSanteAgentScreen,
PDFViewerScreen: PDFViewerScreen,
})
}, {
contentComponent: OptionsMenu,
@ -344,7 +353,10 @@ const AppAdministratorStack = createDrawerNavigator({
about: About,
walletDetail: WalletDetail,
walletDepot: WalletDepot,
walletRetrait: WalletRetrait
walletRetrait: WalletRetrait,
historiqueNanoSanteSuperHyperScreen: HistoriqueNanoSanteSuperHyperScreen,
webviewScreen: WebviewScreen,
PDFViewerScreen: PDFViewerScreen,
})
},
@ -392,7 +404,11 @@ const AppSuperAdministrator = createDrawerNavigator({
about: About,
walletDetail: WalletDetail,
walletDepot: WalletDepot,
walletRetrait: WalletRetrait
walletRetrait: WalletRetrait,
historiqueNanoSanteSuperHyperScreen: HistoriqueNanoSanteSuperHyperScreen,
webviewScreen: WebviewScreen,
PDFViewerScreen: PDFViewerScreen,
})
}, {

View File

@ -120,6 +120,14 @@ def jscFlavor = 'org.webkit:android-jsc:+'
def enableHermes = project.ext.react.get("enableHermes", false);
android {
packagingOptions {
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86_64/libjsc.so'
pickFirst 'lib/arm64-v8a/libjsc.so'
pickFirst 'lib/arm64-v8a/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
}
lintOptions { checkReleaseBuilds false }
compileSdkVersion rootProject.ext.compileSdkVersion

File diff suppressed because one or more lines are too long

View File

@ -72,4 +72,6 @@
"executerPrescriptionScreen": "executerPrescriptionScreen",
"modifierFeuilleSoinScreen": "modifierFeuilleSoinScreen",
"modifierExecutionPrescriptionScreen": "modifierExecutionPrescriptionScreen",
"historiqueNanoSanteAgentScreen": "historiqueNanoSanteAgentScreen",
"historiqueNanoSanteSuperHyperScreen": "historiqueNanoSanteSuperHyperScreen",
}

View File

@ -662,7 +662,7 @@
"MEDICAMENT": "Médicament",
"EXAMEN": "Examen",
"PRESTATION_SUCCESSFULLY_ADD": "Prestation ajouté avec succès",
"EXAMENS_SUCCESSFULLY_ADD": "Examens ajouté avec succès",
"EXAMENS_SUCCESSFULLY_ADD": "Examen ajouté avec succès",
"PRESCRIPTIONS_SUCCESSFULLY_ADD": "Prescription ajouté avec succès",
"PRESCRIPTIONS_SUCCESSFULLY_MODIFY": "Prescription modifié avec succès",
"YOU_MUST_ADD_AT_LEAST_ONE_PRESTATION": "Vous devez ajouter au moins une prestation",
@ -677,7 +677,7 @@
"PLEASE_SELECT_CONDITON_PRISE_CHARGE_FIRST": "Veuillez d'abord sélectionner la conditon de prise en charge",
"CONSULTATION": "Consultation",
"STATE": "Etat",
"INSTITUTE_NAME": "Nom de l'institut",
"INSTITUTE_NAME": "Nom de l'institution",
"ACCEPT": "Accepter",
"REJECT": "Rejeter",
"DETAIL": "Détail",
@ -709,5 +709,10 @@
"AGENT_VALIDEUR": "Agent valideur",
"TEXT_SUPPRESS_CONFIRM_BENEFICIARY": "Voulez vous vraiment supprimer cet ayant droit ?",
"ENTER_PASSWORD_TO_VALID_MODIFICATION": "Renseigner votre mot de passe et valider la suppression de l'ayant pour le supprimé définitivement",
"PLEASE_SELECT_AT_LEAST_ASSURE": "Veuillez sélectionner au moins un ayant droit"
"PLEASE_SELECT_AT_LEAST_ASSURE": "Veuillez sélectionner au moins un ayant droit",
"ID": "ID",
"INVOICE_ID": "ID facture",
"INVOICE": "Facture",
"HISTORY": "Historique",
"INFORMATION_MESSAGE": "Message d'information"
}

View File

@ -0,0 +1,82 @@
import React, {useEffect, useState} from 'react';
import {
LayoutAnimation,
Platform,
StyleProp,
StyleSheet,
TouchableOpacity,
UIManager,
View,
ViewStyle,
} from 'react-native';
import Text from './Text';
import Icon from './Icon';
interface AccordionItemComponentProps {
style?: StyleProp<ViewStyle> | undefined;
title: string;
description: string;
open?: boolean;
}
const AccordionItem = ({
title = '',
description = '',
open = false,
style = {},
...rest
}: AccordionItemComponentProps) => {
const [expanded, setExpanded] = useState(open);
useEffect(() => {
if (Platform.OS === 'android') {
UIManager.setLayoutAnimationEnabledExperimental(true);
}
}, []);
const toggleExpand = () => {
LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
setExpanded(!expanded);
};
const renderPackage = () => (
<View style={[styles.contain, {}, style]}>
<TouchableOpacity style={styles.packageTitleContent} onPress={toggleExpand} activeOpacity={0.9}>
<Text>
{title}
</Text>
<Icon
name={!expanded ? 'angle-down' : 'angle-up'}
size={18}
/>
</TouchableOpacity>
{expanded && (
<Text body2 grayColor style={{marginTop: 10}}>
{description}
</Text>
)}
</View>
);
return renderPackage();
};
export default AccordionItem;
const styles = StyleSheet.create({
contain: {
width: '100%',
},
packageTitleContent: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
},
containItem: {
padding: 10,
alignItems: 'center',
},
serviceContentIcon: {
flexDirection: 'column',
alignItems: 'center',
paddingTop: 20,
},
});

315
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -34,6 +34,7 @@
"react-native-action-button": "^2.8.5",
"react-native-animatable": "^1.3.2",
"react-native-best-viewpager": "^1.0.4",
"react-native-blob-util": "^0.14.0",
"react-native-blur-overlay": "^1.0.6",
"react-native-bottom-sheet-behavior": "^2.0.0",
"react-native-calendario": "^0.2.10",
@ -66,6 +67,7 @@
"react-native-modal-datetime-picker": "^10.2.0",
"react-native-onesignal": "^3.9.0",
"react-native-paper": "^2.16.0",
"react-native-pdf": "^6.4.0",
"react-native-permissions": "^3.0.5",
"react-native-phone-call": "^1.0.9",
"react-native-popup-dialog": "^0.18.3",

View File

@ -72,6 +72,7 @@ import {
TREAT_DEMAND_GROUP_RESET,
TREAT_DEMAND_GROUP_SUCCESS
} from "../types/NanoCreditType";
import InsuranceActions from "../insurance/insurance.type";
export const fetchCreateGroupPending = () => ({
type: CREATE_GROUP_PENDING
@ -396,17 +397,46 @@ export const fetchGetNanoCreditUserHistoryInProgressReset = () => ({
export const fetchGetEpargneInProgressPending = () => ({
type: GET_EPARGNE_HISTORY_PENDING_USER_PENDING
});
export const fetchGetEpargneInProgressSuccess = (res) => ({
type: GET_EPARGNE_HISTORY_PENDING_USER_SUCCESS,
result: res,
});
export const fetchGetEpargneInProgressError = (error) => ({
type: GET_EPARGNE_HISTORY_PENDING_USER_ERROR,
result: error
});
export const fetchGetEpargneInProgressReset = () => ({
type: GET_EPARGNE_HISTORY_PENDING_USER_RESET
});
export const fetchFacturerSoinPending = () => ({
type: InsuranceActions.FACTURER_SOINS_PENDING
});
export const fetchFacturerSoinSuccess = (res) => ({
type: InsuranceActions.FACTURER_SOINS_SUCCESS,
result: res,
});
export const fetchFacturerSoinError = (error) => ({
type: InsuranceActions.FACTURER_SOINS_ERROR,
result: error
});
export const fetchFacturerSoinReset = () => ({
type: InsuranceActions.FACTURER_SOINS_RESET
});
export const fetchInvoiceHistoryPending = () => ({
type: InsuranceActions.INVOICE_HISTORY_PENDING
});
export const fetchInvoiceHistorySuccess = (res) => ({
type: InsuranceActions.INVOICE_HISTORY_SUCCESS,
result: res,
});
export const fetchInvoiceHistoryError = (error) => ({
type: InsuranceActions.INVOICE_HISTORY_ERROR,
result: error
});
export const fetchInvoiceHistoryReset = () => ({
type: InsuranceActions.INVOICE_HISTORY_RESET
});

View File

@ -7,7 +7,7 @@
*/
import InsuranceActions from './insurance.type';
import {
autorisationCareRequestUrl,
autorisationCareRequestUrl, checkInsuranceCoverageAmountUrl,
consultationUrl,
createConsultationUrl,
executionPrescriptionUrl,
@ -18,7 +18,7 @@ import {
getNetworkActsUrl,
getProviderClassUrl,
getUserByIdQRCodeUrl,
getUserByNameOrNumberUrl,
getUserByNameOrNumberUrl, invoiceUrl,
subscribeInsuranceUrl,
uploadInsuranceImagetUrl
} from "../../webservice/IlinkConstants";
@ -540,7 +540,17 @@ export const fetchGetConsultationError = (error: any) => ({
export const fetchGetConsultation = (user_id, state = 'UNTREATED', typeParam = 'CONSULTATION', otherParam = '') => {
console.log("user_id", user_id);
return ApiAction({
url: `${consultationUrl}?user_id=${user_id}&state=${state}&type=${typeParam}${otherParam}`,
url: `${consultationUrl}?state=${state}&type=${typeParam}${user_id !== '' ? '&user_id=' + user_id : ''}${otherParam}`,
method: 'GET',
onLoading: fetchGetConsultationPending,
onSuccess: fetchGetConsultationSuccess,
onError: fetchGetConsultationError,
});
};
export const fetchGetInvoiceHistory = (otherParam) => {
return ApiAction({
url: `${invoiceUrl}${otherParam}`,
method: 'GET',
onLoading: fetchGetConsultationPending,
onSuccess: fetchGetConsultationSuccess,
@ -719,3 +729,33 @@ export const fetchDeleteBeneficiary = (id, data) => {
});
};
/************************************************************/
export const fetchCheckInsuranceCoverageAmountPending = () => ({
type: InsuranceActions.CHECK_HEALTH_CARE_SHEET_PENDING,
});
export const fetchCheckInsuranceCoverageAmountReset = () => ({
type: InsuranceActions.CHECK_HEALTH_CARE_SHEET_RESET,
});
export const fetchCheckInsuranceCoverageAmountSuccess = (authkey: any) => ({
type: InsuranceActions.CHECK_HEALTH_CARE_SHEET_SUCCESS,
payload: authkey,
});
export const fetchCheckInsuranceCoverageAmountError = (error: any) => ({
type: InsuranceActions.CHECK_HEALTH_CARE_SHEET_ERROR,
payload: error,
});
export const fetchCheckInsuranceCoverageAmount = (data) => {
return ApiAction({
url: checkInsuranceCoverageAmountUrl,
method: 'POST',
data,
onLoading: fetchCheckInsuranceCoverageAmountPending,
onSuccess: fetchCheckInsuranceCoverageAmountSuccess,
onError: fetchCheckInsuranceCoverageAmountError,
});
};

View File

@ -677,3 +677,94 @@ export const deleteBeneficiaryeducer = (state = INITIAL_STATE, action: Insurance
}
};
export const facturerSoinReducer = (state = INITIAL_STATE, action: InsuranceActions) => {
switch (action.type) {
case InsuranceActions.FACTURER_SOINS_PENDING:
return {
...state,
loading: true
}
case InsuranceActions.FACTURER_SOINS_SUCCESS:
return {
loading: false,
result: action.result.data,
error: null
}
case InsuranceActions.FACTURER_SOINS_ERROR:
return {
...state,
loading: false,
result: null,
error: action.result
}
case InsuranceActions.FACTURER_SOINS_RESET:
return INITIAL_STATE;
default:
return state
}
};
export const insuranceHistoryReducer = (state = INITIAL_STATE, action: InsuranceActions) => {
switch (action.type) {
case InsuranceActions.INVOICE_HISTORY_PENDING:
return {
...state,
loading: true
}
case InsuranceActions.INVOICE_HISTORY_SUCCESS:
return {
loading: false,
result: action.result.data,
error: null
}
case InsuranceActions.INVOICE_HISTORY_ERROR:
return {
...state,
loading: false,
result: null,
error: action.result
}
case InsuranceActions.INVOICE_HISTORY_RESET:
return INITIAL_STATE;
default:
return state
}
};
export const checkInsuranceCoverageAmountReducer = (state = INITIAL_STATE, action: InsuranceActions) => {
console.log("ACTION", action);
switch (action.type) {
case InsuranceActions.CHECK_HEALTH_CARE_SHEET_PENDING:
return {
...state,
loading: true
}
case InsuranceActions.CHECK_HEALTH_CARE_SHEET_SUCCESS:
return {
loading: false,
result: action.payload.response,
error: null
}
case InsuranceActions.CHECK_HEALTH_CARE_SHEET_ERROR:
return {
...state,
loading: false,
result: null,
error: action.payload
}
case InsuranceActions.CHECK_HEALTH_CARE_SHEET_RESET:
return INITIAL_STATE;
default:
return state
}
};

View File

@ -6,7 +6,7 @@
* Date: 13/09/2021
*/
import {createSelector} from "reselect";
import {deleteBeneficiaryeducer} from "./insurance.reducer";
import {checkInsuranceCoverageAmountReducer, deleteBeneficiaryeducer, facturerSoinReducer} from "./insurance.reducer";
const selectInsuranceListReducer = (state) => state.insuranceList;
const selectSubscribeInsuranceReducer = (state) => state.subscribeInsurance;
@ -30,6 +30,8 @@ const selectExecutionPrescriptionReducerReducer = (state) => state.executionPres
const selectModifyPrescriptionReducer = (state) => state.modifyPrescriptionReducer;
const selectDemandeAutorisationSoinReducer = (state) => state.demandeAutorisationSoinReducer;
const selectDeleteBeneficiaryeducerReducer = (state) => state.deleteBeneficiaryeducer;
const selectFacturerSoinReducer = (state) => state.facturerSoinReducer;
const selectCheckInsuranceCoverageAmountReducer = (state) => state.checkInsuranceCoverageAmountReducer;
export const selectInsuranceList = createSelector(
[selectInsuranceListReducer],
@ -130,3 +132,13 @@ export const selectDeleteBeneficiary = createSelector(
[selectDeleteBeneficiaryeducerReducer],
(deleteBeneficiary) => deleteBeneficiary
);
export const selectFacturerSoin = createSelector(
[selectFacturerSoinReducer],
(facturerSoin) => facturerSoin
);
export const selectCheckInsuranceCoverageAmount = createSelector(
[selectCheckInsuranceCoverageAmountReducer],
(checkInsuranceCoverageAmount) => checkInsuranceCoverageAmount
);

View File

@ -115,5 +115,20 @@ const InsuranceActions = {
DELETE_BENEFICIARY_SUCCESS: 'DELETE_BENEFICIARY_SUCCESS',
DELETE_BENEFICIARY_ERROR: 'DELETE_BENEFICIARY_ERROR',
DELETE_BENEFICIARY_RESET: 'DELETE_BENEFICIARY_RESET',
FACTURER_SOINS_PENDING: 'FACTURER_SOINS_PENDING',
FACTURER_SOINS_SUCCESS: 'FACTURER_SOINS_SUCCESS',
FACTURER_SOINS_ERROR: 'FACTURER_SOINS_ERROR',
FACTURER_SOINS_RESET: 'FACTURER_SOINS_RESET',
INVOICE_HISTORY_PENDING: 'INVOICE_HISTORY_PENDING',
INVOICE_HISTORY_SUCCESS: 'INVOICE_HISTORY_SUCCESS',
INVOICE_HISTORY_ERROR: 'INVOICE_HISTORY_ERROR',
INVOICE_HISTORY_RESET: 'INVOICE_HISTORY_RESET',
CHECK_HEALTH_CARE_SHEET_PENDING: 'CHECK_HEALTH_CARE_SHEET_PENDING',
CHECK_HEALTH_CARE_SHEET_SUCCESS: 'CHECK_HEALTH_CARE_SHEET_SUCCESS',
CHECK_HEALTH_CARE_SHEET_ERROR: 'CHECK_HEALTH_CARE_SHEET_ERROR',
CHECK_HEALTH_CARE_SHEET_RESET: 'CHECK_HEALTH_CARE_SHEET_RESET',
}
export default InsuranceActions;

View File

@ -54,10 +54,10 @@ import {
acceptOrRejectConsultationReducer,
activatePaySubscriptionReducer,
addBeneficiaryToSubscriptionReducer,
addDrugReducer,
addDrugReducer, checkInsuranceCoverageAmountReducer,
createConsultationReducer, deleteBeneficiaryeducer,
demandeAutorisationSoinReducer,
executionPrescriptionReducer,
executionPrescriptionReducer, facturerSoinReducer,
getAmountConsultationReducer,
getConsultationReducer,
getDrugAppareilReducer,
@ -66,7 +66,7 @@ import {
getProviderClassReducer,
getSubscriptionListReducer,
getUserByIdQRCodeReducer,
getUserByNameOrNumberReducer,
getUserByNameOrNumberReducer, insuranceHistoryReducer,
insuranceListReducer,
modifyPrescriptionReducer, stopSubscriptionReducer,
subscribeInsuranceReducer,
@ -179,7 +179,10 @@ const rootReducer = persistCombineReducers(persistConfig, {
executionPrescriptionReducer: executionPrescriptionReducer,
modifyPrescriptionReducer: modifyPrescriptionReducer,
demandeAutorisationSoinReducer: demandeAutorisationSoinReducer,
deleteBeneficiaryeducer: deleteBeneficiaryeducer
deleteBeneficiaryeducer: deleteBeneficiaryeducer,
facturerSoinReducer: facturerSoinReducer,
insuranceHistoryReducer: insuranceHistoryReducer,
checkInsuranceCoverageAmountReducer: checkInsuranceCoverageAmountReducer
});
export default rootReducer;

View File

@ -72,4 +72,6 @@
"executerPrescriptionScreen": "executerPrescriptionScreen",
"modifierFeuilleSoinScreen": "modifierFeuilleSoinScreen",
"modifierExecutionPrescriptionScreen": "modifierExecutionPrescriptionScreen",
"historiqueNanoSanteAgentScreen": "historiqueNanoSanteAgentScreen",
"historiqueNanoSanteSuperHyperScreen": "historiqueNanoSanteSuperHyperScreen",
}

100
screens/PdfViewerScreen.js Normal file
View File

@ -0,0 +1,100 @@
import React, {useEffect, useState} from 'react';
import {ActivityIndicator, Dimensions, StyleSheet, View,} from 'react-native';
import WebView from 'react-native-webview';
import {connect, useDispatch} from 'react-redux';
import {createStructuredSelector} from 'reselect';
import {ScreenComponent} from "../components/ScreenComponent";
import Pdf from "react-native-pdf";
const PDFViewerScreen = ({
navigation,
route,
paypalValidPayment,
fetchPaypalValidPayment,
}: any) => {
let webviewRef = null;
const dispatch = useDispatch();
const [backButtonEnabled, setBackButtonEnabled] = useState(false);
const {url, title} = navigation.state.params;
console.log("URL loaded", url);
/* useFocusEffect(
useCallback(() => {
const onBackPress = () => {
if (backButtonEnabled) {
webviewRef?.goBack();
} else {
navigation.goBack();
}
return false;
};
BackHandler.addEventListener('hardwareBackPress', onBackPress);
return () =>
BackHandler.removeEventListener(
'hardwareBackPress',
onBackPress,
);
}, []),
);*/
const renderLoader = () => (
<ActivityIndicator size="small" />
);
return (
<ScreenComponent>
<View style={styles.contain}>
<Pdf
source={{uri: url}}
onLoadComplete={(numberOfPages,filePath) => {
console.log(`Number of pages: ${numberOfPages}`);
}}
onPageChanged={(page,numberOfPages) => {
console.log(`Current page: ${page}`);
}}
onError={(error) => {
console.log(error);
}}
onPressLink={(uri) => {
console.log(`Link pressed: ${uri}`);
}}
style={styles.webview}/>
</View>
</ScreenComponent>
);
};
export default connect(null, null)(PDFViewerScreen);
const styles = StyleSheet.create({
contain: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
paddingLeft: 20,
paddingRight: 20,
},
contentModal: {
width: '100%',
borderRadius: 8,
padding: 8,
},
item: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
paddingVertical: 20,
},
contentAction: {
flexDirection: 'row',
justifyContent: 'flex-end',
paddingTop: 24,
},
webview: {
height: Dimensions.get('window').height,
width: Dimensions.get('window').width,
},
});

98
screens/WebviewScreen.js Normal file
View File

@ -0,0 +1,98 @@
import React, {useEffect, useState} from 'react';
import {ActivityIndicator, Dimensions, StyleSheet, View,} from 'react-native';
import WebView from 'react-native-webview';
import {connect, useDispatch} from 'react-redux';
import {createStructuredSelector} from 'reselect';
import {ScreenComponent} from "../components/ScreenComponent";
const WebviewScreen = ({
navigation,
route,
paypalValidPayment,
fetchPaypalValidPayment,
}: any) => {
let webviewRef = null;
const dispatch = useDispatch();
const [backButtonEnabled, setBackButtonEnabled] = useState(false);
const {url, title} = navigation.state.params;
console.log("URL loaded", url);
/* useFocusEffect(
useCallback(() => {
const onBackPress = () => {
if (backButtonEnabled) {
webviewRef?.goBack();
} else {
navigation.goBack();
}
return false;
};
BackHandler.addEventListener('hardwareBackPress', onBackPress);
return () =>
BackHandler.removeEventListener(
'hardwareBackPress',
onBackPress,
);
}, []),
);*/
const renderLoader = () => (
<ActivityIndicator size="small" />
);
return (
<ScreenComponent>
<View style={styles.contain}>
<WebView
source={{uri: url}}
style={styles.webview}
ref={ref => {
webviewRef = ref;
}}
javaScriptEnabled
domStorageEnabled
onNavigationStateChange={webViewState => {
setBackButtonEnabled(true);
}}
renderLoading={renderLoader}
startInLoadingState
/>
</View>
</ScreenComponent>
);
};
export default connect(null, null)(WebviewScreen);
const styles = StyleSheet.create({
contain: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
paddingLeft: 20,
paddingRight: 20,
},
contentModal: {
width: '100%',
borderRadius: 8,
padding: 8,
},
item: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
paddingVertical: 20,
},
contentAction: {
flexDirection: 'row',
justifyContent: 'flex-end',
paddingTop: 24,
},
webview: {
height: Dimensions.get('window').height,
width: Dimensions.get('window').width,
},
});

View File

@ -688,6 +688,9 @@ class CreateIdentification extends Component {
<View style={styles.contentSwitch}>
<SwitchSelector options={this.state.sexe}
initial={0}
style={{
width: responsiveWidth(40),
}}
buttonColor={Color.accentColor}
backgroundColor={Color.primaryDarkColor}
textColor='white'

View File

@ -274,7 +274,8 @@ export default class OptionsMenu extends Component {
|| item === 'epargnerArgentUser' || item === 'askNanoCredit' || item === 'casserEpargneUser' || item === 'envoieWalletToBankAgent' || item === 'reattachAccountUser' || item === 'insuranceSubscriptionScreen'
|| item === 'addBeneficiaryScreen' || item === 'activateBuySubscriptionScreen' || item === 'saisirFeuilleSoinScreen' || item === 'validateConsultationScreen' || item === 'validateConsultationDetailScreen'
|| item === 'executerPrescriptionScreen' || item === 'modifierFeuilleSoinScreen' || item === 'modifierExecutionPrescriptionScreen' || item === 'historiqueNanoSanteUserScreen'
|| item === 'demandeAutorisationSoinScreen' || item === 'deleteBeneficiaryScreen' || item === 'StopSubscriptionScreen' || item === 'stopSubscriptionScreen' || item === 'renewAssuranceScreen') {
|| item === 'demandeAutorisationSoinScreen' || item === 'deleteBeneficiaryScreen' || item === 'StopSubscriptionScreen' || item === 'stopSubscriptionScreen' || item === 'renewAssuranceScreen'
|| item === 'webviewScreen' || item === 'historiqueNanoSanteAgentScreen' || item === 'historiqueNanoSanteSuperHyperScreen' || item === 'PDFViewerScreen') {
return null
} else {
const color = this.state.currentId === item.id ? theme.accent : "grey"

View File

@ -61,6 +61,10 @@ import {
} from '../../webservice/WalletTransactionHistoryApi';
import {resetCommissionReducer, transferCommissionAction} from '../../webservice/WalletTransferCommission';
import {readUser} from '../../webservice/AuthApi';
import chunk from "lodash/chunk";
import _ from "lodash";
import FontAwesome from "react-native-vector-icons/FontAwesome";
import FontAwesome5 from "react-native-vector-icons/FontAwesome5";
let moment = require('moment-timezone');
const thousands = require('thousands');
@ -89,6 +93,7 @@ class WalletDetail extends Component {
displayModalHistory: false,
displaySuperHyperModalHistory: false,
historyItemDetail: null,
user: null
};
this.renderContent = null;
@ -170,7 +175,7 @@ class WalletDetail extends Component {
this.props.getHyperSuperTransactionHistoryAction(user.network_id, true);
break;
}
this.setState({});
this.setState({user});
}
}
});
@ -471,7 +476,7 @@ class WalletDetail extends Component {
justifyContent: 'flex-end'
}}>
<Text style={[Typography.headline, Typography.semibold]} numberOfLines={1}>{wallet.network}</Text>
<View style={{flexDirection: 'row'}}>
{!(wallet.type === "ilink_sante") && <View style={{flexDirection: 'row'}}>
<Tag primary
icon={<Icon name='swap-horizontal' size={20} color={Color.whiteColor}
@ -539,7 +544,7 @@ class WalletDetail extends Component {
{I18n.t('HISTORY')}
</Tag>
</View>
</View>}
</View>
</View>
<View style={styles.contentLeftItem}>
@ -1236,7 +1241,7 @@ class WalletDetail extends Component {
}
}
renderSuperHyperHistoryTransaction = () => {
renderSuperHyperHistoryTransaction = (wallet) => {
return (
<>
@ -1259,7 +1264,34 @@ class WalletDetail extends Component {
</>
}
</View>
) :
) : (wallet.type === "ilink_sante") ?
<View style={styles.transactionContainer}>
<View style={[styles.containerTouch]}>
<TouchableOpacity style={styles.contain}
onPress={() => {
this.props.navigation.push(route.historiqueNanoSanteSuperHyperScreen);
}}
activeOpacity={0.9}>
<Icon name='clock'
color={Color.primaryColor}
size={30}
style={styles.imageBanner}/>
<View style={[styles.content]}>
<View style={{paddingTop: 20,}}>
<Text
style={[Typography.headline, Typography.semibold]}>
{I18n.t('HISTORY')}
</Text>
</View>
</View>
</TouchableOpacity>
</View>
</View> :
<>
<View style={[styles.checkDefault, {borderBottomColor: Color.borderColor}]}>
<Text
@ -1275,6 +1307,69 @@ class WalletDetail extends Component {
)
}
renderItem = (options, isOneElement, index) => (
isOneElement ?
<>
<View key={index} style={[styles.containerTouch]}>
<TouchableOpacity style={styles.contain}
onPress={() => {
this.props.navigation.push(options.screen)
}}
activeOpacity={0.9}>
<FontAwesome5 name={options.icon}
color={Color.primaryColor}
size={24}
style={styles.imageBanner}/>
<View style={[styles.content]}>
<View style={[styles.contentTitle], {paddingTop: options.title.length > 20 ? 0 : 5}}>
<Text style={[Typography.headline, Typography.semibold]}>
{I18n.t(options.title)}
</Text>
</View>
</View>
</TouchableOpacity>
</View>
<View style={{flex: 1}}/>
</> :
<>
<View style={[styles.containerTouch]}>
<TouchableOpacity style={styles.contain}
onPress={() => {
this.props.navigation.push(options.screen)
}}
activeOpacity={0.9}>
<FontAwesome5 name={options.icon}
color={Color.primaryColor}
size={24}
style={styles.imageBanner}/>
<View style={[styles.content]}>
<View style={[styles.contentTitle], {paddingTop: options.title.length > 20 ? 0 : 5}}>
<Text style={[Typography.headline, Typography.semibold]}>
{I18n.t(options.title)}
</Text>
</View>
<View style={{flex: 1}}>
</View>
</View>
</TouchableOpacity>
</View>
</>
);
renderDetailWallet = (wallet) => {
return (
@ -1326,7 +1421,7 @@ class WalletDetail extends Component {
<View
style={[styles.blockView, {borderBottomColor: Color.borderColor}]}>
{this.renderAccountDetail(wallet)}
{!(wallet.type === "ilink_sante") && this.renderAccountDetail(wallet)}
{!this.isHomeRootView && (
<>
@ -1337,41 +1432,22 @@ class WalletDetail extends Component {
</Text>
</View>
{(wallet.type === "ilink_sante") &&
<View style={styles.transactionContainer}>
chunk(optionNanoSanteAgentScreen.options, 2).map((item, index) => (
<View style={[styles.containerTouch]}>
<TouchableOpacity style={styles.contain}
onPress={() => {
this.props.navigation.push(route.walletOptionSelect, {
optionSelect: optionNanoSanteAgentScreen,
wallet,
lottie: {
source: require("./../../datas/json/cedit-cards.json"),
loop: true
},
isNanoSanteAgent: true
});
}}
activeOpacity={0.9}>
<Icon name='heart-multiple'
color={Color.primaryColor}
size={30}
style={styles.imageBanner}/>
<View key={index} style={styles.transactionContainer}>
{
item.length === 1 ?
<View style={[styles.content]}>
<View style={{paddingTop: 20,}}>
<Text
style={[Typography.headline, Typography.semibold]}>
{I18n.t('NANO_SANTE')}
</Text>
item.map((wallet, i) => (
this.renderItem(wallet, true, i)
)) :
item.map((wallet, i) => (
this.renderItem(wallet, false, i)
))
}
</View>
</View>
</TouchableOpacity>
</View>
</View>}
))
}
{(wallet.type === "ilink-world" || wallet.type === "ilink" || wallet.type === "visa") &&
<View style={styles.transactionContainer}>
@ -1609,8 +1685,10 @@ class WalletDetail extends Component {
</>
)}
{!this.isHomeRootView && this.renderHistoryTransaction(wallet)}
{this.isHomeRootView && this.renderSuperHyperHistoryTransaction()}
{!this.isHomeRootView && (wallet.type === 'ilink_sante' && wallet.category !== 'geolocated') ?
this.renderHistoryTransaction(wallet)
: !this.isHomeRootView && this.renderHistoryTransaction(wallet) }
{this.isHomeRootView && this.renderSuperHyperHistoryTransaction(wallet)}
</View>
@ -1767,6 +1845,9 @@ class WalletDetail extends Component {
}
</View>
) :
<>
{
wallet.type !== 'ilink_sante' && (
<>
<View style={[styles.checkDefault, {borderBottomColor: Color.borderColor}]}>
<Text
@ -1777,6 +1858,9 @@ class WalletDetail extends Component {
{this.renderHistoryTransactionList(wallet)}
</>
)
}
</>
}
</>
)

View File

@ -1,6 +1,6 @@
import React, {Component} from 'react';
import {
ActivityIndicator,
ActivityIndicator, Alert, FlatList,
Platform,
ProgressBarAndroid,
ScrollView,
@ -35,7 +35,7 @@ import {
cutString,
cutStringWithoutDot,
displayToast,
displayTransactionType,
displayTransactionType, nanoCreditHistoryLabel, nanoSanteHistoryLabel,
transactionHistoryIlinkLabel
} from '../../utils/UtilsFunction';
import chunk from 'lodash/chunk';
@ -52,7 +52,7 @@ import {store} from "../../redux/store";
import FontAwesome5 from "react-native-vector-icons/FontAwesome5";
import FontAwesome from "react-native-vector-icons/FontAwesome";
import {
fetchGetAmountConsultationReset,
fetchGetAmountConsultationReset, fetchGetConsultation,
fetchGetConsultationReset,
fetchGetDrugAppareilReset,
fetchGetNetworkActsReset,
@ -61,6 +61,17 @@ import {
fetchGetUserByIdQRCodeReset,
fetchGetUserByNameOrNumberReset
} from "../../redux/insurance/insurance.actions";
import {
facturerSoinAction,
facturerSoinReset,
getInvoiceHistoryAction,
getInvoiceHistoryReset, getSoinHistoryAction
} from "../../webservice/NanoCreditApi";
import {facturerSoinReducer} from "../../redux/insurance/insurance.reducer";
import SpinnerOverlay from "../../components/SpinnerOverlayComponent";
import AccordionComponent from "../../components/AccordionComponent";
import MaterialCommunityIcons from "react-native-vector-icons/MaterialCommunityIcons";
import {pdfViewerUrl} from "../../webservice/IlinkConstants";
const route = require('./../../route.json');
let slugify = require('slugify');
@ -84,13 +95,21 @@ class WalletOptionSelect extends Component {
user: null,
displayModalHistory: false,
historyItemDetail: null,
isDataHasLoaded: false
isDataHasLoaded: false,
historyResult: [],
page: 1,
loadMore: false,
historiqueDetailLabel: I18n.t('INVOICE')
}
console.log("WALLET OPTION PROPS", this.props);
console.log("WALLET OPTION STATE", this.state);
IlinkEmitter.on("langueChange", this.updateLangue.bind(this));
this.props.getNanoCreditAccountReset();
this.props.facturerSoinReset();
this.props.getNanoCreditUserHistoryReset();
this.props.getInvoiceHistoryReset();
readUser().then((user) => {
if (user) {
@ -99,8 +118,13 @@ class WalletOptionSelect extends Component {
this.props.getNanoCreditAccountAction(user.id);
this.props.getNanoCreditUserHistoryAction(user.id, true);
} else {
if (user.category === 'geolocated')
if (user.category === 'geolocated') {
this.props.getNanoCreditUserHistoryAction(this.state.wallet.id, false);
if(this.state.isNanoSanteAgent) {
this.props.getInvoiceHistoryAction(`?network_id=${user.network_id}&network_agent_id=${this.state.wallet.network_agent_id}&page=1&perPage=20`);
}
}
}
this.setState({user});
}
@ -135,7 +159,7 @@ class WalletOptionSelect extends Component {
this.props.fetchGetProviderClassReset();
this.props.fetchGetConsultationReset();
this.props.fetchGetNetworkActsReset();
this.props.facturerSoinReset();
});
});
@ -174,7 +198,43 @@ class WalletOptionSelect extends Component {
});
console.log("AFTER", this.props);
}
}
}
componentDidMount() {
const {resultInsuranceHistory, errorInsuranceHistory} = this.props;
if (errorInsuranceHistory !== null) {
if (typeof errorInsuranceHistory.data !== 'undefined') {
Alert.alert(
I18n.t("ERROR_LABEL"),
errorInsuranceHistory.data.error,
[
{
text: I18n.t("OK"), onPress: () => {
this.props.getInvoiceHistoryReset();
}
}
],
{cancelable: false}
)
}
}
if (resultInsuranceHistory !== null) {
if (resultInsuranceHistory.response !== null) {
if(this.state.page < resultInsuranceHistory.response.last_page) {
this.setState({
historyResult: this.state.historyResult.concat(resultInsuranceHistory.response.data)
});
}
if(this.state.page === resultInsuranceHistory.response.last_page) {
this.setState({
page: this.state.page + 1,
historyResult: this.state.historyResult.concat(resultInsuranceHistory.response.data)
})
}
}
}
}
@ -278,6 +338,19 @@ class WalletOptionSelect extends Component {
size={30}
style={styles.imageBanner}/>
{
options.hasOwnProperty('iconType') ?
<FontAwesome5 name={options.icon}
color={Color.primaryColor}
size={24}
style={styles.imageBanner}/>
: <Icon name={options.icon}
color={Color.primaryColor}
size={24}
style={styles.imageBanner}/>
}
<View style={[styles.content]}>
<View style={[styles.contentTitle], {paddingTop: options.title.length > 20 ? 0 : 5}}>
@ -320,15 +393,16 @@ class WalletOptionSelect extends Component {
activeOpacity={0.9}>
{
this.state.isNanoSanteAgent
? <FontAwesome name={options.icon}
options.hasOwnProperty('iconType') ?
<FontAwesome5 name={options.icon}
color={Color.primaryColor}
size={30}
size={24}
style={styles.imageBanner}/>
: <Icon name={options.icon}
color={Color.primaryColor}
size={30}
size={24}
style={styles.imageBanner}/>
}
<View style={[styles.content]}>
@ -436,7 +510,7 @@ class WalletOptionSelect extends Component {
renderNanoSanteAccountDetail = (options) => (
<>
<View
{/* <View
style={[styles.blockView, {borderBottomColor: Color.borderColor}]}>
<View style={{flexDirection: 'row', justifyContent: 'space-between'}}>
@ -509,7 +583,7 @@ class WalletOptionSelect extends Component {
}}>{I18n.t('ATTACH_ASSURANCE_CARD')}
</Tag>
</View>
</View>*/}
</>
);
@ -590,6 +664,7 @@ class WalletOptionSelect extends Component {
}}
primary
onPress={() => {
this.props.facturerSoinAction(`?network_agent_id=${this.state.wallet.network_agent_id}`);
//this._scrollView.scrollToEnd();
}}>{' ' + I18n.t('FACTURER_FEUILLES_SOINS')}
</Tag>
@ -616,7 +691,6 @@ class WalletOptionSelect extends Component {
}
}
if (resultHistory !== null) {
if (resultHistory.response !== null) {
return (
@ -695,6 +769,147 @@ class WalletOptionSelect extends Component {
);
}
renderNanoSanteHistoryItem = (item, index) => {
return (
<TouchableOpacity onPress={() => {
this.setState({displayModalHistory: true, historyItemDetail: item})
}} style={[styles.contentService, {borderBottomColor: Color.primaryColor}]}>
{
Object.keys(omit(item, ['created_at', 'currency_code', 'file_url', 'health_care_sheets', 'institution_code', 'institutation_name', 'insured_amount', 'insurer_amount', 'invoice_id',
'network_agent_id', 'network_id', 'period_end_at','period_start_at','updated_at'])).map((element, i) => (
<View style={{alignItems: 'center'}} key={i}>
<Text style={[Typography.overline, Color.grayColor], {marginTop: 4}}>
{item[element]}
</Text>
</View>
))
}
</TouchableOpacity>
);
}
handleLoadMore = () => {
this.props.getInvoiceHistoryReset();
this.props.getInvoiceHistoryAction(`?network_id=${user.network_id}&insured_id=${user.agentId}&page=${this.state.page + 1}&perPage=20`);
this.setState({
page: this.state.page + 1
});
}
renderFooterLoader = () => {
return (
<View
style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}
>
{Platform.OS === 'android'
?
(
<>
<ProgressBarAndroid/>
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
) :
<>
<ActivityIndicator size="small" color={'#ccc'}/>
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
}
</View>
);
};
renderNanoSanteHistoryList = () => {
const {loadingInsuranceHistory, errorInsuranceHistory, resultInsuranceHistory} = this.props;
return (
<>
<View style={[styles.checkDefault, {borderBottomColor: Color.borderColor}]}>
<Text
style={[Typography.title3, Typography.semibold]}>
{`${I18n.t('HISTORY')} ${this.state.historiqueDetailLabel}`}
</Text>
<View style={{flexDirection: 'row', alignItems: 'center', justifyContent: 'center', paddingBottom: 10}}>
<Tag primary
icon={<FontAwesome5 name='book-medical' size={20} color={Color.whiteColor}
style={{marginLeft: 15}}/>}
style={{
paddingRight: 10,
borderTopRightRadius: 0,
borderBottomRightRadius: 0,
borderRightWidth: 1,
borderRightColor: Color.whiteColor
}}
onPress={() => {
this.setState({historiqueDetailLabel: I18n.t('INVOICE')});
readUser().then((user) => {
if (user) {
if (user !== undefined) {
if (user.category === 'geolocated')
this.props.getInvoiceHistoryAction(`?network_id=${user.network_id}&network_agent_id=${this.state.wallet.network_agent_id}&page=1&perPage=20`);
}
}
});
}}/>
<Tag icon={<MaterialCommunityIcons name='medical-bag' size={20} color={Color.whiteColor}/>}
style={{ borderTopLeftRadius: 0, borderBottomLeftRadius: 0,}}
primary
onPress={() => {
this.setState({historiqueDetailLabel: I18n.t('SOINS')});
this.props.getSoinHistoryAction(this.state.wallet.network_agent_id, 'ALL', '', '&pagination=true&page=1');
}}/>
</View>
</View>
{
loadingInsuranceHistory ?
this.renderLoader() :
(<>
<View style={[styles.contentService, {borderBottomColor: Color.primaryColor}]}>
{
nanoSanteHistoryLabel().map((item, index) => (
<View style={{alignItems: 'center'}} key={index}>
<Icon name={item.icon} size={24} color={Color.primaryColor}/>
<Text style={[Typography.overline, Color.grayColor], {marginTop: 4}}>
{I18n.t(item.label)}
</Text>
</View>
))
}
</View>
<FlatList
style={{flex: 1}}
ListEmptyComponent={() => {
return (
<Text>{I18n.t('NO_WALLET_HISTORY')}</Text>
)
}}
data={this.state.historyResult}
keyExtractor={(item, index) => item.id}
renderItem={({item, index}) => (
this.renderNanoSanteHistoryItem(item)
)}
onEndReached={() => {
if (resultInsuranceHistory !== null) {
if (this.state.page < resultInsuranceHistory.response.last_page) {
this.setState({loadMore: true});
this.handleLoadMore();
}
}
}}
onEndReachedThreshold={0.5}
ListFooterComponent={resultInsuranceHistory !== null ? this.state.page < resultInsuranceHistory.response.last_page ? this.renderFooterLoader() : null : null}
/>
</>
)
}
</>
);
}
renderModalHistoryDetail = () => {
const {historyItemDetail} = this.state;
@ -957,6 +1172,101 @@ class WalletOptionSelect extends Component {
</View>
</View>
: historyItemDetail.hasOwnProperty('insured_amount') ?
<ScrollView persistentScrollbar={true}>
<View style={[styles.blockView, {borderBottomColor: Color.borderColor}]}>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('INVOICE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<TouchableOpacity onPress={()=>{
this.setState({
displayModalHistory: !this.state.displayModalHistory,
});
navigation.push('PDFViewerScreen', {url: `${historyItemDetail.file_url}`, title: ''});
}}>
<Text style={{color: "blue", textDecorationLine: 'underline', fontWeight: 'bold'}}>Facture.PDF</Text>
</TouchableOpacity>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('INVOICE_ID')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{this.state.historyItemDetail.invoice_id}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>Date</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{this.state.historyItemDetail.created_at}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('AMOUNT')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{this.state.historyItemDetail.amount}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('MONTANT_ASSURANCE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{this.state.historyItemDetail.insured_amount}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('MONTANT_ASSURE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{this.state.historyItemDetail.insurer_amount}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('INSTITUTE_NAME')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{this.state.historyItemDetail.institution_name}</Text>
</View>
</View>
{
this.state.historyItemDetail.health_care_sheets.map((history_care) => (
<View style={{flexDirection: 'row', marginTop: 10}}>
<AccordionComponent
title={I18n.t('FEUILLE_SOIN')}
description={`${I18n.t('ID')}: ${history_care.health_care_sheet_id}\
${I18n.t('AMOUNT')}: ${history_care.amount}\
${I18n.t('MONTANT_ASSURANCE')}: ${history_care.insuredAmount}\
${I18n.t('MONTANT_ASSURE')}: ${history_care.insurerAmount}\
${I18n.t('PATIENT')}: ${history_care.patient_firstname} ${history_care.patient_lastname}\
${I18n.t('PRATICIEN')}: ${history_care.practitioner_firstname} ${history_care.practitioner_lastname}\
`}
open
style={{marginTop: 20, marginBottom: 10}}
/>
</View>
))
}
</View>
</ScrollView>
: <ScrollView persistentScrollbar={true}>
<View style={[styles.blockView, {borderBottomColor: Color.borderColor}]}>
<View style={{flexDirection: 'row', marginTop: 10}}>
@ -1108,6 +1418,32 @@ class WalletOptionSelect extends Component {
style={[Typography.title3, Typography.semibold]}>
{I18n.t('TRANSACTION_HISTORY')}
</Text>
<View style={{flexDirection: 'row', alignItems: 'flex-end', justifyContent: 'flex-end', paddingBottom: 10}}>
<Tag primary
icon={<FontAwesome5 name='book-medical' size={20} color={Color.whiteColor}
style={{marginLeft: 15}}/>}
style={{
paddingRight: 10,
width: 120,
borderTopRightRadius: 0,
borderBottomRightRadius: 0,
borderRightWidth: 1,
borderRightColor: Color.whiteColor
}}
onPress={() => {
}}>
{` ${I18n.t('SOINS')}`}
</Tag>
<Tag icon={<MaterialCommunityIcons name='medical-bag' size={20} color={Color.whiteColor}/>}
style={{width: 110, borderTopLeftRadius: 0, borderBottomLeftRadius: 0,}}
primary
onPress={() => {
}}>
{` ${I18n.t('SOUSCRIPTION')}`}
</Tag>
</View>
</View>
{
@ -1137,12 +1473,73 @@ class WalletOptionSelect extends Component {
);
}
renderLoader = () => {
return (
<View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
{Platform.OS === 'android'
?
(
<>
<ProgressBarAndroid/>
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
) :
<>
<ActivityIndicator size="large" color={'#ccc'}/>
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
}
</View>
)
}
renderDialogFacturerSoin = () => {
const {resultFacturerSoin, errorFacturerSoin} = this.props;
if (errorFacturerSoin !== null) {
if (typeof errorFacturerSoin.data !== 'undefined') {
Alert.alert(
I18n.t("INFORMATION_MESSAGE"),
errorFacturerSoin.data.error,
[
{
text: I18n.t("OK"), onPress: () => {
this.props.facturerSoinReset();
}
}
],
{cancelable: false}
)
}
}
if (resultFacturerSoin !== null) {
if (resultFacturerSoin.response !== null) {
Alert.alert(
I18n.t("SUCCESS"),
resultFacturerSoin.response,
[
{
text: I18n.t("OK"), onPress: () => {
this.props.facturerSoinReset();
}
}
],
{cancelable: false}
)
}
}
}
render() {
!this.state.isDataHasLoaded && this.renderResultGetNanoCreditAccount();
return (
<Provider>
<View style={{flex: 1}}>
<SpinnerOverlay show={this.props.loadingFacturerSoin} />
{(this.props.resultFacturerSoin !== null || this.props.errorFacturerSoin !== null) && this.renderDialogFacturerSoin()}
<StatusBar
backgroundColor={Color.primaryDarkColor}
barStyle="light-content"
@ -1187,7 +1584,6 @@ class WalletOptionSelect extends Component {
}
</View>
{
this.state.isNanoSante ?
this.state.options.map((item) => (
@ -1215,6 +1611,7 @@ class WalletOptionSelect extends Component {
</View>
))
}
</>
)) :
(<>
@ -1243,9 +1640,9 @@ class WalletOptionSelect extends Component {
}
</>)
}
{/*this.state.isNanoSanteAgent && this.renderNanoSanteHistoryList()*/}
{/* {
{/* {
isEqual(this.props.navigation.state.params.optionSelect.type, 'NANO_CREDIT')
|| isEqual(this.props.navigation.state.params.optionSelect.type, 'NANO_SANTE') ?
this.renderHistory()
@ -1253,7 +1650,6 @@ class WalletOptionSelect extends Component {
}*/}
</ScrollView>
</View>
</Provider>
);
@ -1268,6 +1664,14 @@ const mapStateToProps = state => ({
loadingHistory: state.getNanoCreditHistoryUserReducer.loading,
resultHistory: state.getNanoCreditHistoryUserReducer.result,
errorHistory: state.getNanoCreditHistoryUserReducer.error,
loadingFacturerSoin: state.facturerSoinReducer.loading,
resultFacturerSoin: state.facturerSoinReducer.result,
errorFacturerSoin: state.facturerSoinReducer.error,
loadingInsuranceHistory: state.insuranceHistoryReducer.loading,
resultInsuranceHistory: state.insuranceHistoryReducer.result,
errorInsuranceHistory: state.insuranceHistoryReducer.error,
});
const mapDispatchToProps = dispatch => bindActionCreators({
@ -1285,6 +1689,14 @@ const mapDispatchToProps = dispatch => bindActionCreators({
fetchGetConsultationReset,
fetchGetNetworkActsReset,
facturerSoinReset,
facturerSoinAction,
getInvoiceHistoryAction,
getInvoiceHistoryReset,
getSoinHistoryAction,
getWalletDetailActivated,
getUserIdentificationAction,
getWalletTransactionHistoryUser

View File

@ -29,7 +29,7 @@ import Button from "../../../components/Button";
import {responsiveWidth} from "react-native-responsive-dimensions";
import {
fetchAcceptRejectConsultationReset,
fetchActivePaySubscription,
fetchActivePaySubscription, fetchCheckInsuranceCoverageAmount, fetchCheckInsuranceCoverageAmountReset,
fetchCreateConsultation,
fetchCreateConsultationReset,
fetchExecutionPrescription,
@ -50,7 +50,7 @@ import {readUser} from "../../../webservice/AuthApi";
import TextInput from "../../../components/TextInput";
import {createStructuredSelector} from "reselect";
import {
selectActivatePaySubscription,
selectActivatePaySubscription, selectCheckInsuranceCoverageAmount,
selectExecutionPrescription,
selectGetAmountConsultation,
selectGetConsultation,
@ -247,6 +247,8 @@ const ExecuterPrescriptionScreen = ({
fetchGetProviderClass,
fetchGetConsultation,
fetchExecutionPrescription,
fetchCheckInsuranceCoverageAmount,
checkInsuranceCoverageAmount,
getConsultation,
getUserByNameOrNumber,
getUserByIdQRCode,
@ -279,6 +281,8 @@ const ExecuterPrescriptionScreen = ({
const [modalConsultation, setModalConsultation] = useState(false);
const [consultation, setConsultation] = useState(null);
const [consultationClone, setConsultationClone] = useState(null);
const [displayModalHistory, setDisplayModalHistory] = useState(false);
const [historyItemDetail, setHistoryItemDetail] = useState({});
@ -330,6 +334,7 @@ const ExecuterPrescriptionScreen = ({
dispatch(fetchGetProviderClassReset());
dispatch(fetchGetConsultationReset());
dispatch(fetchExecutionPrescriptionReset());
dispatch(fetchCheckInsuranceCoverageAmountReset());
fetchGetProviderClass(wallet.id_network);
}, []);
@ -340,6 +345,8 @@ const ExecuterPrescriptionScreen = ({
}
}, [user]);
useEffect(() => {
console.log("getUserByNameOrNumber.result", getUserByNameOrNumber);
if (getUserByNameOrNumber.result !== null) {
@ -379,6 +386,50 @@ const ExecuterPrescriptionScreen = ({
}
}, [getUserByNameOrNumber]);
useEffect(() => {
setModalPrice(false);
if (checkInsuranceCoverageAmount.result !== null) {
if (checkInsuranceCoverageAmount.result.response !== null) {
dispatch(fetchCheckInsuranceCoverageAmountReset());
}
}
if (checkInsuranceCoverageAmount.error) {
Alert.alert(
I18n.t("INFORMATION_MESSAGE"),
Utils.getErrorMsg(checkInsuranceCoverageAmount),
[
{
text: I18n.t("OK"), onPress: () => {
if(elementToSetPrice.examen) {
setConsultation({
...consultation,
exams: consultation.exams.map(exam => {
return elementToSetPrice.id === exam.id ? {
...exam,
unit_price: consultationClone.exams.filter(examen => examen.id === elementToSetPrice.id)[0].unit_price
} : exam;
})
});
} else {
setConsultation({
...consultation,
prestations: consultation.prestations.map(presta => {
return elementToSetPrice.id === presta.id ? {
...presta,
unit_price: consultationClone.exams.filter(prestation => prestation.id === elementToSetPrice.id)[0].unit_price
} : presta;
})
});
}
dispatch(fetchCheckInsuranceCoverageAmountReset());
}
}
],
{ cancelable: false }
);
}
}, [checkInsuranceCoverageAmount]);
useEffect(() => {
if (getConsultation.result !== null)
@ -498,6 +549,7 @@ const ExecuterPrescriptionScreen = ({
onSubmit={(values) => {
console.log("Value", elementToSetPrice);
if (elementToSetPrice.examen) {
setConsultation({
...consultation,
exams: consultation.exams.map(exam => {
@ -507,19 +559,44 @@ const ExecuterPrescriptionScreen = ({
} : exam;
})
});
fetchCheckInsuranceCoverageAmount({
insurance_id: assure.id,
beneficiary_id: beneficiary !== null ? beneficiary.id : null,
care_condition: consultation._care_condition,
act_action: "INSERT",
act_type: "EXAM",
exams: [
{
unit_price: values.price,
quantity: consultation.exams.filter(exam => elementToSetPrice.id === exam.id)[0].quantity
}
],
});
} else {
setConsultation({
...consultation,
prescriptions: consultation.prescriptions.map(exam => {
return elementToSetPrice.id === exam.id ? {
...exam,
prescriptions: consultation.prescriptions.map(prescription => {
return elementToSetPrice.id === prescription.id ? {
...prescription,
unit_price: values.price
} : exam;
} : prescription;
})
});
fetchCheckInsuranceCoverageAmount({
insurance_id: assure.id,
beneficiary_id: beneficiary !== null ? beneficiary.id : null,
care_condition: consultation._care_condition,
act_action: "INSERT",
act_type: "PRESCRIPTION",
prescriptions: [
{
unit_price: values.price,
quantity: consultation.prescriptions.filter(prescription => elementToSetPrice.id === prescription.id)[0].quantity
}
],
});
}
setModalPrice(false);
}}>
{({
@ -566,6 +643,7 @@ const ExecuterPrescriptionScreen = ({
/>
<Button
loading={checkInsuranceCoverageAmount.loading}
full
style={{marginTop: 10, marginBottom: 20}}
onPress={handleSubmit}>
@ -956,6 +1034,7 @@ const ExecuterPrescriptionScreen = ({
setModalListAssure(false);
setModalConsultation(false);
setConsultation(historyItemDetail);
setConsultationClone(historyItemDetail);
//dispatch(fetchGetUserByNameOrNumberReset());
wizard.current.next();
}}/>
@ -1527,6 +1606,7 @@ const mapStateToProps = createStructuredSelector({
getAmountConsultation: selectGetAmountConsultation,
executionPrescription: selectExecutionPrescription,
getConsultation: selectGetConsultation,
checkInsuranceCoverageAmount: selectCheckInsuranceCoverageAmount
});
export default connect(mapStateToProps, {
@ -1537,7 +1617,8 @@ export default connect(mapStateToProps, {
fetchCreateConsultation,
fetchGetAmountConsultation,
fetchGetConsultation,
fetchExecutionPrescription
fetchExecutionPrescription,
fetchCheckInsuranceCoverageAmount
})(
ExecuterPrescriptionScreen,
);

View File

@ -0,0 +1,708 @@
/**
* Project iLinkWorld
* File HistoricNanoSanteUserScreen
* Path screens/wallet/user
* Created by BRICE ZELE
* Date: 26/01/2022
*/
import React, {useEffect, useState} from 'react';
import {
ActivityIndicator, Alert,
Dimensions,
FlatList,
Platform,
ProgressBarAndroid,
ScrollView,
StyleSheet,
TouchableOpacity,
View,
} from 'react-native';
import isNil from 'lodash/isNil';
import {connect, useDispatch} from 'react-redux';
import {Color} from "../../../config/Color";
import I18n from 'react-native-i18n';
import {ScreenComponent} from "../../../components/ScreenComponent";
import {
fetchAcceptRejectConsultation,
fetchAcceptRejectConsultationReset,
fetchActivePaySubscription, fetchDemaneAutorisationSoinReset,
fetchGetConsultation,
fetchGetConsultationReset, fetchGetDemandeAutorisationSoin, fetchGetInvoiceHistory,
fetchGetSubscription
} from "../../../redux/insurance/insurance.actions";
import DropdownAlert from "react-native-dropdownalert";
import {createStructuredSelector} from "reselect";
import {
selectAcceptRefuseConsultation,
selectActivatePaySubscription, selectDemandeAutorisationSoin,
selectGetConsultation,
selectSubscriptionList
} from "../../../redux/insurance/insurance.selector";
import {readUser} from "../../../webservice/AuthApi";
import Text from '../../../components/Text';
import * as Utils from "../../../utils/UtilsFunction";
import {uppercaseFirstLetter} from "../../../utils/UtilsFunction";
import Dialog from "react-native-dialog";
import {Typography} from "../../../config/typography";
import Tag from "../../../components/Tag";
import FontAwesome5 from "react-native-vector-icons/FontAwesome5";
import MaterialCommunityIcons from "react-native-vector-icons/MaterialCommunityIcons";
import {store} from "../../../redux/store";
import AccordionComponent from "../../../components/AccordionComponent";
import {pdfViewerUrl} from "../../../webservice/IlinkConstants";
let moment = require('moment-timezone');
const {width, height} = Dimensions.get('window');
const HistoriqueNanoSanteAgentScreen = ({
navigation,
fetchGetConsultation,
fetchGetSubscription,
fetchGetInvoiceHistory,
fetchGetDemandeAutorisationSoin,
fetchAcceptRejectConsultation,
acceptRefuseConsultation,
getConsultation
}) => {
const dispatch = useDispatch();
const [user, setUser] = useState(null);
const [displayModalHistory, setDisplayModalHistory] = useState(false);
const [historyItemDetail, setHistoryItemDetail] = useState({});
const [page, setPage] = useState(1);
const [historiqueDetailLabel, setHistoriqueDetailLabel] = useState(I18n.t('SOINS'));
const [loadMore, setLoadMore] = useState(false);
const [historyResult, setHistoryResult] = useState([]);
const [wallet] = useState(store.getState().walletDetailReducer.result.response);
let dropDownAlertRef: any = null;
function useForceUpdate() {
const [value, setValue] = useState(0); // integer state
return () => setValue(value => value + 1); // update the state to force render
}
const forceUpdate = useForceUpdate();
useEffect(() => {
dispatch(fetchGetConsultationReset());
dispatch(fetchAcceptRejectConsultationReset());
readUser().then((user) => {
setUser(user);
console.log("User", user);
fetchGetConsultation('', 'ALL', '', `&network_id=${wallet.id_network}&network_agent_id=${wallet.network_agent_id}&pagination=true&page=1`);
});
}, []);
useEffect(() => {
if (getConsultation.result !== null) {
if (page < getConsultation.result.response.last_page)
setHistoryResult(historyResult.concat(getConsultation.result.response.data));
if (page === getConsultation.result.response.last_page) {
console.log("Page", page === getConsultation.result.response.last_page);
setPage(page + 1);
console.log("historyResult.concat", historyResult.concat(getConsultation.result.response.data));
setHistoryResult(historyResult.concat(getConsultation.result.response.data));
}
}
if (getConsultation.error) {
Alert.alert(
I18n.t("ERROR_LABLE"),
Utils.getErrorMsg(getConsultation),
[
{
text: I18n.t("OK"), onPress: () => {
dispatch(fetchGetConsultationReset());
}
}
],
{ cancelable: false }
);
/* dropDownAlertRef.alertWithType(
'error',
I18n.t('ERROR_LABEL'),
Utils.getErrorMsg(getConsultation),
);
dispatch(fetchGetConsultationReset());*/
}
//forceUpdate();
}, [getConsultation]);
useEffect(() => {
console.log("historyResult", historyResult);
}, [historyResult]);
/* useEffect(() => {
if (acceptRefuseConsultation.result !== null) {
if(loadMore)
setHistoryResult(historyResult.concat(acceptRefuseConsultation.result.data.data.content));
}
if (acceptRefuseConsultation.error) {
dropDownAlertRef.alertWithType(
'error',
I18n.t('ERROR_LABEL'),
Utils.getErrorMsg(acceptRefuseConsultation),
);
dispatch(fetchAcceptRejectConsultationReset());
setDisplayModalHistory(false);
if (user !== null)
fetchGetConsultation(user.id, 'UNTREATED');
}
}, [acceptRefuseConsultation]);*/
const handleLoadMore = () => {
dispatch(fetchGetConsultationReset());
fetchGetConsultation('', 'ALL', '', `&network_id=${wallet.id_network}&network_agent_id=${wallet.network_agent_id}&pagination=true&pagination=true&page=${page + 1}`);
setPage(page + 1);
}
const renderLoader = () => (
<View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
{Platform.OS === 'android'
?
(
<>
<ProgressBarAndroid/>
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
) :
<>
<ActivityIndicator size="large" color={'#ccc'}/>
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
}
</View>
);
const renderFooterLoader = () => {
return (
<View
style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}
>
{Platform.OS === 'android'
?
(
<>
<ProgressBarAndroid/>
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
) :
<>
<ActivityIndicator size="small" color={'#ccc'}/>
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
}
</View>
);
};
const renderModalHistoryDetail = () => (
<Dialog.Container useNativeDriver={true} visible={displayModalHistory}>
<Dialog.Title>{I18n.t('DETAIL') + ' ' + historiqueDetailLabel}</Dialog.Title>
{historyItemDetail.hasOwnProperty('exams') ?
<ScrollView persistentScrollbar={true}>
<View style={[styles.blockView, {borderBottomColor: Color.borderColor}]}>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('NETWORK')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.network.name}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('PATIENT')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{`${historyItemDetail.patient_lastname} ${historyItemDetail.patient_firstname}`}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>Situation</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.patient_situation.toLowerCase()}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('PRATICIEN')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{`${historyItemDetail.practitioner_lastname} ${historyItemDetail.practitioner_firstname}`}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('MONTANT_ASSURANCE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.insurance_amount}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('MONTANT_ASSURE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.insured_amount}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('CLASSE_PRESTATAIRE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{uppercaseFirstLetter(historyItemDetail.practitioner_provider_class.toLowerCase())}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('STATE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{uppercaseFirstLetter(historyItemDetail.state.toLowerCase())}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>Type</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{uppercaseFirstLetter(historyItemDetail.type.toLowerCase())}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('CONDITION_PRISE_CHARGE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{uppercaseFirstLetter(historyItemDetail.care_condition.toLowerCase())}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('INSTITUTE_NAME')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{uppercaseFirstLetter(historyItemDetail.institution_name.toLowerCase())}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>Date</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{moment(historyItemDetail.created_at).format('YYYY-MM-DD')}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('PRESTATION')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
{historyItemDetail.performances.map(performance => (
<Text
style={[Typography.caption1, Color.grayColor]}>{`${performance.act.name} \n ${performance.amount_formatted} ${!isNil(performance.home_visit_fees_formatted) ? '\n' + I18n.t('FRAIS_DEPLACEMENT')+': ' + performance.home_visit_fees_formatted : ''} \n${!isNil(performance.unit_price_formatted) ? 'P.U: ' + performance.unit_price_formatted + '\n P.T: ' +performance.total_price : ''}`}</Text>
))}
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('EXAMEN')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
{historyItemDetail.exams.map(exam => (
<Text
style={[Typography.caption1, Color.grayColor]}>{`${exam.quantity} ${exam.description} \n ${exam.act.name} \n ${!isNil(exam.unit_price_formatted) ? 'P.U: ' + exam.unit_price_formatted + '\n P.T: ' + exam.total_price : ''}`}</Text>
))}
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('MEDICAMENT')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
{historyItemDetail.prescriptions.map(prescription => (
<Text
style={[Typography.caption1, Color.grayColor]}>{`${prescription.quantity} ${prescription.drug_or_device.name} \n ${prescription.dosage} \n ${!isNil(prescription.unit_price_formatted) ? 'P.U: ' + prescription.unit_price_formatted + '\n P.T: ' + prescription.total_price : ''}`}</Text>
))}
</View>
</View>
</View>
</ScrollView>
: <ScrollView persistentScrollbar={true}>
<View style={[styles.blockView, {borderBottomColor: Color.borderColor}]}>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('INVOICE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<TouchableOpacity onPress={()=>{
setDisplayModalHistory(!displayModalHistory);
navigation.push('PDFViewerScreen', {url: `${historyItemDetail.file_url}`, title: ''});
}}>
<Text style={{color: "blue", textDecorationLine: 'underline', fontWeight: 'bold'}}>Facture.PDF</Text>
</TouchableOpacity>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('INVOICE_ID')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.invoice_id}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>Date</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.created_at}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('AMOUNT')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.amount}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('MONTANT_ASSURANCE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.insured_amount}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('MONTANT_ASSURE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.insurer_amount}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('INSTITUTE_NAME')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.institution_name}</Text>
</View>
</View>
{
historyItemDetail.health_care_sheets.map((history_care) => (
<View style={{flexDirection: 'row', marginTop: 10}}>
<AccordionComponent
title={I18n.t('FEUILLE_SOIN')}
description={`${I18n.t('ID')}: ${history_care.health_care_sheet_id}\
${I18n.t('AMOUNT')}: ${history_care.amount}\
${I18n.t('MONTANT_ASSURANCE')}: ${history_care.insuredAmount}\
${I18n.t('MONTANT_ASSURE')}: ${history_care.insurerAmount}\
${I18n.t('PATIENT')}: ${history_care.patient_firstname} ${history_care.patient_lastname}\
${I18n.t('PRATICIEN')}: ${history_care.practitioner_firstname} ${history_care.practitioner_lastname}\
`}
open
style={{marginTop: 20, marginBottom: 10}}
/>
</View>
))
}
</View>
</ScrollView>}
<Dialog.Button bold={true} label={I18n.t('OK')} onPress={() => {
setDisplayModalHistory(false);
}}/>
{/* <Dialog.Button bold={true} label={I18n.t('REJECT')} onPress={() => {
fetchAcceptRejectConsultation({
health_care_sheet_id: historyItemDetail.id,
user_id: user.id,
action: "REJECT"
});
}}/>
<Dialog.Button bold={true} label={I18n.t('ACCEPT')} onPress={() => {
fetchAcceptRejectConsultation({
health_care_sheet_id: historyItemDetail.id,
user_id: user.id,
action: "ACCEPT"
});
}}/>*/}
</Dialog.Container>
)
const renderItem = (item) => (
item.hasOwnProperty('exams') ?
<TouchableOpacity
style={[styles.content, {backgroundColor: Color.cardBackgroundColor}]}
onPress={() => {
setDisplayModalHistory(true);
setHistoryItemDetail(item);
/*navigation.navigate('validateConsultationDetailScreen', {
item
});*/
}}>
<View style={[styles.contentTop, {borderColor: Color.borderColor}]}>
<View style={{flex: 1, alignItems: 'flex-start'}}>
<Text caption1>{`${I18n.t('MONTANT_ASSURANCE')}: ${item.insured_amount}`}</Text>
<Text footnote light numberOfLines={1}>
{`${I18n.t('STATE')}: ${item.state.toLowerCase()}`}
</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
caption1>{`${I18n.t('NETWORK')}: ${item.network.name}`}</Text>
<Text footnote light numberOfLines={1}>
{`${I18n.t('AYANT_DROIT')}: ${item.patient_firstname} ${item.patient_lastname}\ (${item.patient_situation.toLowerCase()})`}
</Text>
</View>
</View>
<View style={styles.contentBottom}>
<View style={styles.bottomLeft}>
<View style={{marginHorizontal: 5}}>
<Text caption1 semibold accentColor>
{`Type: ${item.type.toLowerCase()}`}
</Text>
</View>
</View>
<View style={{flexDirection: 'row', alignItems: 'flex-end'}}>
<Text caption1 semibold primaryColor>
{`Date: ${moment(item.created_at).format('YYYY-MM-DD')}`}
</Text>
</View>
</View>
</TouchableOpacity>
:
<TouchableOpacity
style={[styles.content, {backgroundColor: Color.cardBackgroundColor}]}
onPress={() => {
setDisplayModalHistory(true);
setHistoryItemDetail(item);
/*navigation.navigate('validateConsultationDetailScreen', {
item
});*/
}}>
<View style={{borderColor: Color.borderColor, flexDirection: "row",paddingBottom: 10, borderBottomWidth: 0.5}}>
<View style={{flex: 1, alignItems: 'flex-start'}}>
<Text caption1>{`${I18n.t('AMOUNT')}: ${item.amount}`}</Text>
</View>
</View>
<View style={[styles.contentTop, {borderColor: Color.borderColor}]}>
<View style={{flex: 1, alignItems: 'flex-start'}}>
<Text
caption1>{`${I18n.t('MONTANT_ASSURANCE')}: ${item.insured_amount}`}</Text>
<Text footnote light numberOfLines={1}>
{`${I18n.t('MONTANT_ASSURE')}: ${item.insurer_amount}`}
</Text>
</View>
</View>
<View style={styles.contentBottom}>
<View style={{flexDirection: 'row', alignItems: 'flex-start'}}>
<Text caption1 semibold primaryColor>
{`Date: ${moment(item.created_at).format('YYYY-MM-DD')}`}
</Text>
</View>
</View>
</TouchableOpacity>
);
return (
<ScreenComponent>
<DropdownAlert ref={ref => (dropDownAlertRef = ref)}/>
<View style={styles.contain}>
<View style={{flexDirection: 'row', alignItems: 'center', justifyContent: 'center', paddingBottom: 10}}>
<Tag primary
icon={<FontAwesome5 name='book-medical' size={20} color={Color.whiteColor}
style={{marginLeft: 15}}/>}
style={{
paddingRight: 10,
width: 120,
borderTopRightRadius: 0,
borderBottomRightRadius: 0,
borderRightWidth: 1,
borderRightColor: Color.whiteColor
}}
onPress={() => {
dispatch(fetchGetConsultationReset());
setPage(1);
setLoadMore(false);
setHistoryResult([]);
setHistoriqueDetailLabel(I18n.t('SOINS'));
fetchGetConsultation('', 'ALL', '', `&network_id=${wallet.id_network}&network_agent_id=${wallet.network_agent_id}&pagination=true&page=1`);
}}>
{` ${I18n.t('SOINS')}`}
</Tag>
<Tag icon={<MaterialCommunityIcons name='file' size={20} color={Color.whiteColor}/>}
style={{width: 110, borderTopLeftRadius: 0, borderBottomLeftRadius: 0,}}
primary
onPress={() => {
dispatch(fetchGetConsultationReset());
setPage(1);
setLoadMore(false);
setHistoryResult([]);
setHistoriqueDetailLabel(I18n.t('INVOICE'));
fetchGetInvoiceHistory(`?network_id=${wallet.id_network}&network_agent_id=${wallet.network_agent_id}&page=1&perPage=20`);
}}>
{` ${I18n.t('INVOICE')}`}
</Tag>
</View>
{getConsultation.loading && !loadMore
? renderLoader()
: (
<FlatList
style={{flex: 1}}
ListEmptyComponent={() => {
return (
<Text>{I18n.t('NO_WALLET_HISTORY')}</Text>
)
}}
data={historyResult}
keyExtractor={(item, index) => item.id}
renderItem={({item, index}) => (
renderItem(item)
)}
onEndReached={() => {
if (getConsultation.result !== null) {
if (page < getConsultation.result.response.last_page) {
setLoadMore(true);
handleLoadMore();
}
}
}}
onEndReachedThreshold={0.5}
ListFooterComponent={getConsultation.result !== null ? page < getConsultation.result.response.last_page ? renderFooterLoader() : null : null}
/>
)}
{displayModalHistory && renderModalHistoryDetail()}
</View>
</ScreenComponent>
)
};
const mapStateToProps = createStructuredSelector({
subscriptionList: selectSubscriptionList,
activatePaySubscription: selectActivatePaySubscription,
getConsultation: selectGetConsultation,
acceptRefuseConsultation: selectAcceptRefuseConsultation
});
export default connect(mapStateToProps, {
fetchActivePaySubscription,
fetchGetConsultation,
fetchAcceptRejectConsultation,
fetchGetSubscription,
fetchGetDemandeAutorisationSoin,
fetchGetInvoiceHistory
})(
HistoriqueNanoSanteAgentScreen,
);
const styles = StyleSheet.create({
textInput: {
height: 46,
backgroundColor: Color.fieldColor,
borderRadius: 5,
marginTop: 10,
padding: 10,
width: '100%',
},
contentService: {
paddingVertical: 10,
borderBottomWidth: 0.5,
flexDirection: 'row',
flexWrap: 'wrap',
justifyContent: 'space-between',
},
lineRow: {
flexDirection: 'row',
justifyContent: 'space-between',
paddingBottom: 20,
},
contain: {
marginTop: 20,
paddingBottom: 20,
paddingLeft: 10,
paddingRight: 10,
flex: 1,
},
content: {
padding: 10,
marginBottom: 10,
borderRadius: 8
},
contentTop: {
flexDirection: "row",
paddingBottom: 10,
borderBottomWidth: 1
},
contentBottom: {
flexDirection: "row",
marginTop: 10,
justifyContent: "space-between"
},
bottomLeft: {flexDirection: "row", alignItems: "center"},
image: {width: 32, height: 32, marginRight: 10, borderRadius: 16},
blockView: {
paddingVertical: 10,
borderBottomWidth: 0.5,
},
});

View File

@ -0,0 +1,709 @@
/**
* Project iLinkWorld
* File HistoricNanoSanteUserScreen
* Path screens/wallet/user
* Created by BRICE ZELE
* Date: 26/01/2022
*/
import React, {useEffect, useState} from 'react';
import {
ActivityIndicator, Alert,
Dimensions,
FlatList,
Platform,
ProgressBarAndroid,
ScrollView,
StyleSheet,
TouchableOpacity,
View,
} from 'react-native';
import isNil from 'lodash/isNil';
import {connect, useDispatch} from 'react-redux';
import {Color} from "../../../config/Color";
import I18n from 'react-native-i18n';
import {ScreenComponent} from "../../../components/ScreenComponent";
import {
fetchAcceptRejectConsultation,
fetchAcceptRejectConsultationReset,
fetchActivePaySubscription, fetchDemaneAutorisationSoinReset,
fetchGetConsultation,
fetchGetConsultationReset, fetchGetDemandeAutorisationSoin, fetchGetInvoiceHistory,
fetchGetSubscription
} from "../../../redux/insurance/insurance.actions";
import DropdownAlert from "react-native-dropdownalert";
import {createStructuredSelector} from "reselect";
import {
selectAcceptRefuseConsultation,
selectActivatePaySubscription, selectDemandeAutorisationSoin,
selectGetConsultation,
selectSubscriptionList
} from "../../../redux/insurance/insurance.selector";
import {readUser} from "../../../webservice/AuthApi";
import Text from '../../../components/Text';
import * as Utils from "../../../utils/UtilsFunction";
import {uppercaseFirstLetter} from "../../../utils/UtilsFunction";
import Dialog from "react-native-dialog";
import {Typography} from "../../../config/typography";
import Tag from "../../../components/Tag";
import FontAwesome5 from "react-native-vector-icons/FontAwesome5";
import MaterialCommunityIcons from "react-native-vector-icons/MaterialCommunityIcons";
import {store} from "../../../redux/store";
import AccordionComponent from "../../../components/AccordionComponent";
import {pdfViewerUrl} from "../../../webservice/IlinkConstants";
let moment = require('moment-timezone');
const {width, height} = Dimensions.get('window');
const HistoriqueNanoSanteSuperHyperScreen = ({
navigation,
fetchGetConsultation,
fetchGetSubscription,
fetchGetInvoiceHistory,
fetchGetDemandeAutorisationSoin,
fetchAcceptRejectConsultation,
acceptRefuseConsultation,
getConsultation
}) => {
const dispatch = useDispatch();
const [user, setUser] = useState(null);
const [displayModalHistory, setDisplayModalHistory] = useState(false);
const [historyItemDetail, setHistoryItemDetail] = useState({});
const [page, setPage] = useState(1);
const [historiqueDetailLabel, setHistoriqueDetailLabel] = useState(I18n.t('SOINS'));
const [loadMore, setLoadMore] = useState(false);
const [historyResult, setHistoryResult] = useState([]);
const [wallet] = useState(store.getState().walletDetailReducer.result.response);
let dropDownAlertRef: any = null;
function useForceUpdate() {
const [value, setValue] = useState(0); // integer state
return () => setValue(value => value + 1); // update the state to force render
}
const forceUpdate = useForceUpdate();
useEffect(() => {
dispatch(fetchGetConsultationReset());
dispatch(fetchAcceptRejectConsultationReset());
readUser().then((user) => {
setUser(user);
console.log("User", user);
fetchGetConsultation('', 'ALL', '', `&network_id=${wallet.id_network}&pagination=true&page=1`);
});
}, []);
useEffect(() => {
if (getConsultation.result !== null) {
if (page < getConsultation.result.response.last_page)
setHistoryResult(historyResult.concat(getConsultation.result.response.data));
if (page === getConsultation.result.response.last_page) {
console.log("Page", page === getConsultation.result.response.last_page);
setPage(page + 1);
console.log("historyResult.concat", historyResult.concat(getConsultation.result.response.data));
setHistoryResult(historyResult.concat(getConsultation.result.response.data));
}
}
if (getConsultation.error) {
Alert.alert(
I18n.t("ERROR_LABLE"),
Utils.getErrorMsg(getConsultation),
[
{
text: I18n.t("OK"), onPress: () => {
dispatch(fetchGetConsultationReset());
}
}
],
{ cancelable: false }
);
/* dropDownAlertRef.alertWithType(
'error',
I18n.t('ERROR_LABEL'),
Utils.getErrorMsg(getConsultation),
);
dispatch(fetchGetConsultationReset());*/
}
//forceUpdate();
}, [getConsultation]);
useEffect(() => {
console.log("historyResult", historyResult);
}, [historyResult]);
/* useEffect(() => {
if (acceptRefuseConsultation.result !== null) {
if(loadMore)
setHistoryResult(historyResult.concat(acceptRefuseConsultation.result.data.data.content));
}
if (acceptRefuseConsultation.error) {
dropDownAlertRef.alertWithType(
'error',
I18n.t('ERROR_LABEL'),
Utils.getErrorMsg(acceptRefuseConsultation),
);
dispatch(fetchAcceptRejectConsultationReset());
setDisplayModalHistory(false);
if (user !== null)
fetchGetConsultation(user.id, 'UNTREATED');
}
}, [acceptRefuseConsultation]);*/
const handleLoadMore = () => {
dispatch(fetchGetConsultationReset());
fetchGetConsultation('', 'ALL', '', `&network_id=${wallet.id_network}&pagination=true&pagination=true&page=${page + 1}`);
setPage(page + 1);
}
const renderLoader = () => (
<View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
{Platform.OS === 'android'
?
(
<>
<ProgressBarAndroid/>
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
) :
<>
<ActivityIndicator size="large" color={'#ccc'}/>
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
}
</View>
);
const renderFooterLoader = () => {
return (
<View
style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}
>
{Platform.OS === 'android'
?
(
<>
<ProgressBarAndroid/>
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
) :
<>
<ActivityIndicator size="small" color={'#ccc'}/>
<Text>{I18n.t('LOADING_DOTS')}</Text>
</>
}
</View>
);
};
const renderModalHistoryDetail = () => (
<Dialog.Container useNativeDriver={true} visible={displayModalHistory}>
<Dialog.Title>{I18n.t('DETAIL') + ' ' + historiqueDetailLabel}</Dialog.Title>
{historyItemDetail.hasOwnProperty('exams') ?
<ScrollView persistentScrollbar={true}>
<View style={[styles.blockView, {borderBottomColor: Color.borderColor}]}>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('NETWORK')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.network.name}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('PATIENT')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{`${historyItemDetail.patient_lastname} ${historyItemDetail.patient_firstname}`}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>Situation</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.patient_situation.toLowerCase()}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('PRATICIEN')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{`${historyItemDetail.practitioner_lastname} ${historyItemDetail.practitioner_firstname}`}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('MONTANT_ASSURANCE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.insurance_amount}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('MONTANT_ASSURE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.insured_amount}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('CLASSE_PRESTATAIRE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{uppercaseFirstLetter(historyItemDetail.practitioner_provider_class.toLowerCase())}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('STATE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{uppercaseFirstLetter(historyItemDetail.state.toLowerCase())}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>Type</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{uppercaseFirstLetter(historyItemDetail.type.toLowerCase())}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('CONDITION_PRISE_CHARGE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{uppercaseFirstLetter(historyItemDetail.care_condition.toLowerCase())}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('INSTITUTE_NAME')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{uppercaseFirstLetter(historyItemDetail.institution_name.toLowerCase())}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>Date</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{moment(historyItemDetail.created_at).format('YYYY-MM-DD')}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('PRESTATION')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
{historyItemDetail.performances.map(performance => (
<Text
style={[Typography.caption1, Color.grayColor]}>{`${performance.act.name} \n ${performance.amount_formatted} ${!isNil(performance.home_visit_fees_formatted) ? '\n' + I18n.t('FRAIS_DEPLACEMENT')+': ' + performance.home_visit_fees_formatted : ''} \n${!isNil(performance.unit_price_formatted) ? 'P.U: ' + performance.unit_price_formatted + '\n P.T: ' +performance.total_price : ''}`}</Text>
))}
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('EXAMEN')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
{historyItemDetail.exams.map(exam => (
<Text
style={[Typography.caption1, Color.grayColor]}>{`${exam.quantity} ${exam.description} \n ${exam.act.name} \n ${!isNil(exam.unit_price_formatted) ? 'P.U: ' + exam.unit_price_formatted + '\n P.T: ' + exam.total_price : ''}`}</Text>
))}
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('MEDICAMENT')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
{historyItemDetail.prescriptions.map(prescription => (
<Text
style={[Typography.caption1, Color.grayColor]}>{`${prescription.quantity} ${prescription.drug_or_device.name} \n ${prescription.dosage} \n ${!isNil(prescription.unit_price_formatted) ? 'P.U: ' + prescription.unit_price_formatted + '\n P.T: ' + prescription.total_price : ''}`}</Text>
))}
</View>
</View>
</View>
</ScrollView>
: <ScrollView persistentScrollbar={true}>
<View style={[styles.blockView, {borderBottomColor: Color.borderColor}]}>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('INVOICE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<TouchableOpacity onPress={()=>{
setDisplayModalHistory(!displayModalHistory);
navigation.push('PDFViewerScreen', {url: `${historyItemDetail.file_url}`, title: ''});
}}>
<Text style={{color: "blue", textDecorationLine: 'underline', fontWeight: 'bold'}}>Facture.PDF</Text>
</TouchableOpacity>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>{I18n.t('INVOICE_ID')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.invoice_id}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text style={[styles.body2]}>Date</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.created_at}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('AMOUNT')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.amount}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('MONTANT_ASSURANCE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.insured_amount}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('MONTANT_ASSURE')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.insurer_amount}</Text>
</View>
</View>
<View style={{flexDirection: 'row', marginTop: 10}}>
<View style={{flex: 1}}>
<Text tyle={[Typography.body2]}>{I18n.t('INSTITUTE_NAME')}</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
style={[Typography.caption1, Color.grayColor]}>{historyItemDetail.institution_name}</Text>
</View>
</View>
{
historyItemDetail.health_care_sheets.map((history_care) => (
<View style={{flexDirection: 'row', marginTop: 10}}>
<AccordionComponent
title={I18n.t('FEUILLE_SOIN')}
description={`${I18n.t('ID')}: ${history_care.health_care_sheet_id}\
${I18n.t('AMOUNT')}: ${history_care.amount}\
${I18n.t('MONTANT_ASSURANCE')}: ${history_care.insuredAmount}\
${I18n.t('MONTANT_ASSURE')}: ${history_care.insurerAmount}\
${I18n.t('PATIENT')}: ${history_care.patient_firstname} ${history_care.patient_lastname}\
${I18n.t('PRATICIEN')}: ${history_care.practitioner_firstname} ${history_care.practitioner_lastname}\
`}
open
style={{marginTop: 20, marginBottom: 10}}
/>
</View>
))
}
</View>
</ScrollView>}
<Dialog.Button bold={true} label={I18n.t('OK')} onPress={() => {
setDisplayModalHistory(false);
}}/>
{/* <Dialog.Button bold={true} label={I18n.t('REJECT')} onPress={() => {
fetchAcceptRejectConsultation({
health_care_sheet_id: historyItemDetail.id,
user_id: user.id,
action: "REJECT"
});
}}/>
<Dialog.Button bold={true} label={I18n.t('ACCEPT')} onPress={() => {
fetchAcceptRejectConsultation({
health_care_sheet_id: historyItemDetail.id,
user_id: user.id,
action: "ACCEPT"
});
}}/>*/}
</Dialog.Container>
)
const renderItem = (item) => (
item.hasOwnProperty('exams') ?
<TouchableOpacity
style={[styles.content, {backgroundColor: Color.cardBackgroundColor}]}
onPress={() => {
setDisplayModalHistory(true);
setHistoryItemDetail(item);
/*navigation.navigate('validateConsultationDetailScreen', {
item
});*/
}}>
<View style={[styles.contentTop, {borderColor: Color.borderColor}]}>
<View style={{flex: 1, alignItems: 'flex-start'}}>
<Text caption1>{`${I18n.t('MONTANT_ASSURANCE')}: ${item.insured_amount}`}</Text>
<Text footnote light numberOfLines={1}>
{`${I18n.t('STATE')}: ${item.state.toLowerCase()}`}
</Text>
</View>
<View style={{flex: 1, alignItems: 'flex-end'}}>
<Text
caption1>{`${I18n.t('NETWORK')}: ${item.network.name}`}</Text>
<Text footnote light numberOfLines={1}>
{`${I18n.t('AYANT_DROIT')}: ${item.patient_firstname} ${item.patient_lastname}\ (${item.patient_situation.toLowerCase()})`}
</Text>
</View>
</View>
<View style={styles.contentBottom}>
<View style={styles.bottomLeft}>
<View style={{marginHorizontal: 5}}>
<Text caption1 semibold accentColor>
{`Type: ${item.type.toLowerCase()}`}
</Text>
</View>
</View>
<View style={{flexDirection: 'row', alignItems: 'flex-end'}}>
<Text caption1 semibold primaryColor>
{`Date: ${moment(item.created_at).format('YYYY-MM-DD')}`}
</Text>
</View>
</View>
</TouchableOpacity>
:
<TouchableOpacity
style={[styles.content, {backgroundColor: Color.cardBackgroundColor}]}
onPress={() => {
setDisplayModalHistory(true);
setHistoryItemDetail(item);
/*navigation.navigate('validateConsultationDetailScreen', {
item
});*/
}}>
<View style={{borderColor: Color.borderColor, flexDirection: "row",paddingBottom: 10, borderBottomWidth: 0.5}}>
<View style={{flex: 1, alignItems: 'flex-start'}}>
<Text caption1>{`${I18n.t('AMOUNT')}: ${item.amount}`}</Text>
</View>
</View>
<View style={[styles.contentTop, {borderColor: Color.borderColor}]}>
<View style={{flex: 1, alignItems: 'flex-start'}}>
<Text
caption1>{`${I18n.t('MONTANT_ASSURANCE')}: ${item.insured_amount}`}</Text>
<Text footnote light numberOfLines={1}>
{`${I18n.t('MONTANT_ASSURE')}: ${item.insurer_amount}`}
</Text>
</View>
</View>
<View style={styles.contentBottom}>
<View style={{flexDirection: 'row', alignItems: 'flex-start'}}>
<Text caption1 semibold primaryColor>
{`Date: ${moment(item.created_at).format('YYYY-MM-DD')}`}
</Text>
</View>
</View>
</TouchableOpacity>
);
return (
<ScreenComponent>
<DropdownAlert ref={ref => (dropDownAlertRef = ref)}/>
<View style={styles.contain}>
<View style={{flexDirection: 'row', alignItems: 'center', justifyContent: 'center', paddingBottom: 10}}>
<Tag primary
icon={<FontAwesome5 name='book-medical' size={20} color={Color.whiteColor}
style={{marginLeft: 15}}/>}
style={{
paddingRight: 10,
width: 120,
borderTopRightRadius: 0,
borderBottomRightRadius: 0,
borderRightWidth: 1,
borderRightColor: Color.whiteColor
}}
onPress={() => {
dispatch(fetchGetConsultationReset());
setPage(1);
setLoadMore(false);
setHistoryResult([]);
setHistoriqueDetailLabel(I18n.t('SOINS'));
fetchGetConsultation('', 'ALL', '', `&network_id=${wallet.id_network}&pagination=true&page=1`);
}}>
{` ${I18n.t('SOINS')}`}
</Tag>
<Tag icon={<MaterialCommunityIcons name='file' size={20} color={Color.whiteColor}/>}
style={{width: 110, borderTopLeftRadius: 0, borderBottomLeftRadius: 0,}}
primary
onPress={() => {
dispatch(fetchGetConsultationReset());
setPage(1);
setLoadMore(false);
setHistoryResult([]);
setHistoriqueDetailLabel(I18n.t('INVOICE'));
fetchGetInvoiceHistory(`?network_id=${wallet.id_network}&page=1&perPage=20`);
}}>
{` ${I18n.t('INVOICE')}`}
</Tag>
</View>
{getConsultation.loading && !loadMore
? renderLoader()
: (
<FlatList
style={{flex: 1}}
ListEmptyComponent={() => {
return (
<Text>{I18n.t('NO_WALLET_HISTORY')}</Text>
)
}}
data={historyResult}
keyExtractor={(item, index) => item.id}
renderItem={({item, index}) => (
renderItem(item)
)}
onEndReached={() => {
if (getConsultation.result !== null) {
if (page < getConsultation.result.response.last_page) {
setLoadMore(true);
handleLoadMore();
}
}
}}
onEndReachedThreshold={0.5}
ListFooterComponent={getConsultation.result !== null ? page < getConsultation.result.response.last_page ? renderFooterLoader() : null : null}
/>
)}
{displayModalHistory && renderModalHistoryDetail()}
</View>
</ScreenComponent>
)
};
const mapStateToProps = createStructuredSelector({
subscriptionList: selectSubscriptionList,
activatePaySubscription: selectActivatePaySubscription,
getConsultation: selectGetConsultation,
acceptRefuseConsultation: selectAcceptRefuseConsultation
});
export default connect(mapStateToProps, {
fetchActivePaySubscription,
fetchGetConsultation,
fetchAcceptRejectConsultation,
fetchGetSubscription,
fetchGetDemandeAutorisationSoin,
fetchGetInvoiceHistory
})(
HistoriqueNanoSanteSuperHyperScreen,
);
const styles = StyleSheet.create({
textInput: {
height: 46,
backgroundColor: Color.fieldColor,
borderRadius: 5,
marginTop: 10,
padding: 10,
width: '100%',
},
contentService: {
paddingVertical: 10,
borderBottomWidth: 0.5,
flexDirection: 'row',
flexWrap: 'wrap',
justifyContent: 'space-between',
},
lineRow: {
flexDirection: 'row',
justifyContent: 'space-between',
paddingBottom: 20,
},
contain: {
marginTop: 20,
paddingBottom: 20,
paddingLeft: 10,
paddingRight: 10,
flex: 1,
},
content: {
padding: 10,
marginBottom: 10,
borderRadius: 8
},
contentTop: {
flexDirection: "row",
paddingBottom: 10,
borderBottomWidth: 1
},
contentBottom: {
flexDirection: "row",
marginTop: 10,
justifyContent: "space-between"
},
bottomLeft: {flexDirection: "row", alignItems: "center"},
image: {width: 32, height: 32, marginRight: 10, borderRadius: 16},
blockView: {
paddingVertical: 10,
borderBottomWidth: 0.5,
},
});

View File

@ -28,7 +28,7 @@ import {ScreenComponent} from "../../../components/ScreenComponent";
import Button from "../../../components/Button";
import {responsiveWidth} from "react-native-responsive-dimensions";
import {
fetchActivePaySubscription,
fetchActivePaySubscription, fetchCheckInsuranceCoverageAmount, fetchCheckInsuranceCoverageAmountReset,
fetchCreateConsultation,
fetchCreateConsultationReset,
fetchExecutionPrescription,
@ -51,7 +51,7 @@ import {readUser} from "../../../webservice/AuthApi";
import TextInput from "../../../components/TextInput";
import {createStructuredSelector} from "reselect";
import {
selectActivatePaySubscription,
selectActivatePaySubscription, selectCheckInsuranceCoverageAmount,
selectExecutionPrescription,
selectGetAmountConsultation,
selectGetConsultation,
@ -250,6 +250,8 @@ const ModifierExecutionPrescriptionScreen = ({
fetchGetConsultation,
fetchExecutionPrescription,
fetchModifyPrescription,
fetchCheckInsuranceCoverageAmount,
checkInsuranceCoverageAmount,
modifyPrescription,
getConsultation,
getUserByNameOrNumber,
@ -283,6 +285,7 @@ const ModifierExecutionPrescriptionScreen = ({
const [modalConsultation, setModalConsultation] = useState(false);
const [consultation, setConsultation] = useState(null);
const [consultationClone, setConsultationClone] = useState(null);
const [displayModalHistory, setDisplayModalHistory] = useState(false);
const [historyItemDetail, setHistoryItemDetail] = useState({});
@ -450,6 +453,51 @@ const ModifierExecutionPrescriptionScreen = ({
}
}, [modifyPrescription]);
useEffect(() => {
setModalPrice(false);
if (checkInsuranceCoverageAmount.result !== null) {
if (checkInsuranceCoverageAmount.result.response !== null) {
dispatch(fetchCheckInsuranceCoverageAmountReset());
}
}
if (checkInsuranceCoverageAmount.error) {
Alert.alert(
I18n.t("INFORMATION_MESSAGE"),
Utils.getErrorMsg(checkInsuranceCoverageAmount),
[
{
text: I18n.t("OK"), onPress: () => {
if(elementToSetPrice.examen) {
setConsultation({
...consultation,
exams: consultation.exams.map(exam => {
return elementToSetPrice.id === exam.id ? {
...exam,
unit_price: consultationClone.exams.filter(examen => examen.id === elementToSetPrice.id)[0].unit_price
} : exam;
})
});
} else {
setConsultation({
...consultation,
prestations: consultation.prestations.map(presta => {
return elementToSetPrice.id === presta.id ? {
...presta,
unit_price: consultationClone.exams.filter(prestation => prestation.id === elementToSetPrice.id)[0].unit_price
} : presta;
})
});
}
dispatch(fetchCheckInsuranceCoverageAmountReset());
}
}
],
{ cancelable: false }
);
}
}, [checkInsuranceCoverageAmount]);
const ExecuterPrescriptionSchema = Yup.object().shape({
numero_assure: Yup.string()
.required(I18n.t('THIS_FIELD_IS_REQUIRED')),
@ -511,6 +559,20 @@ const ModifierExecutionPrescriptionScreen = ({
} : exam;
})
});
fetchCheckInsuranceCoverageAmount({
insurance_id: assure.id,
beneficiary_id: beneficiary !== null ? beneficiary.id : null,
care_condition: consultation._care_condition,
act_id: consultation.exams.filter(exam => elementToSetPrice.id === exam.id)[0].act_id,
act_action: "UPDATE",
act_type: "EXAM",
exams: [
{
unit_price: values.price,
quantity: consultation.exams.filter(exam => elementToSetPrice.id === exam.id)[0].quantity
}
],
});
} else {
setConsultation({
...consultation,
@ -521,9 +583,21 @@ const ModifierExecutionPrescriptionScreen = ({
} : exam;
})
});
fetchCheckInsuranceCoverageAmount({
insurance_id: assure.id,
beneficiary_id: beneficiary !== null ? beneficiary.id : null,
care_condition: consultation._care_condition,
act_id: consultation.prescriptions.filter(prescription => elementToSetPrice.id === prescription.id)[0].act_id,
act_action: "UPDATE",
act_type: "PRESCRIPTION",
prescriptions: [
{
unit_price: values.price,
quantity: consultation.prescriptions.filter(prescription => elementToSetPrice.id === prescription.id)[0].quantity
}
],
});
}
setModalPrice(false);
}}>
{({
@ -570,6 +644,7 @@ const ModifierExecutionPrescriptionScreen = ({
/>
<Button
loading={checkInsuranceCoverageAmount.loading}
full
style={{marginTop: 10, marginBottom: 20}}
onPress={handleSubmit}>
@ -960,6 +1035,7 @@ const ModifierExecutionPrescriptionScreen = ({
setModalListAssure(false);
setModalConsultation(false);
setConsultation(historyItemDetail);
setConsultationClone(historyItemDetail);
setFieldValue(
'practitioner_firstname',
historyItemDetail.practitioner_firstname,
@ -1533,8 +1609,8 @@ const mapStateToProps = createStructuredSelector({
getAmountConsultation: selectGetAmountConsultation,
executionPrescription: selectExecutionPrescription,
getConsultation: selectGetConsultation,
modifyPrescription: selectModifyPrescription
modifyPrescription: selectModifyPrescription,
checkInsuranceCoverageAmount: selectCheckInsuranceCoverageAmount
});
export default connect(mapStateToProps, {
@ -1546,7 +1622,8 @@ export default connect(mapStateToProps, {
fetchGetAmountConsultation,
fetchGetConsultation,
fetchExecutionPrescription,
fetchModifyPrescription
fetchModifyPrescription,
fetchCheckInsuranceCoverageAmount
})(
ModifierExecutionPrescriptionScreen,
);

View File

@ -29,7 +29,7 @@ import {ScreenComponent} from "../../../components/ScreenComponent";
import Button from "../../../components/Button";
import {responsiveWidth} from "react-native-responsive-dimensions";
import {
fetchActivePaySubscription,
fetchActivePaySubscription, fetchCheckInsuranceCoverageAmount, fetchCheckInsuranceCoverageAmountReset,
fetchCreateConsultation,
fetchCreateConsultationReset,
fetchExecutionPrescription,
@ -55,7 +55,7 @@ import DropdownAlert from "react-native-dropdownalert";
import {readUser} from "../../../webservice/AuthApi";
import TextInput from "../../../components/TextInput";
import {
selectActivatePaySubscription,
selectActivatePaySubscription, selectCheckInsuranceCoverageAmount,
selectExecutionPrescription,
selectGetAmountConsultation,
selectGetConsultation,
@ -266,6 +266,9 @@ const ModifierFeuilleSoinScreen = ({
fetchGetDrugAppareil,
fetchModifyPrescription,
fetchGetNetworkActs,
fetchGetAmountConsultation,
fetchCheckInsuranceCoverageAmount,
checkInsuranceCoverageAmount,
getConsultation,
getUserByNameOrNumber,
getUserByIdQRCode,
@ -313,6 +316,7 @@ const ModifierFeuilleSoinScreen = ({
const [modalConsultation, setModalConsultation] = useState(false);
const [consultation, setConsultation] = useState(null);
const [consultationClone, setConsultationClone] = useState(null);
const [displayModalHistory, setDisplayModalHistory] = useState(false);
const [historyItemDetail, setHistoryItemDetail] = useState({});
@ -398,6 +402,8 @@ const ModifierFeuilleSoinScreen = ({
dispatch(fetchGetNetworkActsReset());
dispatch(fetchExecutionPrescriptionReset());
dispatch(fetchModifyPrescriptionReset());
dispatch(fetchCheckInsuranceCoverageAmountReset());
fetchGetProviderClass(wallet.id_network);
fetchGetNetworkActs(wallet.id_network, '');
@ -450,6 +456,8 @@ const ModifierFeuilleSoinScreen = ({
}, [getUserByNameOrNumber]);
useEffect(() => {
if (getConsultation.result !== null)
setModalConsultation(true);
@ -697,12 +705,26 @@ const ModifierFeuilleSoinScreen = ({
act: values.code_acte,
amount: values.amount_prestation,
home_visit_fees: values.frais_deplacement,
to_delete: false
to_delete: false,
} : performance;
})
});
setModalPrestation(false);
fetchCheckInsuranceCoverageAmount({
insurance_id: assure.id,
beneficiary_id: beneficiary !== null ? beneficiary.id : null,
care_condition: careConditon,
act_action: "UPDATE",
act_type: "PERFORMANCE",
act_id: values.code_acte.id,
performances: [
{
amount: values.amount_prestation,
home_visit_fees: values.frais_deplacement
}
],
});
}}>
{({
@ -783,6 +805,11 @@ const ModifierFeuilleSoinScreen = ({
value={values.amount_prestation}
onChangeText={(value) => {
setFieldValue('amount_prestation', value);
console.log({
network_id: wallet.id_network,
amount: '' + value,
care_condition: careConditon
});
fetchGetAmountConsultation({
network_id: wallet.id_network,
amount: '' + value,
@ -799,20 +826,20 @@ const ModifierFeuilleSoinScreen = ({
style={{marginTop: 10}}
placeholder={I18n.t('TICKET_MONDERATEUR')}
editable={false}
value={elementToSetPrice !== null ? elementToSetPrice.drugs === null
value={getAmountConsultation.result !== null ? getAmountConsultation.result.response.moderator_ticket :
elementToSetPrice !== null ? elementToSetPrice.drugs === null
? values.moderator_ticket
: getAmountConsultation.result !== null ? getAmountConsultation.result.response.moderator_ticket : ''
: getAmountConsultation.result !== null ? getAmountConsultation.result.response.moderator_ticket : ''}
: '' : ''}
/>
<TextInput
style={{marginTop: 10}}
placeholder={I18n.t('AMOUNT_PER_INSURANCE')}
editable={false}
value={elementToSetPrice !== null ? elementToSetPrice.drugs === null
? values.insurance_amount
: getAmountConsultation.result !== null ? getAmountConsultation.result.response.insurance_amount : ''
: getAmountConsultation.result !== null ? getAmountConsultation.result.response.insurance_amount : ''}/>
value={getAmountConsultation.result !== null ? getAmountConsultation.result.response.insurance_amount :
elementToSetPrice !== null ? elementToSetPrice.drugs === null
? values.moderator_ticket
: '' : ''}/>
<View style={{
marginTop: 10,
@ -852,6 +879,7 @@ const ModifierFeuilleSoinScreen = ({
}
<Button
loading={checkInsuranceCoverageAmount.loading}
style={{marginTop: 20, marginBottom: 20}}
full
onPress={() => {
@ -969,10 +997,11 @@ const ModifierFeuilleSoinScreen = ({
success={touched.amount_prestation && !errors.amount_prestation}
touched={touched.amount_prestation}
error={errors.amount_prestation}
onKeyPress={() => {
onChangeText={(text)=> {
setFieldValue('amount_prestation', text);
fetchGetAmountConsultation({
network_id: wallet.id_network,
amount: values.amount_prestation,
amount: '' + text,
care_condition: careConditon
});
}}
@ -2260,6 +2289,18 @@ const ModifierFeuilleSoinScreen = ({
return {...prescription, to_delete: false}
})
});
setConsultationClone({
...historyItemDetail,
exams: historyItemDetail.exams.map(exam => {
return {...exam, to_delete: false}
}),
performances: historyItemDetail.performances.map(performance => {
return {...performance, to_delete: false}
}),
prescriptions: historyItemDetail.prescriptions.map(prescription => {
return {...prescription, to_delete: false}
})
});
setCareCondition(historyItemDetail.care_condition);
setFieldValue(
'practitioner_firstname',
@ -3017,7 +3058,8 @@ const mapStateToProps = createStructuredSelector({
executionPrescription: selectExecutionPrescription,
getConsultation: selectGetConsultation,
getNetworkAct: selectGetNetworkAct,
modifyPrescription: selectModifyPrescription
modifyPrescription: selectModifyPrescription,
checkInsuranceCoverageAmount: selectCheckInsuranceCoverageAmount
});
export default connect(mapStateToProps, {
@ -3031,7 +3073,8 @@ export default connect(mapStateToProps, {
fetchGetAmountConsultation,
fetchGetConsultation,
fetchExecutionPrescription,
fetchModifyPrescription
fetchModifyPrescription,
fetchCheckInsuranceCoverageAmount
})(
ModifierFeuilleSoinScreen,
);

View File

@ -32,7 +32,7 @@ import {
fetchActivePaySubscription,
fetchActivePaySubscriptionReset,
fetchAddDrug,
fetchAddDrugReset,
fetchAddDrugReset, fetchCheckInsuranceCoverageAmount, fetchCheckInsuranceCoverageAmountReset,
fetchCreateConsultation,
fetchCreateConsultationReset,
fetchGetAmountConsultation,
@ -56,7 +56,7 @@ import TextInput from "../../../components/TextInput";
import {createStructuredSelector} from "reselect";
import {
selectActivatePaySubscription,
selectAddDrug,
selectAddDrug, selectCheckInsuranceCoverageAmount,
selectCreateConsultation,
selectGetAmountConsultation,
selectGetDrugAppareil,
@ -260,11 +260,13 @@ const SaisirFeuilleSoinScreen = ({
fetchGetNetworkActs,
fetchCreateConsultation,
fetchGetAmountConsultation,
fetchCheckInsuranceCoverageAmount,
getUserByNameOrNumber,
getUserByIdQRCode,
getDrugAppareil,
getProviderClass,
addDrug,
checkInsuranceCoverageAmount,
createConsultation,
getNetworkAct,
getAmountConsultation,
@ -375,6 +377,7 @@ const SaisirFeuilleSoinScreen = ({
dispatch(fetchGetNetworkActsReset());
dispatch(fetchGetProviderClassReset());
dispatch(fetchAddDrugReset());
dispatch(fetchCheckInsuranceCoverageAmountReset());
fetchGetProviderClass(wallet.id_network);
}, []);
@ -423,6 +426,101 @@ const SaisirFeuilleSoinScreen = ({
dispatch(fetchGetUserByNameOrNumberReset());*/
}
}, [getUserByNameOrNumber]);
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) {
Alert.alert(
I18n.t("ERROR_LABLE"),
Utils.getErrorMsg(getUserByNameOrNumber),
[
{
text: I18n.t("OK"), onPress: () => {
dispatch(fetchGetUserByNameOrNumberReset());
}
}
],
{ cancelable: false }
);
/* dropDownAlertRef.alertWithType(
'error',
I18n.t('ERROR_LABEL'),
Utils.getErrorMsg(getUserByNameOrNumber),
);
dispatch(fetchGetUserByNameOrNumberReset());*/
}
}, [getUserByNameOrNumber]);
useEffect(() => {
console.log("checkInsuranceCoverageAmount.result", checkInsuranceCoverageAmount);
console.log("Prestations", prestations);
if (checkInsuranceCoverageAmount.result !== null) {
if (checkInsuranceCoverageAmount.result.response !== null) {
if(prestations !== null) {
setModalPrestation(false);
Utils.displayToast(I18n.t('PRESTATION_SUCCESSFULLY_ADD'));
}
/* if(examens !== null) {
setModalExamen(false);
Utils.displayToast(I18n.t('EXAMENS_SUCCESSFULLY_ADD'));
}
if(prescriptions !== null) {
setModalMedicament(false);
Utils.displayToast(I18n.t('PRESCRIPTIONS_SUCCESSFULLY_ADD'));
}*/
dispatch(fetchCheckInsuranceCoverageAmountReset());
}
}
if (checkInsuranceCoverageAmount.error) {
Alert.alert(
I18n.t("INFORMATION_MESSAGE"),
Utils.getErrorMsg(checkInsuranceCoverageAmount),
[
{
text: I18n.t("OK"), onPress: () => {
if(prestations !== null) {
let newPrestation = [...prestations];
newPrestation.shift();
setPrestations(newPrestation);
setModalPrestation(false);
}
/* if(examens !== null) {
setModalExamen(false);
}
if(prescriptions !== null) {
setModalMedicament(false);
}*/
dispatch(fetchCheckInsuranceCoverageAmountReset());
}
}
],
{ cancelable: false }
);
/* dropDownAlertRef.alertWithType(
'error',
I18n.t('ERROR_LABEL'),
Utils.getErrorMsg(getUserByNameOrNumber),
);
dispatch(fetchGetUserByNameOrNumberReset());*/
}
}, [checkInsuranceCoverageAmount]);
useEffect(() => {
if (getDrugAppareil.result !== null) {
@ -695,8 +793,19 @@ const SaisirFeuilleSoinScreen = ({
amount: values.amount_prestation,
home_visit_fees: values.frais_deplacement
}, ...prestations]);
setModalPrestation(false);
Utils.displayToast(I18n.t('PRESTATION_SUCCESSFULLY_ADD'));
fetchCheckInsuranceCoverageAmount({
insurance_id: assure.id,
beneficiary_id: beneficiary !== null ? beneficiary.id : null,
care_condition: careConditon,
act_action: "INSERT",
act_type: "PERFORMANCE",
performances: [
{
amount: values.amount_prestation,
home_visit_fees: values.frais_deplacement
}
],
});
}
}}>
@ -773,18 +882,19 @@ const SaisirFeuilleSoinScreen = ({
style={{marginTop: 10}}
placeholder={I18n.t('AMOUNT')}
value={values.amount_prestation}
onChangeText={handleChange('amount_prestation')}
onBlur={handleBlur('amount_prestation')}
success={touched.amount_prestation && !errors.amount_prestation}
touched={touched.amount_prestation}
error={errors.amount_prestation}
onKeyPress={() => {
onChangeText={(text)=> {
setFieldValue('amount_prestation', text);
fetchGetAmountConsultation({
network_id: wallet.id_network,
amount: values.amount_prestation,
amount: '' + text,
care_condition: careConditon
});
}}
onBlur={handleBlur('amount_prestation')}
success={touched.amount_prestation && !errors.amount_prestation}
touched={touched.amount_prestation}A
error={errors.amount_prestation}
/>
<TextInput
@ -840,6 +950,7 @@ const SaisirFeuilleSoinScreen = ({
<Button
style={{marginTop: 20, marginBottom: 20}}
full
loading={checkInsuranceCoverageAmount.loading}
onPress={handleSubmit}>
{I18n.t('SUBMIT_LABEL')}
</Button>
@ -864,8 +975,8 @@ const SaisirFeuilleSoinScreen = ({
dosage: values.drug_posologie,
quantity: values.drug_quantity
}, ...prescriptions]);
setModalMedicament(false);
Utils.displayToast(I18n.t('PRESCRIPTIONS_SUCCESSFULLY_ADD'));
setModalMedicament(false);
}}>
{({
@ -2071,7 +2182,8 @@ const mapStateToProps = createStructuredSelector({
getProviderClass: selectGetProviderClass,
createConsultation: selectCreateConsultation,
getNetworkAct: selectGetNetworkAct,
getAmountConsultation: selectGetAmountConsultation
getAmountConsultation: selectGetAmountConsultation,
checkInsuranceCoverageAmount: selectCheckInsuranceCoverageAmount
});
export default connect(mapStateToProps, {
@ -2084,7 +2196,8 @@ export default connect(mapStateToProps, {
fetchGetProviderClass,
fetchGetNetworkActs,
fetchCreateConsultation,
fetchGetAmountConsultation
fetchGetAmountConsultation,
fetchCheckInsuranceCoverageAmount
})(
SaisirFeuilleSoinScreen,
);

View File

@ -260,6 +260,22 @@ export const nanoCreditHistoryLabel = () => {
},
]
}
export const nanoSanteHistoryLabel = () => {
return [
{
icon: 'inbox-arrow-up',
label: 'ID'
},
{
icon: 'cash',
label: 'AMOUNT_LABEL'
},
{
icon: 'account',
label: 'INSTITUTE_NAME'
},
]
}
export const transactionHistoryNanoCreditLabel = () => {
return [
/*{
@ -489,32 +505,42 @@ export const optionNanoSanteUserScreen = {
{
title: 'SUBSCRIBE_ASSURANCE',
screen: 'insuranceSubscriptionScreen',
icon: 'cash'
icon: 'file-medical',
iconType:"FontAwesome5"
},
{
title: 'ADD_SUBSCRIBE',
screen: 'addBeneficiaryScreen',
icon: "cash-refund"
icon: "user-plus",
iconType:"FontAwesome5"
},
{
title: 'ACTIVATE_INSSURANCE',
screen: 'activateBuySubscriptionScreen',
icon: "cash-refund"
icon: "check-circle",
iconType:"FontAwesome5"
},
{
title: 'RENEW_INSSURANCE',
screen: 'renewAssuranceScreen',
icon: "cash-refund"
icon: "sync",
iconType:"FontAwesome5"
},
{
screen: 'deleteBeneficiaryScreen',
icon: 'cash-register',
icon: 'user-minus',
title: 'DELETE_SUBSCRIBE',
iconType:"FontAwesome5"
},
{
screen: 'stopSubscriptionScreen',
icon: 'cash-multiple',
icon: 'hand-spock',
title: 'STOP_SUBSCRIBE',
iconType:"FontAwesome5"
},
]
},
@ -522,19 +548,23 @@ export const optionNanoSanteUserScreen = {
title: 'MANAGE_HEALTH',
options: [
{
icon: 'account-multiple',
icon: 'book-medical',
title: 'DEMAND_AUTORIZATION_HEALTH',
screen: 'demandeAutorisationSoinScreen'
screen: 'demandeAutorisationSoinScreen',
iconType:"FontAwesome5"
},
{
title: 'HISTORIC_HEALTH',
screen: 'historiqueNanoSanteUserScreen',
icon: 'cash'
icon: 'history',
iconType:"FontAwesome5"
},
{
title: 'VALID_HEALTH',
screen: 'validateConsultationScreen',
icon: 'cash'
icon: 'check-circle',
iconType:"FontAwesome5"
},
]
},
@ -617,23 +647,33 @@ export const optionNanoSanteAgentScreen = {
options: [
{
screen: route.saisirFeuilleSoinScreen,
icon: 'user-plus',
icon: 'file-medical',
title: 'SAISIR_FEUILLE_SOIN',
iconType:"FontAwesome5"
},
{
screen: route.executerPrescriptionScreen,
icon: 'edit',
icon: 'check-circle',
title: 'EXECUTER_PRESCRIPTION',
iconType:"FontAwesome5"
},
{
screen: route.modifierFeuilleSoinScreen,
icon: 'edit',
title: 'MODIFY_CONSULTATION',
iconType:"FontAwesome5"
},
{
screen: route.modifierExecutionPrescriptionScreen,
icon: 'edit',
title: 'MODIFY_EXECUTION',
iconType:"FontAwesome5"
},
{
screen: route.historiqueNanoSanteAgentScreen,
icon: 'history',
title: 'HISTORY',
iconType:"FontAwesome5"
}
]
}

View File

@ -662,7 +662,7 @@
"MEDICAMENT": "Médicament",
"EXAMEN": "Examen",
"PRESTATION_SUCCESSFULLY_ADD": "Prestation ajouté avec succès",
"EXAMENS_SUCCESSFULLY_ADD": "Examens ajouté avec succès",
"EXAMENS_SUCCESSFULLY_ADD": "Examen ajouté avec succès",
"PRESCRIPTIONS_SUCCESSFULLY_ADD": "Prescription ajouté avec succès",
"PRESCRIPTIONS_SUCCESSFULLY_MODIFY": "Prescription modifié avec succès",
"YOU_MUST_ADD_AT_LEAST_ONE_PRESTATION": "Vous devez ajouter au moins une prestation",
@ -677,7 +677,7 @@
"PLEASE_SELECT_CONDITON_PRISE_CHARGE_FIRST": "Veuillez d'abord sélectionner la conditon de prise en charge",
"CONSULTATION": "Consultation",
"STATE": "Etat",
"INSTITUTE_NAME": "Nom de l'institut",
"INSTITUTE_NAME": "Nom de l'institution",
"ACCEPT": "Accepter",
"REJECT": "Rejeter",
"DETAIL": "Détail",
@ -709,5 +709,10 @@
"AGENT_VALIDEUR": "Agent valideur",
"TEXT_SUPPRESS_CONFIRM_BENEFICIARY": "Voulez vous vraiment supprimer cet ayant droit ?",
"ENTER_PASSWORD_TO_VALID_MODIFICATION": "Renseigner votre mot de passe et valider la suppression de l'ayant pour le supprimé définitivement",
"PLEASE_SELECT_AT_LEAST_ASSURE": "Veuillez sélectionner au moins un ayant droit"
"PLEASE_SELECT_AT_LEAST_ASSURE": "Veuillez sélectionner au moins un ayant droit",
"ID": "ID",
"INVOICE_ID": "ID facture",
"INVOICE": "Facture",
"HISTORY": "Historique",
"INFORMATION_MESSAGE": "Message d'information"
}

View File

@ -1,3 +1,5 @@
import {fetchCheckInsuranceCoverageAmountPending} from "../redux/insurance/insurance.actions";
export const isDebugMode = false
//base url test
//export const baseUrl = "https://ilink-app.com/mobilebackendbeta"
@ -9,6 +11,7 @@ export const isDebugMode = false
export const baseUrl = "http://test.ilink-app.com:8080/mobilebackend";
export const testBaseUrl = "https://test.ilink-app.com";
export const testBaseUrlWithPort = "https://test.ilink-app.com:8086";
/*export const baseUrl = "https://ilink-app.com/mobilebackend";
export const testBaseUrl = "https://ilink-app.com:8080";*/
@ -81,7 +84,10 @@ export const getIlinkBankListUrl = testBaseUrl + '/walletService/wallets/users/b
export const linkBankAccountUrl = testBaseUrl + '/walletService/wallets/users/link_bank_account';
export const payBillUrl = testBaseUrl + '/walletService/transactions/ilink';
export const facturerSoinUrl = testBaseUrl + '/nanoSanteService/generate-invoice';
export const invoiceUrl = testBaseUrl + '/nanoSanteService/invoices';
export const getInsuranceListUrl = testBaseUrl + '/nanoSanteService/insurances';
export const checkInsuranceCoverageAmountUrl = testBaseUrl + '/nanoSanteService/health-care-sheets/check-insurance-coverage-amount';
export const getUserByIdQRCodeUrl = testBaseUrl + '/nanoSanteService/qrcode/read';
export const getUserByNameOrNumberUrl = testBaseUrl + '/nanoSanteService/insured';
export const getDrugAndDevicesUrl = testBaseUrl + '/nanoSanteService/drugs-and-devices';
@ -94,7 +100,8 @@ export const consultationUrl = testBaseUrl + '/nanoSanteService/health-care-shee
export const getAmountConsultationUrl = testBaseUrl + '/nanoSanteService/health-care-sheets/performances-amount';
export const getInsurancePrimeAmountUrl = testBaseUrl + '/nanoSanteService/insurances/subscriptions/bonus-amount';
export const autorisationCareRequestUrl = testBaseUrl + '/nanoSanteService/authorizations-care-requests';
export const uploadInsuranceImagetUrl = 'https://test.ilink-app.com:8086/insurances/subscriptions/upload-images';
export const uploadInsuranceImagetUrl = testBaseUrlWithPort + '/insurances/subscriptions/upload-images';
export const pdfViewerUrl = testBaseUrlWithPort + '/pdf-viewer';
export const authKeyUrl = testBaseUrl + '/oauth/token';
export const videoUrl = "https://www.youtube.com/watch?v=wwGPDPsSLWY";

View File

@ -9,6 +9,10 @@ import {
fetchCreateGroupPending,
fetchCreateGroupReset,
fetchCreateGroupSuccess,
fetchFacturerSoinError,
fetchFacturerSoinPending,
fetchFacturerSoinReset,
fetchFacturerSoinSuccess,
fetchGetEpargneInProgressError,
fetchGetEpargneInProgressPending,
fetchGetEpargneInProgressReset,
@ -21,6 +25,9 @@ import {
fetchGetNanoCreditUserHistoryInProgressPending,
fetchGetNanoCreditUserHistoryInProgressReset,
fetchGetNanoCreditUserHistoryInProgressSuccess,
fetchInvoiceHistoryError,
fetchInvoiceHistoryPending, fetchInvoiceHistoryReset,
fetchInvoiceHistorySuccess,
fetchJoinGroupError,
fetchJoinGroupPending,
fetchJoinGroupReset,
@ -33,10 +40,10 @@ import {
import {store} from "../redux/store";
import {
askNanoCreditUrl,
cancelDemandUrl, getHistoryEpargnePendingUrl,
cancelDemandUrl, consultationUrl, facturerSoinUrl, getHistoryEpargnePendingUrl,
getHistoryNanoPendingCreditUrl,
getNanoCreditDemandDureationUrl,
groupUrl,
groupUrl, invoiceUrl,
joinGroupUrl,
treatDemandUrl
} from "./IlinkConstants";
@ -310,6 +317,8 @@ export const getEpargneInProgressReset = () => {
dispatch(fetchGetEpargneInProgressReset());
}
}
export const getNanoCreditUserHistoryInProgressAction = (data) => {
const auth = store.getState().authKeyReducer;
@ -340,9 +349,106 @@ export const getNanoCreditUserHistoryInProgressAction = (data) => {
});
}
}
export const getNanoCreditUserHistoryInProgressReset = () => {
return dispatch => {
dispatch(fetchGetNanoCreditUserHistoryInProgressReset());
}
}
export const facturerSoinAction = (otherParam) => {
const auth = store.getState().authKeyReducer;
const authKey = auth !== null ? `${auth.authKey.token_type} ${auth.authKey.access_token}` : '';
return dispatch => {
dispatch(fetchFacturerSoinPending());
axios({
url: `${facturerSoinUrl}${otherParam}`,
method: 'GET',
headers: {
'Authorization': authKey,
'X-Localization': I18n.currentLocale()
}
})
.then(response => {
console.log(response);
dispatch(fetchFacturerSoinSuccess(response));
})
.catch(error => {
if (error.response)
dispatch(fetchFacturerSoinError(error.response));
else if (error.request)
dispatch(fetchFacturerSoinError(error.request))
else
dispatch(fetchFacturerSoinError(error.message))
});
}
}
export const facturerSoinReset = () => {
return dispatch => {
dispatch(fetchFacturerSoinReset());
}
}
export const getInvoiceHistoryAction = (otherParam) => {
const auth = store.getState().authKeyReducer;
const authKey = auth !== null ? `${auth.authKey.token_type} ${auth.authKey.access_token}` : '';
return dispatch => {
dispatch(fetchInvoiceHistoryPending());
axios({
url: `${invoiceUrl}${otherParam}`,
method: 'GET',
headers: {
'Authorization': authKey,
'X-Localization': I18n.currentLocale()
}
})
.then(response => {
console.log(response);
dispatch(fetchInvoiceHistorySuccess(response));
})
.catch(error => {
if (error.response)
dispatch(fetchInvoiceHistoryError(error.response));
else if (error.request)
dispatch(fetchInvoiceHistoryError(error.request))
else
dispatch(fetchInvoiceHistoryError(error.message))
});
}
}
export const getInvoiceHistoryReset = () => {
return dispatch => {
dispatch(fetchInvoiceHistoryReset());
}
}
export const getSoinHistoryAction = (user_id, state = 'UNTREATED', typeParam = 'CONSULTATION', otherParam = '') => {
const auth = store.getState().authKeyReducer;
const authKey = auth !== null ? `${auth.authKey.token_type} ${auth.authKey.access_token}` : '';
return dispatch => {
dispatch(fetchInvoiceHistoryPending());
axios({
url: `${consultationUrl}?network_agent_id=${user_id}&state=${state}&type=${typeParam}${otherParam}`,
method: 'GET',
headers: {
'Authorization': authKey,
'X-Localization': I18n.currentLocale()
}
})
.then(response => {
console.log(response);
dispatch(fetchInvoiceHistorySuccess(response));
})
.catch(error => {
if (error.response)
dispatch(fetchInvoiceHistoryError(error.response));
else if (error.request)
dispatch(fetchInvoiceHistoryError(error.request))
else
dispatch(fetchInvoiceHistoryError(error.message))
});
}
}

View File

@ -2224,6 +2224,11 @@
"resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz"
"version" "1.0.0"
"base-64@0.1.0":
"integrity" "sha1-eAqZyE59YAJgNhURxId2E78k9rs="
"resolved" "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz"
"version" "0.1.0"
"base@^0.11.1":
"integrity" "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg=="
"resolved" "https://registry.npmjs.org/base/-/base-0.11.2.tgz"
@ -2882,6 +2887,11 @@
"shebang-command" "^1.2.0"
"which" "^1.2.9"
"crypto-js@^3.2.0":
"integrity" "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q=="
"resolved" "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz"
"version" "3.3.0"
"css-select-base-adapter@^0.1.1":
"integrity" "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
"version" "0.1.1"
@ -4013,7 +4023,7 @@
"is-glob" "^3.1.0"
"path-dirname" "^1.0.0"
"glob@^7.0.0", "glob@^7.1.1", "glob@^7.1.2", "glob@^7.1.3":
"glob@^7.0.0", "glob@^7.1.1", "glob@^7.1.2", "glob@^7.1.3", "glob@^7.1.6":
"integrity" "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="
"resolved" "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
"version" "7.1.6"
@ -6900,6 +6910,14 @@
dependencies:
"@react-native-community/viewpager" "^3.3.0"
"react-native-blob-util@^0.14.0":
"integrity" "sha512-cr2Tw5VdvUijreMdnBYmsBVQvxwiLWKe37UG8dPnPJ8sQ8rZJQo9IfpfPho+w/8fWrKqCJAoTSLpHI1ar059ew=="
"resolved" "https://registry.npmjs.org/react-native-blob-util/-/react-native-blob-util-0.14.0.tgz"
"version" "0.14.0"
dependencies:
"base-64" "0.1.0"
"glob" "^7.1.6"
"react-native-blur-overlay@^1.0.6":
"integrity" "sha512-2RuyMoy1ZZzY+3Li2wBwAfn6Z46oNG7/zgVCTF77v2/ttmKzEJivUpcNvysYE1vzrwIdnuz4GZu9kC4FQ4qyEg=="
"resolved" "https://registry.npmjs.org/react-native-blur-overlay/-/react-native-blur-overlay-1.0.7.tgz"
@ -7186,6 +7204,13 @@
"react-lifecycles-compat" "^3.0.4"
"react-native-safe-area-view" "^0.12.0"
"react-native-pdf@^6.4.0":
"integrity" "sha512-pfrCvHg4dqAPzl2FtRmGGl/D2dHec4w8+wGAKv7L97wxz5oF/QNvQ6q0KdfXdFlIZ22sS+BOwsRMzbB2mHPs2w=="
"resolved" "https://registry.npmjs.org/react-native-pdf/-/react-native-pdf-6.4.0.tgz"
"version" "6.4.0"
dependencies:
"crypto-js" "^3.2.0"
"react-native-permissions@^2.0.2":
"integrity" "sha512-ihf4shQDSX5Oo9ChQXb9kr13mmyyNem5MaEvOpr3dCjhBOBWyEMztXm9/uPK1Qg5PsNpaYLa1KpcPZDCw87LXg=="
"resolved" "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-2.2.2.tgz"