feat: universal link provider
This commit is contained in:
+46
-12
@@ -9,17 +9,7 @@ import {
|
||||
|
||||
const APP_SCHEME = appJson?.expo?.scheme || "musicland";
|
||||
const APP_SCHEME_BASE = `${APP_SCHEME}://app`;
|
||||
|
||||
const defaultPayload = {
|
||||
heading: musiclandShareHeading,
|
||||
url: musiclandShareUrl,
|
||||
shareTitle: "MusicLand",
|
||||
shareMessage: musiclandShareMessage,
|
||||
qrUrl: musiclandShareUrl,
|
||||
copyUrl: musiclandShareUrl,
|
||||
linkLabel: musiclandShareUrl,
|
||||
appLink: APP_SCHEME_BASE,
|
||||
};
|
||||
const QR_REDIRECT_PATH = "link";
|
||||
|
||||
const trimTrailingSlash = (value) =>
|
||||
typeof value === "string" ? value.replace(/\/+$/, "") : "";
|
||||
@@ -70,6 +60,46 @@ const resolveBaseShareUrl = () => {
|
||||
return musiclandShareUrl;
|
||||
};
|
||||
|
||||
const createShareQrUrl = ({ sharePath = "", fallbackUrl } = {}) => {
|
||||
const sanitizedPath = trimLeadingSlash(sharePath);
|
||||
const schemeDeepLink = createSchemeDeepLink(sanitizedPath);
|
||||
const baseUrl = trimTrailingSlash(resolveBaseShareUrl());
|
||||
|
||||
const resolvedFallback =
|
||||
fallbackUrl ||
|
||||
(baseUrl ? (sanitizedPath ? `${baseUrl}/${sanitizedPath}` : baseUrl) : "");
|
||||
|
||||
if (!baseUrl) {
|
||||
return schemeDeepLink;
|
||||
}
|
||||
|
||||
try {
|
||||
const redirectUrl = new URL(`${baseUrl}/${QR_REDIRECT_PATH}`);
|
||||
redirectUrl.searchParams.set("scheme", schemeDeepLink);
|
||||
if (resolvedFallback) {
|
||||
redirectUrl.searchParams.set("fallback", resolvedFallback);
|
||||
}
|
||||
return redirectUrl.toString();
|
||||
} catch (error) {
|
||||
console.error("share.qr.url.create.error", error);
|
||||
return schemeDeepLink;
|
||||
}
|
||||
};
|
||||
|
||||
const defaultPayload = {
|
||||
heading: musiclandShareHeading,
|
||||
url: musiclandShareUrl,
|
||||
shareTitle: "MusicLand",
|
||||
shareMessage: musiclandShareMessage,
|
||||
qrUrl: createShareQrUrl({
|
||||
sharePath: "",
|
||||
fallbackUrl: musiclandShareUrl,
|
||||
}),
|
||||
copyUrl: musiclandShareUrl,
|
||||
linkLabel: musiclandShareUrl,
|
||||
appLink: APP_SCHEME_BASE,
|
||||
};
|
||||
|
||||
export const createMusicSharePayload = ({ projectId, title, artist } = {}) => {
|
||||
if (!projectId) return null;
|
||||
|
||||
@@ -79,6 +109,10 @@ export const createMusicSharePayload = ({ projectId, title, artist } = {}) => {
|
||||
const sharePath = `music/${encodedProjectId}`;
|
||||
const shareUrl = `${baseUrl}/${sharePath}`;
|
||||
const schemeDeepLink = createSchemeDeepLink(sharePath);
|
||||
const qrUrl = createShareQrUrl({
|
||||
sharePath,
|
||||
fallbackUrl: shareUrl,
|
||||
});
|
||||
|
||||
let shareMessage = musiclandShareMessage;
|
||||
if (title) {
|
||||
@@ -94,7 +128,7 @@ export const createMusicSharePayload = ({ projectId, title, artist } = {}) => {
|
||||
shareTitle: title ? `${title} - MusicLand` : "MusicLand",
|
||||
shareMessage,
|
||||
url: shareUrl,
|
||||
qrUrl: shareUrl,
|
||||
qrUrl,
|
||||
copyUrl: shareUrl,
|
||||
linkLabel: shareUrl,
|
||||
appLink: schemeDeepLink,
|
||||
|
||||
Reference in New Issue
Block a user