import type { MockCode } from '../../bluetooth/readMeter';
import type { ReadStrategy } from '../../parsing/ReadStrategy';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { View } from 'react-native';
import ReadingResult from './components/ReadingResult';
import RetryTakingReading from './components/RetryTakingReading';
import TakingReading from './components/TakingReading';
import ParcialReading from './components/ParcialReading';
import { STEPS } from './constants';
import styles from './styles';
import NoProbeWrapper from '../NoProbeWrapper';
interface StepsTranslations {
probeReadyToReadTitle: string;
probeReadyToReadDescription: string;
probeReadyToReadTextButton: string;
takingReadingTitle: string;
takingReadingDescription: string;
takingReadingTextButton: string;
readingResultTitle: string;
readingResultTextButton: string;
retryTakingReadingTitle: string;
retryTakingReadingTextButton: string;
meterFamilyTypePrepositionBadge: string;
genericErrorInTakingReading: string;
timeoutError: string;
}
interface ParcialReadingTranslations {
probeReadyToReadTitle: string;
probeReadyToReadDescription: string;
probeReadyToReadTextButton: string;
takingReadingTitle: string;
takingReadingDescription: string;
takingReadingTextButton: string;
meterFamilyTypePrepositionBadge: string;
timeoutError: string;
}
interface ReadingTimeouts {
maxWaitTimePerProbeInteraction: number;
probeReadingTimeoutInMilliseconds: number;
}
interface Props {
onClose: Function;
translations: StepsTranslations;
onSuccess: Function;
loadingCurrentDevice: boolean;
mockCode?: MockCode;
readStrategy: ReadStrategy;
reconnectionOrLinkWithProbeTranslations: any;
goToProbeProbePairing: Function;
readingDisabled: boolean;
recoverMeterNumber?: Function | undefined;
skipReadingResult?: boolean | undefined;
parcialReadingWithProbeTranslations?: ParcialReadingTranslations | undefined;
children?: any;
timeoutRef?: any;
readingTimeouts?: ReadingTimeouts | undefined;
meterTypeCode: string | undefined;
showFamilyBadgeLibrary: boolean;
}
const ProbeReading = ({
onClose,
translations,
onSuccess,
loadingCurrentDevice,
readStrategy,
mockCode,
reconnectionOrLinkWithProbeTranslations,
goToProbeProbePairing,
readingDisabled,
recoverMeterNumber,
skipReadingResult = false,
parcialReadingWithProbeTranslations,
children,
timeoutRef,
readingTimeouts,
meterTypeCode,
showFamilyBadgeLibrary = true,
}: Props) => {
const [currentStep, setCurrentStep] = useState(
recoverMeterNumber ? ParcialReading.name : TakingReading.name,
);
const [readingResult, setReadingResult] = useState(null);
const [error, setError] = useState('');
const meterFamilyType = readStrategy.name;
const onError = useCallback(
({ message }) => {
setError(message ?? translations.genericErrorInTakingReading);
},
[translations.genericErrorInTakingReading],
);
useEffect(() => {
if ((readingResult != null || error) && skipReadingResult) {
if (!error) {
onSuccess(readingResult);
} else {
onClose(error);
}
}
}, [readingResult, error, skipReadingResult, onSuccess, onClose]);
const stepProps = useMemo(
() => ({
[ParcialReading.name]: {
onPress: () => setCurrentStep(TakingReading.name),
translations: parcialReadingWithProbeTranslations,
closeProbeReading: onClose,
meterFamilyType,
setReadingResult,
onError,
mockCode,
readStrategy,
loadingCurrentDevice,
readingDisabled,
recoverMeterNumber,
children,
timeoutRef,
readingTimeouts,
showFamilyBadgeLibrary,
},
[TakingReading.name]: {
translations,
closeProbeReading: onClose,
meterFamilyType,
setReadingResult,
onError,
mockCode,
readStrategy,
loadingCurrentDevice,
readingDisabled,
recoverMeterNumber,
children,
timeoutRef,
readingTimeouts,
meterTypeCode,
showFamilyBadgeLibrary,
},
[RetryTakingReading.name]: {
onPress: () => setCurrentStep(TakingReading.name),
translations,
meterFamilyType,
children,
showFamilyBadgeLibrary,
},
}),
[
parcialReadingWithProbeTranslations,
onClose,
meterFamilyType,
onError,
mockCode,
readStrategy,
loadingCurrentDevice,
meterTypeCode,
readingDisabled,
recoverMeterNumber,
children,
timeoutRef,
readingTimeouts,
translations,
showFamilyBadgeLibrary,
],
);
const CurrentStepComponent = useMemo(() => {
if (!STEPS[currentStep]) {
return () => null;
}
return STEPS[currentStep];
}, [currentStep]);
if ((readingResult != null || error) && !skipReadingResult) {
return (
);
} else {
return (
);
}
};
export default ProbeReading;