From 69fc5293ef65c867a5f811f9664ab9a453ab41db Mon Sep 17 00:00:00 2001 From: Benoit Lavenier <benoit.lavenier@e-is.pro> Date: Tue, 18 Mar 2025 18:40:28 +0100 Subject: [PATCH] fix(home) Fix home launch (feed component has a wrong deps in module) fix(env) Add defaultDistanceFileUrls in environment.prod.ts fix(network) Fix race() function, and simplify getDistancePrecomputionData() function --- package-lock.json | 8 +++--- package.json | 4 +-- src/app/app.component.html | 12 ++++++-- src/app/home/feed/feed.component.ts | 5 ++-- src/app/home/feed/feed.module.ts | 17 ++---------- src/app/network/network.service.ts | 40 ++++++++++++++------------- src/app/settings/settings.model.ts | 2 +- src/app/settings/settings.service.ts | 5 ++-- src/app/shared/shared.module.ts | 4 ++- src/app/wot/wot.service.ts | 25 +++++------------ src/environments/environment.class.ts | 4 +-- src/environments/environment.prod.ts | 26 +++++++++++++---- src/environments/environment.ts | 8 ++++-- 13 files changed, 81 insertions(+), 79 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9cd2692d..0207babf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cesium", - "version": "2.0.0-alpha43", + "version": "2.0.0-alpha45", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cesium", - "version": "2.0.0-alpha43", + "version": "2.0.0-alpha45", "license": "AGPL-3.0", "dependencies": { "@angular/animations": "^18.2.13", @@ -131,8 +131,8 @@ "typescript": "~5.4.5" }, "engines": { - "node": ">= 18.18.2", - "npm": ">= 9.9.1", + "node": ">= 20.17.2", + "npm": ">= 10.7.0", "yarn": ">= 1.22.19" }, "peerDependencies": { diff --git a/package.json b/package.json index 51a80053..5ee13936 100644 --- a/package.json +++ b/package.json @@ -213,8 +213,8 @@ "typescript": "~5.4.5" }, "engines": { - "node": ">= 18.18.2", - "npm": ">= 9.9.1", + "node": ">= 20.17.0", + "npm": ">= 10.7.0", "yarn": ">= 1.22.19" } } diff --git a/src/app/app.component.html b/src/app/app.component.html index 034a1ff6..66291e14 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -41,7 +41,9 @@ @if (item.divider) { <!-- divider --> <ion-item-divider class="{{ item.cssClass }} {{ item.color }}" @fadeInAnimation> - <ion-icon slot="start" [color]="item.color" [ios]="item.icon + '-outline'" [md]="item.icon + '-sharp'"></ion-icon> + @if (item.icon) { + <ion-icon slot="start" [color]="item.color" [ios]="item.icon + '-outline'" [md]="item.icon + '-sharp'"></ion-icon> + } @if (item.cssClass !== 'flex-spacer') { <ion-label [color]="item.color">{{ item.title | translate }}</ion-label> } @@ -58,7 +60,9 @@ detail="false" routerLinkActive="selected" > - <ion-icon slot="start" [color]="item.color" [ios]="item.icon + '-outline'" [md]="item.icon + '-sharp'"></ion-icon> + @if (item.icon) { + <ion-icon slot="start" [color]="item.color" [ios]="item.icon + '-outline'" [md]="item.icon + '-sharp'"></ion-icon> + } <ion-label [color]="item.color">{{ item.title | translate }}</ion-label> </ion-item> } @else if (item.handle && (!item.visible || item.visible())) { @@ -73,7 +77,9 @@ tappable @fadeInAnimation > - <ion-icon slot="start" [color]="item.color" [ios]="item.icon + '-outline'" [md]="item.icon + '-sharp'"></ion-icon> + @if (item.icon) { + <ion-icon slot="start" [color]="item.color" [ios]="item.icon + '-outline'" [md]="item.icon + '-sharp'"></ion-icon> + } <ion-label [color]="item.color">{{ item.title | translate }}</ion-label> </ion-item> } diff --git a/src/app/home/feed/feed.component.ts b/src/app/home/feed/feed.component.ts index 83776f32..aff86675 100644 --- a/src/app/home/feed/feed.component.ts +++ b/src/app/home/feed/feed.component.ts @@ -37,9 +37,8 @@ export class FeedComponent extends AppPage<FeedState> { protected async ngOnLoad(): Promise<FeedState> { await Promise.all([this.settings.ready(), this.networkService.ready()]); - console.log(await this.settings); - const feedUrl = environment.feed.jsonFeed.get(this.settings.locale); - this.topics = await this.networkService.loadJsonFeed(feedUrl); + const feedUrls = environment.feed?.jsonFeed[this.settings.locale]; + this.topics = await this.networkService.loadJsonFeedUrls(feedUrls); this.topics = this.topics.filter(isNotNil).map((value) => value); return <FeedState>{ topics: this.topics }; } diff --git a/src/app/home/feed/feed.module.ts b/src/app/home/feed/feed.module.ts index 5c4fa3fd..f0c386d8 100644 --- a/src/app/home/feed/feed.module.ts +++ b/src/app/home/feed/feed.module.ts @@ -1,24 +1,11 @@ import { NgModule } from '@angular/core'; import { AppSharedModule } from '@app/shared/shared.module'; import { TranslateModule } from '@ngx-translate/core'; -import { HomePageRoutingModule } from '@app/home/home-routing.module'; -import { AppAuthModule } from '@app/account/auth/auth.module'; -import { AppRegisterModule } from '@app/account/register/register.module'; -import { AppTransferModule } from '@app/transfer/send/transfer.module'; import { FeedComponent } from '@app/home/feed/feed.component'; -import { NgOptimizedImage } from '@angular/common'; @NgModule({ - imports: [ - AppSharedModule, - TranslateModule.forChild(), - HomePageRoutingModule, - AppAuthModule, - AppRegisterModule, - AppTransferModule, - NgOptimizedImage, - ], + imports: [AppSharedModule, TranslateModule.forChild()], declarations: [FeedComponent], - exports: [FeedComponent], + exports: [FeedComponent, TranslateModule], }) export class FeedModule {} diff --git a/src/app/network/network.service.ts b/src/app/network/network.service.ts index dbc8f9f6..1c668c72 100644 --- a/src/app/network/network.service.ts +++ b/src/app/network/network.service.ts @@ -6,9 +6,9 @@ import { abbreviate, WELL_KNOWN_CURRENCIES } from '@app/shared/currencies'; import { Currency } from '../currency/currency.model'; import { RxStartableService } from '@app/shared/services/rx-startable-service.class'; import { RxStateProperty, RxStateSelect } from '@app/shared/decorator/state.decorator'; -import { firstValueFrom, mergeMap, Observable, tap, timer } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; -import { arrayRandomPick, isNil, isNotNil, isNotNilOrBlank, toNumber } from '@app/shared/functions'; +import { EMPTY, firstValueFrom, mergeMap, Observable, race, tap } from 'rxjs'; +import { catchError, filter, map } from 'rxjs/operators'; +import { arrayRandomPick, isEmptyArray, isNil, isNotNil, isNotNilOrBlank, toNumber } from '@app/shared/functions'; import { IndexerService } from './indexer/indexer.service'; import { fromDateISOString } from '@app/shared/dates'; import { ContextService } from '@app/shared/services/storage/context.service'; @@ -18,7 +18,8 @@ import { environment } from '@environments/environment'; import moment from 'moment'; import DiscourseAPI from 'discourse2'; import { JsonFeedItem, JsonTopic, Topic } from '@app/home/feed/feed.model'; -import { Promise } from '@rx-angular/cdk/zone-less/browser'; + +import { Promise, setTimeout } from '@rx-angular/cdk/zone-less/browser'; export interface NetworkState { peer: Peer; @@ -242,25 +243,26 @@ export class NetworkService extends RxStartableService<NetworkState> { }); } - async race(urls: string[]): Promise<any> { - return Promise.race( - urls.map(async (url) => { - try { - return await firstValueFrom(this.http.get(url)); - } catch (error) { - console.error(`${this._logPrefix}Erreur lors de la récupération de ${url}:`, error); - return undefined; - } - }) - ); + async race<T>(urls: string[]): Promise<T> { + try { + const requests = (urls || []).map((url) => this.http.get<T>(url).pipe(catchError(() => EMPTY))); + return await firstValueFrom(race<T[]>(...requests)); + } catch (err) { + return null; + } } - async getDistancePrecomputionData(urls: string[]) { - const source = timer(0, 5 * 60 * 1000); - return firstValueFrom(source.pipe(map(() => this.race(urls)))); + async getDistancePrecomputionData(): Promise<DistancePrecomputionData> { + const distanceFileUrls = this.settings.data.preferredDistanceFileUrls; + if (isEmptyArray(distanceFileUrls)) { + console.warn(`${this._logPrefix}No precomputed distance file URLs found, in settings and environment!`); + return Promise.resolve(null); + } + console.debug(`${this._logPrefix}Fetching precomputed distance data...`, distanceFileUrls); + return this.race<DistancePrecomputionData>(distanceFileUrls); } - async loadJsonFeed(urls: string[]): Promise<JsonTopic[]> { + async loadJsonFeedUrls(urls: string[]): Promise<JsonTopic[]> { const topicsPromises = urls.map(async (url) => { let topics: JsonTopic[] = []; try { diff --git a/src/app/settings/settings.model.ts b/src/app/settings/settings.model.ts index 17fcc3b4..52dd0d69 100644 --- a/src/app/settings/settings.model.ts +++ b/src/app/settings/settings.model.ts @@ -27,7 +27,7 @@ export interface Settings { ipfsGateway: string; preferredIpfsGateways?: string[]; distanceFileUrl?: string; - preferredDistanteFileUrls?: string[]; + preferredDistanceFileUrls?: string[]; pages?: any; // Any pages settings locale?: string; mobile?: boolean; diff --git a/src/app/settings/settings.service.ts b/src/app/settings/settings.service.ts index 576eacc9..453c4391 100644 --- a/src/app/settings/settings.service.ts +++ b/src/app/settings/settings.service.ts @@ -91,9 +91,8 @@ export class SettingsService extends RxStartableService<SettingsState> { indexer: environment.dev?.indexer ?? environment.defaultIndexers?.[0], pod: environment.dev?.pod ?? environment.defaultPods?.[0], ipfsGateway: environment.dev?.ipfsGateway ?? environment.defaultIfpsGateways?.[0], - distanceFileUrl: environment.dev?.distanceFileUrl ?? environment.defaultDistanteFileUrl?.[0], ...this.get(), - preferredDistanteFileUrls: arrayDistinct([...environment.defaultDistanteFileUrl, ...(data?.preferredDistanteFileUrls || [])]), + preferredDistanceFileUrls: arrayDistinct([...environment.defaultDistanceFileUrls, ...(data?.preferredDistanceFileUrls || [])]), preferredPeers: arrayDistinct([...environment.defaultPeers, ...(data?.preferredPeers || [])]), preferredIndexers: arrayDistinct([...environment.defaultIndexers, ...(data?.preferredIndexers || [])]), preferredPods: arrayDistinct([...environment.defaultPods, ...(data?.preferredPods || [])]), @@ -114,7 +113,7 @@ export class SettingsService extends RxStartableService<SettingsState> { preferredIndexers: arrayDistinct([...environment.defaultIndexers, ...(data?.preferredIndexers || [])]), preferredPods: arrayDistinct([...environment.defaultPods, ...(data?.preferredPods || [])]), preferredIpfsGateways: arrayDistinct([...environment.defaultIfpsGateways, ...(data?.preferredIpfsGateways || [])]), - preferredDistanteFileUrls: arrayDistinct([...environment.defaultDistanteFileUrl, ...(data?.preferredDistanceFileUrls || [])]), + preferredDistanceFileUrls: arrayDistinct([...environment.defaultDistanceFileUrls, ...(data?.preferredDistanceFileUrls || [])]), }; } diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 47697e36..4f68ad7d 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -1,5 +1,5 @@ import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; +import { CommonModule, NgOptimizedImage } from '@angular/common'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { IonicModule } from '@ionic/angular'; @@ -30,6 +30,7 @@ import { SharedDirectivesModule } from '@app/shared/directives/directives.module TranslateModule, QrCodeModule, MaskitoModule, + NgOptimizedImage, // RxState template RxPush, @@ -58,6 +59,7 @@ import { SharedDirectivesModule } from '@app/shared/directives/directives.module TranslateModule, QrCodeModule, MaskitoModule, + NgOptimizedImage, // RxState template RxPush, diff --git a/src/app/wot/wot.service.ts b/src/app/wot/wot.service.ts index 1230ce35..e06e07f1 100644 --- a/src/app/wot/wot.service.ts +++ b/src/app/wot/wot.service.ts @@ -10,7 +10,7 @@ import { LoadResult } from '@app/shared/services/service.model'; import { Account, AccountUtils } from '@app/account/account.model'; import { map } from 'rxjs/operators'; import { isNotEmptyArray, isNotNil } from '@app/shared/functions'; -import { DistancePrecomputionData, NetworkService } from '@app/network/network.service'; +import { NetworkService } from '@app/network/network.service'; import { SettingsService } from '@app/settings/settings.service'; export interface DistanceInformation { @@ -82,24 +82,19 @@ export class WotService extends StartableService { } async getRefereePercentByAccount(account: Account): Promise<number> { - const distanceData: DistancePrecomputionData = await this.getDistanceData(); - if (!distanceData) { - return null; - } + const distanceData = await this.network.getDistancePrecomputionData(); + if (!distanceData) return null; // SKip if no data const accountIndex = account?.meta.index; - const refereesReached = distanceData?.results[accountIndex]; - const refereesCount = distanceData?.referees_count; + const refereesReached = distanceData.results[accountIndex]; + const refereesCount = distanceData.referees_count; return refereesReached / refereesCount; } async getDistanceInformation(account: Account): Promise<DistanceInformation> { - const distanceData: DistancePrecomputionData = await this.getDistanceData(); - - if (!distanceData) { - return null; - } + const distanceData = await this.network.getDistancePrecomputionData(); + if (!distanceData) return null; // Skip if no data const accountIndex = account?.meta.index; const refereesReached = distanceData?.results[accountIndex]; @@ -108,10 +103,4 @@ export class WotService extends StartableService { const height = distanceData?.height; return <DistanceInformation>{ refereesReached, refereesCount, height, minCertsForReferee }; } - - protected async getDistanceData() { - const distanceFileUrls = this.settings.data.preferredDistanteFileUrls; - const distanceData: DistancePrecomputionData = await this.network.getDistancePrecomputionData(distanceFileUrls); - return distanceData; - } } diff --git a/src/environments/environment.class.ts b/src/environments/environment.class.ts index 7e94192b..236cb6ab 100644 --- a/src/environments/environment.class.ts +++ b/src/environments/environment.class.ts @@ -23,10 +23,10 @@ export interface Environment { defaultIndexers: string[]; defaultPods: string[]; defaultIfpsGateways: string[]; - defaultDistanteFileUrl: string[]; + defaultDistanceFileUrls: string[]; feed?: { - jsonFeed: Map<string, string[]>; + jsonFeed: { [key: string]: string[] }; maxContentLength: number; maxAgeInMonths: number; maxCount: number; diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index b8a906d4..bc830306 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -30,8 +30,15 @@ export const environment = <Environment>{ name: 'cesium2', driverOrder: [StorageDrivers.IndexedDB, StorageDrivers.WebSQL, StorageDrivers.LocalStorage], }, + + keyring: { + ss58Format: 42, // dev + }, + feed: { - jsonFeed: new Map<string, string[]>([['fr', ['https://forum.monnaie-libre.fr/t/actu-generale-la-1-bouge/31318.json']]]), + jsonFeed: { + fr: ['https://forum.monnaie-libre.fr/t/actu-generale-la-1-bouge/31318.json'], + }, maxContentLength: 1300, maxAgeInMonths: 3, maxCount: 1, @@ -40,21 +47,24 @@ export const environment = <Environment>{ /* Local endpoint */ //'ws://127.0.0.1:9944', /* GDev endpoints */ + // 'wss://vit.fdn.org/ws', + //'wss://1000i100.fr/ws', 'wss://gdev.coinduf.eu/ws', - 'wss://vit.fdn.org/ws', 'wss://gdev.pini.fr/ws', 'wss://gdev.cgeek.fr/ws', 'wss://gdev.p2p.legal/ws', - //'wss://1000i100.fr/ws', + 'wss://archive-rpc.gdev.brussels.ovh/ws', + 'wss://archive-rpc.gdev.de.brussels.ovh/ws', + 'wss://gdev.p2p.legal/ws', ], defaultIndexers: [ /* Local endpoint */ //'http://localhost:8080/v1/graphql', /* GDev endpoints */ - 'https://gdev-squid.axiom-team.fr/v1beta1/relay', 'https://squid.gdev.coinduf.eu/v1beta1/relay', - //'https://gdev-squid.axiom-team.fr/graphql' + // 'https://gdev-squid.axiom-team.fr/graphql', + 'https://gdev-squid.axiom-team.fr/v1beta1/relay', ], defaultPods: [ @@ -62,6 +72,7 @@ export const environment = <Environment>{ // 'http://localhost:8081/v1/graphql' /* GDev endpoints */ 'https://datapod.coinduf.eu/v1/graphql', + 'https://datapod.gyroi.de:443/v1/graphql', ], defaultIfpsGateways: [ @@ -70,4 +81,9 @@ export const environment = <Environment>{ /* GDev endpoints */ 'https://pagu.re', ], + + defaultDistanceFileUrls: [ + /* Distance file Urls */ + 'https://files.coinduf.eu/distance_precompute/latest_distance.json', + ], }; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index a08e292f..f7b7ae63 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -15,10 +15,10 @@ export const environment = <Environment>{ forumInformationUrl: 'https://forum.duniter.org/t/gchange-v2-moderation-ou-et-federation/12910/2', // About + officialUrl: 'https://www.cesium.app', sourceUrl: 'https://git.duniter.org/clients/cesium-grp/cesium', reportIssueUrl: 'https://git.duniter.org/clients/cesium-grp/cesium/-/issues/new', forumUrl: 'https://forum.monnaie-libre.fr', - officialUrl: 'https://www.cesium.app', graphql: { fetchPolicy: 'cache-first', @@ -38,7 +38,9 @@ export const environment = <Environment>{ }, feed: { - jsonFeed: new Map<string, string[]>([['fr', ['https://forum.monnaie-libre.fr/t/actu-generale-la-1-bouge/31318.json']]]), + jsonFeed: { + fr: ['https://forum.monnaie-libre.fr/t/actu-generale-la-1-bouge/31318.json'], + }, maxContentLength: 1300, maxAgeInMonths: 3, maxCount: 1, @@ -101,7 +103,7 @@ export const environment = <Environment>{ 'https://pagu.re', ], - defaultDistanteFileUrl: [ + defaultDistanceFileUrls: [ /* Distance file Urls */ 'https://files.coinduf.eu/distance_precompute/latest_distance.json', ], -- GitLab