UNPKG

@bit-ui-libs/common

Version:
92 lines (78 loc) 3.46 kB
import { StepEnum } from '../common'; import { ASSET_STATUSES } from './constants'; import { AssetStatus, CustomerAsset, VerifyTypeEnum, WitnessCustomerAssetResponse } from './interfaces'; export function getAssetStatusIndex(status: AssetStatus) { return ASSET_STATUSES.indexOf(status); } export function isAssetStatusBefore(currentStatus: AssetStatus, targetStatus: AssetStatus) { return getAssetStatusIndex(currentStatus) < getAssetStatusIndex(targetStatus); } export function isAssetStatusAfter(currentStatus: AssetStatus, targetStatus: AssetStatus) { return getAssetStatusIndex(currentStatus) > getAssetStatusIndex(targetStatus); } export function isAssetStatusFinished(currentStatus: AssetStatus, targetStatus: AssetStatus) { return getAssetStatusIndex(currentStatus) >= getAssetStatusIndex(targetStatus); } /** * There is a backend logical bug that causes BITDEV-1389: * - Token's status updates to "PHOTO_ADDED" after witness verification * * The workaround for the above bug is to * manually check "serializedSteps" instead of "status" property. * * See function directly below for the workaround version * (exact same function but without the status checks). */ export function getAssetVerifyStatus(a: CustomerAsset) { // Ideal: verified by official if ( isAssetStatusFinished(a.status, 'OFFICIAL_VERIFIED') && a.serializedSteps.find((sc) => sc.step === StepEnum.OFFICIAL && sc.finished === true) && a.status !== 'OFFICIAL_VERIFYING_FAILED' ) { return VerifyTypeEnum.OFFICIAL_VERIFIED; } // Typical: skipped official verification; in other words: self verified // Note: if the status just finished, make sure it wasn't a failure if ( isAssetStatusFinished(a.status, 'OFFICIAL_VERIFIED') && a.serializedSteps.find((sc) => sc.step === StepEnum.OFFICIAL && sc.finished === false) && a.status !== 'OFFICIAL_VERIFYING_FAILED' ) { return VerifyTypeEnum.SELF_VERIFIED; } // Chain Token flow hasn't reached this stage yet - not yet verified if (isAssetStatusBefore(a.status, 'OFFICIAL_VERIFYING_STARTED')) { return VerifyTypeEnum.NOT_VERIFIED; } return VerifyTypeEnum.NOT_VERIFIED; } export function getAssetVerifyStatusBySteps(a: CustomerAsset) { // Ideal: verified by official if ( a.serializedSteps?.find((sc) => sc.step === StepEnum.OFFICIAL && sc.finished === true) && a.status !== 'OFFICIAL_VERIFYING_FAILED' ) { if (getAssetVerifyRejected(a.witness)) return VerifyTypeEnum.OFFICIAL_VERIFIED; return VerifyTypeEnum.OFFICIAL_REJECTED; } // Typical: skipped official verification; in other words: self verified // Note: if the status just finished, make sure it wasn't a failure if ( a.serializedSteps?.find((sc) => sc.step === StepEnum.OFFICIAL && sc.finished === false) && a.status !== 'OFFICIAL_VERIFYING_FAILED' ) { return VerifyTypeEnum.SELF_VERIFIED; } // New scenario: some categories can have NO official step at all, for some reason if (!a.serializedSteps?.find((sc) => sc.step === StepEnum.OFFICIAL)) return VerifyTypeEnum.SELF_VERIFIED; return VerifyTypeEnum.NOT_VERIFIED; } export function getAssetVerifyRejected(data: WitnessCustomerAssetResponse[]) { const witness = Array.isArray(data) ? (data .sort((a, b) => new Date(a.updatedAt).getTime() - new Date(b.updatedAt).getTime()) .pop() as WitnessCustomerAssetResponse) : { approved: false }; return witness.approved; }