feat: universal link provider

This commit is contained in:
2025-11-05 09:56:26 +01:00
parent ffaccd71a7
commit 91818e58ec
4 changed files with 152 additions and 110 deletions
+46 -12
View File
@@ -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,