mirror of
https://github.com/selfxyz/self.git
synced 2026-02-19 02:24:25 -05:00
* 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
191 lines
5.6 KiB
TypeScript
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';
|
|
}
|