129 lines
2.9 KiB
JavaScript
129 lines
2.9 KiB
JavaScript
|
|
// Утилиты для работы с Telegram Web App
|
|||
|
|
|
|||
|
|
let tg = null
|
|||
|
|
|
|||
|
|
export const initTelegramApp = () => {
|
|||
|
|
if (typeof window !== 'undefined' && window.Telegram?.WebApp) {
|
|||
|
|
tg = window.Telegram.WebApp
|
|||
|
|
tg.ready()
|
|||
|
|
tg.expand()
|
|||
|
|
|
|||
|
|
// Установить цвета темы
|
|||
|
|
tg.setHeaderColor('#F2F3F5')
|
|||
|
|
tg.setBackgroundColor('#F2F3F5')
|
|||
|
|
|
|||
|
|
return tg
|
|||
|
|
}
|
|||
|
|
return null
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export const getTelegramApp = () => {
|
|||
|
|
return tg || window.Telegram?.WebApp
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export const getTelegramUser = () => {
|
|||
|
|
const app = getTelegramApp()
|
|||
|
|
return app?.initDataUnsafe?.user || null
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export const getTelegramInitData = () => {
|
|||
|
|
const app = getTelegramApp()
|
|||
|
|
return app?.initData || ''
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export const showAlert = (message) => {
|
|||
|
|
const app = getTelegramApp()
|
|||
|
|
if (app) {
|
|||
|
|
app.showAlert(message)
|
|||
|
|
} else {
|
|||
|
|
alert(message)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export const showConfirm = (message) => {
|
|||
|
|
const app = getTelegramApp()
|
|||
|
|
return new Promise((resolve) => {
|
|||
|
|
if (app) {
|
|||
|
|
app.showConfirm(message, resolve)
|
|||
|
|
} else {
|
|||
|
|
resolve(confirm(message))
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export const showPopup = (params) => {
|
|||
|
|
const app = getTelegramApp()
|
|||
|
|
return new Promise((resolve) => {
|
|||
|
|
if (app) {
|
|||
|
|
app.showPopup(params, resolve)
|
|||
|
|
} else {
|
|||
|
|
alert(params.message)
|
|||
|
|
resolve()
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export const openTelegramLink = (url) => {
|
|||
|
|
const app = getTelegramApp()
|
|||
|
|
if (app) {
|
|||
|
|
app.openTelegramLink(url)
|
|||
|
|
} else {
|
|||
|
|
window.open(url, '_blank')
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export const openLink = (url) => {
|
|||
|
|
const app = getTelegramApp()
|
|||
|
|
if (app) {
|
|||
|
|
app.openLink(url)
|
|||
|
|
} else {
|
|||
|
|
window.open(url, '_blank')
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export const hapticFeedback = (type = 'light') => {
|
|||
|
|
const app = getTelegramApp()
|
|||
|
|
if (app?.HapticFeedback) {
|
|||
|
|
switch (type) {
|
|||
|
|
case 'light':
|
|||
|
|
app.HapticFeedback.impactOccurred('light')
|
|||
|
|
break
|
|||
|
|
case 'medium':
|
|||
|
|
app.HapticFeedback.impactOccurred('medium')
|
|||
|
|
break
|
|||
|
|
case 'heavy':
|
|||
|
|
app.HapticFeedback.impactOccurred('heavy')
|
|||
|
|
break
|
|||
|
|
case 'success':
|
|||
|
|
app.HapticFeedback.notificationOccurred('success')
|
|||
|
|
break
|
|||
|
|
case 'warning':
|
|||
|
|
app.HapticFeedback.notificationOccurred('warning')
|
|||
|
|
break
|
|||
|
|
case 'error':
|
|||
|
|
app.HapticFeedback.notificationOccurred('error')
|
|||
|
|
break
|
|||
|
|
default:
|
|||
|
|
app.HapticFeedback.impactOccurred('light')
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Для разработки: мок данные если не в Telegram
|
|||
|
|
export const getMockUser = () => {
|
|||
|
|
// Генерируем случайные данные для тестирования
|
|||
|
|
const randomId = Math.floor(Math.random() * 1000000000)
|
|||
|
|
return {
|
|||
|
|
id: randomId,
|
|||
|
|
first_name: 'Dev',
|
|||
|
|
last_name: 'User',
|
|||
|
|
username: `dev_user_${randomId}`,
|
|||
|
|
photo_url: `https://api.dicebear.com/7.x/avataaars/svg?seed=${randomId}` // Генератор аватаров
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export const isDevelopment = () => {
|
|||
|
|
return !window.Telegram?.WebApp?.initDataUnsafe?.user
|
|||
|
|
}
|
|||
|
|
|