@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
81 lines • 12.9 kB
JavaScript
import { Component, EventEmitter, Output, Input, Inject, } from '@angular/core';
import { TAP_BLE_SCANNER } from '../../../injection-types';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@ionic/angular";
export class TapScannerWebBluetoothComponent {
scanner;
onProtocolSelected = new EventEmitter();
showScanButton = true;
isScanning = false;
isLoadingDevice = false;
error;
deviceSubscription;
errorSubscription;
constructor(scanner) {
this.scanner = scanner;
}
async ngOnInit() {
// if (!await this.platform.isBluetoothAvailable()) {
// this.errorBleUnavailable = new Error("Bluetooth is not available with your browser");
// }
this.deviceSubscription = this.scanner.results.subscribe({
next: async (bluetoothDevices) => {
const bluetoothDevice = bluetoothDevices[0];
this.onProtocolSelected.emit({
meta: {
type: 'ble',
info: {
webBluetooth: bluetoothDevice,
id: bluetoothDevice.id,
name: bluetoothDevice.name,
},
},
});
this.isScanning = false;
},
error: (error) => {
this.onError(error);
},
complete: () => {
this.isScanning = false;
},
});
// this.errorSubscription = this.scanner.errors$().subscribe({
// next: (err) => {
// this.onError(err);
// }
// });
}
ngOnDestroy() {
this.deviceSubscription?.unsubscribe();
this.errorSubscription?.unsubscribe();
}
async startScan() {
this.isScanning = true;
this.error = undefined;
await this.scanner.start();
// .catch((err) => {
// this.onError(err);
// });
}
onError(error) {
this.isScanning = false;
console.warn(error);
this.error = error;
}
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapScannerWebBluetoothComponent, deps: [{ token: TAP_BLE_SCANNER }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TapScannerWebBluetoothComponent, selector: "tap-scanner-web-bluetooth", inputs: { showScanButton: "showScanButton" }, outputs: { onProtocolSelected: "onProtocolSelected" }, ngImport: i0, template: "<div class=\"ion-progress-bar-slot\">\n @if (isScanning || isLoadingDevice) {\n <ion-progress-bar type=\"indeterminate\"></ion-progress-bar>\n }\n</div>\n\n<ion-grid class=\"center-form\" *ngIf=\"showScanButton\">\n <ion-row>\n <ion-col>\n <form>\n <ion-button\n (click)=\"startScan()\"\n [disabled]=\"isScanning\"\n color=\"primary\"\n expand=\"block\"\n size=\"large\"\n >\n <ion-icon name=\"bluetooth\"></ion-icon>\n Scan\n </ion-button>\n <!--<ion-button (click)=\"stopScan()\" *ngIf=\"isScanning\" color=\"danger\" expand=\"block\" size=\"large\">Stop</ion-button>-->\n </form>\n </ion-col>\n </ion-row>\n</ion-grid>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i2.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonProgressBar, selector: "ion-progress-bar", inputs: ["buffer", "color", "mode", "reversed", "type", "value"] }, { kind: "component", type: i2.IonRow, selector: "ion-row" }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapScannerWebBluetoothComponent, decorators: [{
type: Component,
args: [{ selector: 'tap-scanner-web-bluetooth', template: "<div class=\"ion-progress-bar-slot\">\n @if (isScanning || isLoadingDevice) {\n <ion-progress-bar type=\"indeterminate\"></ion-progress-bar>\n }\n</div>\n\n<ion-grid class=\"center-form\" *ngIf=\"showScanButton\">\n <ion-row>\n <ion-col>\n <form>\n <ion-button\n (click)=\"startScan()\"\n [disabled]=\"isScanning\"\n color=\"primary\"\n expand=\"block\"\n size=\"large\"\n >\n <ion-icon name=\"bluetooth\"></ion-icon>\n Scan\n </ion-button>\n <!--<ion-button (click)=\"stopScan()\" *ngIf=\"isScanning\" color=\"danger\" expand=\"block\" size=\"large\">Stop</ion-button>-->\n </form>\n </ion-col>\n </ion-row>\n</ion-grid>\n" }]
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: [TAP_BLE_SCANNER]
}] }], propDecorators: { onProtocolSelected: [{
type: Output
}], showScanButton: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLXNjYW5uZXItd2ViLWJsdWV0b290aC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvc3JjL2xpYi90YXAtc2Nhbm5lci90YXAtc2Nhbm5lci13ZWItYmx1ZXRvb3RoL3RhcC1zY2FubmVyLXdlYi1ibHVldG9vdGguY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW90aXplLWlvbmljL3NyYy9saWIvdGFwLXNjYW5uZXIvdGFwLXNjYW5uZXItd2ViLWJsdWV0b290aC90YXAtc2Nhbm5lci13ZWItYmx1ZXRvb3RoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7OztBQVEzRCxNQUFNLE9BQU8sK0JBQStCO0lBWUU7SUFYbEMsa0JBQWtCLEdBQzFCLElBQUksWUFBWSxFQUFFLENBQUM7SUFFWixjQUFjLEdBQUcsSUFBSSxDQUFDO0lBRS9CLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN4QixLQUFLLENBQVM7SUFDZCxrQkFBa0IsQ0FBZ0I7SUFDbEMsaUJBQWlCLENBQWdCO0lBRWpDLFlBQTRDLE9BQTJCO1FBQTNCLFlBQU8sR0FBUCxPQUFPLENBQW9CO0lBQUcsQ0FBQztJQUUzRSxLQUFLLENBQUMsUUFBUTtRQUNaLHFEQUFxRDtRQUNyRCwwRkFBMEY7UUFDMUYsSUFBSTtRQUNKLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDdkQsSUFBSSxFQUFFLEtBQUssRUFBRSxnQkFBdUIsRUFBRSxFQUFFO2dCQUN0QyxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztvQkFDM0IsSUFBSSxFQUFFO3dCQUNKLElBQUksRUFBRSxLQUFLO3dCQUNYLElBQUksRUFBRTs0QkFDSixZQUFZLEVBQUUsZUFBZTs0QkFDN0IsRUFBRSxFQUFFLGVBQWUsQ0FBQyxFQUFFOzRCQUN0QixJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUk7eUJBQzNCO3FCQUNGO2lCQUNGLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUMxQixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixDQUFDO1lBQ0QsUUFBUSxFQUFFLEdBQUcsRUFBRTtnQkFDYixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUMxQixDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsOERBQThEO1FBQzlELHFCQUFxQjtRQUNyQix5QkFBeUI7UUFDekIsTUFBTTtRQUNOLE1BQU07SUFDUixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTO1FBQ2IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDdkIsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLG9CQUFvQjtRQUNwQix1QkFBdUI7UUFDdkIsTUFBTTtJQUNSLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBWTtRQUNsQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7MkhBbEVVLCtCQUErQixrQkFZdEIsZUFBZTsrR0FaeEIsK0JBQStCLHNLQ25CNUMsaXVCQXlCQTs7NEZETmEsK0JBQStCO2tCQUwzQyxTQUFTOytCQUNFLDJCQUEyQjs7MEJBZ0J4QixNQUFNOzJCQUFDLGVBQWU7eUNBWHpCLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFHRSxjQUFjO3NCQUF0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT3V0cHV0LFxuICBJbnB1dCxcbiAgSW5qZWN0LFxuICBPbkRlc3Ryb3ksXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQcm90b2NvbFNlbGVjdGVkRXZlbnQgfSBmcm9tICcuLi9hcGknO1xuaW1wb3J0IHsgVEFQX0JMRV9TQ0FOTkVSIH0gZnJvbSAnLi4vLi4vLi4vaW5qZWN0aW9uLXR5cGVzJztcbmltcG9ydCB7IERldmljZVNjYW5uZXIgfSBmcm9tICdAaW90aXplL3RhcC9zY2FubmVyL2FwaSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RhcC1zY2FubmVyLXdlYi1ibHVldG9vdGgnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFwLXNjYW5uZXItd2ViLWJsdWV0b290aC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhcC1zY2FubmVyLXdlYi1ibHVldG9vdGguY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFwU2Nhbm5lcldlYkJsdWV0b290aENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQE91dHB1dCgpIG9uUHJvdG9jb2xTZWxlY3RlZDogRXZlbnRFbWl0dGVyPFByb3RvY29sU2VsZWN0ZWRFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASW5wdXQoKSBzaG93U2NhbkJ1dHRvbiA9IHRydWU7XG5cbiAgaXNTY2FubmluZyA9IGZhbHNlO1xuICBpc0xvYWRpbmdEZXZpY2UgPSBmYWxzZTtcbiAgZXJyb3I/OiBFcnJvcjtcbiAgZGV2aWNlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBlcnJvclN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFRBUF9CTEVfU0NBTk5FUikgcHVibGljIHNjYW5uZXI6IERldmljZVNjYW5uZXI8YW55Pikge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICAvLyBpZiAoIWF3YWl0IHRoaXMucGxhdGZvcm0uaXNCbHVldG9vdGhBdmFpbGFibGUoKSkge1xuICAgIC8vICAgdGhpcy5lcnJvckJsZVVuYXZhaWxhYmxlID0gbmV3IEVycm9yKFwiQmx1ZXRvb3RoIGlzIG5vdCBhdmFpbGFibGUgd2l0aCB5b3VyIGJyb3dzZXJcIik7XG4gICAgLy8gfVxuICAgIHRoaXMuZGV2aWNlU3Vic2NyaXB0aW9uID0gdGhpcy5zY2FubmVyLnJlc3VsdHMuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IGFzeW5jIChibHVldG9vdGhEZXZpY2VzOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCBibHVldG9vdGhEZXZpY2UgPSBibHVldG9vdGhEZXZpY2VzWzBdO1xuICAgICAgICB0aGlzLm9uUHJvdG9jb2xTZWxlY3RlZC5lbWl0KHtcbiAgICAgICAgICBtZXRhOiB7XG4gICAgICAgICAgICB0eXBlOiAnYmxlJyxcbiAgICAgICAgICAgIGluZm86IHtcbiAgICAgICAgICAgICAgd2ViQmx1ZXRvb3RoOiBibHVldG9vdGhEZXZpY2UsXG4gICAgICAgICAgICAgIGlkOiBibHVldG9vdGhEZXZpY2UuaWQsXG4gICAgICAgICAgICAgIG5hbWU6IGJsdWV0b290aERldmljZS5uYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pc1NjYW5uaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSxcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNTY2FubmluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHRoaXMuZXJyb3JTdWJzY3JpcHRpb24gPSB0aGlzLnNjYW5uZXIuZXJyb3JzJCgpLnN1YnNjcmliZSh7XG4gICAgLy8gICBuZXh0OiAoZXJyKSA9PiB7XG4gICAgLy8gICAgIHRoaXMub25FcnJvcihlcnIpO1xuICAgIC8vICAgfVxuICAgIC8vIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXZpY2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5lcnJvclN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0U2NhbigpIHtcbiAgICB0aGlzLmlzU2Nhbm5pbmcgPSB0cnVlO1xuICAgIHRoaXMuZXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgYXdhaXQgdGhpcy5zY2FubmVyLnN0YXJ0KCk7XG4gICAgLy8gLmNhdGNoKChlcnIpID0+IHtcbiAgICAvLyAgIHRoaXMub25FcnJvcihlcnIpO1xuICAgIC8vIH0pO1xuICB9XG5cbiAgb25FcnJvcihlcnJvcjogRXJyb3IpIHtcbiAgICB0aGlzLmlzU2Nhbm5pbmcgPSBmYWxzZTtcbiAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImlvbi1wcm9ncmVzcy1iYXItc2xvdFwiPlxuICBAaWYgKGlzU2Nhbm5pbmcgfHwgaXNMb2FkaW5nRGV2aWNlKSB7XG4gIDxpb24tcHJvZ3Jlc3MtYmFyIHR5cGU9XCJpbmRldGVybWluYXRlXCI+PC9pb24tcHJvZ3Jlc3MtYmFyPlxuICB9XG48L2Rpdj5cblxuPGlvbi1ncmlkIGNsYXNzPVwiY2VudGVyLWZvcm1cIiAqbmdJZj1cInNob3dTY2FuQnV0dG9uXCI+XG4gIDxpb24tcm93PlxuICAgIDxpb24tY29sPlxuICAgICAgPGZvcm0+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cInN0YXJ0U2NhbigpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTY2FubmluZ1wiXG4gICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICBleHBhbmQ9XCJibG9ja1wiXG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiYmx1ZXRvb3RoXCI+PC9pb24taWNvbj5cbiAgICAgICAgICBTY2FuXG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPCEtLTxpb24tYnV0dG9uIChjbGljayk9XCJzdG9wU2NhbigpXCIgKm5nSWY9XCJpc1NjYW5uaW5nXCIgY29sb3I9XCJkYW5nZXJcIiBleHBhbmQ9XCJibG9ja1wiIHNpemU9XCJsYXJnZVwiPlN0b3A8L2lvbi1idXR0b24+LS0+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9pb24tY29sPlxuICA8L2lvbi1yb3c+XG48L2lvbi1ncmlkPlxuIl19