From abbd6ec9beda5e682fc71b6d70bc179f5fc5d355 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 1 Oct 2025 04:53:56 +0000 Subject: [PATCH] update --- src/shared/utils/start-payload.ts | 85 +++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/shared/utils/start-payload.ts diff --git a/src/shared/utils/start-payload.ts b/src/shared/utils/start-payload.ts new file mode 100644 index 0000000..4e7627b --- /dev/null +++ b/src/shared/utils/start-payload.ts @@ -0,0 +1,85 @@ +export const START_PARAM_SEPARATOR = '!'; +const REF_STORAGE_KEY = 'ref_id'; + +type StartPayload = { + contentId: string | null; + referralId: string | null; +}; + +const safeSessionStorage = (): Storage | null => { + if (typeof window === 'undefined') { + return null; + } + try { + return window.sessionStorage; + } catch (error) { + return null; + } +}; + +export const resolveStartPayload = (): StartPayload => { + if (typeof window === 'undefined') { + return { contentId: null, referralId: null }; + } + + const searchParams = new URLSearchParams(window.location.search); + const telegramApp = (window as any)?.Telegram?.WebApp; + const rawStartParam = telegramApp?.initDataUnsafe?.start_param ?? null; + + let contentId: string | null = null; + let referralId: string | null = null; + + const parsePayload = (payload: string | null) => { + if (!payload) { + return; + } + const [contentPart, refPart] = payload.split(START_PARAM_SEPARATOR, 2); + if (contentPart) { + contentId = contentPart; + } + if (refPart) { + referralId = refPart; + } + }; + + parsePayload(rawStartParam); + + if (!contentId) { + const queryContent = + searchParams.get('content') || + searchParams.get('cid') || + searchParams.get('start_param'); + if (queryContent) { + contentId = queryContent; + } + } + + if (!referralId) { + const queryRef = searchParams.get('ref') || searchParams.get('ref_id'); + if (queryRef) { + referralId = queryRef; + } + } + + const storage = safeSessionStorage(); + if (storage) { + if (referralId) { + storage.setItem(REF_STORAGE_KEY, referralId); + } else { + const stored = storage.getItem(REF_STORAGE_KEY); + if (stored) { + referralId = stored; + } + } + } + + return { contentId, referralId }; +}; + +export const appendReferral = >(payload: T): T => { + const { referralId } = resolveStartPayload(); + if (referralId && !payload.ref_id) { + return { ...payload, ref_id: referralId } as T; + } + return payload; +};