bridge.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. (function () {
  2. 'use strict';
  3. var invoke = window.__TAURI__.core.invoke;
  4. var listen = window.__TAURI__.event.listen;
  5. // ── Rust → JS ──────────────────────────────
  6. listen('pet://state', function (e) {
  7. if (window.cfcPetAPI) window.cfcPetAPI.notifyState(e.payload);
  8. });
  9. listen('pet://bubble', function (e) {
  10. if (window.cfcPetAPI) window.cfcPetAPI.showBubble(e.payload.text, e.payload.durationMs);
  11. });
  12. listen('pet://config', function (e) {
  13. if (window.cfcPetAPI) window.cfcPetAPI.loadConfig(e.payload);
  14. });
  15. listen('pet://custom-image', function (e) {
  16. if (window.cfcPetAPI) window.cfcPetAPI.setCustomImage(e.payload && e.payload.url);
  17. });
  18. // 启动时应用已保存的自定义形象
  19. try {
  20. invoke('get_settings').then(function (s) {
  21. if (s && s.customMascotUrl && window.cfcPetAPI) {
  22. window.cfcPetAPI.setCustomImage(s.customMascotUrl);
  23. }
  24. }).catch(function () {});
  25. } catch (_) { /* noop */ }
  26. // ── JS → Rust(替换 chrome.webview.hostObjects.sync.cfcHost)──
  27. window.cfcHost = {
  28. onInteract: function (action, dataJson) {
  29. try {
  30. invoke('on_interact', { action: action, data: dataJson });
  31. } catch (err) {
  32. console.log('[interaction]', action, dataJson);
  33. }
  34. },
  35. onDragStart: function () {
  36. try { invoke('drag_start'); } catch (e) { /* noop */ }
  37. },
  38. onDragEnd: function () {
  39. try { invoke('drag_end'); } catch (e) { /* noop */ }
  40. }
  41. };
  42. })();