Files
self/app/src/proving/loadingScreenStateText.ts
Justin Hernandez 551067a48e Reorganize mobile app /src and /tests folders (#1357)
* Refactor mobile app utilities into new modules

* prettier

* update lock, feedback from codex

* fix path

* keep some files in utils

* fix tests

* update paths

* remove old docs

* cr feedback

* flatten inefficient paths

* better structure

* update test folder structure

* migrate images

* fix import

* fix Sentry path

* update ignore

* save wip migration

* more updates

* standardize component names

* rename assets

* fix linting

* add barrel exports. final refactor commit

* fix formatting

* fix nav bar

* reduce bundle size

* remove dupe license

* fix test

* fix merge issues

* add refactor doc so we can track what was imporoved

* cr feedback

* feedback
2025-11-20 17:56:44 -03:00

191 lines
5.6 KiB
TypeScript

// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.
import type {
provingMachineCircuitType,
ProvingStateType,
} from '@selfxyz/mobile-sdk-alpha';
interface LoadingScreenText {
actionText: string;
actionSubText: string;
estimatedTime: string;
statusBarProgress: number;
}
export function getLoadingScreenText(
state: ProvingStateType,
signatureAlgorithm: string,
curveOrExponent: string,
type: provingMachineCircuitType,
): LoadingScreenText {
// Helper function to calculate progress with type offset
const getStatusBarProgress = (baseProgress: number): number => {
return baseProgress + (type === 'register' ? 3 : 0);
};
switch (state) {
// Initial states
case 'idle':
return {
actionText: 'Initializing',
actionSubText: 'Retrieving ID data from the keychain',
estimatedTime: '3 - 15 SECONDS',
statusBarProgress: getStatusBarProgress(0),
};
case 'parsing_id_document':
return {
actionText: 'Initializing',
actionSubText: 'Parsing ID data',
estimatedTime: '3 - 15 SECONDS',
statusBarProgress: getStatusBarProgress(0),
};
// Data preparation states
case 'fetching_data':
return {
actionText: 'Reading registry',
actionSubText: 'Reading current state of the registry',
estimatedTime: '2 - 5 SECONDS',
statusBarProgress: getStatusBarProgress(1),
};
case 'validating_document':
return {
actionText: 'Validating ID',
actionSubText: 'Validating ID data locally',
estimatedTime: '2 - 5 SECONDS',
statusBarProgress: getStatusBarProgress(1),
};
// Connection states
case 'init_tee_connexion':
return {
actionText: 'Securing connection',
actionSubText: 'Establishing secure connection to the registry',
estimatedTime: '2 - 5 SECONDS',
statusBarProgress: getStatusBarProgress(2),
};
case 'listening_for_status':
return {
actionText: 'Securing connection',
actionSubText: 'Establishing secure connection to the registry',
estimatedTime: '2 - 5 SECONDS',
statusBarProgress: getStatusBarProgress(2),
};
// Proving states
case 'ready_to_prove':
return {
actionText: 'Securing connection',
actionSubText: 'Establishing secure connection to the registry',
estimatedTime: '2 - 5 SECONDS',
statusBarProgress: getStatusBarProgress(2),
};
case 'proving':
return {
actionText: 'Proving',
actionSubText: 'Generating the ZK proof',
statusBarProgress: getStatusBarProgress(2),
estimatedTime:
signatureAlgorithm && curveOrExponent
? getProvingTimeEstimate(signatureAlgorithm, curveOrExponent, type)
: '30 - 90 SECONDS',
};
case 'post_proving':
return {
actionText: 'Verifying',
actionSubText: 'Waiting for verification of the ZK proof',
statusBarProgress: getStatusBarProgress(2),
estimatedTime: '1 - 2 SECONDS',
};
// Success state
case 'completed':
return {
actionText: 'Verified',
actionSubText: 'Verification completed',
statusBarProgress: getStatusBarProgress(3),
estimatedTime: '0 - 1 SECONDS',
};
// Error states
case 'error':
case 'failure':
return {
actionText: 'Verification failed',
actionSubText: 'Verification failed',
statusBarProgress: getStatusBarProgress(0),
estimatedTime: '0 - 1 SECONDS',
};
// Special case states
case 'passport_not_supported':
return {
actionText: 'Unsupported passport',
actionSubText: 'Unsupported passport',
estimatedTime: '1 - 3 SECONDS',
statusBarProgress: getStatusBarProgress(0),
};
case 'account_recovery_choice':
return {
actionText: 'Account recovery needed',
actionSubText: 'Account recovery needed',
statusBarProgress: getStatusBarProgress(0),
estimatedTime: '1 - 3 SECONDS',
};
case 'passport_data_not_found':
return {
actionText: 'Passport data not found',
actionSubText: 'Passport data not found',
statusBarProgress: getStatusBarProgress(0),
estimatedTime: '1 - 3 SECONDS',
};
default:
return {
actionText: '',
actionSubText: '',
statusBarProgress: getStatusBarProgress(0),
estimatedTime: 'SECONDS',
};
}
}
export function getProvingTimeEstimate(
signatureAlgorithm: string,
curveOrExponent: string,
type: provingMachineCircuitType,
): string {
if (!signatureAlgorithm || !curveOrExponent) return '30 - 90 SECONDS';
const algorithm = signatureAlgorithm?.toLowerCase();
const curve = curveOrExponent;
// RSA algorithms
if (algorithm?.includes('rsa')) {
if (algorithm?.includes('pss')) {
return type === 'dsc' ? '3 SECONDS' : '6 SECONDS';
}
return type === 'dsc' ? '2 SECONDS' : '4 SECONDS';
}
// ECDSA algorithms
if (algorithm?.includes('ecdsa')) {
// Check bit size from curve name
if (curve?.includes('224') || curve?.includes('256')) {
return type === 'dsc' ? '25 SECONDS' : '50 SECONDS';
}
if (curve?.includes('384')) {
return type === 'dsc' ? '45 SECONDS' : '90 SECONDS';
}
if (curve?.includes('512') || curve?.includes('521')) {
return type === 'dsc' ? '100 SECONDS' : '200 SECONDS';
}
}
// Default case
return '30 - 90 SECONDS';
}