import { Observable, Subject } from 'rxjs'; import { NativeService, WindowState, NotificationRequest, WindowIdle, UpdateInfo, UpdateCheckConfig, NotificationType, NativePathName, NativeType } from '@ucap-webmessenger/native'; import { HttpClient } from '@angular/common/http'; import { map, share, take } from 'rxjs/operators'; import { TranslateLoader } from '@ngx-translate/core'; import { TranslateLoaderService } from '../translate/browser-loader'; import { NotificationService } from '../notification/notification.service'; import { Injectable } from '@angular/core'; import { FileUtil, StatusCode } from '@ucap-webmessenger/core'; @Injectable({ providedIn: 'root' }) export class BrowserNativeService extends NativeService { private notificationService: NotificationService; private chatOpenRoomSubject: Subject | null = null; private chatOpenRoom$: Observable | null = null; private msgOpenMessageSubject: Subject | null = null; private msgOpenMessage$: Observable | null = null; type(): NativeType { return NativeType.Browser; } postAppInit(): void { this.notificationService.requestPermission(); } logout(): Observable { return new Observable(subscriber => { try { } catch (error) { subscriber.error(error); } finally { subscriber.complete(); } }); } changeStatus(): Observable { return new Observable(subscriber => { try { } catch (error) { subscriber.error(error); } finally { subscriber.complete(); } }); } showSetting(): Observable { return new Observable(subscriber => { try { } catch (error) { subscriber.error(error); } finally { subscriber.complete(); } }); } getNetworkInfo(): Promise { return new Promise((resolve, reject) => { resolve([{ ip: 'Browser', mac: 'browser' }]); }); } changeAutoLaunch(autoLaunch: boolean): Promise { return new Promise((resolve, reject) => { resolve(true); }); } changeStartupHideWindow(startupHideWindow: boolean): Promise { return new Promise((resolve, reject) => { resolve(true); }); } changeDownloadPath(downloadPath: string): Promise { return new Promise((resolve, reject) => { resolve(downloadPath); }); } notify(noti: NotificationRequest): void { this.notificationService.notify(noti, () => { window.focus(); if (noti.type === NotificationType.Event) { this.chatOpenRoomSubject.next(noti.seq); } else if (noti.type === NotificationType.Message) { this.msgOpenMessageSubject.next(noti.seq); } }); } closeAllNotify(): void {} checkForUpdates(currentVersion: string): Promise { return new Promise((resolve, reject) => { resolve(false); }); } checkForInstantUpdates(config: UpdateCheckConfig): Observable { return new Observable(subscriber => { try { } catch (error) { subscriber.error(error); } finally { subscriber.complete(); } }); } applyInstantUpdates(): void {} showImageViewer(): void {} readFile(path: string): Promise { return new Promise((resolve, reject) => { this.httpClient .get(path, { responseType: 'arraybuffer' }) .pipe(take(1)) .subscribe(arraybuffer => { resolve(Buffer.from(arraybuffer)); }); }); } saveFile( buffer: Buffer, fileName: string, mimeType: string, path?: string ): Promise { return new Promise((resolve, reject) => { try { FileUtil.save(buffer, fileName, mimeType).then(fn => { resolve(fn); }); } catch (error) { reject(error); } }); } openDefaultDownloadFolder(): Promise { return new Promise((resolve, reject) => { resolve(true); }); } openTargetFolder(folderPath?: string, make?: boolean): Promise { return new Promise((resolve, reject) => { resolve(true); }); } openTargetItem(filePath?: string): Promise { return new Promise((resolve, reject) => { resolve(true); }); } getPath(name: NativePathName): Promise { return new Promise((resolve, reject) => { resolve(''); }); } selectDirectory(): Promise { return new Promise((resolve, reject) => { resolve(''); }); } selectSaveFilePath(defaultPath?: string): Promise { return new Promise((resolve, reject) => { resolve(''); }); } executeProcess(executableName: string): Promise { return new Promise((resolve, reject) => { resolve(-1); }); } windowStateChanged(): Observable { return new Observable(subscriber => { try { subscriber.next(WindowState.Normal); } catch (error) { subscriber.error(error); } finally { subscriber.complete(); } }); } windowClose(): void {} windowMinimize(): void {} windowMaximize(): void {} idleStateChanged(): Observable { return new Observable(subscriber => { try { } catch (error) { subscriber.error(error); } finally { subscriber.complete(); } }); } changeLimitOfIdleState(limitTime: number): void {} chatOpenRoom(): Observable { if (!this.chatOpenRoomSubject) { this.chatOpenRoomSubject = new Subject(); this.chatOpenRoom$ = this.chatOpenRoomSubject .asObservable() .pipe(share()); } return this.chatOpenRoom$; } msgOpenMessage(): Observable { if (!this.msgOpenMessageSubject) { this.msgOpenMessageSubject = new Subject(); this.msgOpenMessage$ = this.msgOpenMessageSubject .asObservable() .pipe(share()); } return this.msgOpenMessage$; } getTranslateLoader(prefix?: string, suffix?: string): TranslateLoader { return new TranslateLoaderService(this, prefix, suffix); } openDefaultBrowser(url: string): void { open(url); } constructor(private httpClient: HttpClient) { super(); this.notificationService = new NotificationService(); } }