diff --git a/src/pages/redirect-page.tsx b/src/pages/redirect-page.tsx
index 50b4ce0d..c5e0d78b 100644
--- a/src/pages/redirect-page.tsx
+++ b/src/pages/redirect-page.tsx
@@ -9,6 +9,7 @@ import { getUiComponentLogger, uiLogger } from '../lib/logger.js'
import { tellSwToReloadConfig } from '../lib/sw-comms.js'
import { translateIpfsRedirectUrl } from '../lib/translate-ipfs-redirect-url.js'
import './default-page-styles.css'
+import LoadingIndicator from "../components/loading-indicator.jsx"
const uiComponentLogger = getUiComponentLogger('redirect-page')
const log = uiLogger.forComponent('redirect-page')
@@ -25,9 +26,10 @@ const ConfigIframe: React.FC = () => {
iframeSrc = url.href
} else {
- const portString = window.location.port === '' ? '' : `:${window.location.port}`
- iframeSrc = `${window.location.protocol}//${parentDomain}${portString}/#/ipfs-sw-config@origin=${encodeURIComponent(window.location.origin)}`
- }
+
+ const portString = window.location.port === '' ? '' : `:${window.location.port}`
+ iframeSrc = `${window.location.protocol}//${parentDomain}${portString}/#/ipfs-sw-config@origin=${encodeURIComponent(window.location.origin)}`
+ }
const [isVisible, setIsVisible] = useState(false)
@@ -39,78 +41,167 @@ const ConfigIframe: React.FC = () => {
}, [isServiceWorkerRegistered])
return (
-
-
+
+
)
}
-function RedirectPage ({ showConfigIframe = true }: { showConfigIframe?: boolean }): ReactElement {
+function RedirectPage({
+ showConfigIframe = true,
+}: {
+ showConfigIframe?: boolean
+}): ReactElement {
const { isServiceWorkerRegistered } = useContext(ServiceWorkerContext)
- const [reloadUrl, setReloadUrl] = useState(translateIpfsRedirectUrl(window.location.href).href)
+ const [reloadUrl, setReloadUrl] = useState(
+ translateIpfsRedirectUrl(window.location.href).href
+ )
const [isLoadingContent, setIsLoadingContent] = useState(false)
const [isConfigLoading, setIsConfigLoading] = useState(true)
useEffect(() => {
if (isConfigPage(window.location.hash)) {
- setReloadUrl(window.location.href.replace('#/ipfs-sw-config', ''))
+ setReloadUrl(window.location.href.replace("#/ipfs-sw-config", ""))
}
- async function doWork (config: ConfigDb): Promise
{
+ async function doWork(config: ConfigDb): Promise {
try {
await setConfig(config, uiComponentLogger)
await tellSwToReloadConfig()
- log.trace('redirect-page: RELOAD_CONFIG_SUCCESS on %s', window.location.origin)
+ log.trace(
+ "redirect-page: RELOAD_CONFIG_SUCCESS on %s",
+ window.location.origin
+ )
setIsConfigLoading(false)
} catch (err) {
- log.error('redirect-page: error setting config on subdomain', err)
+ log.error("redirect-page: error setting config on subdomain", err)
}
}
const listener = (event: MessageEvent): void => {
- if (event.data?.source === 'helia-sw-config-iframe') {
- log.trace('redirect-page: received RELOAD_CONFIG message from iframe', event.data)
+ if (event.data?.source === "helia-sw-config-iframe") {
+ log.trace(
+ "redirect-page: received RELOAD_CONFIG message from iframe",
+ event.data
+ )
const config = event.data?.config
if (config != null) {
void doWork(config as ConfigDb)
} else {
- log.error('redirect-page: received RELOAD_CONFIG message from iframe, but no config', event.data)
+ log.error(
+ "redirect-page: received RELOAD_CONFIG message from iframe, but no config",
+ event.data
+ )
}
}
}
- window.addEventListener('message', listener)
+ window.addEventListener("message", listener)
return () => {
- window.removeEventListener('message', listener)
+ window.removeEventListener("message", listener)
}
}, [])
const displayString: string = useMemo(() => {
if (!isServiceWorkerRegistered) {
- return 'Registering Helia service worker...'
+ return "Setting up Helia service worker to handle IPFS content..."
}
if (!isConfigPage(window.location.hash)) {
- return 'Redirecting you.'
+ return "Preparing to load your IPFS content..."
+ }
+ if (isConfigLoading) {
+ return "Configuring Helia service worker..."
}
- return 'Loading...'
- }, [isServiceWorkerRegistered])
+ return "Almost there! Loading your content..."
+ }, [isServiceWorkerRegistered, isConfigLoading])
const loadContent = useCallback(() => {
- setIsLoadingContent(true)
- window.location.href = reloadUrl
- }, [reloadUrl])
+ if (!isLoadingContent) {
+ setIsLoadingContent(true)
+ // Use replace instead of href to prevent back button issues
+ window.location.replace(reloadUrl)
+ }
+ }, [reloadUrl, isLoadingContent])
+ // Handle initial redirect when service worker is ready
useEffect(() => {
- if (isServiceWorkerRegistered && !isConfigPage(window.location.hash) && !isLoadingContent && !isConfigLoading) {
- loadContent()
+ if (
+ isServiceWorkerRegistered &&
+ !isConfigPage(window.location.hash) &&
+ !isLoadingContent &&
+ !isConfigLoading
+ ) {
+ void loadContent()
}
- }, [isServiceWorkerRegistered, isConfigLoading, isLoadingContent])
+ }, [
+ isServiceWorkerRegistered,
+ isConfigLoading,
+ isLoadingContent,
+ loadContent,
+ ])
+
+ // Handle redirect after config is loaded
+ useEffect(() => {
+ if (!isConfigLoading && !isLoadingContent && isServiceWorkerRegistered) {
+ void loadContent()
+ }
+ }, [
+ isConfigLoading,
+ isLoadingContent,
+ isServiceWorkerRegistered,
+ loadContent,
+ ])
+
+ // Force redirect if we're stuck
+ useEffect(() => {
+ const timeout = setTimeout(() => {
+ if (!isLoadingContent && isServiceWorkerRegistered) {
+ void loadContent()
+ }
+ }, 2000) // 2 second timeout
+
+ return () => clearTimeout(timeout)
+ }, [isLoadingContent, isServiceWorkerRegistered, loadContent])
return (
<>
-
-
-
{displayString}
+
+
+
+
+ {displayString}
+
{showConfigIframe &&
}