From 6270bf4505fa4303ebb6deec528610ce96002cfd Mon Sep 17 00:00:00 2001 From: Evan Simkowitz Date: Thu, 17 Oct 2024 15:56:23 -0700 Subject: [PATCH 1/4] Add helpview callback to resolve failed webview loads --- frontend/app/view/helpview/helpview.tsx | 30 ++++++++++++++++--------- frontend/app/view/webview/webview.tsx | 7 +++++- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/frontend/app/view/helpview/helpview.tsx b/frontend/app/view/helpview/helpview.tsx index b7f0e61460..22e9d8b451 100644 --- a/frontend/app/view/helpview/helpview.tsx +++ b/frontend/app/view/helpview/helpview.tsx @@ -6,7 +6,7 @@ import { WebView, WebViewModel } from "@/app/view/webview/webview"; import { NodeModel } from "@/layout/index"; import { fireAndForget } from "@/util/util"; import { atom, useAtomValue } from "jotai"; -import { useEffect } from "react"; +import { useCallback } from "react"; import "./helpview.less"; class HelpViewModel extends WebViewModel { @@ -48,25 +48,35 @@ function makeHelpViewModel(blockId: string, nodeModel: NodeModel) { return new HelpViewModel(blockId, nodeModel); } +const baseUrlRegex = /http:\/\/(?:[^:\/])+(?::\d+)?/; + function HelpView({ model }: { model: HelpViewModel }) { const homepageUrl = useAtomValue(model.homepageUrl); - const url = useAtomValue(model.url); // Effect to update the docsite base url when the app restarts, since the webserver port is dynamic - useEffect( - () => + const onFailLoad = useCallback( + (url: string) => fireAndForget(async () => { - const curDocsiteUrl = getApi().getDocsiteUrl(); - if (curDocsiteUrl !== homepageUrl) { - await model.setHomepageUrl(curDocsiteUrl, "block"); - model.loadUrl(url.replace(homepageUrl, curDocsiteUrl), "new-base-url"); + const newDocsiteUrl = getApi().getDocsiteUrl(); + + // Correct the homepage URL, if necessary + if (newDocsiteUrl !== homepageUrl) { + await model.setHomepageUrl(newDocsiteUrl, "block"); + } + + // Correct the base URL of the current page, if necessary + const newBaseUrl = baseUrlRegex.exec(newDocsiteUrl)?.[0]; + const curBaseUrl = baseUrlRegex.exec(url)?.[0]; + console.log("fix-docsite-url", url, newDocsiteUrl, homepageUrl, curBaseUrl, newBaseUrl); + if (curBaseUrl && newBaseUrl && curBaseUrl !== newBaseUrl) { + model.loadUrl(url.replace(curBaseUrl, newBaseUrl), "fix-fail-load"); } }), - [] + [homepageUrl] ); return (
- +
); } diff --git a/frontend/app/view/webview/webview.tsx b/frontend/app/view/webview/webview.tsx index ed3cb33e22..caa345e4df 100644 --- a/frontend/app/view/webview/webview.tsx +++ b/frontend/app/view/webview/webview.tsx @@ -468,9 +468,10 @@ function makeWebViewModel(blockId: string, nodeModel: NodeModel): WebViewModel { interface WebViewProps { blockId: string; model: WebViewModel; + onFailLoad?: (url: string) => void; } -const WebView = memo(({ model }: WebViewProps) => { +const WebView = memo(({ model, onFailLoad }: WebViewProps) => { const blockData = useAtomValue(model.blockAtom); const defaultUrl = useAtomValue(model.homepageUrl); const defaultSearchAtom = getSettingsKeyAtom("web:defaultsearch"); @@ -555,6 +556,10 @@ const WebView = memo(({ model }: WebViewProps) => { console.warn("Suppressed ERR_ABORTED error", e); } else { console.error(`Failed to load ${e.validatedURL}: ${e.errorDescription}`); + if (onFailLoad) { + const curUrl = model.webviewRef?.current.getURL(); + onFailLoad(curUrl); + } } }; const webviewFocus = () => { From 59cd6f19117002ccfc22d52a73dc1e48a4f71c1a Mon Sep 17 00:00:00 2001 From: Evan Simkowitz Date: Thu, 17 Oct 2024 15:59:00 -0700 Subject: [PATCH 2/4] remove unnecessary regex group constructors --- frontend/app/view/helpview/helpview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/app/view/helpview/helpview.tsx b/frontend/app/view/helpview/helpview.tsx index 22e9d8b451..089b5fd136 100644 --- a/frontend/app/view/helpview/helpview.tsx +++ b/frontend/app/view/helpview/helpview.tsx @@ -48,7 +48,7 @@ function makeHelpViewModel(blockId: string, nodeModel: NodeModel) { return new HelpViewModel(blockId, nodeModel); } -const baseUrlRegex = /http:\/\/(?:[^:\/])+(?::\d+)?/; +const baseUrlRegex = /http:\/\/([^:\/])+(:\d+)?/; function HelpView({ model }: { model: HelpViewModel }) { const homepageUrl = useAtomValue(model.homepageUrl); From 3955fe09cb73630d0f21d80568153a938f7eb37a Mon Sep 17 00:00:00 2001 From: Evan Simkowitz Date: Thu, 17 Oct 2024 16:00:10 -0700 Subject: [PATCH 3/4] add https handle --- frontend/app/view/helpview/helpview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/app/view/helpview/helpview.tsx b/frontend/app/view/helpview/helpview.tsx index 089b5fd136..71be6b6725 100644 --- a/frontend/app/view/helpview/helpview.tsx +++ b/frontend/app/view/helpview/helpview.tsx @@ -48,7 +48,7 @@ function makeHelpViewModel(blockId: string, nodeModel: NodeModel) { return new HelpViewModel(blockId, nodeModel); } -const baseUrlRegex = /http:\/\/([^:\/])+(:\d+)?/; +const baseUrlRegex = /http(s)?:\/\/([^:\/])+(:\d+)?/; function HelpView({ model }: { model: HelpViewModel }) { const homepageUrl = useAtomValue(model.homepageUrl); From 04693012e9159ce831c8078f93f7d5c5d3d6df83 Mon Sep 17 00:00:00 2001 From: Evan Simkowitz Date: Thu, 17 Oct 2024 16:02:55 -0700 Subject: [PATCH 4/4] don't use group for s --- frontend/app/view/helpview/helpview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/app/view/helpview/helpview.tsx b/frontend/app/view/helpview/helpview.tsx index 71be6b6725..5f45c45b76 100644 --- a/frontend/app/view/helpview/helpview.tsx +++ b/frontend/app/view/helpview/helpview.tsx @@ -48,7 +48,7 @@ function makeHelpViewModel(blockId: string, nodeModel: NodeModel) { return new HelpViewModel(blockId, nodeModel); } -const baseUrlRegex = /http(s)?:\/\/([^:\/])+(:\d+)?/; +const baseUrlRegex = /http[s]?:\/\/([^:\/])+(:\d+)?/; function HelpView({ model }: { model: HelpViewModel }) { const homepageUrl = useAtomValue(model.homepageUrl);