diff --git a/.github/workflows/deploy-prod.yml b/.github/workflows/deploy-prod.yml new file mode 100644 index 0000000..3242661 --- /dev/null +++ b/.github/workflows/deploy-prod.yml @@ -0,0 +1,32 @@ +name: Action | Auto deploy "develop" to wen.soonaverse.com + +on: + release: + types: [published] + +jobs: + publish: + runs-on: ubuntu-latest + environment: production + permissions: + contents: read + deployments: write + name: Publish to Cloudflare Pages + steps: + - name: Checkout + uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + - name: Install Dependencies + run: npm install + - name: Build project + run: npm run build + - name: Publish to Cloudflare Pages + uses: cloudflare/pages-action@v1 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + projectName: ${{ secrets.CLOUDFLARE_PROJECT_NAME }} + branch: main + directory: dist diff --git a/.github/workflows/deploy-wen.yml b/.github/workflows/deploy-wen.yml new file mode 100644 index 0000000..78093a6 --- /dev/null +++ b/.github/workflows/deploy-wen.yml @@ -0,0 +1,33 @@ +name: Action | Auto deploy "develop" to wen.soonaverse.com + +on: + push: + branches: + - develop + +jobs: + publish: + runs-on: ubuntu-latest + environment: develop + permissions: + contents: read + deployments: write + name: Publish to Cloudflare Pages + steps: + - name: Checkout + uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + - name: Install Dependencies + run: npm install + - name: Build project + run: npm run build + - name: Publish to Cloudflare Pages + uses: cloudflare/pages-action@v1 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + projectName: ${{ secrets.CLOUDFLARE_PROJECT_NAME }} + branch: main + directory: dist diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..6366838 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "semi": true, + "trailingComma": "all", + "singleQuote": true, + "printWidth": 100, + "tabWidth": 2, + "useTabs": false, + "endOfLine": "auto" +} diff --git a/package.json b/package.json index 04e01c5..6d2bd66 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "i18n": "ng extract-i18n --out-file=src/locale/messages.xlf", "analyze": "webpack-bundle-analyzer dist/soonaverse/stats.json", "dev:ssr": "node --max-old-space-size=8192 node_modules/@angular/cli/bin/ng run soonaverse:serve-ssr", - "serve:ssr": "node dist/soonaverse-server/main.js" + "serve:ssr": "node dist/soonaverse-server/main.js", + "prettier": "npx prettier --write ./src" }, "dependencies": { "@angular/animations": "15.1.3", diff --git a/src/app/@api/base.api.ts b/src/app/@api/base.api.ts index 21b8599..092954d 100644 --- a/src/app/@api/base.api.ts +++ b/src/app/@api/base.api.ts @@ -3,11 +3,11 @@ import { environment } from '@env/environment'; import { EthAddress, PublicCollections, - SOON_PROD_ADDRESS_API, - SOON_TEST_ADDRESS_API, + BUILD5_PROD_ADDRESS_API, + BUILD5_TEST_ADDRESS_API, WEN_FUNC, } from '@build-5/interfaces'; -import { SoonEnv, initSoonEnv } from '@build-5/lib'; +import { Build5Env } from '@build-5/lib'; import { CrudRepository } from '@build-5/lib/lib/repositories/CrudRepository'; import { Observable, map } from 'rxjs'; @@ -18,9 +18,7 @@ export const FULL_LIST = 10000; export const FULL_TODO_CHANGE_TO_PAGING = FULL_LIST; export const FULL_TODO_MOVE_TO_PROTOCOL = FULL_LIST; -export const SOON_ENV = environment.production ? SoonEnv.PROD : SoonEnv.TEST; - -initSoonEnv(SOON_ENV); +export const SOON_ENV = environment.production ? Build5Env.PROD : Build5Env.TEST; export class BaseApi { protected repo: CrudRepository; @@ -36,7 +34,7 @@ export class BaseApi { public top = (lastValue?: string, limit?: number) => this.repo.getTopLive(lastValue, limit); protected request(func: WEN_FUNC, req: any): Observable { - const origin = environment.production ? SOON_PROD_ADDRESS_API : SOON_TEST_ADDRESS_API; + const origin = environment.production ? BUILD5_PROD_ADDRESS_API : BUILD5_TEST_ADDRESS_API; return this.httpClient.post(origin + func, { data: req }).pipe(map((b: any) => b.data)); } } diff --git a/src/app/@api/file.api.ts b/src/app/@api/file.api.ts index c5ae8e0..918e2b9 100644 --- a/src/app/@api/file.api.ts +++ b/src/app/@api/file.api.ts @@ -3,8 +3,8 @@ import { Injectable } from '@angular/core'; import { environment } from '@env/environment'; import { FILE_SIZES, - SOON_PROD_ADDRESS_API, - SOON_TEST_ADDRESS_API, + BUILD5_PROD_ADDRESS_API, + BUILD5_TEST_ADDRESS_API, WEN_FUNC, } from '@build-5/interfaces'; import { NzUploadXHRArgs } from 'ng-zorro-antd/upload'; @@ -47,7 +47,7 @@ export class FileApi { formData.append('file', item.postFile); formData.append('member', memberId); formData.append('uid', item.file.uid); - const origin = environment.production ? SOON_PROD_ADDRESS_API : SOON_TEST_ADDRESS_API; + const origin = environment.production ? BUILD5_PROD_ADDRESS_API : BUILD5_TEST_ADDRESS_API; return this.httpClient .post(origin + WEN_FUNC.uploadFile, formData) .pipe( diff --git a/src/app/@api/nft.api.ts b/src/app/@api/nft.api.ts index 8673529..875b150 100644 --- a/src/app/@api/nft.api.ts +++ b/src/app/@api/nft.api.ts @@ -6,9 +6,7 @@ import { Nft, PublicCollections, Transaction, - TransactionOrder, - TransactionOrderType, - TransactionPayment, + TransactionPayloadType, TransactionType, WEN_FUNC, WenRequest, @@ -19,13 +17,13 @@ import { BaseApi, SOON_ENV } from './base.api'; export interface SuccesfullOrdersWithFullHistory { newMember: Member; - order: TransactionOrder; + order: Transaction; transactions: Transaction[]; } export interface OffersHistory { member: Member; - transaction: TransactionPayment; + transaction: Transaction; } @Injectable({ @@ -77,7 +75,7 @@ export class NftApi extends BaseApi { const sourceTransaction = Array.isArray(sourceTransactions) ? sourceTransactions[sourceTransactions.length - 1] : sourceTransactions; - const order = (await this.transactionRepo.getById(sourceTransaction))!; + const order = (await this.transactionRepo.getById(sourceTransaction!))!; const member = (await this.memberRepo.getById(transaction.member!))!; const successfullOrder: SuccesfullOrdersWithFullHistory = { @@ -86,7 +84,7 @@ export class NftApi extends BaseApi { transactions: [], }; - for (const link of order.linkedTransactions) { + for (const link of order.linkedTransactions!) { const linkedTransaction = (await this.transactionRepo.getById(link))!; if ( (!linkedTransaction.payload.void && !linkedTransaction.payload.invalidPayment) || @@ -121,7 +119,7 @@ export class NftApi extends BaseApi { return { member, transaction } as OffersHistory; }); return (await Promise.all(promises)).sort( - (a, b) => b.transaction.payload.amount - a.transaction.payload.amount, + (a, b) => Number(b.transaction.payload.amount) - Number(a.transaction.payload.amount), ); }), ); @@ -135,16 +133,16 @@ export class NftApi extends BaseApi { let sourceTransactionId = Array.isArray(sourceTransactions) ? sourceTransactions[sourceTransactions.length - 1] : sourceTransactions; - let sourceTransaction = (await this.transactionRepo.getById(sourceTransactionId))!; + let sourceTransaction = (await this.transactionRepo.getById(sourceTransactionId!))!; if (sourceTransaction.type === TransactionType.PAYMENT) { sourceTransactions = sourceTransaction.payload.sourceTransaction; sourceTransactionId = Array.isArray(sourceTransactions) ? sourceTransactions[sourceTransactions.length - 1] : sourceTransactions; - sourceTransaction = (await this.transactionRepo.getById(sourceTransactionId))!; + sourceTransaction = (await this.transactionRepo.getById(sourceTransactionId!))!; } - const isNftBid = sourceTransaction.payload.type === TransactionOrderType.NFT_BID; + const isNftBid = sourceTransaction.payload.type === TransactionPayloadType.NFT_BID; return isNftBid ? transaction : undefined; }); diff --git a/src/app/@api/space.api.ts b/src/app/@api/space.api.ts index 85a959c..e44f662 100644 --- a/src/app/@api/space.api.ts +++ b/src/app/@api/space.api.ts @@ -1,7 +1,9 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { + Member, PublicCollections, + QUERY_MAX_LENGTH, Space, SpaceMember, WEN_FUNC, @@ -16,6 +18,7 @@ import { } from '@build-5/lib'; import { Observable, map, of, switchMap } from 'rxjs'; import { BaseApi, SOON_ENV } from './base.api'; +import { chunkArray } from '@core/utils/common.utils'; @Injectable({ providedIn: 'root', @@ -55,10 +58,8 @@ export class SpaceApi extends BaseApi { public listenGuardians = (spaceId: string, lastValue?: string) => this.spaceGuardianRepo.getAllLive(spaceId, lastValue).pipe(switchMap(this.getMembers)); - public listenMembersWithoutData = (spaceId: string, lastValue?: string) => - this.spaceMemberRepo - .getAllLive(spaceId, lastValue) - .pipe(map((members) => members.map((m) => ({ uid: m.uid })))); + public getMembersWithoutData = (spaceId: string, lastValue?: string) => + this.spaceMemberRepo.getAll(spaceId, lastValue); public listenMembers = (spaceId: string, lastValue?: string) => this.spaceMemberRepo.getAllLive(spaceId, lastValue).pipe(switchMap(this.getMembers)); @@ -70,10 +71,11 @@ export class SpaceApi extends BaseApi { this.spaceKnockingRepo.getAllLive(spaceId, lastValue).pipe(switchMap(this.getMembers)); private getMembers = async (spaceMembers: SpaceMember[]) => { - const promises = spaceMembers.map( - async (spaceMember) => (await this.memberRepo.getById(spaceMember.uid))!, + const uids = spaceMembers.map((m) => m.uid); + const promises = chunkArray(uids, QUERY_MAX_LENGTH).map((chunk) => + this.memberRepo.getManyById(chunk), ); - return await Promise.all(promises); + return (await Promise.all(promises)).flat(); }; public create = (req: WenRequest): Observable => diff --git a/src/app/@api/token.api.ts b/src/app/@api/token.api.ts index d788427..f0b31de 100644 --- a/src/app/@api/token.api.ts +++ b/src/app/@api/token.api.ts @@ -8,11 +8,7 @@ import { WEN_FUNC, WenRequest, } from '@build-5/interfaces'; -import { - TokenDistributionRepository, - TokenRepository, - TokenStatsRepository, -} from '@build-5/lib'; +import { TokenDistributionRepository, TokenRepository, TokenStatsRepository } from '@build-5/lib'; import { Observable, of } from 'rxjs'; import { BaseApi, SOON_ENV } from './base.api'; @@ -94,9 +90,6 @@ export class TokenApi extends BaseApi { public topPublic = (lastValue?: string, limit?: number) => this.tokenRepo.getByStatusLive([], lastValue, limit); - public top = (lastValue?: string, limit?: number): Observable => - this.tokenRepo.getTopLive(lastValue, limit); - public space = (space: string, lastValue?: string) => this.tokenRepo.getBySpaceLive(space, lastValue); } diff --git a/src/app/@api/token_mint.api.ts b/src/app/@api/token_mint.api.ts index 7b9a39e..99c5769 100644 --- a/src/app/@api/token_mint.api.ts +++ b/src/app/@api/token_mint.api.ts @@ -1,12 +1,6 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { - PublicCollections, - Token, - Transaction, - WEN_FUNC, - WenRequest, -} from '@build-5/interfaces'; +import { PublicCollections, Token, Transaction, WEN_FUNC, WenRequest } from '@build-5/interfaces'; import { Observable } from 'rxjs'; import { BaseApi } from './base.api'; diff --git a/src/app/@core/pipes/formatToken/format-token.pipe.ts b/src/app/@core/pipes/formatToken/format-token.pipe.ts index 93ff1e2..d9b24cf 100644 --- a/src/app/@core/pipes/formatToken/format-token.pipe.ts +++ b/src/app/@core/pipes/formatToken/format-token.pipe.ts @@ -29,14 +29,16 @@ export class FormatTokenPipe implements PipeTransform { } public async transform( - value: number | null | undefined | ConvertValue, + value: string | number | null | undefined | ConvertValue, tokenUidOrNetwork?: string | null, removeZeroes = false, showUnit = true, defDecimals = DEF_DECIMALS, ): Promise { let network = DEFAULT_NETWORK; - if (typeof value === 'object') { + if (typeof value === 'string') { + value = Number(value); + } else if (typeof value === 'object') { if (value?.value) { value = this.multiValue(value); } else { diff --git a/src/app/@core/services/transaction/transaction.service.ts b/src/app/@core/services/transaction/transaction.service.ts index 3917f08..812200f 100644 --- a/src/app/@core/services/transaction/transaction.service.ts +++ b/src/app/@core/services/transaction/transaction.service.ts @@ -3,8 +3,7 @@ import { DEF_WALLET_PAY_IN_PROGRESS, Network, Transaction, - TransactionMintCollectionType, - TransactionMintTokenType, + TransactionPayloadType, TransactionType, } from '@build-5/interfaces'; @@ -45,15 +44,15 @@ export class TransactionService { public getMintedSubtypesText(t: Transaction): string { let base = ''; - if (t.payload.type === TransactionMintCollectionType.MINT_ALIAS) { + if (t.payload.type === TransactionPayloadType.MINT_ALIAS) { base += ' ' + $localize`(Mint Alias)`; - } else if (t.payload.type === TransactionMintCollectionType.MINT_NFTS) { + } else if (t.payload.type === TransactionPayloadType.MINT_NFTS) { base += ' ' + $localize`(Mint NFTs)`; - } else if (t.payload.type === TransactionMintTokenType.MINT_FOUNDRY) { + } else if (t.payload.type === TransactionPayloadType.MINT_FOUNDRY) { base += ' ' + $localize`(Mint Foundry)`; - } else if (t.payload.type === TransactionMintCollectionType.SEND_ALIAS_TO_GUARDIAN) { + } else if (t.payload.type === TransactionPayloadType.SEND_ALIAS_TO_GUARDIAN) { base += ' ' + $localize`(Send Alias to Guardian)`; - } else if (t.payload.type === TransactionMintCollectionType.LOCK_COLLECTION) { + } else if (t.payload.type === TransactionPayloadType.LOCK_COLLECTION) { base += ' ' + $localize`(Lock Collection)`; } @@ -65,7 +64,7 @@ export class TransactionService { if (this.paymentNotProcessedOrInProgress(t)) return null; const link = t.payload.chainReference || t.payload?.walletReference?.chainReference; - return this.generateLink(link, t.network); + return this.generateLink(link!, t.network); } public generateLink(link: string, network?: Network): string { @@ -85,7 +84,8 @@ export class TransactionService { public paymentNotProcessedOrInProgress(tran: Transaction | undefined | null): boolean { return ( (!tran?.payload.chainReference && !tran?.payload.walletReference?.chainReference) || - tran.payload.walletReference?.chainReference.startsWith(DEF_WALLET_PAY_IN_PROGRESS) + tran.payload.walletReference?.chainReference?.startsWith(DEF_WALLET_PAY_IN_PROGRESS) || + false ); } } diff --git a/src/app/@core/utils/common.utils.ts b/src/app/@core/utils/common.utils.ts new file mode 100644 index 0000000..52c3d41 --- /dev/null +++ b/src/app/@core/utils/common.utils.ts @@ -0,0 +1,8 @@ +export const chunkArray = (array: T[], size: number) => { + const chunks: T[][] = []; + for (let i = 0; i < array.length; i += size) { + const chunk = array.slice(i, i + size); + chunks.push(chunk); + } + return chunks; +}; diff --git a/src/app/@shell/ui/header/header.component.ts b/src/app/@shell/ui/header/header.component.ts index 6e08c96..b3844b8 100644 --- a/src/app/@shell/ui/header/header.component.ts +++ b/src/app/@shell/ui/header/header.component.ts @@ -34,7 +34,7 @@ import { Notification, NotificationType, TRANSACTION_AUTO_EXPIRY_MS, - TransactionOrder, + Transaction, } from '@build-5/interfaces'; import dayjs from 'dayjs'; import { NzNotificationRef, NzNotificationService } from 'ng-zorro-antd/notification'; @@ -82,8 +82,8 @@ export class HeaderComponent implements OnInit, OnDestroy { private notificationRef?: NzNotificationRef; public expiryTicker$: BehaviorSubject = new BehaviorSubject(null); - private transaction$: BehaviorSubject = new BehaviorSubject< - TransactionOrder | undefined + private transaction$: BehaviorSubject = new BehaviorSubject< + Transaction | undefined >(undefined); private subscriptionTransaction$?: Subscription; private subscriptionNotification$?: Subscription; diff --git a/src/app/components/award/components/award-mint/award-mint.component.html b/src/app/components/award/components/award-mint/award-mint.component.html index 997f01c..1154670 100644 --- a/src/app/components/award/components/award-mint/award-mint.component.html +++ b/src/app/components/award/components/award-mint/award-mint.component.html @@ -132,9 +132,9 @@ [targetAddress]="targetAddress" [network]="award?.network" [tokenId]="token?.mintingData?.tokenId" - [tokenAmount]="(transaction$ | async)?.payload.nativeTokens?.[0]?.amount" + [tokenAmount]="(transaction$ | async)?.payload?.nativeTokens?.[0]?.amount" [surplus]="true" - [targetAmount]="((transaction$ | async)?.payload.amount).toString()" + [targetAmount]="((transaction$ | async)?.payload?.amount || 0).toString()" > diff --git a/src/app/components/award/components/award-mint/award-mint.component.ts b/src/app/components/award/components/award-mint/award-mint.component.ts index 8400643..a5c8c28 100644 --- a/src/app/components/award/components/award-mint/award-mint.component.ts +++ b/src/app/components/award/components/award-mint/award-mint.component.ts @@ -112,7 +112,7 @@ export class AwardMintComponent implements OnInit { // It's expired. removeItem(StorageItem.AwardMintTransaction); } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.WAIT; // Listen to other transactions. for (const tranId of val.linkedTransactions) { diff --git a/src/app/components/collection/components/collection-mint-network/collection-mint-network.component.ts b/src/app/components/collection/components/collection-mint-network/collection-mint-network.component.ts index c50d287..f54d917 100644 --- a/src/app/components/collection/components/collection-mint-network/collection-mint-network.component.ts +++ b/src/app/components/collection/components/collection-mint-network/collection-mint-network.component.ts @@ -122,7 +122,7 @@ export class CollectionMintNetworkComponent implements OnInit { // It's expired. removeItem(StorageItem.CollectionMintTransaction); } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.WAIT; // Listen to other transactions. for (const tranId of val.linkedTransactions) { diff --git a/src/app/components/member/components/member-card/member-card.component.html b/src/app/components/member/components/member-card/member-card.component.html index 3f18fca..e5591cd 100644 --- a/src/app/components/member/components/member-card/member-card.component.html +++ b/src/app/components/member/components/member-card/member-card.component.html @@ -74,17 +74,6 @@ {{ getTotal() | async }} awards - -
- - -
0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.WAIT; // Listen to other transactions. for (const tranId of val.linkedTransactions) { diff --git a/src/app/components/nft/components/nft-card/nft-card.component.ts b/src/app/components/nft/components/nft-card/nft-card.component.ts index d1b3e65..3c70eb3 100644 --- a/src/app/components/nft/components/nft-card/nft-card.component.ts +++ b/src/app/components/nft/components/nft-card/nft-card.component.ts @@ -126,7 +126,7 @@ export class NftCardComponent { (a, b) => b.amount - a.amount, ); for (const discount of descDiscounts) { - const awardStat = (spaceRewards?.awardStat || {})[discount.tokenUid]; + const awardStat = (spaceRewards?.awardStat || {})[discount.tokenUid!]; const memberTotalReward = awardStat?.totalReward || 0; if (memberTotalReward >= discount.tokenReward) { return 1 - discount.amount; diff --git a/src/app/components/nft/components/nft-checkout/nft-checkout.component.ts b/src/app/components/nft/components/nft-checkout/nft-checkout.component.ts index 4180288..d0c4fc1 100644 --- a/src/app/components/nft/components/nft-checkout/nft-checkout.component.ts +++ b/src/app/components/nft/components/nft-checkout/nft-checkout.component.ts @@ -167,7 +167,7 @@ export class NftCheckoutComponent implements OnInit, OnDestroy { // It's expired. removeItem(StorageItem.CheckoutTransaction); } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.WAIT; // Listen to other transactions. for (const tranId of val.linkedTransactions) { @@ -372,7 +372,7 @@ export class NftCheckoutComponent implements OnInit, OnDestroy { (a, b) => b.amount - a.amount, ); for (const discount of descDiscounts) { - const awardStat = (spaceRewards?.awardStat || {})[discount.tokenUid]; + const awardStat = (spaceRewards?.awardStat || {})[discount.tokenUid!]; const memberTotalReward = awardStat?.totalReward || 0; if (memberTotalReward >= discount.tokenReward) { return 1 - discount.amount; diff --git a/src/app/components/nft/components/nft-deposit/nft-deposit.component.ts b/src/app/components/nft/components/nft-deposit/nft-deposit.component.ts index a0dd659..3f342fa 100644 --- a/src/app/components/nft/components/nft-deposit/nft-deposit.component.ts +++ b/src/app/components/nft/components/nft-deposit/nft-deposit.component.ts @@ -118,7 +118,7 @@ export class NftDepositComponent implements OnInit { // It's expired. removeItem(StorageItem.DepositNftTransaction); } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.WAIT; // Listen to other transactions. for (const tranId of val.linkedTransactions) { @@ -184,11 +184,12 @@ export class NftDepositComponent implements OnInit { val.payload.reconciled === true && !val.payload?.walletReference?.chainReference ) { + const response = val.payload?.response; this.pushToHistory( val, val.uid + '_false', val.createdOn, - $localize`Invalid NFT received. ` + val.payload?.response?.key || '', + $localize`Invalid NFT received. ` + (response?.key || response?.message || ''), ); } diff --git a/src/app/components/nft/components/nft-stake/nft-stake.component.ts b/src/app/components/nft/components/nft-stake/nft-stake.component.ts index 8edc609..0a36e5d 100644 --- a/src/app/components/nft/components/nft-stake/nft-stake.component.ts +++ b/src/app/components/nft/components/nft-stake/nft-stake.component.ts @@ -143,7 +143,7 @@ export class NftStakeComponent implements OnInit { // It's expired. removeItem(StorageItem.StakeNftTransaction); } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.WAIT; // Listen to other transactions. for (const tranId of val.linkedTransactions) { @@ -209,11 +209,12 @@ export class NftStakeComponent implements OnInit { val.payload.reconciled === true && !val.payload?.walletReference?.chainReference ) { + const response = val.payload?.response; this.pushToHistory( val, val.uid + '_false', val.createdOn, - $localize`Invalid NFT received. ` + val.payload?.response?.key || '', + $localize`Invalid NFT received. ` + (response?.key || response?.message || ''), ); } diff --git a/src/app/components/space/components/space-claim/space-claim.component.ts b/src/app/components/space/components/space-claim/space-claim.component.ts index 80bfef2..cf09910 100644 --- a/src/app/components/space/components/space-claim/space-claim.component.ts +++ b/src/app/components/space/components/space-claim/space-claim.component.ts @@ -107,7 +107,7 @@ export class SpaceClaimComponent implements OnInit, OnDestroy { if (expiresOn.isBefore(dayjs()) || val.payload?.void || val.payload?.reconciled) { this.space && removeSpaceClaimItem(this.space.uid); } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.TRANSACTION; // Listen to other transactions. for (const tranId of val.linkedTransactions) { @@ -161,7 +161,7 @@ export class SpaceClaimComponent implements OnInit, OnDestroy { val.createdOn, $localize`Transaction confirmed.`, ); - this.purchasedAmount = val.payload.amount; + this.purchasedAmount = Number(val.payload.amount); this.receivedTransactions = true; this.currentStep = StepType.COMPLETE; this.cd.markForCheck(); diff --git a/src/app/components/token/components/locked-token-claim/locked-token-claim.component.html b/src/app/components/token/components/locked-token-claim/locked-token-claim.component.html index 4b99214..0a8885e 100644 --- a/src/app/components/token/components/locked-token-claim/locked-token-claim.component.html +++ b/src/app/components/token/components/locked-token-claim/locked-token-claim.component.html @@ -30,8 +30,8 @@
{{ ( - this.transaction?.payload.nativeTokens?.[0].amount| formatToken: - this.transaction?.payload.token: + this.transaction?.payload?.nativeTokens?.[0]?.amount | formatToken: + this.transaction?.payload?.token: false: false | async ) @@ -65,8 +65,8 @@
{{ ( - this.transaction?.payload.nativeTokens?.[0].amount | formatToken: - this.transaction?.payload.token: + this.transaction?.payload?.nativeTokens?.[0]?.amount | formatToken: + this.transaction?.payload?.token: false: false | async ) diff --git a/src/app/components/token/components/locked-token-claim/locked-token-claim.component.ts b/src/app/components/token/components/locked-token-claim/locked-token-claim.component.ts index 1fc71d7..6b67720 100644 --- a/src/app/components/token/components/locked-token-claim/locked-token-claim.component.ts +++ b/src/app/components/token/components/locked-token-claim/locked-token-claim.component.ts @@ -107,7 +107,7 @@ export class LockedTokenClaimComponent implements OnInit, OnDestroy { if (expiresOn.isBefore(dayjs()) || val.payload?.void || val.payload?.reconciled) { this.transaction?.uid && removeLockedTokenClaimItem(this.transaction.uid); } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.TRANSACTION; // Listen to other transactions. for (const tranId of val.linkedTransactions) { @@ -161,7 +161,7 @@ export class LockedTokenClaimComponent implements OnInit, OnDestroy { val.createdOn, $localize`Transaction confirmed.`, ); - this.purchasedAmount = val.payload.amount; + this.purchasedAmount = Number(val.payload.amount); this.receivedTransactions = true; this.currentStep = StepType.COMPLETE; this.cd.markForCheck(); diff --git a/src/app/components/token/components/token-airdrop-network/token-airdrop-network.component.ts b/src/app/components/token/components/token-airdrop-network/token-airdrop-network.component.ts index 4b3eecd..4ed13f6 100644 --- a/src/app/components/token/components/token-airdrop-network/token-airdrop-network.component.ts +++ b/src/app/components/token/components/token-airdrop-network/token-airdrop-network.component.ts @@ -116,7 +116,7 @@ export class TokenAirdropNetworkComponent implements OnInit { // It's expired. removeItem(StorageItem.TokenAirdropTransaction); } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.WAIT; // Listen to other transactions. for (const tranId of val.linkedTransactions) { diff --git a/src/app/components/token/components/token-all-token-row/token-all-token-row.component.ts b/src/app/components/token/components/token-all-token-row/token-all-token-row.component.ts index 6466f52..fa69323 100644 --- a/src/app/components/token/components/token-all-token-row/token-all-token-row.component.ts +++ b/src/app/components/token/components/token-all-token-row/token-all-token-row.component.ts @@ -56,7 +56,7 @@ export class TokenAllTokenRowComponent implements OnInit, OnDestroy { if (this.tokenId) { this.tokenApi .listen(this.tokenId) - .pipe(first(), untilDestroyed(this)) + .pipe(untilDestroyed(this)) .subscribe((token) => { if (token) { this.token = token; diff --git a/src/app/components/token/components/token-bid/token-bid.component.ts b/src/app/components/token/components/token-bid/token-bid.component.ts index 55c61a2..3bdcb62 100644 --- a/src/app/components/token/components/token-bid/token-bid.component.ts +++ b/src/app/components/token/components/token-bid/token-bid.component.ts @@ -130,7 +130,7 @@ export class TokenBidComponent implements OnInit, OnDestroy { if (expiresOn.isBefore(dayjs()) || val.payload?.void || val.payload?.reconciled) { // none. } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.TRANSACTION; // Listen to other transactions. for (const tranId of val.linkedTransactions) { @@ -184,7 +184,7 @@ export class TokenBidComponent implements OnInit, OnDestroy { val.createdOn, $localize`Transaction confirmed.`, ); - this.purchasedAmount = val.payload.amount; + this.purchasedAmount = val.payload.amount || 0; this.receivedTransactions = true; this.currentStep = StepType.COMPLETE; this.cd.markForCheck(); diff --git a/src/app/components/token/components/token-claim/token-claim.component.ts b/src/app/components/token/components/token-claim/token-claim.component.ts index 8abe9d4..9de621b 100644 --- a/src/app/components/token/components/token-claim/token-claim.component.ts +++ b/src/app/components/token/components/token-claim/token-claim.component.ts @@ -111,7 +111,7 @@ export class TokenClaimComponent implements OnInit, OnDestroy { if (expiresOn.isBefore(dayjs()) || val.payload?.void || val.payload?.reconciled) { this.token && removeTokenClaimItem(this.token.uid); } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions.length > 0) { this.currentStep = StepType.TRANSACTION; // Listen to other transactions. for (const tranId of val.linkedTransactions) { @@ -165,7 +165,7 @@ export class TokenClaimComponent implements OnInit, OnDestroy { val.createdOn, $localize`Transaction confirmed.`, ); - this.purchasedAmount = val.payload.amount; + this.purchasedAmount = val.payload.amount || 0; this.receivedTransactions = true; this.currentStep = StepType.COMPLETE; this.cd.markForCheck(); diff --git a/src/app/components/token/components/token-import/token-import.component.ts b/src/app/components/token/components/token-import/token-import.component.ts index 8c5de11..35ea79a 100644 --- a/src/app/components/token/components/token-import/token-import.component.ts +++ b/src/app/components/token/components/token-import/token-import.component.ts @@ -116,7 +116,7 @@ export class TokenImportComponent implements OnInit { // It's expired. removeItem(StorageItem.TokenMintTransaction); } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.WAIT; // Listen to other transactions. for (const tranId of val.linkedTransactions) { diff --git a/src/app/components/token/components/token-mint-network/token-mint-network.component.ts b/src/app/components/token/components/token-mint-network/token-mint-network.component.ts index 42ce782..5f952e7 100644 --- a/src/app/components/token/components/token-mint-network/token-mint-network.component.ts +++ b/src/app/components/token/components/token-mint-network/token-mint-network.component.ts @@ -130,7 +130,7 @@ export class TokenMintNetworkComponent implements OnInit { // It's expired. removeItem(StorageItem.TokenMintTransaction); } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.WAIT; // Listen to other transactions. for (const tranId of val.linkedTransactions) { diff --git a/src/app/components/token/components/token-offer-mint/token-offer-mint.component.ts b/src/app/components/token/components/token-offer-mint/token-offer-mint.component.ts index 93885a2..66a4530 100644 --- a/src/app/components/token/components/token-offer-mint/token-offer-mint.component.ts +++ b/src/app/components/token/components/token-offer-mint/token-offer-mint.component.ts @@ -131,7 +131,7 @@ export class TokenOfferMintComponent implements OnInit, OnDestroy { if (expiresOn.isBefore(dayjs()) || val.payload?.void || val.payload?.reconciled) { // TODO remove empty if } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.TRANSACTION; // Listen to other transactions. for (const tranId of val.linkedTransactions) { @@ -185,7 +185,7 @@ export class TokenOfferMintComponent implements OnInit, OnDestroy { val.createdOn, $localize`Transaction confirmed.`, ); - this.purchasedAmount = val.payload.amount; + this.purchasedAmount = val.payload.amount || 0; this.receivedTransactions = true; this.currentStep = StepType.COMPLETE; this.cd.markForCheck(); diff --git a/src/app/components/token/components/token-purchase/token-purchase.component.ts b/src/app/components/token/components/token-purchase/token-purchase.component.ts index 46567e4..3a53c79 100644 --- a/src/app/components/token/components/token-purchase/token-purchase.component.ts +++ b/src/app/components/token/components/token-purchase/token-purchase.component.ts @@ -113,7 +113,7 @@ export class TokenPurchaseComponent implements OnInit, OnDestroy { if (expiresOn.isBefore(dayjs()) || val.payload?.void || val.payload?.reconciled) { // Nothing... } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = historical ? StepType.TRANSACTION : StepType.WAIT; // Listen to other transactions. for (const tranId of val.linkedTransactions) { @@ -166,7 +166,7 @@ export class TokenPurchaseComponent implements OnInit, OnDestroy { $localize`Transaction confirmed.`, ); if (!historical) { - this.purchasedAmount = val.payload.amount; + this.purchasedAmount = val.payload.amount || 0; this.receivedTransactions = true; this.currentStep = StepType.COMPLETE; } diff --git a/src/app/components/token/components/token-stake/token-stake.component.ts b/src/app/components/token/components/token-stake/token-stake.component.ts index 7980a2d..07cc56c 100644 --- a/src/app/components/token/components/token-stake/token-stake.component.ts +++ b/src/app/components/token/components/token-stake/token-stake.component.ts @@ -196,7 +196,7 @@ export class TokenStakeComponent implements OnInit, OnDestroy { if (expiresOn.isBefore(dayjs()) || val.payload?.void || val.payload?.reconciled) { this.token && removeStakeTokenItem(this.token.uid); } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.TRANSACTION; // Listen to other transactions. for (const tranId of val.linkedTransactions) { @@ -250,7 +250,7 @@ export class TokenStakeComponent implements OnInit, OnDestroy { val.createdOn, $localize`Transaction confirmed.`, ); - this.purchasedAmount = val.payload.amount; + this.purchasedAmount = val.payload.amount || 0; this.receivedTransactions = true; this.currentStep = StepType.COMPLETE; this.cd.markForCheck(); diff --git a/src/app/components/token/components/token-trade-detail-modal/token-trade-detail-modal.component.html b/src/app/components/token/components/token-trade-detail-modal/token-trade-detail-modal.component.html index f72e974..c4168ac 100644 --- a/src/app/components/token/components/token-trade-detail-modal/token-trade-detail-modal.component.html +++ b/src/app/components/token/components/token-trade-detail-modal/token-trade-detail-modal.component.html @@ -123,11 +123,11 @@ {{ - (billPaymentTransactions$[i] | async)?.payload.nativeTokens[0].amount - | formatToken : (billPaymentTransactions$[i] | async)?.payload.token : true : false + (billPaymentTransactions$[i] | async)?.payload?.nativeTokens?.[0]?.amount + | formatToken : (billPaymentTransactions$[i] | async)?.payload?.token : true : false | async }} {{ (token?.symbol === 'IOTA' ? 'M' : '') + token?.symbol }} @@ -139,7 +139,7 @@ nzTooltipTitle="Storage deposit fee" > ({{ - (billPaymentTransactions$[i] | async)?.payload.amount + (billPaymentTransactions$[i] | async)?.payload?.amount | formatToken : (billPaymentTransactions$[i] | async)?.network : true | async }}) @@ -147,10 +147,10 @@ {{ - (billPaymentTransactions$[i] | async)?.payload.amount + (billPaymentTransactions$[i] | async)?.payload?.amount | formatToken : (billPaymentTransactions$[i] | async)?.network : true | async }} @@ -207,10 +207,10 @@ {{ - (buyerBillPaymentTransactions$[i] | async)?.payload.nativeTokens[0].amount + (buyerBillPaymentTransactions$[i] | async)?.payload?.nativeTokens?.[0]?.amount | formatToken : (buyerBillPaymentTransactions$[i] | async)?.payload?.token : true @@ -221,10 +221,10 @@ {{ - (buyerBillPaymentTransactions$[i] | async)?.payload.amount + (buyerBillPaymentTransactions$[i] | async)?.payload?.amount | formatToken : (buyerBillPaymentTransactions$[i] | async)?.network : true | async }} @@ -280,7 +280,7 @@ {{ item?.createdOn?.toDate() | date : 'medium' }} - {{ item?.payload.amount | formatToken : item?.network : true | async }} + {{ item?.payload?.amount | formatToken : item?.network : true | async }} @@ -315,7 +315,7 @@ {{ - (creditTransactions$[i] | async)?.payload.amount + (creditTransactions$[i] | async)?.payload?.amount | formatToken : (creditTransactions$[i] | async)?.network : true | async }} diff --git a/src/app/components/token/components/token-trade-detail-modal/token-trade-detail-modal.component.ts b/src/app/components/token/components/token-trade-detail-modal/token-trade-detail-modal.component.ts index 9e940ca..cc59b7d 100644 --- a/src/app/components/token/components/token-trade-detail-modal/token-trade-detail-modal.component.ts +++ b/src/app/components/token/components/token-trade-detail-modal/token-trade-detail-modal.component.ts @@ -149,7 +149,7 @@ export class TokenTradeDetailModalComponent implements OnDestroy { } public getWalletStatus(tran: Transaction | undefined | null): string { - if (tran?.ignoreWallet && tran?.payload?.amount < MIN_IOTA_AMOUNT) { + if (tran?.ignoreWallet && Number(tran?.payload?.amount) < MIN_IOTA_AMOUNT) { return $localize`Non Transferable`; } else { return $localize`Processing...`; @@ -181,8 +181,8 @@ export class TokenTradeDetailModalComponent implements OnDestroy { this.buyerBillPaymentTransactions$[i], ]).pipe( map(([royalty, bill]) => { - let total = royalty?.reduce((acc, act) => acc + act.payload.amount, 0); - total += bill?.payload.amount; + let total = (royalty || []).reduce((acc, act) => acc + Number(act.payload.amount), 0); + total += Number(bill?.payload.amount); if (total && tran?.payload.amount) { return tran?.payload.amount / total; } else { diff --git a/src/app/components/token/components/token-trading-pair-row/token-trading-pair-row.component.ts b/src/app/components/token/components/token-trading-pair-row/token-trading-pair-row.component.ts index a4db1ca..e2fedfc 100644 --- a/src/app/components/token/components/token-trading-pair-row/token-trading-pair-row.component.ts +++ b/src/app/components/token/components/token-trading-pair-row/token-trading-pair-row.component.ts @@ -63,7 +63,7 @@ export class TokenTradingPairRowComponent implements OnInit, OnDestroy { if (this.tokenId) { this.tokenApi .listen(this.tokenId) - .pipe(first(), untilDestroyed(this)) + .pipe(untilDestroyed(this)) .subscribe((token) => { if (token) { this.token = token; diff --git a/src/app/components/token/components/token-vote/token-vote.component.html b/src/app/components/token/components/token-vote/token-vote.component.html index 755e824..38f5b80 100644 --- a/src/app/components/token/components/token-vote/token-vote.component.html +++ b/src/app/components/token/components/token-vote/token-vote.component.html @@ -122,7 +122,7 @@ {{ now$ | async | date : 'long' }}
- {{ proposal?.settings?.startDate.toDate() | date : 'long' }} + {{ proposal?.settings?.startDate?.toDate() | date : 'long' }}
diff --git a/src/app/components/token/components/token-vote/token-vote.component.ts b/src/app/components/token/components/token-vote/token-vote.component.ts index efa3dde..a487d1f 100644 --- a/src/app/components/token/components/token-vote/token-vote.component.ts +++ b/src/app/components/token/components/token-vote/token-vote.component.ts @@ -158,7 +158,7 @@ export class TokenVoteComponent implements OnInit, OnDestroy { if (expiresOn.isBefore(dayjs()) || val.payload?.void || val.payload?.reconciled) { // TODO remove empty if } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions?.length > 0) { this.currentStep = StepType.TRANSACTION; // Listen to other transactions. for (const tranId of val.linkedTransactions) { @@ -212,7 +212,7 @@ export class TokenVoteComponent implements OnInit, OnDestroy { val.createdOn, $localize`Transaction confirmed and funds refunded.`, ); - this.purchasedAmount = val.payload.amount; + this.purchasedAmount = val.payload.amount || 0; this.receivedTransactions = true; this.currentStep = StepType.COMPLETE; this.cd.markForCheck(); diff --git a/src/app/components/wallet-address/verify-address/verify-address.component.ts b/src/app/components/wallet-address/verify-address/verify-address.component.ts index e188bd0..a59c8c2 100644 --- a/src/app/components/wallet-address/verify-address/verify-address.component.ts +++ b/src/app/components/wallet-address/verify-address/verify-address.component.ts @@ -104,7 +104,7 @@ export class VerifyAddressComponent implements OnInit, OnDestroy { getVerifyAddressItem(this.network || DEFAULT_NETWORK); } - if (val.linkedTransactions?.length > 0) { + if (val.linkedTransactions && val.linkedTransactions.length > 0) { this.currentStep = StepType.WAIT; // Listen to other transactions. for (const tranId of val.linkedTransactions) { diff --git a/src/app/components/wallet-deeplink/wallet-deeplink.component.ts b/src/app/components/wallet-deeplink/wallet-deeplink.component.ts index da6a39b..4cd8f3c 100644 --- a/src/app/components/wallet-deeplink/wallet-deeplink.component.ts +++ b/src/app/components/wallet-deeplink/wallet-deeplink.component.ts @@ -60,8 +60,8 @@ export class WalletDeeplinkComponent { } @Input() - set tokenAmount(value: number | undefined) { - this._tokenAmount = value; + set tokenAmount(value: string | number | undefined) { + this._tokenAmount = Number(value); this.setLinks(); } diff --git a/src/app/pages/collection/pages/upsert/upsert.page.ts b/src/app/pages/collection/pages/upsert/upsert.page.ts index e94c51f..aed0c9c 100644 --- a/src/app/pages/collection/pages/upsert/upsert.page.ts +++ b/src/app/pages/collection/pages/upsert/upsert.page.ts @@ -565,8 +565,8 @@ export class UpsertPage implements OnInit, OnDestroy { data.discounts.forEach((v: DiscountLine) => { if (v.amount > 0) { discounts.push({ - tokenReward: (v.tokenReward || 0) * Math.pow(10, this.tokenCache[v.tokenUid].decimals), - tokenSymbol: this.tokenCache[v.tokenUid].symbol, + tokenReward: (v.tokenReward || 0) * Math.pow(10, this.tokenCache[v.tokenUid!].decimals), + tokenSymbol: this.tokenCache[v.tokenUid!].symbol, amount: v.amount / 100, }); } diff --git a/src/app/pages/member/pages/activity/activity.page.html b/src/app/pages/member/pages/activity/activity.page.html index faf5505..81e510e 100644 --- a/src/app/pages/member/pages/activity/activity.page.html +++ b/src/app/pages/member/pages/activity/activity.page.html @@ -232,11 +232,6 @@
- - diff --git a/src/app/pages/member/pages/activity/activity.page.ts b/src/app/pages/member/pages/activity/activity.page.ts index 3e58599..e2d832f 100644 --- a/src/app/pages/member/pages/activity/activity.page.ts +++ b/src/app/pages/member/pages/activity/activity.page.ts @@ -183,18 +183,4 @@ export class ActivityPage implements OnInit { public trackByUid(index: number, item: any): number { return item.uid; } - - public getTimelineItems(badges?: Transaction[] | null): TimelineItem[] { - return ( - badges?.map((b) => ({ - type: TimelineItemType.BADGE, - payload: { - image: b.payload.image, - date: b.createdOn?.toDate(), - name: b.payload.name, - network: b.network, - }, - })) || [] - ); - } } diff --git a/src/app/pages/member/pages/badges/badges.page.html b/src/app/pages/member/pages/badges/badges.page.html index 1b1c29d..ad12fd8 100644 --- a/src/app/pages/member/pages/badges/badges.page.html +++ b/src/app/pages/member/pages/badges/badges.page.html @@ -118,26 +118,4 @@ - -
- -
-
-

- {{ t.payload.name }} -

-

- {{t.payload.description}} -

-
- -
-
-
diff --git a/src/app/pages/member/pages/transactions/transactions.page.html b/src/app/pages/member/pages/transactions/transactions.page.html index e3ea625..af0e419 100644 --- a/src/app/pages/member/pages/transactions/transactions.page.html +++ b/src/app/pages/member/pages/transactions/transactions.page.html @@ -59,8 +59,8 @@ {{ transactionService.getTitle(t) }} - {{ t.payload.nativeTokens[0].amount| formatToken: t.payload.token:false:false | async }} -  {{ t.payload.tokenSymbol || 'Tokens' }} + {{ (t?.payload?.nativeTokens?.[0]?.amount || 0) | formatToken: + t.payload.token:false:false | async }}  {{ t.payload.tokenSymbol || 'Tokens' }} {{ t.payload.amount | formatToken: t.network | async }} diff --git a/src/app/pages/nft/pages/nft/nft.page.ts b/src/app/pages/nft/pages/nft/nft.page.ts index 2023ddf..78a2e4d 100644 --- a/src/app/pages/nft/pages/nft/nft.page.ts +++ b/src/app/pages/nft/pages/nft/nft.page.ts @@ -414,7 +414,7 @@ export class NFTPage implements OnInit, OnDestroy { const spaceRewards = (this.auth.member$.value.spaces || {})[collection.space]; const descDiscounts = [...(collection.discounts || [])].sort((a, b) => b.amount - a.amount); for (const discount of descDiscounts) { - const awardStat = (spaceRewards?.awardStat || {})[discount.tokenUid]; + const awardStat = (spaceRewards?.awardStat || {})[discount.tokenUid!]; const memberTotalReward = awardStat?.totalReward || 0; if (memberTotalReward >= discount.tokenReward) { return 1 - discount.amount; diff --git a/src/app/pages/nft/services/helper.service.ts b/src/app/pages/nft/services/helper.service.ts index 5917aaf..dab49aa 100644 --- a/src/app/pages/nft/services/helper.service.ts +++ b/src/app/pages/nft/services/helper.service.ts @@ -14,7 +14,6 @@ import { PropStats, Timestamp, Transaction, - TransactionBillPayment, TransactionType, TRANSACTION_AUTO_EXPIRY_MS, } from '@build-5/interfaces'; @@ -220,15 +219,13 @@ export class HelperService { return dayjs(this.getDate(nft!.availableFrom)).isAfter(dayjs(), 's'); } - public getLatestBill( - orders?: SuccesfullOrdersWithFullHistory[] | null, - ): TransactionBillPayment | undefined { + public getLatestBill(orders?: SuccesfullOrdersWithFullHistory[] | null): Transaction | undefined { if (!orders) { return undefined; } // Get all non royalty bills. - let lastestBill: TransactionBillPayment | undefined = undefined; + let lastestBill: Transaction | undefined = undefined; for (const h of orders) { for (const l of h.transactions || []) { if ( diff --git a/src/app/pages/proposal/pages/new/new.page.ts b/src/app/pages/proposal/pages/new/new.page.ts index 5b0f818..8792195 100644 --- a/src/app/pages/proposal/pages/new/new.page.ts +++ b/src/app/pages/proposal/pages/new/new.page.ts @@ -44,7 +44,7 @@ export class NewPage implements OnInit, OnDestroy { ); public startControl: FormControl = new FormControl('', Validators.required); public endControl: FormControl = new FormControl('', Validators.required); - public typeControl: FormControl = new FormControl(ProposalType.NATIVE, Validators.required); + public typeControl: FormControl = new FormControl(ProposalType.MEMBERS, Validators.required); public votingAwardControl: FormControl = new FormControl([]); public additionalInfoControl: FormControl = new FormControl('', Validators.required); // Questions / answers. @@ -148,9 +148,9 @@ export class NewPage implements OnInit, OnDestroy { }); this.selectedGroupControl.valueChanges.pipe(untilDestroyed(this)).subscribe((val) => { - if (val !== ProposalType.NATIVE) { - this.typeControl.setValue(ProposalType.MEMBERS); - } + this.typeControl.setValue( + val === ProposalType.NATIVE ? ProposalType.NATIVE : ProposalType.MEMBERS, + ); }); } diff --git a/src/app/pages/proposal/pages/overview/overview.page.ts b/src/app/pages/proposal/pages/overview/overview.page.ts index 2d4810e..16447d3 100644 --- a/src/app/pages/proposal/pages/overview/overview.page.ts +++ b/src/app/pages/proposal/pages/overview/overview.page.ts @@ -38,13 +38,13 @@ export class OverviewPage implements OnInit { ) { // Init start date. this.startDateTicker$ = new BehaviorSubject( - this.data.proposal$.value?.settings?.startDate, + this.data.proposal$.value?.settings?.startDate || Timestamp.now(), ); } public ngOnInit(): void { this.data.currentMembersVotes$.pipe(untilDestroyed(this)).subscribe((tran) => { - if (tran?.[0]?.payload?.values?.length > 0) { + if (tran?.[0]?.payload?.values && tran?.[0]?.payload?.values?.length > 0) { // TODO Deal with multiple answers. tran?.[0]?.payload?.values.forEach((v: number) => { this.voteControl.setValue(v); @@ -53,7 +53,7 @@ export class OverviewPage implements OnInit { }); this.data.proposal$.pipe(untilDestroyed(this)).subscribe((p) => { - this.startDateTicker$.next(p?.settings?.startDate); + this.startDateTicker$.next(p?.settings?.startDate || Timestamp.now()); this.seo.setTags( $localize`Proposal - ` + p?.name || '', diff --git a/src/app/pages/proposal/pages/votes/votes.page.html b/src/app/pages/proposal/pages/votes/votes.page.html index f32e386..6bac346 100644 --- a/src/app/pages/proposal/pages/votes/votes.page.html +++ b/src/app/pages/proposal/pages/votes/votes.page.html @@ -33,7 +33,7 @@ {{ t.createdOn?.toDate() | date : 'short' }} - {{ helper.findAnswerText((data.proposal$ | async)?.questions, t.payload.values) }} ({{ + {{ helper.findAnswerText((data.proposal$ | async)?.questions, t.payload.values||[]) }} ({{ (data.proposal$ | async)?.type === proposalTypes.NATIVE ? (t.payload.weight | formatToken: (data.token$ | async)?.uid: false: false: 2 | async) + ' ' + ((data.token$ | async)?.symbol === 'IOTA' ? 'M' : '') + (data.token$ | async)?.symbol : t.payload.weight diff --git a/src/app/pages/space/pages/space/space-about/space-about.component.ts b/src/app/pages/space/pages/space/space-about/space-about.component.ts index 731c25e..3fc1745 100644 --- a/src/app/pages/space/pages/space/space-about/space-about.component.ts +++ b/src/app/pages/space/pages/space/space-about/space-about.component.ts @@ -20,9 +20,11 @@ import { DataService, SpaceAction } from '@pages/space/services/data.service'; import { FILE_SIZES, Member, + QUERY_MAX_LENGTH, SOON_SPACE, SOON_SPACE_TEST, Space, + SpaceMember, StakeType, getDefDecimalIfNotSet, } from '@build-5/interfaces'; @@ -126,31 +128,31 @@ export class SpaceAboutComponent implements OnInit, OnDestroy { ); } - public exportMembers(): void { - if (this.exportingMembers) return; + public async exportMembers(): Promise { + const space = this.data.space$.value; + if (this.exportingMembers || !space?.uid) { + return; + } this.exportingMembers = true; - const space = this.data.space$.value; - if (!space?.uid) return; - - this.spaceApi - .listenMembersWithoutData(space?.uid, undefined) - .pipe(skip(1), first()) - .subscribe((members) => { - this.exportingMembers = false; - const fields = ['', 'address']; - const csv = Papa.unparse({ - fields, - data: members.map((m) => [m.uid]), - }); - - const filteredSpaceName = space?.name?.toLowerCase().replace(/[^a-zA-Z0-9-_]/g, ''); - download( - `data:text/csv;charset=utf-8${csv}`, - `soonaverse_${filteredSpaceName}_members.csv`, - ); - this.cd.markForCheck(); - }); + const data: string[][] = []; + let members: SpaceMember[] = []; + do { + const last = data[data.length - 1]?.[0]; + members = await this.spaceApi.getMembersWithoutData(space.uid, last); + data.push(...members.map((m) => [m.uid])); + if (members.length < QUERY_MAX_LENGTH) { + break; + } + } while (members.length); + + this.exportingMembers = false; + const fields = ['', 'address']; + const csv = Papa.unparse({ fields, data }); + + const filteredSpaceName = space?.name?.toLowerCase().replace(/[^a-zA-Z0-9-_]/g, ''); + download(`data:text/csv;charset=utf-8${csv}`, `soonaverse_${filteredSpaceName}_members.csv`); + this.cd.markForCheck(); } public isSoonSpace(): Observable {