Files
musicland/src/providers/UniversalLinkProvider.js
T
2025-09-30 13:37:12 +02:00

110 lines
3.0 KiB
JavaScript

import { useContext, useState, useEffect } from "reactn";
import * as Linking from "expo-linking";
import { UserDataContext } from "./UserDataProvider";
import { isWeb } from "../hooks/useLayoutType";
import { navigateToTask } from "../navigation/NavigationService";
import { SplashAnimationContext } from "./SplashAnimationProvider";
const appJson = require("../../app.json");
export const storeURL = {
apple: "apps.apple.com/app/id1661696886",
google: "play.google.com/store/apps",
};
const UniversalLinkProvider = ({ children }) => {
const { currentUID } = useContext(UserDataContext);
const { isFullyLoaded } = useContext(SplashAnimationContext);
const [tempTaskData, setTempTaskData] = useState(null);
useEffect(() => {
const handleDeepLink = async (event) => {
// console.log("event", event);
const { path = "", queryParams } = Linking.parse(event.url);
// console.log("path", path);
// console.log("queryParams", queryParams);
const appSchemeURL = `${
appJson.expo.scheme
}://app/${path}?${new URLSearchParams(queryParams).toString()}`;
const appStoreURL = `itms-apps://${storeURL.apple}`;
if (isWeb) {
const userAgent =
navigator.userAgent || navigator.vendor || window.opera;
const isIOSBrowser =
/iPad|iPhone|iPod/.test(userAgent) ||
(/Macintosh/.test(userAgent) &&
navigator.maxTouchPoints &&
navigator.maxTouchPoints > 2);
if (isIOSBrowser) {
try {
const canOpen = await Linking.canOpenURL(appSchemeURL);
if (canOpen) {
window.location.href = appSchemeURL;
} else {
window.location.href = appStoreURL;
}
} catch (error) {
console.error("Redirection error:", error);
handleParams(path);
}
} else {
handleParams(path);
}
} else {
handleParams(path);
}
};
const initDeepLinkHandling = async () => {
const initialUrl = await Linking.getInitialURL();
if (initialUrl) {
// console.log("Initial URL:", initialUrl);
handleDeepLink({ url: initialUrl });
}
Linking.addEventListener("url", handleDeepLink);
return () => {
Linking.removeEventListener("url", handleDeepLink);
};
};
initDeepLinkHandling();
}, []);
useEffect(() => {
if (tempTaskData && currentUID && isFullyLoaded) {
// console.log("try to navigate to task");
navigateToTask(tempTaskData);
setTempTaskData(null);
}
}, [tempTaskData, currentUID, isFullyLoaded]);
const handleParams = (path) => {
// console.log("path", path);
cleanURL();
};
const cleanURL = () => {
if (isWeb) {
const url = new URL(window.location);
// console.log(url);
url.search = "";
window.history.replaceState({}, document.title, url.origin.toString());
}
};
return children;
};
export default UniversalLinkProvider;