Clean Stores (#199)

This commit is contained in:
Aaron DeRuvo
2025-02-21 16:05:57 +01:00
committed by GitHub
parent 83f3f53702
commit 5d9e959444
7 changed files with 24 additions and 91 deletions

View File

@@ -18,7 +18,7 @@
"ios": "react-native run-ios",
"lint": "eslint .",
"lint:fix": "eslint --fix .",
"nice": "yarn fmt:fix && yarn lint:fix",
"nice": "yarn lint:fix && yarn fmt:fix",
"reinstall": "yarn clean && yarn install && yarn install-app",
"start": "watchman watch-del-all && react-native start",
"test": "jest --passWithNoTests"

View File

@@ -36,12 +36,11 @@ const LoadingScreen: React.FC<LoadingScreenProps> = ({}) => {
}, 3000);
};
const [animationSource, setAnimationSource] = useState<any>(miscAnimation);
const { registrationStatus, resetProof, setProofVerificationResult } =
useProofInfo();
const { registrationStatus, resetProof } = useProofInfo();
const { getPassportDataAndSecret, clearPassportData } = usePassport();
useEffect(() => {
setProofVerificationResult(null);
// TODO this makes sense if reset proof was only about passport registration
resetProof();
}, []);

View File

@@ -22,8 +22,7 @@ import {
} from '../../utils/haptic';
const SuccessScreen: React.FC = () => {
const { selectedApp, proofVerificationResult, disclosureStatus } =
useProofInfo();
const { selectedApp, disclosureStatus } = useProofInfo();
const appName = selectedApp?.appName;
const goHome = useHapticNavigation('Home');
@@ -40,24 +39,6 @@ const SuccessScreen: React.FC = () => {
}
}, [disclosureStatus]);
useEffect(() => {
if (!proofVerificationResult) {
return;
}
const failedConditions = [];
for (const field of fieldsToCheck) {
console.log(
`Checking field ${field}: ${JSON.stringify(
(proofVerificationResult as any)[field],
)}`,
);
if ((proofVerificationResult as any)[field] === false) {
failedConditions.push(formatFieldName(field));
}
}
console.log('Failed conditions:', JSON.stringify(failedConditions));
}, [proofVerificationResult]);
return (
<ExpandableBottomLayout.Layout backgroundColor={white}>
<StatusBar barStyle="dark-content" backgroundColor={white} />
@@ -152,37 +133,6 @@ function Info({
}
}
const formatFieldName = (field: string) => {
return field
.split('_')
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
.join(' ');
};
const fieldsToCheck = [
'scope',
'merkle_root_commitment',
'merkle_root_csca',
'attestation_id',
'current_date',
'issuing_state',
'name',
'passport_number',
'nationality',
'date_of_birth',
'gender',
'expiry_date',
'older_than',
'owner_of',
'blinded_dsc_commitment',
'proof',
'dscProof',
'dsc',
'pubKey',
'ofac',
'forbidden_countries_list',
];
export default SuccessScreen;
export const styles = StyleSheet.create({

View File

@@ -40,7 +40,7 @@ import {
const ProveScreen: React.FC = () => {
const { navigate } = useNavigation();
const { getPassportDataAndSecret } = usePassport();
const { selectedApp, resetProof } = useProofInfo();
const { selectedApp } = useProofInfo();
const { handleProofVerified } = useApp();
const selectedAppRef = useRef(selectedApp);
@@ -84,7 +84,6 @@ const ProveScreen: React.FC = () => {
const onVerify = useCallback(
async function () {
resetProof();
buttonTap();
if (isProcessingRef.current) {
return;
@@ -140,7 +139,7 @@ const ProveScreen: React.FC = () => {
isProcessingRef.current = false;
}
},
[navigate, getPassportDataAndSecret, handleProofVerified, resetProof],
[navigate, getPassportDataAndSecret, handleProofVerified],
);
async function sendMockPayload() {

View File

@@ -73,6 +73,7 @@ const QRCodeViewFinderScreen: React.FC<QRCodeViewFinderScreenProps> = ({}) => {
return;
}
// TODO (_): cleaning here makes sense, clean app should set the disclosure states to default too
// Clean up first
cleanSelfApp();

View File

@@ -20,22 +20,30 @@ export enum ProofStatusEnum {
interface IProofContext {
registrationStatus: ProofStatusEnum;
disclosureStatus: ProofStatusEnum;
proofVerificationResult: unknown;
selectedApp: SelfApp;
setSelectedApp: (app: SelfApp) => void;
cleanSelfApp: () => void;
setProofVerificationResult: (result: unknown) => void;
resetProof: () => void;
}
const defaults: IProofContext = {
registrationStatus: ProofStatusEnum.PENDING,
disclosureStatus: ProofStatusEnum.PENDING,
proofVerificationResult: null,
selectedApp: {} as SelfApp,
selectedApp: {
appName: '',
logoBase64: '',
scope: '',
endpointType: 'https',
endpoint: '',
header: '',
sessionId: '',
userId: '',
userIdType: 'uuid',
devMode: true,
disclosures: {},
},
setSelectedApp: (_: SelfApp) => undefined,
cleanSelfApp: () => undefined,
setProofVerificationResult: (_: unknown) => undefined,
resetProof: () => undefined,
};
@@ -58,8 +66,7 @@ export function ProofProvider({ children }: PropsWithChildren<{}>) {
const [disclosureStatus, setDisclosureStatus] = useState<ProofStatusEnum>(
ProofStatusEnum.PENDING,
);
const [proofVerificationResult, setProofVerificationResult] =
useState<unknown>(defaults.proofVerificationResult);
const [selectedApp, setSelectedAppInternal] = useState<SelfApp>(
defaults.selectedApp,
);
@@ -69,31 +76,18 @@ export function ProofProvider({ children }: PropsWithChildren<{}>) {
return;
}
setRegistrationStatus(ProofStatusEnum.PENDING);
setProofVerificationResult(null);
setSelectedAppInternal(app);
}, []);
const cleanSelfApp = useCallback(() => {
const emptySelfApp: SelfApp = {
appName: '',
logoBase64: '',
scope: '',
endpointType: 'https',
endpoint: '',
header: '',
sessionId: '',
userId: '',
userIdType: 'uuid',
devMode: true,
disclosures: {},
};
setSelectedAppInternal(emptySelfApp);
setSelectedAppInternal(defaults.selectedApp);
}, []);
// why do we have both resetProof and cleanSelfApp?
// possible we can make resetProof only about registration status, and clean app about disclosures status
const resetProof = useCallback(() => {
setRegistrationStatus(ProofStatusEnum.PENDING);
setDisclosureStatus(ProofStatusEnum.PENDING);
setProofVerificationResult(null);
setSelectedAppInternal(defaults.selectedApp);
}, []);
@@ -117,17 +111,14 @@ export function ProofProvider({ children }: PropsWithChildren<{}>) {
() => ({
registrationStatus,
disclosureStatus,
proofVerificationResult,
selectedApp,
setSelectedApp,
cleanSelfApp,
setProofVerificationResult,
resetProof,
}),
[
registrationStatus,
disclosureStatus,
proofVerificationResult,
selectedApp,
setSelectedApp,
cleanSelfApp,

View File

@@ -1,5 +1,3 @@
import { resetGenericPassword } from 'react-native-keychain';
import { DEFAULT_DOB, DEFAULT_DOE, DEFAULT_PNUMBER } from '@env';
import { create } from 'zustand';
@@ -7,7 +5,6 @@ interface UserState {
passportNumber: string;
dateOfBirth: string;
dateOfExpiry: string;
clearSecretFromStorage: () => void;
update: (patch: any) => void;
deleteMrzFields: () => void;
}
@@ -17,10 +14,6 @@ const useUserStore = create<UserState>((set, get) => ({
dateOfBirth: DEFAULT_DOB ?? '',
dateOfExpiry: DEFAULT_DOE ?? '',
clearSecretFromStorage: async () => {
await resetGenericPassword({ service: 'secret' });
},
update: patch => {
set({
...get(),