From 098d6f9bb1fd26f2d192db497992ab95b258ce55 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sun, 27 Feb 2022 01:52:55 +0100 Subject: feat: Location bar actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The buttons and the text field in the location bar shall now affect the BrowserView of the loaded service. Some error handling is still needed, e.g., when loading a web page fails due to a DNS error. Signed-off-by: Kristóf Marussy --- .../electron/impl/ElectronServiceView.ts | 12 +++++ packages/main/src/infrastructure/electron/types.ts | 4 ++ packages/main/src/stores/MainStore.ts | 21 ++++++-- packages/main/src/stores/Service.ts | 60 +++++++++++++++++++++- 4 files changed, 93 insertions(+), 4 deletions(-) (limited to 'packages/main') diff --git a/packages/main/src/infrastructure/electron/impl/ElectronServiceView.ts b/packages/main/src/infrastructure/electron/impl/ElectronServiceView.ts index 6ff8e21..e5fdf11 100644 --- a/packages/main/src/infrastructure/electron/impl/ElectronServiceView.ts +++ b/packages/main/src/infrastructure/electron/impl/ElectronServiceView.ts @@ -105,6 +105,18 @@ export default class ElectronServiceView implements ServiceView { this.browserView.webContents.goForward(); } + reload(ignoreCache: boolean): void { + if (ignoreCache) { + this.browserView.webContents.reloadIgnoringCache(); + } else { + this.browserView.webContents.reload(); + } + } + + stop(): void { + this.browserView.webContents.stop(); + } + setBounds(bounds: BrowserViewBounds): void { this.browserView.setBounds(bounds); } diff --git a/packages/main/src/infrastructure/electron/types.ts b/packages/main/src/infrastructure/electron/types.ts index 9f03214..63974ce 100644 --- a/packages/main/src/infrastructure/electron/types.ts +++ b/packages/main/src/infrastructure/electron/types.ts @@ -61,6 +61,10 @@ export interface ServiceView { goForward(): void; + reload(ignoreCache: boolean): void; + + stop(): void; + setBounds(bounds: BrowserViewBounds): void; dispose(): void; diff --git a/packages/main/src/stores/MainStore.ts b/packages/main/src/stores/MainStore.ts index cb4f4c9..bf351d7 100644 --- a/packages/main/src/stores/MainStore.ts +++ b/packages/main/src/stores/MainStore.ts @@ -74,9 +74,6 @@ const MainStore = types }, dispatch(action: Action): void { switch (action.action) { - case 'reload-all-services': - // TODO - break; case 'set-browser-view-bounds': this.setBrowserViewBounds(action.browserViewBounds); break; @@ -89,6 +86,24 @@ const MainStore = types case 'set-show-location-bar': self.settings.setShowLocationBar(action.showLocationBar); break; + case 'reload-all-services': + // TODO + break; + case 'dispatch-service-action': { + const { serviceId, serviceAction } = action; + const service = self.shared.servicesById.get(serviceId); + if (service === undefined) { + log.error( + 'No such service', + serviceId, + 'to dispatch action', + serviceAction, + ); + } else { + service.dispatch(serviceAction); + } + break; + } default: log.error('Unknown action to dispatch', action); break; diff --git a/packages/main/src/stores/Service.ts b/packages/main/src/stores/Service.ts index abef7c2..cbd8662 100644 --- a/packages/main/src/stores/Service.ts +++ b/packages/main/src/stores/Service.ts @@ -19,14 +19,17 @@ */ import type { UnreadCount } from '@sophie/service-shared'; -import { defineServiceModel } from '@sophie/shared'; +import { defineServiceModel, ServiceAction } from '@sophie/shared'; import { Instance, getSnapshot } from 'mobx-state-tree'; import type { ServiceView } from '../infrastructure/electron/types'; +import { getLogger } from '../utils/log'; import ServiceSettings from './ServiceSettings'; import type ServiceConfig from './config/ServiceConfig'; +const log = getLogger('Service'); + const Service = defineServiceModel(ServiceSettings) .views((self) => ({ get config(): ServiceConfig { @@ -87,6 +90,61 @@ const Service = defineServiceModel(ServiceSettings) setServiceView(serviceView: ServiceView | undefined): void { self.serviceView = serviceView; }, + goBack(): void { + self.serviceView?.goBack(); + }, + goForward(): void { + self.serviceView?.goForward(); + }, + reload(ignoreCache = false): void { + if (self.serviceView === undefined) { + this.startedLoading(); + } else { + self.serviceView?.reload(ignoreCache); + } + }, + stop(): void { + self.serviceView?.stop(); + }, + go(url: string): void { + if (self.serviceView === undefined) { + self.currentUrl = url; + this.startedLoading(); + } else { + self.serviceView?.loadURL(url).catch((error) => { + log.warn('Error while loading', url, error); + this.crashed(); + }); + } + }, + goHome(): void { + this.go(self.settings.url); + }, + dispatch(action: ServiceAction): void { + switch (action.action) { + case 'back': + this.goBack(); + break; + case 'forward': + this.goForward(); + break; + case 'reload': + this.reload(action.ignoreCache); + break; + case 'stop': + this.stop(); + break; + case 'go-home': + this.goHome(); + break; + case 'go': + this.go(action.url); + break; + default: + log.error('Unknown action to dispatch', action); + break; + } + }, })); /* -- cgit v1.2.3-54-g00ecf