feedback-engine.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /**
  2. * 即时多巴胺反馈触发引擎
  3. * 判定何时触发什么反馈,协调 Toast/Milestone 组件
  4. */
  5. import { getRandomText, getIcon, getSound, formatText } from './feedback-presets.js'
  6. // 存储外部注册的回调
  7. var _toastCallback = null
  8. var _celebrationCallback = null
  9. /**
  10. * 注册反馈组件回调
  11. * @param {Function} toastFn - 接收 {text, icon, sound} 触发 Toast
  12. * @param {Function} celebrationFn - 接收 {title, subtitle} 触发全屏庆祝
  13. */
  14. function registerCallbacks(toastFn, celebrationFn) {
  15. _toastCallback = toastFn
  16. _celebrationCallback = celebrationFn
  17. }
  18. /**
  19. * 触发即时反馈(L1)
  20. * @param {string} scene - 场景编码: micro_action/checkin/exercise/sleep/water/milestone_7/first_use/comeback
  21. * @param {Object} vars - 模板变量,如 {minutes: 20}
  22. */
  23. function trigger(scene, vars) {
  24. var text = getRandomText(scene)
  25. var icon = getIcon(scene)
  26. var sound = getSound(scene)
  27. var formatted = formatText(text, vars)
  28. // 判断是否为里程碑(需要全屏庆祝)
  29. if (scene && scene.indexOf('milestone_') === 0) {
  30. var days = scene.replace('milestone_', '')
  31. var titles = {
  32. '3': '连续3天!',
  33. '7': '连续一周!',
  34. '14': '连续14天!',
  35. '21': '连续21天!',
  36. '30': '连续一个月!'
  37. }
  38. if (_celebrationCallback) {
  39. _celebrationCallback({
  40. title: titles[days] || '里程碑达成!',
  41. subtitle: formatted
  42. })
  43. }
  44. } else {
  45. // 普通反馈:Toast
  46. if (_toastCallback) {
  47. _toastCallback({
  48. text: formatted,
  49. icon: icon,
  50. sound: sound
  51. })
  52. }
  53. }
  54. }
  55. export { registerCallbacks, trigger }