feat: deeplink & vercel

This commit is contained in:
2025-11-04 17:08:59 +01:00
parent 673199ff87
commit ffaccd71a7
8 changed files with 246 additions and 16 deletions
+49 -1
View File
@@ -1,22 +1,65 @@
import { SheetManager } from "react-native-actions-sheet";
import appJson from "../../app.json";
import {
musiclandShareHeading,
musiclandShareMessage,
musiclandShareUrl,
} from "../data";
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 trimTrailingSlash = (value) =>
typeof value === "string" ? value.replace(/\/+$/, "") : "";
const trimLeadingSlash = (value) =>
typeof value === "string" ? value.replace(/^\/+/, "") : "";
const buildQueryString = (params = {}) => {
const entries = Object.entries(params).filter(
([, value]) => value !== undefined && value !== null && value !== ""
);
if (!entries.length) {
return "";
}
const searchParams = new URLSearchParams();
entries.forEach(([key, value]) => {
if (Array.isArray(value)) {
value.forEach((item) => {
searchParams.append(key, `${item}`);
});
} else {
searchParams.append(key, `${value}`);
}
});
const query = searchParams.toString();
return query ? `?${query}` : "";
};
const createSchemeDeepLink = (path = "", params = {}) => {
const sanitizedPath = trimLeadingSlash(path);
const basePath = sanitizedPath
? `${APP_SCHEME_BASE}/${sanitizedPath}`
: APP_SCHEME_BASE;
return `${basePath}${buildQueryString(params)}`;
};
const resolveBaseShareUrl = () => {
if (typeof window !== "undefined" && window.location?.origin) {
const origin = window.location.origin;
@@ -32,7 +75,10 @@ export const createMusicSharePayload = ({ projectId, title, artist } = {}) => {
const baseUrl = trimTrailingSlash(resolveBaseShareUrl());
if (!baseUrl) return null;
const shareUrl = `${baseUrl}/music/${projectId}`;
const encodedProjectId = encodeURIComponent(projectId);
const sharePath = `music/${encodedProjectId}`;
const shareUrl = `${baseUrl}/${sharePath}`;
const schemeDeepLink = createSchemeDeepLink(sharePath);
let shareMessage = musiclandShareMessage;
if (title) {
@@ -49,7 +95,9 @@ export const createMusicSharePayload = ({ projectId, title, artist } = {}) => {
shareMessage,
url: shareUrl,
qrUrl: shareUrl,
copyUrl: shareUrl,
linkLabel: shareUrl,
appLink: schemeDeepLink,
};
};