Files
web-frontend/app/composables/useTelegramMiniApp.ts
2026-04-04 14:21:31 +07:00

62 lines
1.4 KiB
TypeScript

type TelegramMiniAppUser = {
id: number | string;
first_name?: string;
last_name?: string;
username?: string;
language_code?: string;
photo_url?: string;
};
type TelegramWebApp = {
initData?: string;
initDataUnsafe?: {
user?: TelegramMiniAppUser;
start_param?: string;
};
ready?: () => void;
expand?: () => void;
};
declare global {
interface Window {
Telegram?: {
WebApp?: TelegramWebApp;
};
}
}
function buildDisplayName(user: TelegramMiniAppUser | null) {
if (!user) {
return '';
}
const firstName = String(user.first_name || '').trim();
const lastName = String(user.last_name || '').trim();
return `${firstName} ${lastName}`.trim() || firstName || String(user.username || '').trim();
}
export function useTelegramMiniApp() {
const webApp = computed<TelegramWebApp | null>(() => {
if (!import.meta.client) {
return null;
}
return window.Telegram?.WebApp ?? null;
});
const initData = computed(() => String(webApp.value?.initData || '').trim());
const user = computed<TelegramMiniAppUser | null>(() => webApp.value?.initDataUnsafe?.user ?? null);
const startParam = computed(() => String(webApp.value?.initDataUnsafe?.start_param || '').trim());
const isAvailable = computed(() => Boolean(initData.value));
const displayName = computed(() => buildDisplayName(user.value));
return {
webApp,
initData,
user,
startParam,
isAvailable,
displayName,
};
}