@bit-ui-libs/common
Version:
This library was generated with [Nx](https://nx.dev).
1 lines • 233 kB
Source Map (JSON)
{"version":3,"sources":["../src/lib/api/services/base-service.ts","../src/lib/common/constants/application-id.ts","../src/lib/common/constants/common-keys.ts","../src/lib/common/constants/device-levels.ts","../src/lib/common/constants/encrypted-storage-keys.ts","../src/lib/common/constants/levels.ts","../src/lib/common/enums/file-format.ts","../src/lib/common/enums/info-type.ts","../src/lib/common/enums/witness-types.ts","../src/lib/common/interfaces/attachment.ts","../src/lib/common/interfaces/check-in.ts","../src/lib/common/interfaces/device.ts","../src/lib/common/interfaces/event.ts","../src/lib/common/interfaces/ipfs.ts","../src/lib/common/interfaces/qr.ts","../src/lib/common/interfaces/subject.ts","../src/lib/common/interfaces/wallet.ts","../src/lib/common/utils/auth-utils.ts","../src/lib/common/utils/create-query-params.ts","../src/lib/common/utils/debounce.ts","../src/lib/common/utils/format-date.ts","../src/lib/common/utils/format-number.ts","../src/lib/common/utils/get-error-message.ts","../src/lib/common/utils/make-sample-geolocation.ts","../src/lib/common/utils/make-sample-weather-data.ts","../src/lib/asset/asset-attachment.utils.ts","../src/lib/asset/asset.service.utils.ts","../src/lib/asset/asset.service.ts","../src/lib/asset/asset.service.interfaces.ts","../src/lib/asset/constants.ts","../src/lib/asset/interfaces/chain-type-enum.ts","../src/lib/asset/interfaces/customer-base.ts","../src/lib/asset/interfaces/i-chain.service.ts","../src/lib/asset/interfaces/verify-type-enum.ts","../src/lib/asset/interfaces/ownership-history.ts","../src/lib/asset/asset.utils.ts","../src/lib/asset/chain-asset/chain-asset.service.ts","../src/lib/asset/chain-asset/chain-asset.utils.ts","../src/lib/asset/chain-service/chain-service.service.ts","../src/lib/asset/chain.utils.ts","../src/lib/asset/enums.ts","../src/lib/asset/s2c-asset.service.ts","../src/lib/biometrics/biometrics.service.ts","../src/lib/biometrics/enums.ts","../src/lib/check-in/check-in-service.ts","../src/lib/check-in/interfaces.ts","../src/lib/check-in/utils.ts","../src/lib/common-admin/common-admin.service.ts","../src/lib/common-admin/common-admin.service.interfaces.ts","../src/lib/core-events/enums.ts","../src/lib/core-events/event.service.ts","../src/lib/device/device.service.ts","../src/lib/inventory/inventory.service.ts","../src/lib/marketplace/enums.ts","../src/lib/marketplace/interfaces/bid.ts","../src/lib/marketplace/services/bid.service.ts","../src/lib/marketplace/services/categories.service.ts","../src/lib/marketplace/services/listing.service.ts","../src/lib/marketplace/services/order.service.ts","../src/lib/marketplace/services/order.service.interfaces.ts","../src/lib/marketplace/services/types.service.ts","../src/lib/marketplace/services/wishlist.service.ts","../src/lib/menu/menu.service.ts","../src/lib/notifications/interfaces.ts","../src/lib/notifications/notification.service.ts","../src/lib/organization/organization.service.ts","../src/lib/organization-location/organization-location.service.ts","../src/lib/reports/enums.ts","../src/lib/reports/reports.service.ts","../src/lib/users/enums.ts","../src/lib/users/interfaces/being-id.ts","../src/lib/users/interfaces/document.ts","../src/lib/users/interfaces/profile.ts","../src/lib/users/services/address.service.ts","../src/lib/users/services/payment-details.service.ts","../src/lib/users/services/profile.service.ts","../src/lib/users/services/shipping-address.service.ts","../src/lib/users/services/buyer-profile.service.ts","../src/lib/users/services/creator-profile.service.ts","../src/lib/users/services/document-types.service.ts","../src/lib/users/services/documents.service.ts","../src/lib/users/services/feedback.service.ts","../src/lib/users/services/feedback.service.interfaces.ts","../src/lib/users/services/role.service.ts","../src/lib/users/services/seller-profile.service.ts","../src/lib/users/services/user.service.ts","../src/lib/users/services/user.service.interfaces.ts","../src/lib/web3/web3-service.ts"],"sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig } from 'axios';\n\nexport type BaseServiceOptions = {\n // If this is not passed then the service will create\n // its own axios instance.\n axiosInstance?: AxiosInstance;\n apiUrl: string;\n};\n\nexport class BaseService {\n private axiosInstance: AxiosInstance;\n protected apiUrl!: string;\n protected coreApiServicePrefix: string;\n protected coreApiUrl: string;\n\n constructor(opts: BaseServiceOptions) {\n this.axiosInstance =\n opts.axiosInstance ??\n axios.create({\n timeout: 15000,\n validateStatus: (status) => status >= 200 && status < 300,\n });\n this.apiUrl = opts.apiUrl;\n this.coreApiServicePrefix = 'core-events';\n this.coreApiUrl = `${this.apiUrl}/${this.coreApiServicePrefix}`;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n protected async beforeQuery(params?: object) {}\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n protected async beforeMutation(data: object) {}\n\n // API Generic functions\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public async get<TRes, TParams extends object = NonNullable<unknown>>(\n url: string,\n params?: TParams,\n options?: AxiosRequestConfig<TParams>\n ) {\n this.beforeQuery(params);\n return this.axiosInstance.get(url, { params, ...options }).then((res) => res.data as TRes);\n }\n\n public async post<TRes, TVars extends object>(url: string, data: TVars, config?: AxiosRequestConfig<TVars>) {\n this.beforeMutation(data);\n return this.axiosInstance.post(url, data, config).then((res) => res.data as TRes);\n }\n\n public async put<TRes, TVars extends object>(url: string, data: TVars, config?: AxiosRequestConfig<TVars>) {\n this.beforeMutation(data);\n return this.axiosInstance.put(url, data, config).then((res) => res.data as TRes);\n }\n\n public async patch<TRes, TVars extends object>(url: string, data: TVars) {\n this.beforeMutation(data);\n return this.axiosInstance.patch(url, data).then((res) => res.data as TRes);\n }\n\n public async delete<TRes, TParams extends object = NonNullable<unknown>>(\n url: string,\n params?: TParams,\n config?: AxiosRequestConfig\n ) {\n this.beforeQuery(params);\n return this.axiosInstance.delete(url, { params, ...config }).then((res) => res.data as TRes);\n }\n}\n","interface AppIds {\n [key: string]: string;\n}\n\nexport const APP_ID: AppIds = {\n CHAINIT: 'chainit',\n SPORTAFI: 'sportafi',\n ARTLOCK: 'art_lock',\n PAIRED: 'paired',\n SITESUPER: 'site_super',\n S2C: 's2c',\n GREENLIGHT_DATA: 'gld',\n ANYTIME_CASH: 'anytime_cash',\n};\n\nexport const DEFAULT_APP_ID = APP_ID.CHAINIT;\n","export const DEFAULT_ORG_ID = '00000000-0000-0000-0000-000000000000';\n","export const DEVICE_LEVELS = [\n { level: 1, label: 'Stationary Kiosk on BIT Trusted Network', color: '#6BAF23', bgColor: '#d3e9bb' },\n { level: 2, label: 'Floating Kiosk on BIT Trusted Network', color: '#0C682A', bgColor: '#8BE7A9' },\n { level: 3, label: 'Verifed Personal Devices on Public Network', color: '#02381B', bgColor: '#81B79A' },\n { level: 4, label: 'Unverifed Personal Devices on Public Network', color: '#191617', bgColor: '#989596' },\n];\n","export const ENCRYPTED_STORAGE_KEYS = {\n accessToken: 'accessToken',\n bitToken: 'bitToken',\n refreshToken: 'refreshToken',\n chainItNftWalletAddress: 'CHAINIT_NFT_WALLET_ADDRESS',\n codeVerifier: 'codeVerifier',\n state: 'state',\n sessionToken: 'sessionToken',\n expiresIn: 'expiresIn',\n idToken: 'idToken',\n hasProfile: 'hasProfile',\n introPassed: 'introPassed',\n deviceId: 'deviceId',\n mintPlatform: 'mintPlatform',\n isLoggingDisabled: 'isLoggingDisabled',\n incodeUserId: 'incodeUserId',\n organizationId: 'organizationId',\n themeMode: 'themeMode',\n shippingDetails: 'shippingDetails',\n authStep: 'authStep',\n authEmails: 'authEmails',\n incodeInterviewId: 'incodeInterviewId',\n incodeToken: 'incodeToken',\n selfCustodyWalletAddress: 'selfCustodyWalletAddress',\n selfCustodyWalletMnemonic: 'selfCustodyWalletMnemonic',\n selfCustodyWalletPrivateKey: 'selfCustodyWalletPrivateKey',\n};\n","export const BEING_ID_LEVELS = [\n { level: 1, label: 'Government Witness', description: 'Government-Issued ID Created' },\n { level: 2, label: 'Government Real ID', description: 'Government Validation Added' },\n { level: 3, label: 'Secondary Government ID', description: 'Multiple IDs Added' },\n { level: 4, label: 'Witness Confirmation', description: 'VDT Created at Kiosk' },\n { level: 5, label: 'Multiple Events', description: 'Higher Level Witnesses Added' },\n { level: 6, label: 'Human', description: 'Account Created, Biometric Template Recorded' },\n];\n\nexport const HARDWARE_LEVELS = [\n { level: 1, label: 'Stationary Kiosk on BIT Trusted Network', color: '#6BAF23', bgColor: '#d3e9bb' },\n { level: 2, label: 'Floating Kiosk on BIT Trusted Network', color: '#0C682A', bgColor: '#8BE7A9' },\n { level: 3, label: 'Verifed Personal Devices on Public Network', color: '#02381B', bgColor: '#81B79A' },\n { level: 4, label: 'Unverifed Personal Devices on Public Network', color: '#191617', bgColor: '#989596' },\n];\n","export enum FileFormatEnum {\n CSV = 'CSV',\n PDF = 'PDF'\n}","export enum InfoTypeEnum {\n Who = 'Who',\n What = 'What',\n When = 'When',\n Where = 'Where',\n}\n","export enum WitnessTypeEnum {\r\n Witness = 'witness',\r\n Buyer = 'buyer',\r\n Seller = 'seller',\r\n}\r\n","// Old version of AttachmentData interface\n// which is still used by check-in APIs\nexport interface OldAttachmentData {\n id: string;\n mimeType: string;\n docType: AttachmentDocType;\n classification: AttachmentClassification;\n name: string;\n description: string;\n}\n\nexport interface AttachmentData {\n docId: string;\n mimeType: string;\n docType: AttachmentDocType;\n classification: AttachmentClassification;\n name: string;\n description: string;\n url: string;\n thumbUrl: string;\n isMain?: boolean;\n}\n\nexport type AttachmentDocType = 'PHOTO' | 'PDF';\n\nexport enum AttachmentType {\n TokenDocument = 'TOKEN_DOCUMENT',\n TokenPhoto = 'TOKEN_PHOTO',\n VerificationPhoto = 'VERIFICATION_PHOTO',\n WitnessPhoto = 'WITNESS_PHOTO',\n}\n\nexport enum AttachmentClassification {\n Face = 'FACE',\n GovtId = 'GOVTID',\n FaceAndGovtId = 'FACEANDGOVTID',\n QrCode = 'QRCODE',\n AssetPhoto = 'ASSET_PHOTO',\n AssetVerificationPhoto = 'ASSET_VERIFICATION_PHOTO',\n AssetWitnessPhoto = 'ASSET_WITNESS_PHOTO',\n ServicePhoto = 'SERVICE_PHOTO',\n ServiceVerificationPhoto = 'SERVICE_VERIFICATION_PHOTO',\n ServiceWitnessPhoto = 'SERVICE_WITNESS_PHOTO',\n Other = 'OTHER',\n AssetDocument = 'ASSET_DOCUMENT',\n ServiceDocument = 'SERVICE_DOCUMENT',\n}\n\nexport interface CreateAttachmentInputData {\n mimeType: string;\n docType: AttachmentDocType;\n classification: AttachmentClassification;\n name: string;\n description: string;\n data?: string;\n isMain?: boolean;\n}\n\nexport interface CreateQrAttachmentInputData {\n docType: AttachmentDocType;\n classification: AttachmentClassification;\n data: string;\n name?: string;\n description?: string;\n}\n\nexport interface UpdateAttachmentInputData {\n mimeType?: string;\n docType?: AttachmentDocType;\n classification: AttachmentClassification;\n name?: string;\n description?: string;\n docId: string;\n data?: string;\n isMain?: boolean;\n}\n\nexport interface UploadedAttachmentData {\n mimeType: string;\n docType: AttachmentDocType;\n classification: AttachmentClassification;\n docId: string;\n name: string;\n description: string;\n url?: string;\n isMain: boolean;\n}\n\nexport enum EAttachmentUploadStatus {\n New = 'NEW',\n Uploaded = 'UPLOADED',\n Error = 'ERROR',\n}\n","export enum RelationTypeEnum {\n Official = 'CHECKIN_OFFICIAL',\n Witness = 'CHECKIN_WITNESS',\n Inspector = 'CHECKIN_INSPECTOR',\n Archive = 'CHECKIN_ARCHIVE',\n Buyer = 'CHECKIN_BUYER',\n Seller = 'CHECKIN_SELLER',\n ChildVdt = 'CHILD_VDT',\n ParentVdt = 'PARENT_VDT',\n}\n","import { GeolocationData } from './geolocation';\n\nexport enum DeviceTypeIdEnum {\n STATIONARY_KIOSK = 1,\n MOBILE_KIOSK = 2,\n TABLET_KIOSK = 3,\n PHONE = 4,\n TABLET = 5,\n}\n\nexport enum DeviceTypeEnum {\n STATIONARY_KIOSK = 'STATIONARY_KIOSK',\n MOBILE_KIOSK = 'MOBILE_KIOSK',\n TABLET_KIOSK = 'TABLET_KIOSK',\n PHONE = 'PHONE',\n TABLET = 'TABLET',\n}\n\nexport type DeviceData = {\n deviceId: string;\n deviceName: string;\n deviceType: DeviceTypeEnum;\n geolocation: GeolocationData;\n ipAddress?: string;\n date: string;\n hardwareLevel?: number;\n};\n","export interface EventData {\n eventType: string;\n eventId: string;\n}\n\nexport enum StepEnum {\n DATA = 'DATA',\n PHOTO = 'PHOTO',\n CONFIRM = 'CONFIRM',\n OFFICIAL = 'OFFICIAL',\n QRCODE = 'QRCODE',\n RFID = 'RFID',\n PRIVACY = 'PRIVACY',\n WITNESS = 'WITNESS',\n DOCUMENT = 'DOCUMENT',\n REFERENCE_VDTS = 'REFERENCE_VDTS',\n VDT_MINTED = 'VDT_MINTED',\n}\n\nexport type EventRelationType = 'CHECKIN_OFFICIAL' | 'CHECKIN_WITNESS';\n","import { DeviceRefVdt, UserRefVdt } from './reference-vdt';\n\nexport enum TraitTypeEnum {\n Type = 'Type',\n TypeWitness = 'Type-Witness',\n Who = 'Who',\n WhoBiometrics = 'Who-Biometrics',\n What = 'What',\n When = 'When',\n Where = 'Where',\n WhereDevice = 'Where-Device',\n}\n\nexport interface VdtAttribute {\n trait_type: TraitTypeEnum;\n value: string;\n}\n\nexport interface IpfsMetadata {\n ipfs: string;\n name: string;\n image: string;\n qrCode: { image: string; url: string };\n eventId: string;\n refVdts: {\n userVdt: UserRefVdt;\n deviceVdt: DeviceRefVdt;\n };\n vdtType: string;\n bitSysId: string;\n attributes: VdtAttribute[];\n description: string;\n beingIdLevel: {\n current: {\n activeAt: Date;\n endedAt?: Date;\n level: string;\n };\n history: {\n activeAt: Date;\n endedAt?: Date;\n level: string;\n }[];\n };\n}\n","export enum QrPackageTypeEnum {\n OBJECTS = 'OBJECTS',\n SERVICES = 'SERVICES',\n USERS = 'USERS',\n USER_DEVICES = 'USER_DEVICES',\n USER_OBJECTS = 'USER_OBJECTS',\n USER_SERVICES = 'USER_SERVICES',\n ORGANIZATIONS = 'ORGANIZATIONS',\n DEVICES = 'DEVICES',\n ORG_USERS = 'ORG_USERS',\n ORG_DEVICES = 'ORG_DEVICES',\n ORG_OBJECTS = 'ORG_OBJECTS',\n ORG_SERVICES = 'ORG_SERVICES',\n WITNESS = 'WITNESS',\n OBJECT_WITNESSES = 'OBJECT_WITNESSES',\n SERVICE_WITNESSES = 'SERVICE_WITNESSES',\n}\n","export enum ReferenceType {\n PHONE = 'PHONE',\n DRIVERS_LICENSE = 'DRIVERS_LICENSE',\n EMPLOYEE_ID = 'EMPLOYEE_ID',\n AUTH0_IDENTITY = 'AUTH0_IDENTITY',\n END_USER_ID = 'END_USER_ID',\n ADMIN_USER_ID = 'ADMIN_USER_ID',\n}\n\nexport interface SubjectDataReferenceItem {\n type: ReferenceType;\n value: string;\n}\n\nexport interface SubjectData {\n subjectType: string;\n references: SubjectDataReferenceItem[];\n orgId?: string;\n}\n\nexport enum SubjectTypeEnum {\n EMPLOYEE = 'EMPLOYEE',\n DRIVER = 'DRIVER',\n USER = 'USER',\n ASSET_OWNER = 'ASSET_OWNER',\n}\n","export enum WalletPlatformEnum {\n Ethereum = \"ethereum\",\n Polygon = \"polygon\",\n}\n","import { AuthClaims } from '../interfaces/auth-claims';\nimport jwtDecode from 'jwt-decode';\n\nexport async function getAuth0Id(claims: AuthClaims, opts?: { keepPrefix: boolean }) {\n if (opts?.keepPrefix) return claims.sub;\n return claims.sub.replace('auth0|', '');\n}\n\nexport async function getAuthEmail(claims: AuthClaims) {\n return claims['https://blackinktech.io/schemas/claims/email'];\n}\n\nexport function isTokenExpired(token: string) {\n try {\n // If token is undefined / invalid, this throws\n // \"InvalidTokenError: Invalid token specified\"\n const claims = jwtDecode<AuthClaims>(token);\n return Date.now() / 1000 > claims.exp;\n } catch (err) {\n return false;\n }\n}\n","import { SerializableValue } from '../interfaces';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const createQueryParams = (params?: Record<any, SerializableValue>) => {\n if (!params) return '';\n return Object.keys(params)\n .filter((k) => typeof params[k] !== 'undefined')\n .map((k) => {\n // This assertion is fine because we have the undefined check above\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const value = params[k]!;\n if (Array.isArray(value)) {\n if (value.length === 0) return '';\n return encodeURIComponent(k) + '=' + encodeURIComponent(value.join(','));\n }\n else if (typeof value === 'object') {\n return encodeURIComponent(k) + '=' + JSON.stringify(value);\n }\n return encodeURIComponent(k) + '=' + encodeURIComponent(value);\n })\n .join('&');\n};\n","// Source: https://decipher.dev/30-seconds-of-typescript/docs/debounce/\nexport const debounce = <TFunction extends (...args: any[]) => any>(fn: TFunction, ms = 300) => {\n let timeoutId: ReturnType<typeof setTimeout>;\n return function (this: any, ...args: any[]) {\n clearTimeout(timeoutId);\n // @ts-ignore\n timeoutId = setTimeout(() => fn.apply(this, args), ms);\n };\n};","export function formatDate(date: string) {\n return new Date(date).toLocaleDateString('en-US', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n });\n}","export function formatNumber(n: string) {\n const sanitizedValue = n.replace(/[^0-9.]/g, '').replace(/^0+(?=\\d)/, '');\n const parts = sanitizedValue.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return parts.join('.');\n}","import axios from 'axios';\nimport { ApiServiceError } from '../../api/interfaces/api-service-error';\n\n/**\n * This is a no-man's land function that tries\n * to handle every possible error scenario from ChainIT frontend & backend.\n * Handles simple error messages, axios errors, and now FATAL server error objects\n */\nexport function getErrorMessage(err: unknown) {\n if (!err) return '';\n\n // First, check if the error is an Axios error\n if (axios.isAxiosError(err) || (err as any)?.response) {\n const axiosError = err as ApiServiceError;\n // If response.data.message is not available then check for message\n const message = axiosError.response?.data?.message;\n\n // Backend returns an error message\n if (typeof message === 'string') {\n return message;\n }\n // Backend returns a really bad internal server error object\n // (e.g. { query: \"UPDATE ...\", parameters: [...], driverError: {...} })\n else if (typeof message === 'object') {\n // Usually, backend returns message as string array with the errors... usually.\n if (Array.isArray(message) && (message as any[]).every(m => typeof m === 'string')) {\n return (message as string[]).join(', ');\n }\n let fatalErrorMessage = JSON.stringify(message);\n // If the message comes as an object,\n // there is usually error details in a neighboring \"error\" property.\n const details = (axiosError.response?.data as any)?.error;\n // Prepend to fatal error object\n if (details) fatalErrorMessage = details + fatalErrorMessage;\n // Returns the error details + fatal error object\n return fatalErrorMessage;\n }\n // If none of the above work try accessing first-level message\n else if (axiosError.message) {\n return axiosError.message;\n }\n\n // This error isn't an axios error,\n // start checking for other properties below.\n }\n\n // Second, check if the error is an RTK error\n if (err && typeof err === 'object' && 'status' in err && 'data' in err) {\n if (Object.prototype.hasOwnProperty.call(err.data, 'message')) {\n return (err.data as { message: string }).message;\n }\n }\n\n // Next, check if the error is of type Error\n if (err instanceof Error) {\n const error = err as Error;\n return error.message;\n }\n\n // Next, check if the error has a property called message\n // (it can have message but not be of type Error (e.g. Geolocation error))\n if (Object.prototype.hasOwnProperty.call(err, 'message')) {\n return (err as { message: string }).message;\n }\n\n // Next, check if the error is just a string\n if (typeof err === 'string') {\n return err;\n }\n\n // Last resort, return a hardcoded unknown error message\n return 'Unknown error';\n}\n","export function makeSampleGeolocation() {\n return { latitude: 0, longitude: 0, meanSeaLevel: 0 };\n}\n","export function makeSampleWeatherData() {\n return {\n AbsHumidity: 0,\n AirDensity: 0,\n AvgCorrectedWindDir: 0,\n AvgCorrectedWindSpeed: 0,\n AvgRelativeWindDir: 0,\n AvgRelativeWindSpeed: 0,\n CompassHeading: 0,\n CorrectedGustDirection: 0,\n CorrectedGustSpeed: 0,\n CorrectedWindDir: 0,\n CorrectedWindSpeed: 0.92,\n Dewpoint: 75.2,\n GPSHeading: '',\n GPSLocation: '+32.843528:-080.015936:+0017.50',\n GPSSpeedOverGround: '',\n GPSStatusError: false,\n HeatIndex: 0,\n PositionOfTheSun: 0,\n PrecipIntensity: '',\n RainPresent: false,\n Pressure: 1019.7,\n PressureAtSeaLevel: 0,\n PressureAtStation: 0,\n RelGustDir: 0,\n RelGustSpeed: 0,\n RelHumidity: 84,\n RelWindDir: 241,\n RelWindSpeed: 0.92,\n SensorStatusError: false,\n SolarNoonTime: '',\n SolarRadiation: '0001',\n SunriseTime: '',\n SunsetTime: '',\n SunshineHours: 0,\n Temperature: 80.4,\n TotalPrecip: '00000.000',\n TwilightAstronomical: '',\n TwilightCivil: '',\n TwilightNautical: '',\n WetBulbTemperature: 0,\n WindChill: 0,\n WindSensorError: false,\n XTilt: 0,\n YTilt: 0,\n ZOrientation: '',\n };\n}\n","import { BaseService } from '../api/services/base-service';\nimport { UpdateAttachmentResponse, UploadedAttachmentData, createQueryParams } from '../common';\nimport { CreateAttachmentRequest, CreateAttachmentsPayload, UpdateAttachmentRequest } from './interfaces';\n\nexport interface GetAttachmentLinkOpts {\n apiUrl: string;\n id: string;\n bitToken: string;\n accessToken: string;\n thumb?: boolean;\n}\n\nexport function getAttachmentLink(opts: GetAttachmentLinkOpts) {\n const params = {\n thumb: opts.thumb ? 'true' : undefined,\n bit_token: opts.bitToken,\n access_token: opts.accessToken,\n };\n return `${opts.apiUrl}/core-events/v1/chain-assets/attachments/${opts.id}/view?${createQueryParams(params)}`;\n}\n\ninterface CreateAndUploadAttachmentsOpts {\n service: BaseService;\n chainApiUrl: string;\n req: CreateAttachmentsPayload;\n}\n\nexport async function createAndUploadAttachments(\n opts: CreateAndUploadAttachmentsOpts\n): Promise<UploadedAttachmentData[]> {\n const { service, chainApiUrl, req } = opts;\n const { eventId, req: input, onUpload } = req;\n // 1. Prepare array of attachments to initialize\n const docs = input.docs\n // Exclude attachments that are already initialized\n // .filter((d) => !event.attachments.some((a) => a.classification === d.classification))\n // Exclude image data first, as we're just initializing the attachments\n .map((d) => ({ ...d, data: undefined }));\n\n // Initialize attachments\n const initializeInput = { ...input, docs };\n const initializedAttachments = await service.post<UploadedAttachmentData[], CreateAttachmentRequest>(\n `${chainApiUrl}/${eventId}/attachments`,\n initializeInput\n );\n\n // 2. Update Attachments (upload / pass image data to the initialized attachments)\n const updatedDocs: UploadedAttachmentData[] = [];\n let i = 0;\n for (const d of input.docs) {\n onUpload?.(i + 1, input.docs.length);\n const req: UpdateAttachmentRequest = {\n application: input.application,\n docs: [\n {\n mimeType: d.mimeType,\n docType: d.docType,\n classification: d.classification,\n docId: initializedAttachments[i].docId,\n name: d.name,\n description: d.description,\n data: d.data ?? '',\n isMain: d.isMain,\n },\n ],\n };\n await service.put<UpdateAttachmentResponse, UpdateAttachmentRequest>(`${chainApiUrl}/${eventId}/attachments`, req, {\n onUploadProgress: (e) => console.log('Upload attachment progress:', e),\n });\n i++;\n // TODO: Please fix typing, just a quick fix for build error\n updatedDocs.push(req.docs[0] as UploadedAttachmentData);\n }\n return updatedDocs;\n}\n","import { GetAssetsRequest } from './asset.service.interfaces';\n\nexport function makeGetAssetsParams(req?: Partial<GetAssetsRequest>): GetAssetsRequest {\n return {\n ...req,\n $orderBy: req?.$orderBy ?? 'createdAt',\n $order: req?.$order ?? 'desc',\n $page: req?.$page ?? 1,\n $perPage: req?.$perPage ?? 10,\n };\n}\n","import { AxiosRequestHeaders } from 'axios';\nimport { BaseService, BaseServiceOptions } from '../api/services/base-service';\nimport { FileFormatEnum, FilteredRequest, PagedRequest, PagedResponse, createQueryParams } from '../common';\nimport {\n AddReferenceVdtRequest,\n AddReferenceVdtResponse,\n CategoriesRequest,\n CollectionReport,\n CreateListingRequest,\n CreateListingResponse,\n GetActiveAssetTemplateRequest,\n GetAssetGroupsResponse,\n GetAssetWitnessesRequest,\n GetAssetsRequest,\n GetPublicWitnessesRequest,\n SearchAssetTypesRequest,\n ShareAssetRequest,\n} from './asset.service.interfaces';\nimport { makeGetAssetsParams } from './asset.service.utils';\nimport {\n AssetCategory,\n AssetTemplate,\n AssetType,\n AssetTypeStep,\n AssetWitness,\n ChainBaseEvent,\n CustomerAsset,\n FavoriteAsset,\n OwnershipHistoryResponse,\n} from './interfaces';\n\ninterface AssetServiceOptions {\n route: 'asset' | 'service';\n}\n\nexport class AssetService extends BaseService {\n assetApiUrl: string;\n\n constructor(opts: BaseServiceOptions & AssetServiceOptions) {\n super(opts);\n this.assetApiUrl = `${this.apiUrl}/assets/v1/${opts?.route}`;\n }\n\n list(req: GetAssetsRequest = {}) {\n return this.get<PagedResponse<CustomerAsset>>(this.assetApiUrl, makeGetAssetsParams(req));\n }\n\n listPublic(req: GetAssetsRequest = {}) {\n return this.get<PagedResponse<CustomerAsset>>(`${this.assetApiUrl}/tokens-public`, makeGetAssetsParams(req));\n }\n\n favorites(req: GetAssetsRequest = {}) {\n return this.get<PagedResponse<FavoriteAsset>>(`${this.assetApiUrl}/list-favorite`, makeGetAssetsParams(req));\n }\n\n listGroup() {\n return this.get<GetAssetGroupsResponse>(`${this.assetApiUrl}/group`);\n }\n\n listCategories(req: FilteredRequest<CategoriesRequest> = {}) {\n return this.get<AssetCategory[]>(`${this.apiUrl}/assets/v1/asset-category/list`, req);\n }\n\n searchCategories(req: PagedRequest<CategoriesRequest> = {}) {\n return this.get<PagedResponse<AssetCategory>>(`${this.apiUrl}/assets/v1/asset-category`, req);\n }\n\n getCategoryByName(name?: string) {\n return this.get<AssetCategory>(`${this.apiUrl}/assets/v1/asset-category?name=${name}`);\n }\n\n getCategoryById(categoryId?: string, headers?: AxiosRequestHeaders) {\n return this.get<AssetCategory>(`${this.apiUrl}/assets/v1/asset-category/${categoryId}`, undefined, { headers });\n }\n\n searchAssetTypes(req: PagedRequest<SearchAssetTypesRequest> = {}) {\n return this.get<PagedResponse<AssetType>>(`${this.apiUrl}/assets/v1/asset-type`, req);\n }\n\n listAssetTypes(req: PagedRequest<SearchAssetTypesRequest> = {}) {\n return this.get<AssetType[]>(`${this.apiUrl}/assets/v1/asset-type/list`, req);\n }\n\n getActiveAssetTemplate(req?: GetActiveAssetTemplateRequest, headers?: AxiosRequestHeaders) {\n return this.get<AssetTemplate>(`${this.apiUrl}/assets/v1/asset-template/activated`, req, { headers });\n }\n\n getAssetType(assetTypeId: string, headers?: AxiosRequestHeaders) {\n return this.get<AssetType>(`${this.apiUrl}/assets/v1/asset-type/${assetTypeId}`, undefined, { headers });\n }\n\n getAssetTypeSteps(assetTypeId: string) {\n return this.get<AssetTypeStep>(`${this.apiUrl}/assets/v1/asset-type/${assetTypeId}/steps`);\n }\n\n share(eventId: string, data: ShareAssetRequest): Promise<any> {\n return this.post<any, any>(`${this.assetApiUrl}/${eventId}/share`, data);\n }\n\n witnesses(req: GetAssetWitnessesRequest = {}) {\n return this.get<PagedResponse<AssetWitness>>(`${this.assetApiUrl}/witnesses`, req);\n }\n\n witnessesPublic(req: GetPublicWitnessesRequest = {}) {\n return this.get<PagedResponse<AssetWitness>>(`${this.assetApiUrl}/witnesses-public`, req);\n }\n\n addReferenceVdt(req: AddReferenceVdtRequest) {\n return this.post<AddReferenceVdtResponse, AddReferenceVdtRequest>(`${this.assetApiUrl}/reference-vdt`, req);\n }\n\n createListing(props: CreateListingRequest) {\n return this.post<CreateListingResponse, CreateListingRequest>(`${this.assetApiUrl}/listing`, props);\n }\n\n getAssetChainDetails(eventId: string) {\n return this.get<ChainBaseEvent>(`${this.apiUrl}/core-events/v1/chain-assets/${eventId}`);\n }\n\n getOwnershipHistory(req: GetAssetsRequest = {}) {\n const query = createQueryParams({ assetName: req.name, ...req });\n return this.get<PagedResponse<OwnershipHistoryResponse>>(`${this.assetApiUrl}/ownership-history?${query}`);\n }\n\n getAssociatedAssets(req: GetAssetsRequest = {}) {\n return this.get<PagedResponse<CustomerAsset>>(`${this.apiUrl}/assets/v1/asset/tokens-public`, req);\n }\n\n vdtReport(fileFormat: FileFormatEnum) {\n return this.get<CollectionReport>(`${this.apiUrl}/assets/v1/asset/collection-report`, { fileFormat });\n }\n}\n","import { FileFormatEnum, PagedRequest, RelationTypeEnum, StepEnum } from '../common';\nimport { BaseAddress } from '../users';\nimport { CategoryStatusEnum } from './constants';\nimport { SellingMethodEnum } from './enums';\nimport { AssetStatus, ChainTypeEnum, CustomerAsset } from './interfaces';\n\nexport type GetAssetsRequest = PagedRequest<{\n ownerId?: string;\n typeId?: string;\n orgId?: string;\n appName?: string[] | string;\n name?: string;\n status?: AssetStatus;\n eventIdRef?: string;\n isMinted?: boolean;\n isListed?: boolean;\n isVerifiedByWitness?: boolean;\n isVerifiedByOfficial?: boolean;\n sellingMethod?: SellingMethodEnum;\n isFavorite?: boolean;\n}>;\n\nexport type GetPublicAssetsRequest = PagedRequest<{\n ownerId?: string;\n typeId?: string;\n orgId?: string;\n appName?: string;\n name?: string;\n status?: AssetStatus;\n eventIdRef?: string;\n isMinted?: boolean;\n isVerifiedByWitness?: boolean;\n isVerifiedByOfficial?: boolean;\n sellingMethod?: SellingMethodEnum;\n}>;\n\nexport interface GetAssetsRes {\n assets: CustomerAsset[];\n page: number;\n totalPages: number;\n}\nexport type GetAssetGroupsRes = {\n [assetGroupName: string]: CustomerAsset[];\n}[];\n\nexport interface ShareAssetReq {\n to: {\n email: string;\n name: string;\n }[];\n}\n\nexport const chainServiceStatuses = ['INFO', 'PHOTO', 'OFFICIALS', 'QRCODE', 'RFID', 'WITNESS', 'MINTED'] as const;\n\nexport type GetAssetGroupsResponse = {\n [assetGroupName: string]: CustomerAsset[];\n}[];\n\nexport interface ShareAssetRequest {\n to: { email: string; name: string }[];\n}\n\nexport interface CategoriesRequest {\n parentId?: string;\n parentIds?: string[];\n appName?: string;\n name?: string;\n isActive?: boolean;\n state?: CategoryStatusEnum;\n vdtType?: ChainTypeEnum;\n}\n\nexport interface SearchAssetTypesRequest {\n categoryId?: string;\n name?: string;\n isActive?: boolean;\n state?: CategoryStatusEnum;\n vdtType?: ChainTypeEnum;\n}\n\nexport type GetActiveAssetTemplateRequest = {\n typeId: string;\n step: StepEnum;\n};\n\nexport type GetAssetWitnessesRequest = PagedRequest<{\n userId?: string;\n assetId?: string;\n}>;\n\nexport type GetPublicWitnessesRequest = PagedRequest<{\n eventId?: string;\n relationType?: RelationTypeEnum;\n}>;\n\nexport interface AddReferenceVdtRequest {\n serviceId?: string;\n assetId: string;\n qrCodeRefId: string;\n vdtType: ChainTypeEnum;\n bitSysId: string;\n relationType: RelationTypeEnum;\n data?: { title: string };\n}\n\nexport interface AddReferenceVdtResponse {\n assetId: string;\n qrCodeRefId: string;\n vdtType: ChainTypeEnum;\n bitSysId: string;\n relationType: RelationTypeEnum;\n createdAt: string;\n data: { title: string };\n}\n\nexport interface CreateListingRequest {\n id: string;\n sellingMethod: SellingMethodEnum;\n price: number;\n startAt?: string;\n endAt?: string;\n description: string;\n isFreeShipping: boolean;\n shippingDetail?: {\n shipFrom: BaseAddress & {\n phone: string;\n };\n weight: number;\n length: number;\n width: number;\n height: number;\n handlingFee: number;\n unitOfMeasurement: string;\n packagingType: string;\n };\n revenue: number;\n}\n\nexport interface CreateListingResponse {\n id: string;\n assetId: string;\n sellerId: string;\n sellerWallet: string;\n listingType: string;\n plstform: string;\n chainName: string;\n tokenId: string;\n tokenContract: string;\n startDate: string;\n endDate: string;\n}\n\nexport interface ListFinalWithTypes {\n appName: string;\n $resolveImages?: boolean;\n}\n\nexport interface CollectionReport {\n fileFormat: FileFormatEnum;\n url: string;\n fileName: string;\n}\n","import { StepEnum } from '../common/interfaces/event';\n\nexport const ASSET_STEPS = [\n StepEnum.DATA,\n StepEnum.PHOTO,\n StepEnum.OFFICIAL,\n StepEnum.QRCODE,\n StepEnum.RFID,\n StepEnum.PRIVACY,\n StepEnum.WITNESS,\n] as const;\n\n// Probably remove this\nexport const assetStatuses = ['INFO', 'PHOTO', 'OFFICIALS', 'QRCODE', 'RFID', 'WITNESS', 'MINTED'] as const;\n\n// RFID is intentionally placed here because we currently do not support that step.\nexport const SKIPPABLE_ASSET_STEPS = [StepEnum.RFID, StepEnum.OFFICIAL, StepEnum.WITNESS, StepEnum.CONFIRM];\nexport const ASSET_STATUSES = [\n 'CREATED',\n 'PHOTO_ADDED_STARTED',\n 'PHOTO_ADDED_FAILED',\n 'PHOTO_ADDED',\n 'OFFICIAL_VERIFYING_STARTED',\n 'OFFICIAL_VERIFYING_FAILED',\n 'OFFICIAL_VERIFIED',\n 'QR_BINDING_STARTED',\n 'QR_BINDING_FAILED',\n 'QR_BOUND',\n 'RFID_BINDING_STARTED',\n 'RFID_BINDING_FAILED',\n 'RFID_BOUND',\n 'PRIVACY_STARTED',\n 'PRIVACY_FAILED',\n 'PRIVACY_DONE',\n 'REGISTERING_STARTED',\n 'REGISTERING_FAILED',\n 'REGISTERED',\n 'MINTING_STARTED',\n 'MINTING_FAILED',\n 'MINTED',\n 'INCOMPLETE',\n 'COMPLETED',\n] as const;\n\nexport enum CategoryStatusEnum {\n Normal = 'NORMAL',\n Fixed = 'FIXED',\n}\n","export enum ChainTypeEnum {\n Objects = 'OBJECTS',\n Services = 'SERVICES',\n Files = 'FILES',\n OrgObjects = 'ORG-OBJECTS',\n OrgServices = 'ORG-SERVICES',\n OrgFiles = 'ORG-FILES',\n}\nexport enum ReportTypeEnum {\n Seller = 'Seller',\n Buyer = 'Buyer',\n}\n\nexport enum FileTypeEnum {\n PDF = 'PDF',\n CSV = 'CSV',\n}\n\nexport enum AssetStatusEnum {\n CREATED = 'CREATED',\n PHOTO_ADDED_STARTED = 'PHOTO_ADDED_STARTED',\n PHOTO_ADDED_FAILED = 'PHOTO_ADDED_FAILED',\n PHOTO_ADDED = 'PHOTO_ADDED',\n DOCUMENT_ADDED_STARTED = 'DOCUMENT_ADDED_STARTED',\n DOCUMENT_ADDED_FAILED = 'DOCUMENT_ADDED_FAILED',\n DOCUMENT_ADDED = 'DOCUMENT_ADDED',\n OFFICIAL_VERIFYING_STARTED = 'OFFICIAL_VERIFYING_STARTED',\n OFFICIAL_VERIFYING_FAILED = 'OFFICIAL_VERIFYING_FAILED',\n OFFICIAL_VERIFIED = 'OFFICIAL_VERIFIED',\n QR_BINDING_STARTED = 'QR_BINDING_STARTED',\n QR_BINDING_FAILED = 'QR_BINDING_FAILED',\n QR_BOUND = 'QR_BOUND',\n RFID_BINDING_STARTED = 'RFID_BINDING_STARTED',\n RFID_BINDING_FAILED = 'RFID_BINDING_FAILED',\n RFID_BOUND = 'RFID_BOUND',\n PRIVACY_STARTED = 'PRIVACY_STARTED',\n PRIVACY_FAILED = 'PRIVACY_FAILED',\n PRIVACY_DONE = 'PRIVACY_DONE',\n WITNESS_VERIFYING_STARTED = 'WITNESS_VERIFYING_STARTED',\n WITNESS_VERIFYING_FAILED = 'WITNESS_VERIFYING_FAILED',\n WITNESS_VERIFIED = 'WITNESS_VERIFIED',\n REGISTERING_STARTED = 'REGISTERING_STARTED',\n REGISTERING_FAILED = 'REGISTERING_FAILED',\n REGISTERED = 'REGISTERED',\n MINTING_STARTED = 'MINTING_STARTED',\n MINTING_FAILED = 'MINTING_FAILED',\n MINTED = 'MINTED',\n REFERENCE_VDTS_STARTED = 'REFERENCE_VDTS_STARTED',\n REFERENCE_VDTS_FAILED = 'REFERENCE_VDTS_FAILED',\n REFERENCE_VDTS_COMPLETED = 'REFERENCE_VDTS_COMPLETED',\n CONFIRMED = 'CONFIRMED',\n}\n","import { AttachmentClassification, RelationTypeEnum, StepEnum } from '../../common';\nimport { ASSET_STATUSES } from '../constants';\nimport { SellingMethodEnum } from '../enums';\nimport { AssetTypeStep } from './asset-template';\nimport { AssetWitness } from './asset-witness';\nimport { ChainTypeEnum } from './chain-type-enum';\n\nexport interface BaseTypePropertyData {\n id: string | number;\n name: string;\n value: string;\n}\n\nexport interface BaseType {\n id: string;\n name: string;\n categoryId: number;\n image: string | null;\n}\n\nexport interface CustomerAssetWitness {\n assetId: string;\n witnessId: string;\n relationType: RelationsTypeEnum;\n witness: AssetWitness;\n}\n\nexport interface CustomerAsset {\n id: string;\n appName: string;\n typeId: string;\n typeName: string;\n status: AssetStatus;\n level: AssetLevelEnum;\n name: string;\n ownerId: string;\n orgId: string;\n serializedSteps: SerializedStep[];\n serializedProps: SerializedProp[];\n serializedImages: SerializedImage[];\n serializedDocuments: SerializedImage[];\n serializedCategories: string[];\n qrCodeRef?: string | null;\n rfIdRef?: string | null;\n eventIdRef: string;\n city?: string | null;\n state?: string | null;\n country?: string | null;\n isMinted: boolean;\n isVerifiedByWitness: boolean;\n createdAt: string;\n updatedAt: string;\n mintedAt: string;\n isFavorite: boolean;\n isVerifiedByOfficial: boolean;\n sellingMethod: SellingMethodEnum | null;\n referenceVDT: AssetReferenceVDTResponse[];\n witness: WitnessCustomerAssetResponse[];\n createdBy: string;\n categoryId?: string;\n assetWitness?: CustomerAssetWitness[];\n}\n\nexport interface S2CCustomerAsset extends CustomerAsset {\n typeDetail: {\n id: string;\n name: string;\n description: string;\n categoryId: string;\n readyForUse: true;\n imageUrl: string;\n isActive: true;\n steps: AssetTypeStep[];\n vdtType: ChainTypeEnum;\n orgId: string;\n };\n isOpen?: boolean;\n}\n\nexport interface AssetReferenceVDTResponse {\n assetId?: string;\n serviceId?: string;\n qrCodeRefId: string;\n vdtType: ChainTypeEnum;\n bitSysId: string;\n relationType: RelationTypeEnum;\n createdAt: string;\n data: { title: string };\n}\n\nexport interface WitnessCustomerAssetResponse {\n id: string;\n relationType: RelationTypeEnum;\n userId: string;\n name: string;\n email: string;\n firstName: string;\n lastName: string;\n avatarUrl: string;\n serializedImages: SerializedImage[];\n serializedProps: SerializedProp[];\n eventIdRef: string;\n isMinted: boolean;\n city: string;\n state: string;\n country: string;\n locationAccuracy: 'exact' | 'city';\n geolocation: {\n longitude: number;\n latitude: number;\n meanSeaLevel: number;\n };\n createdAt: string;\n mintedAt: string;\n approved: boolean;\n updatedAt: string;\n orgId: string;\n}\n\nexport enum RelationsTypeEnum {\n CHECKIN_OFFICIAL = 'CHECKIN_OFFICIAL',\n CHECKIN_WITNESS = 'CHECKIN_WITNESS',\n CHECKIN_INSPECTOR = 'CHECKIN_INSPECTOR',\n CHECKIN_BUYER = 'CHECKIN_BUYER',\n CHECKIN_SELLER = 'CHECKIN_SELLER',\n PARENT_VDT = 'PARENT_VDT',\n CHILD_VDT = 'CHILD_VDT',\n}\n\nexport type AssetStatus = (typeof ASSET_STATUSES)[number];\n// export type AssetSteps = (typeof ASSET_STEPS)[number];\n\nexport enum AssetLevelEnum {\n A_PLUS = 'A+',\n A = 'A',\n A_MINUS = 'A-',\n B_PLUS = 'B+',\n B = 'B',\n B_MINUS = 'B-',\n C_PLUS = 'C+',\n C = 'C',\n C_MINUS = 'C-',\n}\n\nexport interface SerializedStep {\n step?: StepEnum;\n order: number;\n typeId: string;\n enabled: boolean;\n finished: boolean;\n isRequired: boolean;\n}\n\nexport interface SerializedProp {\n id: string;\n name: string;\n value: string;\n}\n\nexport interface SerializedImage {\n name: string;\n docId: string;\n docType: string;\n mimeType: string;\n description: string;\n classification: AttachmentClassification;\n isMain: boolean;\n}\n\nexport enum VerifyType {\n NOT_VERIFIED = 'notVerified',\n OFFICIAL_VERIFIED = 'verifiedByOfficial',\n SELF_VERIFIED = 'selfVerified',\n}\n\nexport type MintStatus = 'MINTING_STARTED' | 'MINTING_FAILED' | 'MINTED';\n\nexport interface FavoriteAsset extends CustomerAsset {\n isDeleted: boolean;\n}\n","import { CustomerAsset, RelationsTypeEnum, WitnessAsset } from '.';\nimport {\n ApplicationData,\n CreateAttachmentInputData,\n CreateQrAttachmentInputData,\n DeviceData,\n PagedRequest,\n PagedResponse,\n QrPackageTypeEnum,\n UpdateAttachmentInputData,\n UpdateAttachmentResponse,\n UploadedAttachmentData,\n} from '../../common';\nimport { Event } from '../../core-events';\nimport { AddReferenceVdtRequest, ShareAssetRequest } from '../asset.service.interfaces';\nimport { ChainBaseEvent, ChainBaseEventData, ChainBaseEventMetadata, CreateChainBaseRequest } from './chain-base';\nimport { EventGroupItem } from './event-group-item';\n\nexport interface IChainService {\n chainApiUrl: string;\n create: (req: CreateChainBaseRequest) => Promise<ChainBaseEvent>;\n createAttachments: (req: CreateAttachmentsPayload) => Promise<UploadedAttachmentData[]>;\n createQrAttachment: (eventId: string, req: CreateQrAttachmentRequest) => Promise<void>;\n getEvent: (eventId: string) => Promise<ChainBaseEvent>;\n getChildEvents: (eventId: string) => Promise<EventGroupItem[]>;\n getDetailsByEvent: (eventId: string) => Promise<CustomerAsset>;\n getDetails: (assetId: string) => Promise<CustomerAsset>;\n assetByQr: (qrId: string) => Promise<ChainBaseEvent>;\n getAttachmentImageUrl: (attId: string, thumb?: boolean) => string;\n getWitnesses: (req: GetWitnessAssetsRequest) => Promise<PagedResponse<WitnessAsset>>;\n update: (eventId: string, req: UpdateChainBaseDetailsRequest) => Promise<ChainBaseEvent>;\n updateMetadata: (eventId: string, req: UpdateMetadataRequest) => Promise<ChainBaseEventData>;\n updateLocationPrivacy: (eventId: string, req: UpdateLocationPrivacyRequest) => Promise<void>;\n linkQr: (qrId: string, req: LinkQrRequest) => Promise<QrPackageCodeResponse>;\n generateQr: (req: GenerateQrRequest) => Promise<QrPackageCodeResponse>;\n deleteAttachments: (attId: string) => Promise<any>;\n addReferenceVdt: (req: AddReferenceVdtRequest) => Promise<AddReferenceVdtRequest>;\n updateAttachments: (eventId: string, req: UpdateAttachmentRequest) => Promise<UpdateAttachmentResponse>;\n updateConfirmStatus: (eventId: string) => Promise<void>;\n deleteReferenceVdt: (id: string, qrCodeRefId: string) => Promise<void>;\n eventByQr: (qrId: string) => Promise<Event>;\n updateFavorite: (req: UpdateFavoriteRequest) => Promise<void>;\n share: (eventId: string, data: ShareAssetRequest) => Promise<void>;\n}\n\nexport interface CreateAttachmentsPayload {\n // This is needed to know which Asset Anchoring Event\n // we are adding the attachments for\n eventId: string;\n // This is the input passed to the API (see above)\n req: CreateAttachmentRequest;\n // This doesn't seem to even be used\n chainType?: string;\n onUpload?: (index: number, total: number) => void;\n}\n\nexport interface CreateAttachmentRequest {\n application: ApplicationData;\n device: DeviceData;\n eventId: string;\n docs: CreateAttachmentInputData[];\n}\n\nexport interface UpdateAttachmentRequest {\n application: ApplicationData;\n docs: UpdateAttachmentInputData[];\n}\n\nexport interface CreateQrAttachmentRequest {\n application: ApplicationData;\n device: DeviceData;\n docs: CreateQrAttachmentInputData[];\n}\n\nexport interface UpdateChainBaseDetailsRequest {\n date: string;\n}\n\nexport interface UpdateMetadataRequest {\n metadata: ChainBaseEventMetadata;\n}\n\nexport enum LocationAccuracy {\n Exact = 'exact',\n City = 'city',\n State = 'state',\n Country = 'country',\n}\n\nexport interface UpdateLocationPrivacyRequest {\n locationAccuracy: LocationAccuracy;\n city?: string;\n state?: string;\n country?: string;\n}\n\nexport interface LinkQrRequest {\n eventId: string;\n device: DeviceData;\n isAdminAsset?: boolean;\n}\n\nexport interface QrPackageCodeResponse {\n id: string;\n eventId?: string;\n package?: {\n id: string;\n isSystem: boolean;\n isCategoryDefault: boolean;\n type: QrPackageTypeEnum;\n name: string;\n url: string;\n qrCodeTotalCount: number;\n createdBy: string;\n createdAt: string;\n };\n}\n\nexport interface GenerateQrRequest {\n application: ApplicationData;\n type: QrPackageTypeEnum;\n categoryId?: string;\n orgId?: string;\n}\n\nexport type GetWitnessAssetsRequest = PagedRequest<{\n name?: string;\n id?: string;\n userId: string;\n relationType?: RelationsTypeEnum;\n isMinted?: boolean;\n categoryId?: string;\n}>;\n\nexport interface UpdateFavoriteRequest {\n ids: string[];\n isFavorite: boolean;\n}\n","export enum VerifyTypeEnum {\n NOT_VERIFIED = 'notVerified',\n OFFICIAL_VERIFIED = 'verifiedByOfficial',\n OFFICIAL_REJECTED = 'rejectedByOfficial',\n SELF_VERIFIED = 'selfVerified',\n}\n","import { CustomerAsset } from \"./customer-base\";\n\nexport enum EOrderStatus {\n Created = \"CREATED\",\n ShippingInfo = \"SHIPPING_INFO\",\n PaymentCompleted = \"PAYMENT_COMPLETED\",\n PaymentFailed = \"PAYMENT_FAILED\",\n Confirmed = \"CONFIRMED\",\n Canceled = \"CANCELED\",\n OrderShipped = \"ORDER_SHIPPED\",\n OrderDelivered = \"ORDER_DELIVERED\",\n OwnershipTransferStarted = \"OWNERSHIP_TRANSFER_STARTED\",\n OwnershipTransferCompleted = \"OWNERSHIP_TRANSFER_COMPLETED\",\n OwnershipTransferFailed = \"OWNERSHIP_TRANSFER_FAILED\",\n OrderUndelivered = \"ORDER_UNDELIVERED\",\n OrderSuccess = \"ORDER_SUCCESS\",\n Return = \"RETURN\",\n ReturnShipped = \"RETURN_SHIPPED\",\n ReturnDelivered = \"RETURN_DELIVERED\",\n ReturnUndelivered = \"RETURN_UNDELIVERED\",\n Refund = \"REFUND\",\n RefundCompleted = \"REFUND_COMPLETED\",\n RefundFailed = \"REFUND_FAILED\",\n}\n\nexport interface OrderDataDataResponse {\n id: string;\n listingId: string;\n assetId: string;\n sellerId: string;\n buyerId: string;\n price: number;\n status: EOrderStatus;\n createdAt: Date;\n updatedAt: Date;\n ownershipChangedAt: Date;\n}\n\nexport interface OwnershipHistoryResponse {\n id: string;\n assetId: string;\n ownerId: string;\n orderData: OrderDataDataResponse;\n orgId: string;\n asset: CustomerAsset;\n createdAt: string;\n}\n\n","import { StepEnum } from '../common';\nimport { ASSET_STATUSES } from './constants';\nimport { AssetStatus, CustomerAsset, VerifyTypeEnum, WitnessCustomerAssetResponse } from './interfaces';\n\nexport function getAssetStatusIndex(status: AssetStatus) {\n return ASSET_STATUSES.indexOf(status);\n}\n\nexport function isAssetStatusBefore(currentStatus: AssetStatus, targetStatus: AssetStatus) {\n return getAssetStatusIndex(currentStatus) < getAssetStatusIndex(targetStatus);\n}\n\nexport function isAssetStatusAfter(currentStatus: AssetStatus, targetStatus: AssetStatus) {\n return getAssetStatusIndex(currentStatus) > getAssetStatusIndex(targetStatus);\n}\n\nexport function isAssetStatusFinished(currentStatus: AssetStatus, targetStatus: AssetStatus) {\n return getAssetStatusIndex(currentStatus) >= getAssetStatusIndex(targetStatus);\n}\n\n/**\n * There is a backend logical bug that causes BITDEV-1389:\n * - Token's status updates to \"PHOTO_ADDED\" after witness verification\n *\n * The workaround for the above bug is to\n * manually check \"serializedSteps\" instead of \"status\" property.\n *\n * See function directly below for the workaround version\n * (exact same function but without the status checks).\n */\nexport function getAssetVerifyStatus(a: CustomerAsset) {\n // Ideal: verified by official\n if (\n isAssetStatusFinished(a.status, 'OFFICIAL_VERIFIED') &&\n a.serializedSteps.find((sc) => sc.step === StepEnum.OFFICIAL && sc.finished === true) &&\n a.status !== 'OFFICIAL_VERIFYING_FAILED'\n ) {\n return VerifyTypeEnum.OFFICIAL_VERIFIED;\n }\n\n // Typical: skipped official verification; in other words: self verified\n // Note: if the status just finished, make sure it wasn't a failure\n if (\n isAssetStatusFinished(a.status, 'OFFICIAL_VERIFIED') &&\n a.serializedSteps.find((sc) => sc.step === StepEnum.OFFICIAL && sc.finished === false) &&\n a.status !== 'OFFICIAL_VERIFYING_FAILED'\n ) {\n return VerifyTypeEnum.SELF_VERIFIED;\n }\n\n // Chain Token flow hasn't reached this stage yet - not yet verified\n if (isAssetStatusBefore(a.status, 'OFFICIAL_VERIFYING_STARTED')) {\n return VerifyTypeEnum.NOT_VERIFIED;\n }\n\n return VerifyTypeEnum.NOT_VERIFIED;\n}\n\nexport function getAssetVerifyStatusBySteps(a: CustomerAsset) {\n // Ideal: verified by official\n if (\n a.serializedSteps?.find((sc) => sc.step === StepEnum.OFFICIAL && sc.finished === true) &&\n a.status !== 'OFFICIAL_VERIFYING_FAILED'\n ) {\n if (getAssetVerifyRejected(a.witness)) return VerifyTypeEnum.OFFICIAL_VERIFIED;\n return VerifyTypeEnum.OFFICIAL_REJECTED;\n }\n\n // Typical: skipped official verification; in other words: self verified\n // Note: if the status just finished, make sure it wasn't a failure\n if (\n a.serializedSteps?.find((sc) => sc.step === StepEnum.OFFICIAL && sc.finished === false) &&\n a.status !== 'OFFICIAL_VERIFYING_FAILED'\n ) {\n return VerifyTypeEnum.SELF_VERIFIED;\n }\n\n // New scenario: some categories can have NO official step at all, f