aboutsummaryrefslogtreecommitdiffstats
path: root/packages/main/src/stores/Service.ts
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2022-02-28 01:13:06 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2022-03-06 18:56:49 +0100
commit2a5f7e3fecc98debea2b3408662d402a1e1681a0 (patch)
tree39b363cd8453007a8b6537e01813e0c8e61fe46c /packages/main/src/stores/Service.ts
parentfix(service-preload): Browser view canvas background (diff)
downloadsophie-2a5f7e3fecc98debea2b3408662d402a1e1681a0.tar.gz
sophie-2a5f7e3fecc98debea2b3408662d402a1e1681a0.tar.zst
sophie-2a5f7e3fecc98debea2b3408662d402a1e1681a0.zip
feat: Handle service load failures
Adds a "failed" state for services where the BrowserView and WebContents should be left around to keep history and allow people to navigate back. Access to the browser history otherwise doesn't seem possible (see https://github.com/electron/electron/issues/26727 and https://github.com/electron/electron/issues/7186), so destroying BrowserView and managing our own history is not possible. Also keep https://github.com/electron/electron/issues/24113 in mind. Signed-off-by: Kristóf Marussy <kristof@marussy.com>
Diffstat (limited to 'packages/main/src/stores/Service.ts')
-rw-r--r--packages/main/src/stores/Service.ts31
1 files changed, 17 insertions, 14 deletions
diff --git a/packages/main/src/stores/Service.ts b/packages/main/src/stores/Service.ts
index cbd8662..d98e52e 100644
--- a/packages/main/src/stores/Service.ts
+++ b/packages/main/src/stores/Service.ts
@@ -40,7 +40,10 @@ const Service = defineServiceModel(ServiceSettings)
40 return self.currentUrl ?? self.settings.url; 40 return self.currentUrl ?? self.settings.url;
41 }, 41 },
42 get shouldBeLoaded(): boolean { 42 get shouldBeLoaded(): boolean {
43 return self.state !== 'crashed'; 43 return !self.crashed;
44 },
45 get shouldBeVisible(): boolean {
46 return this.shouldBeLoaded && !self.failed;
44 }, 47 },
45 })) 48 }))
46 .volatile( 49 .volatile(
@@ -67,17 +70,20 @@ const Service = defineServiceModel(ServiceSettings)
67 setTitle(title: string): void { 70 setTitle(title: string): void {
68 self.title = title; 71 self.title = title;
69 }, 72 },
70 startedLoading(): void { 73 startLoading(): void {
71 self.state = 'loading'; 74 self.state = { type: 'loading' };
72 }, 75 },
73 finishedLoading(): void { 76 finishLoading(): void {
74 if (self.state === 'loading') { 77 if (self.loading) {
75 // Do not overwrite crashed state if the service haven't been reloaded yet. 78 // Do not overwrite crashed state if the service haven't been reloaded yet.
76 self.state = 'loaded'; 79 self.state = { type: 'loaded' };
77 } 80 }
78 }, 81 },
79 crashed(): void { 82 setFailed(errorCode: number, errorDesc: string): void {
80 self.state = 'crashed'; 83 self.state = { type: 'failed', errorCode, errorDesc };
84 },
85 setCrashed(reason: string, exitCode: number): void {
86 self.state = { type: 'crashed', reason, exitCode };
81 }, 87 },
82 setUnreadCount({ direct, indirect }: UnreadCount): void { 88 setUnreadCount({ direct, indirect }: UnreadCount): void {
83 if (direct !== undefined) { 89 if (direct !== undefined) {
@@ -98,7 +104,7 @@ const Service = defineServiceModel(ServiceSettings)
98 }, 104 },
99 reload(ignoreCache = false): void { 105 reload(ignoreCache = false): void {
100 if (self.serviceView === undefined) { 106 if (self.serviceView === undefined) {
101 this.startedLoading(); 107 self.state = { type: 'initializing' };
102 } else { 108 } else {
103 self.serviceView?.reload(ignoreCache); 109 self.serviceView?.reload(ignoreCache);
104 } 110 }
@@ -109,12 +115,9 @@ const Service = defineServiceModel(ServiceSettings)
109 go(url: string): void { 115 go(url: string): void {
110 if (self.serviceView === undefined) { 116 if (self.serviceView === undefined) {
111 self.currentUrl = url; 117 self.currentUrl = url;
112 this.startedLoading(); 118 self.state = { type: 'initializing' };
113 } else { 119 } else {
114 self.serviceView?.loadURL(url).catch((error) => { 120 self.serviceView?.loadURL(url);
115 log.warn('Error while loading', url, error);
116 this.crashed();
117 });
118 } 121 }
119 }, 122 },
120 goHome(): void { 123 goHome(): void {