aboutsummaryrefslogtreecommitdiffstats
path: root/packages/main
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2022-02-27 01:52:55 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2022-03-06 18:56:47 +0100
commit098d6f9bb1fd26f2d192db497992ab95b258ce55 (patch)
tree22905f87e6ad53032b6ff39bb3af274df2f6287c /packages/main
parentrefactor: Shared model type factories (diff)
downloadsophie-098d6f9bb1fd26f2d192db497992ab95b258ce55.tar.gz
sophie-098d6f9bb1fd26f2d192db497992ab95b258ce55.tar.zst
sophie-098d6f9bb1fd26f2d192db497992ab95b258ce55.zip
feat: Location bar actions
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 <kristof@marussy.com>
Diffstat (limited to 'packages/main')
-rw-r--r--packages/main/src/infrastructure/electron/impl/ElectronServiceView.ts12
-rw-r--r--packages/main/src/infrastructure/electron/types.ts4
-rw-r--r--packages/main/src/stores/MainStore.ts21
-rw-r--r--packages/main/src/stores/Service.ts60
4 files changed, 93 insertions, 4 deletions
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 {
105 this.browserView.webContents.goForward(); 105 this.browserView.webContents.goForward();
106 } 106 }
107 107
108 reload(ignoreCache: boolean): void {
109 if (ignoreCache) {
110 this.browserView.webContents.reloadIgnoringCache();
111 } else {
112 this.browserView.webContents.reload();
113 }
114 }
115
116 stop(): void {
117 this.browserView.webContents.stop();
118 }
119
108 setBounds(bounds: BrowserViewBounds): void { 120 setBounds(bounds: BrowserViewBounds): void {
109 this.browserView.setBounds(bounds); 121 this.browserView.setBounds(bounds);
110 } 122 }
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 {
61 61
62 goForward(): void; 62 goForward(): void;
63 63
64 reload(ignoreCache: boolean): void;
65
66 stop(): void;
67
64 setBounds(bounds: BrowserViewBounds): void; 68 setBounds(bounds: BrowserViewBounds): void;
65 69
66 dispose(): void; 70 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
74 }, 74 },
75 dispatch(action: Action): void { 75 dispatch(action: Action): void {
76 switch (action.action) { 76 switch (action.action) {
77 case 'reload-all-services':
78 // TODO
79 break;
80 case 'set-browser-view-bounds': 77 case 'set-browser-view-bounds':
81 this.setBrowserViewBounds(action.browserViewBounds); 78 this.setBrowserViewBounds(action.browserViewBounds);
82 break; 79 break;
@@ -89,6 +86,24 @@ const MainStore = types
89 case 'set-show-location-bar': 86 case 'set-show-location-bar':
90 self.settings.setShowLocationBar(action.showLocationBar); 87 self.settings.setShowLocationBar(action.showLocationBar);
91 break; 88 break;
89 case 'reload-all-services':
90 // TODO
91 break;
92 case 'dispatch-service-action': {
93 const { serviceId, serviceAction } = action;
94 const service = self.shared.servicesById.get(serviceId);
95 if (service === undefined) {
96 log.error(
97 'No such service',
98 serviceId,
99 'to dispatch action',
100 serviceAction,
101 );
102 } else {
103 service.dispatch(serviceAction);
104 }
105 break;
106 }
92 default: 107 default:
93 log.error('Unknown action to dispatch', action); 108 log.error('Unknown action to dispatch', action);
94 break; 109 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 @@
19 */ 19 */
20 20
21import type { UnreadCount } from '@sophie/service-shared'; 21import type { UnreadCount } from '@sophie/service-shared';
22import { defineServiceModel } from '@sophie/shared'; 22import { defineServiceModel, ServiceAction } from '@sophie/shared';
23import { Instance, getSnapshot } from 'mobx-state-tree'; 23import { Instance, getSnapshot } from 'mobx-state-tree';
24 24
25import type { ServiceView } from '../infrastructure/electron/types'; 25import type { ServiceView } from '../infrastructure/electron/types';
26import { getLogger } from '../utils/log';
26 27
27import ServiceSettings from './ServiceSettings'; 28import ServiceSettings from './ServiceSettings';
28import type ServiceConfig from './config/ServiceConfig'; 29import type ServiceConfig from './config/ServiceConfig';
29 30
31const log = getLogger('Service');
32
30const Service = defineServiceModel(ServiceSettings) 33const Service = defineServiceModel(ServiceSettings)
31 .views((self) => ({ 34 .views((self) => ({
32 get config(): ServiceConfig { 35 get config(): ServiceConfig {
@@ -87,6 +90,61 @@ const Service = defineServiceModel(ServiceSettings)
87 setServiceView(serviceView: ServiceView | undefined): void { 90 setServiceView(serviceView: ServiceView | undefined): void {
88 self.serviceView = serviceView; 91 self.serviceView = serviceView;
89 }, 92 },
93 goBack(): void {
94 self.serviceView?.goBack();
95 },
96 goForward(): void {
97 self.serviceView?.goForward();
98 },
99 reload(ignoreCache = false): void {
100 if (self.serviceView === undefined) {
101 this.startedLoading();
102 } else {
103 self.serviceView?.reload(ignoreCache);
104 }
105 },
106 stop(): void {
107 self.serviceView?.stop();
108 },
109 go(url: string): void {
110 if (self.serviceView === undefined) {
111 self.currentUrl = url;
112 this.startedLoading();
113 } else {
114 self.serviceView?.loadURL(url).catch((error) => {
115 log.warn('Error while loading', url, error);
116 this.crashed();
117 });
118 }
119 },
120 goHome(): void {
121 this.go(self.settings.url);
122 },
123 dispatch(action: ServiceAction): void {
124 switch (action.action) {
125 case 'back':
126 this.goBack();
127 break;
128 case 'forward':
129 this.goForward();
130 break;
131 case 'reload':
132 this.reload(action.ignoreCache);
133 break;
134 case 'stop':
135 this.stop();
136 break;
137 case 'go-home':
138 this.goHome();
139 break;
140 case 'go':
141 this.go(action.url);
142 break;
143 default:
144 log.error('Unknown action to dispatch', action);
145 break;
146 }
147 },
90 })); 148 }));
91 149
92/* 150/*