diff --git a/.github/workflows/build-publish.yml b/.github/workflows/build-publish.yml index 530e6ca42..5b20cf2a4 100644 --- a/.github/workflows/build-publish.yml +++ b/.github/workflows/build-publish.yml @@ -14,8 +14,12 @@ on: pull_request: workflow_dispatch: inputs: - publish: - description: 'Publish to Appstore and Google play' + publishandroid: + description: 'Publish to Google play' + required: false + default: 'false' + publishios: + description: 'Publish to App Store' required: false default: 'false' tag: @@ -103,7 +107,7 @@ jobs: path: IsraelHiking.Web/android/app/build/outputs/bundle/release/app-release.aab - name: Publish to Google Play - if: ${{ github.event.inputs.publish == 'true' }} + if: ${{ github.event.inputs.publishandroid == 'true' }} uses: r0adkll/upload-google-play@v1 with: serviceAccountJsonPlainText: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }} @@ -158,19 +162,19 @@ jobs: - name: Keychain setup run: | cd IsraelHiking.Web - openssl aes-256-cbc -pbkdf2 -k $PASSWORD -in ./signing/appveyor.mobileprovision.enc -d -a -out ./signing/appveyor.mobileprovision + openssl aes-256-cbc -pbkdf2 -k $PASSWORD -in ./signing/CI.mobileprovision.enc -d -a -out ./signing/CI.mobileprovision openssl aes-256-cbc -pbkdf2 -k $PASSWORD -in ./signing/ihm-dist.cer.enc -d -a -out ./signing/ihm-dist.cer openssl aes-256-cbc -pbkdf2 -k $PASSWORD -in ./signing/ihm-dist.p12.enc -d -a -out ./signing/ihm-dist.p12 - security create-keychain -p appveyor ios-build.keychain + security create-keychain -p CI ios-build.keychain security default-keychain -s ios-build.keychain - security unlock-keychain -p appveyor ios-build.keychain + security unlock-keychain -p CI ios-build.keychain security set-keychain-settings -t 3600 -l ~/Library/Keychains/ios-build.keychain security import ./signing/apple.cer -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign security import ./signing/ihm-dist.cer -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign security import ./signing/ihm-dist.p12 -k ~/Library/Keychains/ios-build.keychain -P $STORE_PASSWORD -T /usr/bin/codesign - security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k appveyor ~/Library/Keychains/ios-build.keychain > /dev/null + security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k CI ~/Library/Keychains/ios-build.keychain > /dev/null mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles - cp ./signing/appveyor.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/ + cp ./signing/CI.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/ env: PASSWORD: ${{ secrets.PASSWORD }} STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }} @@ -199,7 +203,7 @@ jobs: path: IsraelHiking.Web/ios/App.ipa - name: Publish to App Store - if: ${{ github.event.inputs.publish == 'true' }} + if: ${{ github.event.inputs.publishios == 'true' }} run: | cd IsraelHiking.Web/ios xcrun altool --upload-app --type ios --file ./App.ipa --username $APPLE_APPSTORE_USER --password $APPLE_APPSTORE_PASSWORD diff --git a/IsraelHiking.Web/ios/App/App.xcodeproj/project.pbxproj b/IsraelHiking.Web/ios/App/App.xcodeproj/project.pbxproj index 3d42d0178..70a096b84 100644 --- a/IsraelHiking.Web/ios/App/App.xcodeproj/project.pbxproj +++ b/IsraelHiking.Web/ios/App/App.xcodeproj/project.pbxproj @@ -378,7 +378,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = il.org.osm.israelhiking; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "645adb40-6a2a-4346-be8e-20a5ab7651f2"; + PROVISIONING_PROFILE = "16734540-bf0f-4c60-a332-77984ddbddf1"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/IsraelHiking.Web/ios/exportOptions.plist b/IsraelHiking.Web/ios/exportOptions.plist index 54606cc2a..6dd3cd8c3 100644 --- a/IsraelHiking.Web/ios/exportOptions.plist +++ b/IsraelHiking.Web/ios/exportOptions.plist @@ -11,7 +11,7 @@ provisioningProfiles il.org.osm.israelhiking - 645adb40-6a2a-4346-be8e-20a5ab7651f2 + 16734540-bf0f-4c60-a332-77984ddbddf1 \ No newline at end of file diff --git a/IsraelHiking.Web/signing/CI.mobileprovision.enc b/IsraelHiking.Web/signing/CI.mobileprovision.enc new file mode 100644 index 000000000..dc847ea3a --- /dev/null +++ b/IsraelHiking.Web/signing/CI.mobileprovision.enc @@ -0,0 +1,260 @@ +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 diff --git a/IsraelHiking.Web/signing/appveyor.mobileprovision.enc b/IsraelHiking.Web/signing/appveyor.mobileprovision.enc deleted file mode 100644 index 265bb9ffe..000000000 --- a/IsraelHiking.Web/signing/appveyor.mobileprovision.enc +++ /dev/null @@ -1,260 +0,0 @@ -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 -txBz0etu9ej1oM9zyhrXSA== diff --git a/IsraelHiking.Web/signing/ihm-dist.cer.enc b/IsraelHiking.Web/signing/ihm-dist.cer.enc index 716e15928..66963b142 100644 --- a/IsraelHiking.Web/signing/ihm-dist.cer.enc +++ b/IsraelHiking.Web/signing/ihm-dist.cer.enc @@ -1,32 +1,32 @@ -U2FsdGVkX18eMOTV4WCyUh+m1pQidmO1GkoFQu3eHZT1W8RlZdd4trDK0x+lhlT7 -3dc7nlKegYrHlc3aL9y77LFKzo3Bh/eWjDwnx8KjV7t0J8grWFQpSA3faE6JJU1h -wMIG/2dSf/dk4Yk9kNJCD18VHkIfkWlnlPEZJIXNN4wVMSowsSw54hm6IgVALebs -eS1DW6xlGemk7KMY/mPVWey3pQ2wFmDa3UuRBLIDieBM5LTNj+/5ZP+tX4ECKrg1 -eSGtkYgzmlIw448nsdjnTEO8e+nunyrmrn0pudPIvZFmBJHjLN3vChi7qOK2Q92d -D36F2efoOBau41A+8XD/OtgbzqUvqjQs8tmBsZpkuC6FuBRfrpPjKhQVvY+qjvX9 -TF8VTFT7eBVXjo83SEu4aDr7ZtyS1/gnxzDBaiDGYQDs4QyN8zFUQzsaqTZQRSPQ -0ayD8Qaqdz6nPfb5qW8jx4qoEDirAlaIrRLFT691RzCzBQH9lPVKt0a2E4ZE6zY+ -/yVGbncR5K9CDZNM9DXhs97QEMe+6aNZfEjSNpoKqDeAJq7POMZHZHjhUcp1IxcN -KIZGwCARXiXB6XGA7eqjX/TnZWDSgauS8jV8qOAl/B5VHmTgYd5Xcft5iqCt4p9f -xJzhf8OsL5GaUdyqXWasIfkyG2lx6IelrH/SwBKPyFL9nE2GUZwVPk5DYOu5kH8L -/CRyvp8WRQ8FJjpJCr4pGlWKUSaQBwWZFU+jinlA8x11yzClkydhu4LqLDpPGE6S -7BMM6UUYkmunJuGkEckKQm6uDiBm5bNZSdpTpJ0TEiWC5lqJHxpTkmkMXhQ99Si9 -N+bDvWetlF3qlVxF8f7+7NKl5qE+jrNNGksRaK7FseREOfrDaZxt9MxIWabiRVxE -xgu0X822MbFStrGIMkM4DpAlv2MQbXyPGXCDVGyVR2+QBHwjLb0XK0bBWSAn3Oku -VJ4jC7FBMDvGifVlhcchKCFkvBkOgZ2DNTRKJmyoduEMUrdbMH0rYeiPmIMGENM6 -5Rd7RgUXd5AcP0dXcB6Bz42RzCOsR5zJQ496jtCBIr89T2VRsKbFXFDAqwSxhLt3 -Th2dl8S6Fflq4k+n5ODUNnWawcWPROCVyEddRQ05pz3sjiinT8+TnXlu0vtueSFW -gE/jk7QrsBrBsfwARklkr5AUFN4zagQ9S8AVzc/nIKQqGXoYAlTW3wlBlUCczNI/ -T6rOq6VycbpAA1IM+3zZ8k455Km10o1cBcavkHxcmGXnJPQsYrLuStCaHd/mMXaM -2Tb1jYfoWNcstdQvmtFngvRAYxeAePvqMWZ+8lYlFrpAkotViRC14m3K0GgpMehJ -P8PKxmwrKdH5YLMn+XXl9YVq5jIsJDIUsi6tEGKdW3fse50aH0XT/DrQ4w0KWbYB -Ea4IIE6i7J0/lMc0kZduwNEFamr8fuN5+sg5zds4C/hmeohpsFCevzpq8MCVx9Yj -+GVC+foxncugKJRLGCTBcXAt43Ei7oeOEMERy2UBCXknwypMVo0WPsPPB53FQaAp -ntJooPaFenKf08vXkpyfqmU+haGHR4ItQzVKJpuJnEilgBUFb8xTn1lq7fkXjPV8 -0Gx/JjsVPsCQbaIsgwG7nb3Pw013+m8udiPI+88JHyBjWjbCtijBAE0jjvENzSym -wyHO/uSazLAdTEWjbkTkGZi5g1APokR+k5sFY+5pr/qOjZfED7GJoxF6a74tHpX2 -qUSf29dBPGwpDRbgzWUWAXruI8cQAapKBGTo2xZjGpkbT8gcqYQuLUK7yxzYXw09 -Gvvv8Ctq6gTA+srx+n2nyPlL9jhiIXBtpvRE+10rYXyuR+bLvtVgO/pv7ThUjiRN -++I+fWfc8baBefe70KhDY1pGPddQ0g/Lfwfd2kAM5qnRorvV3FoBAW59C+uQkuiA -zt9hIN98OYvepV60lOhWwwVnUGQBYmsFBZjxvWJBGGXAPcmM+fCvccIZtfaBHTiM -C1R5cW3kq74DGSv4dCFoFg== +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 +WZtUog83hoz7161jy4bssA== diff --git a/IsraelHiking.Web/signing/ihm-dist.p12.enc b/IsraelHiking.Web/signing/ihm-dist.p12.enc index 253d6e658..abdda7a1b 100644 --- a/IsraelHiking.Web/signing/ihm-dist.p12.enc +++ b/IsraelHiking.Web/signing/ihm-dist.p12.enc @@ -1,32 +1,32 @@ -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 diff --git a/IsraelHiking.Web/src/application/components/application-state.component.ts b/IsraelHiking.Web/src/application/components/application-state.component.ts index cf914ea5e..1d0bba195 100644 --- a/IsraelHiking.Web/src/application/components/application-state.component.ts +++ b/IsraelHiking.Web/src/application/components/application-state.component.ts @@ -1,7 +1,5 @@ -import { Component, OnInit, OnDestroy } from "@angular/core"; - +import { Component, DestroyRef, OnInit } from "@angular/core"; import { Router, ActivatedRoute } from "@angular/router"; -import { Subscription } from "rxjs"; import { Store } from "@ngxs/store"; import { RouteStrings } from "../services/hash.service"; @@ -9,26 +7,24 @@ import { SidebarService } from "../services/sidebar.service"; import { DataContainerService } from "../services/data-container.service"; import { FitBoundsService } from "../services/fit-bounds.service"; import { SetFileUrlAndBaseLayerAction, SetShareUrlAction } from "../reducers/in-memory.reducer"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; @Component({ selector: "application-state", template: "
" }) -export class ApplicationStateComponent implements OnInit, OnDestroy { - - private subscription: Subscription; - +export class ApplicationStateComponent implements OnInit { constructor(private readonly router: Router, private readonly route: ActivatedRoute, private readonly sidebarService: SidebarService, private readonly dataContainerService: DataContainerService, private readonly fitBoundsService: FitBoundsService, - private readonly store: Store) { - this.subscription = null; + private readonly store: Store, + private readonly destroyRef: DestroyRef) { } public ngOnInit() { - this.subscription = this.route.params.subscribe(params => { + this.route.params.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(params => { if (this.router.url.startsWith(RouteStrings.ROUTE_MAP)) { this.fitBoundsService.flyTo({ lng: +params[RouteStrings.LON], @@ -46,10 +42,4 @@ export class ApplicationStateComponent implements OnInit, OnDestroy { } }); } - - public ngOnDestroy() { - if (this.subscription) { - this.subscription.unsubscribe(); - } - } } diff --git a/IsraelHiking.Web/src/application/components/background-text.component.ts b/IsraelHiking.Web/src/application/components/background-text.component.ts index 0365af07f..f3de6b576 100644 --- a/IsraelHiking.Web/src/application/components/background-text.component.ts +++ b/IsraelHiking.Web/src/application/components/background-text.component.ts @@ -1,11 +1,10 @@ import { Component } from "@angular/core"; -import { Observable } from "rxjs"; -import { Store, Select } from "@ngxs/store"; -import type { Immutable } from "immer"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { Store } from "@ngxs/store"; import { BaseMapComponent } from "./base-map.component"; import { ResourcesService } from "../services/resources.service"; -import type { ApplicationState, Language } from "../models/models"; +import type { ApplicationState } from "../models/models"; @Component({ selector: "background-text", @@ -14,15 +13,6 @@ import type { ApplicationState, Language } from "../models/models"; }) export class BackgroundTextComponent extends BaseMapComponent { - @Select((state: ApplicationState) => state.offlineState.isOfflineAvailable) - public isOfflineAvailable$: Observable; - - @Select((state: ApplicationState) => state.offlineState.lastModifiedDate) - public lastModifiedDate$: Observable; - - @Select((state: ApplicationState) => state.configuration.language) - public language$: Observable>; - public text: string; constructor(resources: ResourcesService, @@ -30,9 +20,9 @@ export class BackgroundTextComponent extends BaseMapComponent { super(resources); this.text = ""; - this.isOfflineAvailable$.subscribe(() => this.updateText()); - this.lastModifiedDate$.subscribe(() => this.updateText()); - this.language$.subscribe(() => this.updateText()); + this.store.select((state: ApplicationState) => state.offlineState.isOfflineAvailable).pipe(takeUntilDestroyed()).subscribe(() => this.updateText()); + this.store.select((state: ApplicationState) => state.offlineState.lastModifiedDate).pipe(takeUntilDestroyed()).subscribe(() => this.updateText()); + this.store.select((state: ApplicationState) => state.configuration.language).pipe(takeUntilDestroyed()).subscribe(() => this.updateText()); } private updateText() { diff --git a/IsraelHiking.Web/src/application/components/dialogs/configuration-dialog.component.html b/IsraelHiking.Web/src/application/components/dialogs/configuration-dialog.component.html index 44a17ac65..a73f8158d 100644 --- a/IsraelHiking.Web/src/application/components/dialogs/configuration-dialog.component.html +++ b/IsraelHiking.Web/src/application/components/dialogs/configuration-dialog.component.html @@ -8,7 +8,7 @@
- +
{{resources.screenOn}}
@@ -24,14 +24,14 @@
- {{resources.automaticRecordingUpload}} + {{resources.automaticRecordingUpload}}
{{resources.automaticRecordingUploadHint}}
- {{resources.gotLostWarnings}} + {{resources.gotLostWarnings}}
{{resources.gotLostWarningsHint}}
diff --git a/IsraelHiking.Web/src/application/components/dialogs/configuration-dialog.component.ts b/IsraelHiking.Web/src/application/components/dialogs/configuration-dialog.component.ts index 206f0689b..10238da1a 100644 --- a/IsraelHiking.Web/src/application/components/dialogs/configuration-dialog.component.ts +++ b/IsraelHiking.Web/src/application/components/dialogs/configuration-dialog.component.ts @@ -1,7 +1,7 @@ import { Component } from "@angular/core"; import { MatDialogRef } from "@angular/material/dialog"; import { Observable } from "rxjs"; -import { Store, Select } from "@ngxs/store"; +import { Store } from "@ngxs/store"; import { BaseMapComponent } from "../base-map.component"; import { ResourcesService } from "../../services/resources.service"; @@ -22,14 +22,9 @@ import type { ApplicationState, BatteryOptimizationType } from "../../models/mod }) export class ConfigurationDialogComponent extends BaseMapComponent { - @Select((state: ApplicationState) => state.configuration.batteryOptimizationType) - public batteryOptimizationType: Observable; - - @Select((state: ApplicationState) => state.configuration.isAutomaticRecordingUpload) - public isAutomaticRecordingUpload: Observable; - - @Select((state: ApplicationState) => state.configuration.isGotLostWarnings) - public isGotLostWarnings: Observable; + public batteryOptimizationType$: Observable; + public isAutomaticRecordingUpload$: Observable; + public isGotLostWarnings$: Observable; constructor(resources: ResourcesService, private readonly dialogRef: MatDialogRef, @@ -38,6 +33,9 @@ export class ConfigurationDialogComponent extends BaseMapComponent { private readonly logginService: LoggingService, private readonly store: Store) { super(resources); + this.batteryOptimizationType$ = this.store.select((state: ApplicationState) => state.configuration.batteryOptimizationType); + this.isAutomaticRecordingUpload$ = this.store.select((state: ApplicationState) => state.configuration.isAutomaticRecordingUpload); + this.isGotLostWarnings$ = this.store.select((state: ApplicationState) => state.configuration.isGotLostWarnings); } public isApp() { diff --git a/IsraelHiking.Web/src/application/components/dialogs/layers/base-layer-add-dialog.component.ts b/IsraelHiking.Web/src/application/components/dialogs/layers/base-layer-add-dialog.component.ts index afc3d3595..d7d5e4f1c 100644 --- a/IsraelHiking.Web/src/application/components/dialogs/layers/base-layer-add-dialog.component.ts +++ b/IsraelHiking.Web/src/application/components/dialogs/layers/base-layer-add-dialog.component.ts @@ -1,5 +1,6 @@ import { Component } from "@angular/core"; import { HttpClient } from "@angular/common/http"; +import { Store } from "@ngxs/store"; import { LayerBaseDialogComponent } from "./layer-base-dialog.component"; import { ResourcesService } from "../../../services/resources.service"; @@ -17,9 +18,9 @@ export class BaseLayerAddDialogComponent extends LayerBaseDialogComponent { layersService: LayersService, mapService: MapService, toastService: ToastService, - http: HttpClient - ) { - super(resources, mapService, layersService, toastService, http); + http: HttpClient, + store: Store) { + super(resources, mapService, layersService, toastService, http, store); this.title = this.resources.addBaseLayer; this.isNew = true; this.isOverlay = false; diff --git a/IsraelHiking.Web/src/application/components/dialogs/layers/base-layer-edit-dialog.component.ts b/IsraelHiking.Web/src/application/components/dialogs/layers/base-layer-edit-dialog.component.ts index 0c12b95dd..d36453653 100644 --- a/IsraelHiking.Web/src/application/components/dialogs/layers/base-layer-edit-dialog.component.ts +++ b/IsraelHiking.Web/src/application/components/dialogs/layers/base-layer-edit-dialog.component.ts @@ -1,5 +1,6 @@ import { Component } from "@angular/core"; import { HttpClient } from "@angular/common/http"; +import { Store } from "@ngxs/store"; import { ResourcesService } from "../../../services/resources.service"; import { MapService } from "../../../services/map.service"; @@ -19,8 +20,9 @@ export class BaseLayerEditDialogComponent extends LayerBaseDialogComponent { mapService: MapService, layersService: LayersService, toastService: ToastService, - http: HttpClient) { - super(resources, mapService, layersService, toastService, http); + http: HttpClient, + store: Store) { + super(resources, mapService, layersService, toastService, http, store); this.title = this.resources.baseLayerProperties; this.isNew = false; this.isOverlay = false; diff --git a/IsraelHiking.Web/src/application/components/dialogs/layers/layer-base-dialog.component.ts b/IsraelHiking.Web/src/application/components/dialogs/layers/layer-base-dialog.component.ts index f9b11c617..31b9a304e 100644 --- a/IsraelHiking.Web/src/application/components/dialogs/layers/layer-base-dialog.component.ts +++ b/IsraelHiking.Web/src/application/components/dialogs/layers/layer-base-dialog.component.ts @@ -1,6 +1,6 @@ import { HttpClient } from "@angular/common/http"; -import { firstValueFrom, Observable } from "rxjs"; -import { Select } from "@ngxs/store"; +import { Observable, firstValueFrom } from "rxjs"; +import { Store } from "@ngxs/store"; import { BaseMapComponent } from "../../base-map.component"; import { ResourcesService } from "../../../services/resources.service"; @@ -14,18 +14,15 @@ export abstract class LayerBaseDialogComponent extends BaseMapComponent { public title: string; public isNew: boolean; public isOverlay: boolean; - public layerData: EditableLayer; - - @Select((state: ApplicationState) => state.locationState) - public location: Observable>; + public location$: Observable>; protected constructor(resources: ResourcesService, protected readonly mapService: MapService, protected readonly layersService: LayersService, protected readonly toastService: ToastService, - private readonly http: HttpClient - ) { + private readonly http: HttpClient, + private readonly store: Store) { super(resources); this.layerData = { minZoom: LayersService.MIN_ZOOM, @@ -37,6 +34,8 @@ export abstract class LayerBaseDialogComponent extends BaseMapComponent { isOfflineAvailable: false, isOfflineOn: true } as EditableLayer; + + this.location$ = this.store.select((state: ApplicationState) => state.locationState); } public onAddressChanged(address: string) { diff --git a/IsraelHiking.Web/src/application/components/dialogs/layers/layer-properties-dialog.component.html b/IsraelHiking.Web/src/application/components/dialogs/layers/layer-properties-dialog.component.html index 2fdb6d7f3..f70662122 100644 --- a/IsraelHiking.Web/src/application/components/dialogs/layers/layer-properties-dialog.component.html +++ b/IsraelHiking.Web/src/application/components/dialogs/layers/layer-properties-dialog.component.html @@ -39,7 +39,7 @@
; public shareUrlInEditMode: ShareUrl; public selectedShareUrlId: string; public loadingShareUrls: boolean; public searchTerm: FormControl; - - @Select((state: ApplicationState) => state.shareUrlsState.shareUrls) - public shareUrls$: Observable>; - - @Select((state: ApplicationState) => state.inMemoryState.shareUrl) public shownShareUrl$: Observable>; private sessionSearchTerm = ""; private page: number; - private subscriptions: Subscription[]; constructor(resources: ResourcesService, private readonly dialog: MatDialog, @@ -56,17 +51,17 @@ export class SharesDialogComponent extends BaseMapComponent implements OnInit, O this.shareUrlInEditMode = null; this.selectedShareUrlId = null; this.page = 1; - this.subscriptions = []; this.searchTerm = new FormControl(""); - this.subscriptions.push(this.searchTerm.valueChanges.subscribe((searchTerm: string) => { + this.searchTerm.valueChanges.pipe(takeUntilDestroyed()).subscribe((searchTerm: string) => { this.updateFilteredLists(searchTerm); - })); + }); this.searchTerm.setValue(this.sessionSearchTerm); - this.subscriptions.push(this.shareUrls$.subscribe(() => { + this.store.select((state: ApplicationState) => state.shareUrlsState.shareUrls).pipe(takeUntilDestroyed()).subscribe(() => { if (!this.loadingShareUrls) { this.updateFilteredLists(this.searchTerm.value); } - })); + }); + this.shownShareUrl$ = this.store.select((state: ApplicationState) => state.inMemoryState.shareUrl).pipe(takeUntilDestroyed()); } public async ngOnInit() { @@ -76,12 +71,6 @@ export class SharesDialogComponent extends BaseMapComponent implements OnInit, O this.updateFilteredLists(this.searchTerm.value); } - public ngOnDestroy() { - for (const subscription of this.subscriptions) { - subscription.unsubscribe(); - } - } - public isApp(): boolean { return this.runningContextService.isCapacitor; } diff --git a/IsraelHiking.Web/src/application/components/dialogs/traces-dialog.component.ts b/IsraelHiking.Web/src/application/components/dialogs/traces-dialog.component.ts index ee7d4edd5..f3c91ad36 100644 --- a/IsraelHiking.Web/src/application/components/dialogs/traces-dialog.component.ts +++ b/IsraelHiking.Web/src/application/components/dialogs/traces-dialog.component.ts @@ -1,9 +1,9 @@ -import { Component, OnInit, OnDestroy, ViewEncapsulation, Inject } from "@angular/core"; +import { Component, OnInit, ViewEncapsulation, Inject } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { FormControl } from "@angular/forms"; import { MatDialogRef, MAT_DIALOG_DATA } from "@angular/material/dialog"; -import { Subscription, Observable } from "rxjs"; import { orderBy, take } from "lodash-es"; -import { Store, Select } from "@ngxs/store"; +import { Store } from "@ngxs/store"; import type { Immutable } from "immer"; import { BaseMapComponent } from "../base-map.component"; @@ -26,7 +26,7 @@ import type { ApplicationState, Trace, TraceVisibility } from "../../models/mode styleUrls: ["./traces-dialog.component.scss"], encapsulation: ViewEncapsulation.None }) -export class TracesDialogComponent extends BaseMapComponent implements OnInit, OnDestroy { +export class TracesDialogComponent extends BaseMapComponent implements OnInit { public filteredTraces: Immutable; public selectedTraceId: string; @@ -35,12 +35,8 @@ export class TracesDialogComponent extends BaseMapComponent implements OnInit, O public loadingTraces: boolean; public searchTerm: FormControl; - @Select((state: ApplicationState) => state.tracesState.traces) - public traces$: Observable>; - private sessionSearchTerm = ""; private page: number; - private tracesChangedSubscription: Subscription; private specificIds: string[]; constructor(resources: ResourcesService, @@ -68,11 +64,11 @@ export class TracesDialogComponent extends BaseMapComponent implements OnInit, O this.specificIds = []; } - this.searchTerm.valueChanges.subscribe((searchTerm: string) => { + this.searchTerm.valueChanges.pipe(takeUntilDestroyed()).subscribe((searchTerm: string) => { this.updateFilteredLists(searchTerm); }); this.searchTerm.setValue(this.sessionSearchTerm); - this.tracesChangedSubscription = this.traces$.subscribe(() => { + this.store.select((state: ApplicationState) => state.tracesState.traces).pipe(takeUntilDestroyed()).subscribe(() => { if (!this.loadingTraces) { this.updateFilteredLists(this.searchTerm.value); } @@ -86,10 +82,6 @@ export class TracesDialogComponent extends BaseMapComponent implements OnInit, O this.updateFilteredLists(this.searchTerm.value); } - public ngOnDestroy() { - this.tracesChangedSubscription.unsubscribe(); - } - public async addTraceToRoutes() { const trace = await this.tracesService.getTraceById(this.selectedTraceId); this.dataContainerService.setData(trace.dataContainer, true); diff --git a/IsraelHiking.Web/src/application/components/drawing.component.html b/IsraelHiking.Web/src/application/components/drawing.component.html index c6906a44c..5e51b8dca 100644 --- a/IsraelHiking.Web/src/application/components/drawing.component.html +++ b/IsraelHiking.Web/src/application/components/drawing.component.html @@ -5,7 +5,7 @@ - + diff --git a/IsraelHiking.Web/src/application/components/drawing.component.ts b/IsraelHiking.Web/src/application/components/drawing.component.ts index 219fc0f36..493520617 100644 --- a/IsraelHiking.Web/src/application/components/drawing.component.ts +++ b/IsraelHiking.Web/src/application/components/drawing.component.ts @@ -1,6 +1,6 @@ import { Component, HostListener } from "@angular/core"; import { Observable } from "rxjs"; -import { Store, Select } from "@ngxs/store"; +import { Store } from "@ngxs/store"; import { BaseMapComponent } from "./base-map.component"; import { ResourcesService } from "../services/resources.service"; @@ -25,14 +25,14 @@ import type { RoutingType, ApplicationState } from "../models/models"; }) export class DrawingComponent extends BaseMapComponent { - @Select((state: ApplicationState) => state.routes.past.length) - public undoQueueLength: Observable; + public undoQueueLength$: Observable; constructor(resources: ResourcesService, private readonly selectedRouteService: SelectedRouteService, private readonly toastService: ToastService, private readonly store: Store) { super(resources); + this.undoQueueLength$ = this.store.select((state: ApplicationState) => state.routes.past.length); } @HostListener("window:keydown", ["$event"]) diff --git a/IsraelHiking.Web/src/application/components/location.component.ts b/IsraelHiking.Web/src/application/components/location.component.ts index 48b936b89..468491d3b 100644 --- a/IsraelHiking.Web/src/application/components/location.component.ts +++ b/IsraelHiking.Web/src/application/components/location.component.ts @@ -1,8 +1,7 @@ -import { Component } from "@angular/core"; +import { Component, DestroyRef } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { MapComponent } from "@maplibre/ngx-maplibre-gl"; -import { Observable } from "rxjs"; -import { Store, Select } from "@ngxs/store"; -import type { Immutable } from "immer"; +import { Store } from "@ngxs/store"; import { BaseMapComponent } from "./base-map.component"; import { ResourcesService } from "../services/resources.service"; @@ -26,15 +25,6 @@ import type { LatLngAlt, ApplicationState } from "../models/models"; }) export class LocationComponent extends BaseMapComponent { - @Select((state: ApplicationState) => state.inMemoryState.distance) - public distance$: Observable; - - @Select((state: ApplicationState) => state.inMemoryState.pannedTimestamp) - public pannedTimestamp$: Observable; - - @Select((state: ApplicationState) => state.gpsState.currentPosition) - private currentPosition$: Observable>; - private lastSpeed: number; private lastSpeedTime: number; private isPanned: boolean; @@ -53,6 +43,7 @@ export class LocationComponent extends BaseMapComponent { private readonly fitBoundsService: FitBoundsService, private readonly deviceOrientationService: DeviceOrientationService, private readonly store: Store, + private readonly destroyRef: DestroyRef, private readonly mapComponent: MapComponent) { super(resources); @@ -62,12 +53,12 @@ export class LocationComponent extends BaseMapComponent { this.lastSpeedTime = null; this.clearLocationFeatureCollection(); - this.distance$.subscribe(distance => { + this.store.select((state: ApplicationState) => state.inMemoryState.distance).pipe(takeUntilDestroyed()).subscribe(distance => { this.showDistance = distance; this.updateDistanceFeatureCollection(); }); - this.pannedTimestamp$.subscribe(pannedTimestamp => { + this.store.select((state: ApplicationState) => state.inMemoryState.pannedTimestamp).pipe(takeUntilDestroyed()).subscribe(pannedTimestamp => { this.isPanned = pannedTimestamp != null; if (this.isPanned) { return; @@ -98,13 +89,13 @@ export class LocationComponent extends BaseMapComponent { } }); - this.currentPosition$.subscribe((position: GeolocationPosition) => { + this.store.select((state: ApplicationState) => state.gpsState.currentPosition).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(position => { if (position != null) { this.handlePositionChange(position); } }); - this.deviceOrientationService.orientationChanged.subscribe((bearing: number) => { + this.deviceOrientationService.orientationChanged.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((bearing: number) => { if (!this.isActive() || this.locationFeatures.features.length === 0) { return; } diff --git a/IsraelHiking.Web/src/application/components/main-menu.component.ts b/IsraelHiking.Web/src/application/components/main-menu.component.ts index 4855a549a..b5da322ce 100644 --- a/IsraelHiking.Web/src/application/components/main-menu.component.ts +++ b/IsraelHiking.Web/src/application/components/main-menu.component.ts @@ -1,13 +1,12 @@ -import { Component, OnDestroy } from "@angular/core"; +import { Component } from "@angular/core"; import { MatDialog, MatDialogConfig } from "@angular/material/dialog"; -import { Subscription, Observable, timer } from "rxjs"; +import { timer } from "rxjs"; import { Device } from "@capacitor/device"; import { App } from "@capacitor/app"; import { SocialSharing } from "@awesome-cordova-plugins/social-sharing/ngx"; import { encode } from "base64-arraybuffer"; -import { Store, Select } from "@ngxs/store"; +import { Store } from "@ngxs/store"; import platform from "platform"; -import type { Immutable } from "immer"; import { BaseMapComponent } from "./base-map.component"; import { ResourcesService } from "../services/resources.service"; @@ -31,30 +30,20 @@ import { SendReportDialogComponent } from "./dialogs/send-report-dialog.componen import { SetUIComponentVisibilityAction } from "../reducers/ui-components.reducer"; import { SetAgreeToTermsAction } from "../reducers/user.reducer"; import type { UserInfo, ApplicationState } from "../models/models"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; @Component({ selector: "main-menu", templateUrl: "./main-menu.component.html", styleUrls: ["./main-menu.component.scss"] }) -export class MainMenuComponent extends BaseMapComponent implements OnDestroy { - - private subscriptions: Subscription[]; +export class MainMenuComponent extends BaseMapComponent { public userInfo: UserInfo; public drawingVisible: boolean; public statisticsVisible: boolean; public isShowMore: boolean; - @Select((state: ApplicationState) => state.userState.userInfo) - public userInfo$: Observable>; - - @Select((state: ApplicationState) => state.uiComponentsState.drawingVisible) - public drawingVisible$: Observable; - - @Select((state: ApplicationState) => state.uiComponentsState.statisticsVisible) - public statisticsVisible$: Observable; - constructor(resources: ResourcesService, private readonly socialSharing: SocialSharing, private readonly authorizationService: AuthorizationService, @@ -72,10 +61,9 @@ export class MainMenuComponent extends BaseMapComponent implements OnDestroy { super(resources); this.isShowMore = false; this.userInfo = null; - this.subscriptions = []; - this.subscriptions.push(this.userInfo$.subscribe(userInfo => this.userInfo = userInfo)); - this.subscriptions.push(this.drawingVisible$.subscribe(v => this.drawingVisible = v)); - this.subscriptions.push(this.statisticsVisible$.subscribe(v => this.statisticsVisible = v)); + this.store.select((state: ApplicationState) => state.userState.userInfo).pipe(takeUntilDestroyed()).subscribe(userInfo => this.userInfo = userInfo); + this.store.select((state: ApplicationState) => state.uiComponentsState.drawingVisible).pipe(takeUntilDestroyed()).subscribe(v => this.drawingVisible = v); + this.store.select((state: ApplicationState) => state.uiComponentsState.statisticsVisible).pipe(takeUntilDestroyed()).subscribe(v => this.statisticsVisible = v); if (this.runningContextService.isCapacitor) { App.getInfo().then((info) => { this.loggingService.info(`App version: ${info.version}`); @@ -83,12 +71,6 @@ export class MainMenuComponent extends BaseMapComponent implements OnDestroy { } } - public ngOnDestroy(): void { - for (const subscription of this.subscriptions) { - subscription.unsubscribe(); - } - } - public isLoggedIn() { return this.userInfo != null; } @@ -141,14 +123,14 @@ export class MainMenuComponent extends BaseMapComponent implements OnDestroy { public selectDrawing() { this.store.dispatch(new SetUIComponentVisibilityAction( "drawing", - !this.store.selectSnapshot((s: ApplicationState) => s.uiComponentsState).drawingVisible + !this.drawingVisible )); } public selectStatistics() { this.store.dispatch(new SetUIComponentVisibilityAction( "statistics", - !this.store.selectSnapshot((s: ApplicationState) => s.uiComponentsState).statisticsVisible + !this.statisticsVisible )); } diff --git a/IsraelHiking.Web/src/application/components/map/automatic-layer-presentation.component.ts b/IsraelHiking.Web/src/application/components/map/automatic-layer-presentation.component.ts index 743541fbd..93d74abd9 100644 --- a/IsraelHiking.Web/src/application/components/map/automatic-layer-presentation.component.ts +++ b/IsraelHiking.Web/src/application/components/map/automatic-layer-presentation.component.ts @@ -7,16 +7,15 @@ import { SourceSpecification, LayerSpecification } from "maplibre-gl"; -import { Observable, Subject, Subscription, mergeMap } from "rxjs"; -import { Store, Select } from "@ngxs/store"; -import type { Immutable } from "immer"; +import { Subject, Subscription, mergeMap } from "rxjs"; +import { Store } from "@ngxs/store"; import { BaseMapComponent } from "../base-map.component"; import { ResourcesService } from "../../services/resources.service"; import { FileService } from "../../services/file.service"; import { ConnectionService } from "../../services/connection.service"; import { MapService } from "../../services/map.service"; -import type { ApplicationState, EditableLayer, Language, LanguageCode, LayerData } from "../../models/models"; +import type { ApplicationState, EditableLayer, LanguageCode, LayerData } from "../../models/models"; @Component({ selector: "auto-layer", @@ -49,9 +48,6 @@ export class AutomaticLayerPresentationComponent extends BaseMapComponent implem private currentLanguageCode: LanguageCode; private recreateQueue: Subject<() => Promise>; - @Select((state: ApplicationState) => state.configuration.language) - private language$: Observable>; - constructor(resources: ResourcesService, private readonly mapComponent: MapComponent, private readonly fileService: FileService, @@ -79,7 +75,7 @@ export class AutomaticLayerPresentationComponent extends BaseMapComponent implem public ngOnInit() { this.addLayerRecreationQuqueItem(null, this.layerData); this.currentLanguageCode = this.store.selectSnapshot((s: ApplicationState) => s.configuration).language.code; - this.subscriptions.push(this.language$.subscribe((language) => { + this.subscriptions.push(this.store.select((state: ApplicationState) => state.configuration.language).subscribe((language) => { if (this.currentLanguageCode !== language.code) { this.addLayerRecreationQuqueItem(this.layerData, this.layerData); } @@ -244,4 +240,4 @@ export class AutomaticLayerPresentationComponent extends BaseMapComponent implem } }); } -} +} \ No newline at end of file diff --git a/IsraelHiking.Web/src/application/components/map/layers-view.component.html b/IsraelHiking.Web/src/application/components/map/layers-view.component.html index ae2c6459a..86b3b37e2 100644 --- a/IsraelHiking.Web/src/application/components/map/layers-view.component.html +++ b/IsraelHiking.Web/src/application/components/map/layers-view.component.html @@ -4,7 +4,7 @@ [isBaselayer]="true" [isMainMap]="true"> -
+
[]; public hoverFeature: GeoJSON.Feature; public isShowCoordinatesPopup: boolean; - - @Select((state: ApplicationState) => state.layersState.overlays) - public overlays: Observable>; - - @Select((state: ApplicationState) => state.poiState.selectedPointOfInterest) - public selectedPoi$: Observable>; + public overlays$: Observable>; constructor(resources: ResourcesService, private readonly router: Router, @@ -45,7 +41,8 @@ export class LayersViewComponent extends BaseMapComponent implements OnInit { private readonly poiService: PoiService, private readonly selectedRouteService: SelectedRouteService, private readonly navigateHereService: NavigateHereService, - private readonly store: Store + private readonly store: Store, + private readonly destroyRef: DestroyRef ) { super(resources); this.selectedCluster = null; @@ -56,6 +53,7 @@ export class LayersViewComponent extends BaseMapComponent implements OnInit { type: "FeatureCollection", features: [] }; + this.overlays$ = this.store.select((state: ApplicationState) => state.layersState.overlays); } public getBaseLayer() { @@ -64,10 +62,10 @@ export class LayersViewComponent extends BaseMapComponent implements OnInit { public ngOnInit() { this.poiGeoJsonData = this.poiService.poiGeojsonFiltered; - this.poiService.poisChanged.subscribe(() => { + this.poiService.poisChanged.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => { this.poiGeoJsonData = this.poiService.poiGeojsonFiltered; }); - this.selectedPoi$.subscribe((poi) => this.onSelectedPoiChanged(poi)); + this.store.select((state: ApplicationState) => state.poiState.selectedPointOfInterest).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(poi => this.onSelectedPoiChanged(poi)); } private onSelectedPoiChanged(poi: Immutable) { diff --git a/IsraelHiking.Web/src/application/components/map/recorded-route.component.ts b/IsraelHiking.Web/src/application/components/map/recorded-route.component.ts index f60322f20..acaa3819c 100644 --- a/IsraelHiking.Web/src/application/components/map/recorded-route.component.ts +++ b/IsraelHiking.Web/src/application/components/map/recorded-route.component.ts @@ -1,6 +1,7 @@ import { Component } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { Observable, combineLatest, throttleTime } from "rxjs"; -import { Store, Select } from "@ngxs/store"; +import { Store } from "@ngxs/store"; import type { Immutable } from "immer"; import { BaseMapComponent } from "../base-map.component"; @@ -17,19 +18,13 @@ export class RecordedRouteComponent extends BaseMapComponent { static readonly NUMBER_OF_POINTS_IN_ROUTE_SPLIT = 4000; - @Select((state: ApplicationState) => state.recordedRouteState.isAddingPoi) public isAddingPoi$: Observable; - - @Select((state: ApplicationState) => state.recordedRouteState.route) - public recordedRoute$: Observable>; - - @Select((state: ApplicationState) => state.gpsState.currentPosition) - public currentPosition$: Observable>; - public recordedRouteSegments: GeoJSON.Feature[]; public lastRouteSegment: GeoJSON.Feature; public startPointGeoJson: GeoJSON.Feature; - + public recordedRoute$: Observable>; + + private currentPosition$: Observable>; private lastSplit: number; constructor(resources: ResourcesService, @@ -47,10 +42,14 @@ export class RecordedRouteComponent extends BaseMapComponent { }, properties: {} }; + this.recordedRoute$ = this.store.select((state: ApplicationState) => state.recordedRouteState.route); + this.currentPosition$ = this.store.select((state: ApplicationState) => state.gpsState.currentPosition); // Combine streams to work when both current location and recorded route changes, added throttle to avoid a double update of the UI - combineLatest([this.recordedRoute$, this.currentPosition$]).pipe(throttleTime(50, undefined, { trailing: true })) + combineLatest([this.recordedRoute$, this.currentPosition$]).pipe(throttleTime(50, undefined, { trailing: true }), takeUntilDestroyed()) .subscribe(() => this.handleRecordingChanges()); + + this.isAddingPoi$ = this.store.select((state: ApplicationState) => state.recordedRouteState.isAddingPoi); } public isRecording() { diff --git a/IsraelHiking.Web/src/application/components/map/routes.component.html b/IsraelHiking.Web/src/application/components/map/routes.component.html index 9b72b4df4..f7a82bafa 100644 --- a/IsraelHiking.Web/src/application/components/map/routes.component.html +++ b/IsraelHiking.Web/src/application/components/map/routes.component.html @@ -116,7 +116,7 @@ -
+
state.routes.present) - public routes$: Observable>; - - @Select((state: ApplicationState) => state.routeEditingState.selectedRouteId) - public selectedRouteId$: Observable>; - - @Select((state: ApplicationState) => state.recordedRouteState.isAddingPoi) - public isAddingPoi$: Observable; - public routePointPopupData: RoutePointViewData; public nonEditRoutePointPopupData: { latlng: LatLngAlt; wazeAddress: string; routeId: string}; - public editingRouteGeoJson: GeoJSON.FeatureCollection; public routesGeoJson: GeoJSON.FeatureCollection; - - private routes: Immutable; + public routes: Immutable; constructor(resources: ResourcesService, private readonly selectedRouteService: SelectedRouteService, @@ -77,17 +66,17 @@ export class RoutesComponent extends BaseMapComponent implements AfterViewInit { features: [] }; this.routes = []; - this.routeEditRouteInteraction.onRoutePointClick.subscribe(this.handleRoutePointClick); - this.routes$.subscribe(this.handleRoutesChanges); - this.selectedRouteId$.subscribe(() => this.handleRoutesChanges(this.routes)); - this.isAddingPoi$.subscribe(() => this.setInteractionAccordingToState()); + this.routeEditRouteInteraction.onRoutePointClick.pipe(takeUntilDestroyed()).subscribe(this.handleRoutePointClick); + this.store.select((state: ApplicationState) => state.routes.present).pipe(takeUntilDestroyed()).subscribe(routes => this.handleRoutesChanges(routes)); + this.store.select((state: ApplicationState) => state.routeEditingState.selectedRouteId).pipe(takeUntilDestroyed()).subscribe(() => this.handleRoutesChanges(this.routes)); + this.store.select((state: ApplicationState) => state.recordedRouteState.isAddingPoi).pipe(takeUntilDestroyed()).subscribe(() => this.setInteractionAccordingToState()); } - private handleRoutesChanges = (routes: Immutable) => { + private handleRoutesChanges(routes: Immutable) { this.routes = routes; this.setInteractionAccordingToState(); this.buildFeatureCollections(); - }; + } private buildFeatureCollections() { let features = [] as GeoJSON.Feature[]; diff --git a/IsraelHiking.Web/src/application/components/map/traces.component.ts b/IsraelHiking.Web/src/application/components/map/traces.component.ts index 6825fa1e2..7cf6e4b2b 100644 --- a/IsraelHiking.Web/src/application/components/map/traces.component.ts +++ b/IsraelHiking.Web/src/application/components/map/traces.component.ts @@ -1,7 +1,6 @@ import { Component } from "@angular/core"; -import { Observable } from "rxjs"; -import { Store, Select } from "@ngxs/store"; -import type { Immutable } from "immer"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; +import { Store } from "@ngxs/store"; import type { LngLatLike } from "maplibre-gl"; import { BaseMapComponent } from "../base-map.component"; @@ -28,12 +27,6 @@ export class TracesComponent extends BaseMapComponent { public selectedFeatureSource: GeoJSON.FeatureCollection; public isConfigOpen: boolean; - @Select((state: ApplicationState) => state.tracesState.visibleTraceId) - private visibleTraceId$: Observable; - - @Select((state: ApplicationState) => state.tracesState.missingParts) - private missingParts$: Observable>>; - constructor(resources: ResourcesService, private readonly routesFactory: RoutesFactory, private readonly tracesService: TracesService, @@ -48,7 +41,7 @@ export class TracesComponent extends BaseMapComponent { type: "FeatureCollection", features: [] }; - this.visibleTraceId$.subscribe(async (id) => { + this.store.select((state: ApplicationState) => state.tracesState.visibleTraceId).pipe(takeUntilDestroyed()).subscribe(async (id) => { if (id == null) { this.clearTraceSource(); @@ -94,7 +87,7 @@ export class TracesComponent extends BaseMapComponent { this.selectedTraceStart = traceCoordinates[0]; }); - this.missingParts$.subscribe(m => { + this.store.select((state: ApplicationState) => state.tracesState.missingParts).pipe(takeUntilDestroyed()).subscribe(m => { if (m != null) { this.missingParts = structuredClone(m) as GeoJSON.FeatureCollection; } else { diff --git a/IsraelHiking.Web/src/application/components/overlays/gps-location-overlay.component.ts b/IsraelHiking.Web/src/application/components/overlays/gps-location-overlay.component.ts index 21dfa403a..61f672cb4 100644 --- a/IsraelHiking.Web/src/application/components/overlays/gps-location-overlay.component.ts +++ b/IsraelHiking.Web/src/application/components/overlays/gps-location-overlay.component.ts @@ -2,7 +2,7 @@ import { Component, Input, Output, EventEmitter } from "@angular/core"; import { MatDialog } from "@angular/material/dialog"; import { Observable } from "rxjs"; import { SocialSharing } from "@awesome-cordova-plugins/social-sharing/ngx"; -import { Store, Select } from "@ngxs/store"; +import { Store } from "@ngxs/store"; import { BaseMapComponent } from "../base-map.component"; import { PrivatePoiEditDialogComponent } from "../dialogs/private-poi-edit-dialog.component"; @@ -29,9 +29,7 @@ export class GpsLocationOverlayComponent extends BaseMapComponent { @Output() public closed = new EventEmitter(); - @Select((state: ApplicationState) => state.inMemoryState.distance) public distance$: Observable; - public hideCoordinates: boolean; constructor(resources: ResourcesService, @@ -44,6 +42,7 @@ export class GpsLocationOverlayComponent extends BaseMapComponent { private readonly store: Store) { super(resources); this.hideCoordinates = true; + this.distance$ = this.store.select((state: ApplicationState) => state.inMemoryState.distance); } public addPointToRoute() { diff --git a/IsraelHiking.Web/src/application/components/route-statistics.component.html b/IsraelHiking.Web/src/application/components/route-statistics.component.html index 86d228838..5c603a618 100644 --- a/IsraelHiking.Web/src/application/components/route-statistics.component.html +++ b/IsraelHiking.Web/src/application/components/route-statistics.component.html @@ -1,4 +1,4 @@ -
+
diff --git a/IsraelHiking.Web/src/application/components/route-statistics.component.ts b/IsraelHiking.Web/src/application/components/route-statistics.component.ts index 5f1fdd891..7d786cc2b 100644 --- a/IsraelHiking.Web/src/application/components/route-statistics.component.ts +++ b/IsraelHiking.Web/src/application/components/route-statistics.component.ts @@ -1,9 +1,10 @@ -import { Component, ViewEncapsulation, OnInit, OnDestroy, ViewChild, ElementRef, ChangeDetectorRef } from "@angular/core"; +import { Component, ViewEncapsulation, OnInit, ViewChild, ElementRef, ChangeDetectorRef, DestroyRef } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { trigger, style, transition, animate } from "@angular/animations"; -import { Subscription, Observable, interval } from "rxjs"; +import { Observable, interval } from "rxjs"; import { regressionLoess } from "d3-regression"; import { LineLayerSpecification } from "maplibre-gl"; -import { Store, Select } from "@ngxs/store"; +import { Store } from "@ngxs/store"; import * as d3 from "d3"; import type { Selection, ScaleContinuousNumeric } from "d3"; import type { Immutable } from "immer"; @@ -18,7 +19,7 @@ import { SpatialService } from "../services/spatial.service"; import { GeoLocationService } from "../services/geo-location.service"; import { AudioPlayerFactory, IAudioPlayer } from "../services/audio-player.factory"; import { ToggleIsShowKmMarkersAction, ToggleIsShowSlopeAction } from "../reducers/configuration.reducer"; -import type { LatLngAlt, RouteData, ApplicationState, Language, LatLngAltTime } from "../models/models"; +import type { LatLngAlt, ApplicationState, LatLngAltTime } from "../models/models"; declare type DragState = "start" | "drag" | "none"; @@ -72,7 +73,7 @@ interface IChartElements { ) ], }) -export class RouteStatisticsComponent extends BaseMapComponent implements OnInit, OnDestroy { +export class RouteStatisticsComponent extends BaseMapComponent implements OnInit { private static readonly HOVER_BOX_WIDTH = 160; private static readonly MAX_SLOPE = 20; @@ -97,37 +98,13 @@ export class RouteStatisticsComponent extends BaseMapComponent implements OnInit public slopeRouteSource: GeoJSON.FeatureCollection; public subRouteRange: IChartSubRouteRange; public slopeRoutePaint: LineLayerSpecification["paint"]; + public statisticsVisible$: Observable; @ViewChild("lineChartContainer") public lineChartContainer: ElementRef; - @Select((state: ApplicationState) => state.routes.present) - private routes$: Observable>; - - @Select((state: ApplicationState) => state.routeEditingState.selectedRouteId) - private selectedRouteId$: Observable; - - @Select((state: ApplicationState) => state.locationState.zoom) - private zoom$: Observable; - - @Select((state: ApplicationState) => state.gpsState.currentPosition) - private currentPosition$: Observable>; - - @Select((state: ApplicationState) => state.uiComponentsState.statisticsVisible) - public statisticsVisible$: Observable; - - @Select((state: ApplicationState) => state.configuration.language) - public language$: Observable>; - - @Select((state: ApplicationState) => state.configuration.isShowSlope) - public isShowSlope$: Observable; - - @Select((state: ApplicationState) => state.configuration.isShowKmMarker) - public isShowKmMarkers$: Observable; - private statistics: RouteStatistics; private chartElements: IChartElements; - private componentSubscriptions: Subscription[]; private zoom: number; private routeColor: string; private audioPlayer: IAudioPlayer; @@ -140,7 +117,8 @@ export class RouteStatisticsComponent extends BaseMapComponent implements OnInit private readonly cancelableTimeoutService: CancelableTimeoutService, private readonly sidebarService: SidebarService, private readonly audioPlayerFactory: AudioPlayerFactory, - private readonly store: Store + private readonly store: Store, + private readonly destroyRef: DestroyRef, ) { super(resources); this.isExpanded = false; @@ -151,7 +129,6 @@ export class RouteStatisticsComponent extends BaseMapComponent implements OnInit this.subRouteRange = null; this.heading = null; this.setViewStatisticsValues(null); - this.componentSubscriptions = []; this.kmMarkersSource = { type: "FeatureCollection", features: [] @@ -169,14 +146,15 @@ export class RouteStatisticsComponent extends BaseMapComponent implements OnInit margin: { top: 10, right: 10, bottom: 40, left: 40 }, } as IChartElements; this.zoom = 7; - this.zoom$.subscribe((zoom) => { + this.store.select((state: ApplicationState) => state.locationState.zoom).pipe(takeUntilDestroyed()).subscribe((zoom) => { this.zoom = zoom; this.updateKmMarkers(); }); - this.componentSubscriptions.push(this.sidebarService.sideBarStateChanged.subscribe(() => { + this.sidebarService.sideBarStateChanged.pipe(takeUntilDestroyed()).subscribe(() => { this.redrawChart(); - })); - this.componentSubscriptions.push(this.selectedRouteService.selectedRouteHover.subscribe(this.onSelectedRouteHover)); + }); + this.selectedRouteService.selectedRouteHover.pipe(takeUntilDestroyed()).subscribe(this.onSelectedRouteHover); + this.statisticsVisible$ = this.store.select((state: ApplicationState) => state.uiComponentsState.statisticsVisible); } private setViewStatisticsValues(statistics: RouteStatistics): void { @@ -248,44 +226,38 @@ export class RouteStatisticsComponent extends BaseMapComponent implements OnInit } public async ngOnInit() { - this.componentSubscriptions.push(this.routes$.subscribe(() => { + this.store.select((state: ApplicationState) => state.routes.present).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => { this.routeChanged(); - })); - this.componentSubscriptions.push(this.selectedRouteId$.subscribe(() => { + }); + this.store.select((state: ApplicationState) => state.routeEditingState.selectedRouteId).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => { this.routeChanged(); - })); - this.componentSubscriptions.push(this.language$.subscribe(() => { + }); + this.store.select((state: ApplicationState) => state.configuration.language).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => { this.redrawChart(); - })); - this.componentSubscriptions.push(this.currentPosition$.subscribe(p => { + }); + this.store.select((state: ApplicationState) => state.gpsState.currentPosition).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(p => { this.onGeolocationChanged(p); - })); - this.componentSubscriptions.push(this.isShowSlope$.subscribe(showSlope => { + }); + this.store.select((state: ApplicationState) => state.configuration.isShowSlope).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(showSlope => { this.isSlopeOn = showSlope; this.redrawChart(); this.updateSlopeRoute(); - })); - this.componentSubscriptions.push(this.isShowKmMarkers$.subscribe(showKmMarkers => { + }); + this.store.select((state: ApplicationState) => state.configuration.isShowKmMarker).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(showKmMarkers => { this.isKmMarkersOn = showKmMarkers; this.updateKmMarkers(); - })); + }); this.routeChanged(); - this.componentSubscriptions.push(interval(1000).subscribe(() => { + interval(1000).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => { const recordedRouteState = this.store.selectSnapshot((s: ApplicationState) => s.recordedRouteState); if (recordedRouteState.isRecording) { const recordingStartTime = new Date(recordedRouteState.route.latlngs[0].timestamp).getTime(); this.updateDurationString((new Date().getTime() - recordingStartTime) / 1000); } - })); + }); this.audioPlayer = await this.audioPlayerFactory.create(); } - public ngOnDestroy() { - for (const subscription of this.componentSubscriptions) { - subscription.unsubscribe(); - } - } - public changeState(state: string) { switch (state) { case "table": diff --git a/IsraelHiking.Web/src/application/components/sidebar/info-sidebar.component.ts b/IsraelHiking.Web/src/application/components/sidebar/info-sidebar.component.ts index cc688b4e1..08222090e 100644 --- a/IsraelHiking.Web/src/application/components/sidebar/info-sidebar.component.ts +++ b/IsraelHiking.Web/src/application/components/sidebar/info-sidebar.component.ts @@ -1,10 +1,9 @@ import { Component } from "@angular/core"; +import { takeUntilDestroyed } from "@angular/core/rxjs-interop"; import { MatDialog } from "@angular/material/dialog"; import { remove } from "lodash-es"; import { Angulartics2GoogleGlobalSiteTag } from "angulartics2"; -import { Observable } from "rxjs"; -import { Select } from "@ngxs/store"; -import type { Immutable } from "immer"; +import { Store } from "@ngxs/store"; import { BaseMapComponent } from "../base-map.component"; import { DownloadDialogComponent } from "../dialogs/download-dialog.component"; @@ -14,7 +13,7 @@ import { ResourcesService } from "../../services/resources.service"; import { LayersService } from "../../services/layers.service"; import { RunningContextService } from "../../services/running-context.service"; import { ISRAEL_MTB_MAP, ISRAEL_HIKING_MAP } from "../../reducers/initial-state"; -import type { ApplicationState, Language } from "../../models/models"; +import type { ApplicationState } from "../../models/models"; import legendSectionsJson from "../../../content/legend/legend.json"; export type LegendSection = { @@ -33,22 +32,20 @@ export class InfoSidebarComponent extends BaseMapComponent { public selectedTabIndex: number; private selectedSection: LegendSection; - @Select((state: ApplicationState) => state.configuration.language) - private language$: Observable>; - constructor(resources: ResourcesService, private readonly dialog: MatDialog, private readonly angulartics: Angulartics2GoogleGlobalSiteTag, private readonly sidebarService: SidebarService, private readonly layersService: LayersService, - private readonly runningContext: RunningContextService) { + private readonly runningContext: RunningContextService, + private readonly store: Store) { super(resources); this.selectedTabIndex = 0; this.selectedSection = null; this.legendSections = []; - this.language$.subscribe(() => { + this.store.select((state: ApplicationState) => state.configuration.language).pipe(takeUntilDestroyed()).subscribe(() => { this.initalizeLegendSections(); }); } diff --git a/IsraelHiking.Web/src/application/components/sidebar/layers-sidebar.component.html b/IsraelHiking.Web/src/application/components/sidebar/layers-sidebar.component.html index f9a52fdc4..abfc3a174 100644 --- a/IsraelHiking.Web/src/application/components/sidebar/layers-sidebar.component.html +++ b/IsraelHiking.Web/src/application/components/sidebar/layers-sidebar.component.html @@ -17,7 +17,7 @@
-
+
-
+
- + @@ -75,7 +75,7 @@
-
+
-
-
{{resources.lastUpdatedOn}} {{lastModified | async | date:'dd/MM/yyyy'}}
+
+
{{resources.lastUpdatedOn}} {{lastModified$ | async | date:'dd/MM/yyyy'}}

{{resources.offlinePurchaseGraditude}}
diff --git a/IsraelHiking.Web/src/application/components/sidebar/layers-sidebar.component.ts b/IsraelHiking.Web/src/application/components/sidebar/layers-sidebar.component.ts index 1ca8bd14d..99699a828 100644 --- a/IsraelHiking.Web/src/application/components/sidebar/layers-sidebar.component.ts +++ b/IsraelHiking.Web/src/application/components/sidebar/layers-sidebar.component.ts @@ -2,7 +2,7 @@ import { Component, ViewEncapsulation } from "@angular/core"; import { MatDialog } from "@angular/material/dialog"; import { CdkDragDrop, moveItemInArray } from "@angular/cdk/drag-drop"; import { Observable } from "rxjs"; -import { Store, Select } from "@ngxs/store"; +import { Store } from "@ngxs/store"; import type { Immutable } from "immer"; import { BaseMapComponent } from "../base-map.component"; @@ -33,20 +33,11 @@ import type { ApplicationState, RouteData, EditableLayer, Overlay, CategoriesGro }) export class LayersSidebarComponent extends BaseMapComponent { - @Select((state: ApplicationState) => state.layersState.baseLayers) - public baseLayers: Observable>; - - @Select((state: ApplicationState) => state.layersState.overlays) - public overlays: Observable>; - - @Select((state: ApplicationState) => state.layersState.categoriesGroups) - public categoriesGroups: Observable>; - - @Select((state: ApplicationState) => state.routes.present) - public routes: Observable>; - - @Select((state: ApplicationState) => state.offlineState.lastModifiedDate) - public lastModified: Observable; + public baseLayers$: Observable>; + public overlays$: Observable>; + public categoriesGroups$: Observable>; + public routes$: Observable>; + public lastModified$: Observable; public manageSubscriptions: string; @@ -64,6 +55,11 @@ export class LayersSidebarComponent extends BaseMapComponent { this.manageSubscriptions = this.runningContextService.isIos ? "https://apps.apple.com/account/subscriptions" : "https://play.google.com/store/account/subscriptions"; + this.lastModified$ = this.store.select((state: ApplicationState) => state.offlineState.lastModifiedDate); + this.baseLayers$ = this.store.select((state: ApplicationState) => state.layersState.baseLayers); + this.overlays$ = this.store.select((state: ApplicationState) => state.layersState.overlays); + this.categoriesGroups$ = this.store.select((state: ApplicationState) => state.layersState.categoriesGroups); + this.routes$ = this.store.select((state: ApplicationState) => state.routes.present); } public closeSidebar() { diff --git a/IsraelHiking.Web/src/application/components/sidebar/publicpoi/public-poi-sidebar.component.html b/IsraelHiking.Web/src/application/components/sidebar/publicpoi/public-poi-sidebar.component.html index e3aaf73ee..84055cfd3 100644 --- a/IsraelHiking.Web/src/application/components/sidebar/publicpoi/public-poi-sidebar.component.html +++ b/IsraelHiking.Web/src/application/components/sidebar/publicpoi/public-poi-sidebar.component.html @@ -1,4 +1,4 @@ -