110 lines
3.0 KiB
JavaScript
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;
|