Skip to content
32 linesCodeBlameRaw
1import { router, useLocalSearchParams } from "expo-router";
2import * as WebBrowser from "expo-web-browser";
3import { useEffect } from "react";
4
5import { Loading, Screen } from "@/components/ui";
6import { useSession } from "@/lib/session";
7import { siteUrl } from "@/lib/server";
8
9/**
10 * A link to a page the app has no screen for: it opens on the site, in
11 * the system's browser, and the app goes back to where it was.
12 */
13export default function Open() {
14 const { path } = useLocalSearchParams<{ path?: string }>();
15 const { state } = useSession();
16
17 useEffect(() => {
18 const server = state.server;
19 if (!server) return;
20 const safe = path && path.startsWith("/") ? path : "/";
21 void WebBrowser.openBrowserAsync(siteUrl(server, safe)).finally(() => {
22 if (router.canGoBack()) router.back();
23 else router.replace("/");
24 });
25 }, [path, state.server]);
26
27 return (
28 <Screen>
29 <Loading />
30 </Screen>
31 );
32}