Browse Source

refactor(iot-hub): fetch device package zip inside install dialog

Move the zip fetch from IotHubActionsService into TbDeviceInstallDialogComponent.ngOnInit so the dialog opens immediately and shows its own loading spinner instead of blocking the caller. Drops the now-unused fetchZipData helper and zipData field from DeviceInstallDialogData.
pull/15787/head
Igor Kulikov 4 months ago
parent
commit
71182fea38
  1. 4
      ui-ngx/src/app/modules/home/components/iot-hub/device-install-dialog/device-install-dialog.component.html
  2. 7
      ui-ngx/src/app/modules/home/components/iot-hub/device-install-dialog/device-install-dialog.component.ts
  3. 22
      ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-actions.service.ts

4
ui-ngx/src/app/modules/home/components/iot-hub/device-install-dialog/device-install-dialog.component.html

@ -164,8 +164,8 @@
<!-- Main dialog --> <!-- Main dialog -->
@if (loading) { @if (loading) {
<div class="flex items-center justify-center py-12"> <div class="flex h-full items-center justify-center py-12">
<mat-spinner diameter="40"></mat-spinner> <mat-spinner diameter="60"></mat-spinner>
</div> </div>
} @else { } @else {
<div class="tb-device-install-header flex items-center gap-3 py-2 pl-6 pr-2"> <div class="tb-device-install-header flex items-center gap-3 py-2 pl-6 pr-2">

7
ui-ngx/src/app/modules/home/components/iot-hub/device-install-dialog/device-install-dialog.component.ts

@ -53,10 +53,10 @@ import {
InstallStepType, InstallStepType,
stepTypeAliasMap stepTypeAliasMap
} from '@shared/models/iot-hub/device-package.models'; } from '@shared/models/iot-hub/device-package.models';
import { mergeMap } from 'rxjs/operators';
export interface DeviceInstallDialogData { export interface DeviceInstallDialogData {
item: MpItemVersionView; item: MpItemVersionView;
zipData: ArrayBuffer;
reviewMode?: boolean; reviewMode?: boolean;
selectedInstallMethod?: string; selectedInstallMethod?: string;
installState?: Record<string, any>; installState?: Record<string, any>;
@ -138,8 +138,11 @@ export class TbDeviceInstallDialogComponent extends DialogComponent<TbDeviceInst
async ngOnInit(): Promise<void> { async ngOnInit(): Promise<void> {
try { try {
const zipData = await firstValueFrom(this.iotHubApiService.getVersionFileData(this.data.item.id, { ignoreLoading: true }).pipe(
mergeMap((blob: Blob) => blob.arrayBuffer())
));
const JSZip = (await import('jszip')).default; const JSZip = (await import('jszip')).default;
const zip = await JSZip.loadAsync(this.data.zipData); const zip = await JSZip.loadAsync(zipData);
const imageExtensions = new Set(['png', 'jpg', 'jpeg', 'gif', 'svg']); const imageExtensions = new Set(['png', 'jpg', 'jpeg', 'gif', 'svg']);
for (const [path, entry] of Object.entries(zip.files) as [string, any][]) { for (const [path, entry] of Object.entries(zip.files) as [string, any][]) {
if (!entry.dir) { if (!entry.dir) {

22
ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-actions.service.ts

@ -129,34 +129,24 @@ export class IotHubActionsService {
} }
installDevice(item: MpItemVersionView): Observable<string> { installDevice(item: MpItemVersionView): Observable<string> {
return this.fetchZipData(item).pipe( return this.openDeviceInstallDialog(item);
mergeMap((zipData: ArrayBuffer) => this.openDeviceInstallDialog(item, zipData))
);
} }
reviewDevice(item: MpItemVersionView, deviceDescriptor: DeviceInstalledItemDescriptor): Observable<any> { reviewDevice(item: MpItemVersionView, deviceDescriptor: DeviceInstalledItemDescriptor): Observable<any> {
return this.fetchZipData(item).pipe( return this.openDeviceInstallDialog(item, {
mergeMap((zipData: ArrayBuffer) => this.openDeviceInstallDialog(item, zipData, {
reviewMode: true, reviewMode: true,
selectedInstallMethod: deviceDescriptor.selectedInstallMethod, selectedInstallMethod: deviceDescriptor.selectedInstallMethod,
installState: deviceDescriptor.installState installState: deviceDescriptor.installState
})) });
);
}
private fetchZipData(item: MpItemVersionView): Observable<ArrayBuffer> {
return this.iotHubApiService.getVersionFileData(item.id as string, { ignoreLoading: true }).pipe(
mergeMap((blob: Blob) => blob.arrayBuffer())
);
} }
private openDeviceInstallDialog(item: MpItemVersionView, zipData: ArrayBuffer, private openDeviceInstallDialog(item: MpItemVersionView,
options?: { reviewMode?: boolean; selectedInstallMethod?: string; installState?: any }): Observable<any> { options?: { reviewMode?: boolean; selectedInstallMethod?: string; installState?: any }): Observable<any> {
return this.dialog.open(TbDeviceInstallDialogComponent, { return this.dialog.open<TbDeviceInstallDialogComponent, DeviceInstallDialogData>(TbDeviceInstallDialogComponent, {
panelClass: ['tb-dialog', 'tb-fullscreen-dialog-lt-md'], panelClass: ['tb-dialog', 'tb-fullscreen-dialog-lt-md'],
disableClose: true, disableClose: true,
autoFocus: false, autoFocus: false,
data: { item, zipData, ...options } as DeviceInstallDialogData data: { item, ...options }
}).afterClosed(); }).afterClosed();
} }
} }

Loading…
Cancel
Save