<script setup lang="ts">
// Регистрация toast-провайдера кита для геймификации: useToast() кит требует
// вызывать внутри <GnToastProvider> — потому мостик живёт внутри провайдера,
// а не в App.vue (который провайдер только рендерит).
import { onMounted } from 'vue'
import { useToast } from 'gnexus-ui-kit/vue'
import { api } from '../api'
import {
initGamification,
notifyDaily,
notifyRemoteXp,
notifyTaskClaimed,
notifyTaskReview,
} from '../gamification'
import { onRealtime } from '../realtime'
initGamification(useToast())
// SSE-эхо начисления XP (ТЗ 3.14): своя вкладка празднует по заголовкам ответа,
// соседние вкладки показывают скромный тост (дедуп wasOwnActivity)
onRealtime('xp.changed', (e) => {
const amount = Number(e.data?.amount)
if (e.data?.celebrate) notifyRemoteXp(amount)
})
// Мандат ИИ-агента (ТЗ 3.20): агент ходит своим токеном в другой сессии, и без
// этих тостов о его работе владелец узнаёт только заглянув в список
onRealtime('task.claimed', (e) => notifyTaskClaimed(String(e.data?.claimed_by ?? '')))
onRealtime('task.review', (e) => notifyTaskReview(String(e.data?.title ?? '')))
// Дейли-награда за визит (ТЗ 3.13): при каждой загрузке приложения спрашиваем
// бэк — он начисляет 50 монет только раз в сутки, повторные входы молчат
onMounted(async () => {
try {
const res = await api.claimDaily()
notifyDaily(res.granted, res.coins)
} catch {
// нет сети/сессии — награда не критична, тихо пропускаем
}
})
</script>
<template />