@bit-ui-libs/common
Version:
This library was generated with [Nx](https://nx.dev).
92 lines (78 loc) • 3.46 kB
text/typescript
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;
}