Skip to content

Commit

Permalink
fix: handle linking
Browse files Browse the repository at this point in the history
  • Loading branch information
reneaaron committed Sep 26, 2024
1 parent 2099ae0 commit 877e7d9
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 43 deletions.
103 changes: 63 additions & 40 deletions hooks/useHandleLinking.ts
Original file line number Diff line number Diff line change
@@ -1,58 +1,81 @@
import { StackActions } from "@react-navigation/native";
import * as Linking from "expo-linking";
import { getInitialURL } from "expo-linking";
import { router, useNavigationContainerRef } from "expo-router";
import { useEffect } from "react";
import { router, useRootNavigationState } from "expo-router";
import { useEffect, useCallback, useRef } from "react";

// TESTING: ["lightning:", "bitcoin:", "alby:", "exp:"]
const SUPPORTED_SCHEMES = ["lightning", "bitcoin", "alby", "exp"];

export function useHandleLinking() {
const rootNavigation = useNavigationContainerRef();
const navigationState = useRootNavigationState();
const pendingLinkRef = useRef<string | null>(null);

useEffect(() => {
getInitialURL().then((url) => handleLink(url ?? ""));
const subscription = Linking.addEventListener(
"url",
(event: { url: string }) => handleLink(event.url),
);
return () => subscription.remove();
}, []);
const handleLink = useCallback(
(url: string) => {
if (!url) return;

function handleLink(url: string) {
if (!url) return;
const { hostname, path, queryParams, scheme } = Linking.parse(url);

const { hostname, path, queryParams, scheme } = Linking.parse(url);
if (!scheme) return;

if (!scheme) return;
if (SUPPORTED_SCHEMES.indexOf(scheme) > -1) {
let fullUrl = scheme === "exp" ? path : `${scheme}:${hostname}`;

if (SUPPORTED_SCHEMES.indexOf(scheme) > -1) {
let fullUrl = scheme === "exp" ? path : `${scheme}:${hostname}`;
// Add query parameters to the URL if they exist
if (queryParams && Object.keys(queryParams).length > 0) {
const queryString = new URLSearchParams(
queryParams as Record<string, string>,
).toString();
fullUrl += `?${queryString}`;
}

// Add query parameters to the URL if they exist
if (queryParams && Object.keys(queryParams).length > 0) {
const queryString = new URLSearchParams(
queryParams as Record<string, string>,
).toString();
fullUrl += `?${queryString}`;
if (router.canDismiss()) {
router.dismissAll();
}
router.push({
pathname: "/send",
params: {
url: fullUrl,
},
});
return;
}

// Remove all items from the navigation stack
rootNavigation.dispatch(StackActions.popToTop());

router.push({
pathname: "/send",
params: {
url: fullUrl,
},
// Redirect the user to the home screen
// if no match was found
router.replace({
pathname: "/",
});
return;
}
},
[navigationState?.key],
);

useEffect(() => {
const processInitialURL = async () => {
const url = await getInitialURL();
if (url) pendingLinkRef.current = url;
};

// Redirect the user to the home screen
// if no match was found
router.replace({
pathname: "/",
});
}
processInitialURL();

const subscription = Linking.addEventListener(
"url",
(event: { url: string }) => {
if (navigationState?.key) {
handleLink(event.url);
} else {
pendingLinkRef.current = event.url;
}
},
);

return () => subscription.remove();
}, [handleLink]);

useEffect(() => {
if (navigationState?.key && pendingLinkRef.current) {
handleLink(pendingLinkRef.current);
pendingLinkRef.current = null;
}
}, [navigationState?.key, handleLink]);
}
11 changes: 8 additions & 3 deletions pages/Wildcard.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
import { Stack, usePathname } from "expo-router";
import { router, Stack, useFocusEffect, usePathname } from "expo-router";
import { View } from "react-native";
import Loading from "~/components/Loading";
import { Text } from "~/components/ui/text";
import { useHandleLinking } from "~/hooks/useHandleLinking";

export function Wildcard() {
const pathname = usePathname();
useHandleLinking();

// Should a user ever land on this page, redirect them to home
useFocusEffect(() => {
router.replace({
pathname: "/"
});
});

return (
<View className="flex-1 justify-center items-center flex flex-col gap-3">
Expand Down

0 comments on commit 877e7d9

Please sign in to comment.