Newer
Older
gnexus-tasks / frontend / src / components / GamifyBridge.vue
<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 } 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.13): при каждой загрузке приложения спрашиваем
// бэк — он начисляет 50 монет только раз в сутки, повторные входы молчат
onMounted(async () => {
  try {
    const res = await api.claimDaily()
    notifyDaily(res.granted, res.coins)
  } catch {
    // нет сети/сессии — награда не критична, тихо пропускаем
  }
})
</script>

<template />