// Telegram Mini App deep-link "start parameters", mirroring the connector's Go // scheme (platform/telegram/internal/deeplink): a one-character kind prefix plus a // value — // g open that game // i open that invitation // f<6-digit code> redeem that friend code // An empty or unrecognised parameter opens the lobby. export type DeepLink = | { kind: 'lobby' } | { kind: 'game'; id: string } | { kind: 'invitation'; id: string } | { kind: 'friendCode'; code: string }; /** parseStartParam classifies a Telegram start parameter into a routing target. */ export function parseStartParam(param: string | undefined | null): DeepLink { if (!param) return { kind: 'lobby' }; const value = param.slice(1); if (!value) return { kind: 'lobby' }; switch (param[0]) { case 'g': return { kind: 'game', id: value }; case 'i': return { kind: 'invitation', id: value }; case 'f': return { kind: 'friendCode', code: value }; default: return { kind: 'lobby' }; } } /** gameParam builds the start parameter that opens a game. */ export const gameParam = (id: string): string => 'g' + id; /** invitationParam builds the start parameter that opens an invitation. */ export const invitationParam = (id: string): string => 'i' + id; /** friendCodeParam builds the start parameter that redeems a friend code. */ export const friendCodeParam = (code: string): string => 'f' + code; /** * shareLink wraps a deep-link start parameter in a t.me Mini App link, using the * VITE_TELEGRAM_LINK base (e.g. https://t.me//). It returns null when the * base is not configured, so callers can hide the share affordance. */ export function shareLink(param: string): string | null { const base = import.meta.env.VITE_TELEGRAM_LINK as string | undefined; if (!base) return null; const sep = base.includes('?') ? '&' : '?'; return `${base}${sep}startapp=${encodeURIComponent(param)}`; }