@lemoncat7/dsh-partner 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -1
- package/docs/THIRD_PARTY_LICENSES.md +231 -0
- package/docs/architecture.md +23 -0
- package/lib/api/features/pendant-api.d.ts +4 -0
- package/lib/api/features/pendant-api.d.ts.map +1 -0
- package/lib/api/features/pendant-api.js +37 -0
- package/lib/api/features/pendant-api.js.map +1 -0
- package/lib/api.d.ts +2 -0
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +3 -0
- package/lib/api.js.map +1 -1
- package/lib/client-controller.d.ts +6 -1
- package/lib/client-controller.d.ts.map +1 -1
- package/lib/client-controller.js +4 -1
- package/lib/client-controller.js.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +2567 -1587
- package/lib/client.js.map +4 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +8 -2
- package/lib/index.js.map +1 -1
- package/lib/notifications/domain.d.ts +18 -0
- package/lib/notifications/domain.d.ts.map +1 -0
- package/lib/notifications/domain.js +2 -0
- package/lib/notifications/domain.js.map +1 -0
- package/lib/notifications/service.d.ts +15 -0
- package/lib/notifications/service.d.ts.map +1 -0
- package/lib/notifications/service.js +65 -0
- package/lib/notifications/service.js.map +1 -0
- package/lib/notifications/store.d.ts +14 -0
- package/lib/notifications/store.d.ts.map +1 -0
- package/lib/notifications/store.js +56 -0
- package/lib/notifications/store.js.map +1 -0
- package/lib/pendant/card-image.d.ts +6 -0
- package/lib/pendant/card-image.d.ts.map +1 -0
- package/lib/pendant/card-image.js +43 -0
- package/lib/pendant/card-image.js.map +1 -0
- package/lib/pendant/frame-loop.d.ts +18 -0
- package/lib/pendant/frame-loop.d.ts.map +1 -0
- package/lib/pendant/frame-loop.js +74 -0
- package/lib/pendant/frame-loop.js.map +1 -0
- package/lib/pendant/notice-motion.d.ts +12 -0
- package/lib/pendant/notice-motion.d.ts.map +1 -0
- package/lib/pendant/notice-motion.js +40 -0
- package/lib/pendant/notice-motion.js.map +1 -0
- package/lib/pendant/physics.d.ts +14 -0
- package/lib/pendant/physics.d.ts.map +1 -0
- package/lib/pendant/physics.js +29 -0
- package/lib/pendant/physics.js.map +1 -0
- package/lib/pendant/reader.d.ts +15 -0
- package/lib/pendant/reader.d.ts.map +1 -0
- package/lib/pendant/reader.js +37 -0
- package/lib/pendant/reader.js.map +1 -0
- package/lib/pendant/renderer.d.ts +24 -0
- package/lib/pendant/renderer.d.ts.map +1 -0
- package/lib/pendant/renderer.js +407 -0
- package/lib/pendant/renderer.js.map +1 -0
- package/lib/pendant/settings-panel.d.ts +2 -0
- package/lib/pendant/settings-panel.d.ts.map +1 -0
- package/lib/pendant/settings-panel.js +70 -0
- package/lib/pendant/settings-panel.js.map +1 -0
- package/lib/pendant/settings.d.ts +16 -0
- package/lib/pendant/settings.d.ts.map +1 -0
- package/lib/pendant/settings.js +18 -0
- package/lib/pendant/settings.js.map +1 -0
- package/lib/pendant/sheen.d.ts +11 -0
- package/lib/pendant/sheen.d.ts.map +1 -0
- package/lib/pendant/sheen.js +36 -0
- package/lib/pendant/sheen.js.map +1 -0
- package/lib/pendant/strap-geometry.d.ts +17 -0
- package/lib/pendant/strap-geometry.d.ts.map +1 -0
- package/lib/pendant/strap-geometry.js +69 -0
- package/lib/pendant/strap-geometry.js.map +1 -0
- package/lib/pendant/strap-preview.d.ts +5 -0
- package/lib/pendant/strap-preview.d.ts.map +1 -0
- package/lib/pendant/strap-preview.js +8 -0
- package/lib/pendant/strap-preview.js.map +1 -0
- package/lib/pendant/strap-style.d.ts +11 -0
- package/lib/pendant/strap-style.d.ts.map +1 -0
- package/lib/pendant/strap-style.js +13 -0
- package/lib/pendant/strap-style.js.map +1 -0
- package/lib/pendant/strap.d.ts +13 -0
- package/lib/pendant/strap.d.ts.map +1 -0
- package/lib/pendant/strap.js +73 -0
- package/lib/pendant/strap.js.map +1 -0
- package/lib/pendant/use-inbox.d.ts +9 -0
- package/lib/pendant/use-inbox.d.ts.map +1 -0
- package/lib/pendant/use-inbox.js +81 -0
- package/lib/pendant/use-inbox.js.map +1 -0
- package/lib/pendant/use-placement.d.ts +28 -0
- package/lib/pendant/use-placement.d.ts.map +1 -0
- package/lib/pendant/use-placement.js +108 -0
- package/lib/pendant/use-placement.js.map +1 -0
- package/lib/pendant/use-settings.d.ts +4 -0
- package/lib/pendant/use-settings.d.ts.map +1 -0
- package/lib/pendant/use-settings.js +44 -0
- package/lib/pendant/use-settings.js.map +1 -0
- package/lib/pendant/widget.d.ts +5 -0
- package/lib/pendant/widget.d.ts.map +1 -0
- package/lib/pendant/widget.js +92 -0
- package/lib/pendant/widget.js.map +1 -0
- package/lib/pendant-renderer.js +4124 -0
- package/lib/store.d.ts +2 -0
- package/lib/store.d.ts.map +1 -1
- package/lib/store.js +19 -0
- package/lib/store.js.map +1 -1
- package/lib/ui/companion-picker.d.ts +8 -0
- package/lib/ui/companion-picker.d.ts.map +1 -0
- package/lib/ui/companion-picker.js +70 -0
- package/lib/ui/companion-picker.js.map +1 -0
- package/lib/ui/task-board-panel.d.ts +4 -1
- package/lib/ui/task-board-panel.d.ts.map +1 -1
- package/lib/ui/task-board-panel.js +4 -2
- package/lib/ui/task-board-panel.js.map +1 -1
- package/package.json +9 -5
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { useEffect, useRef } from 'react';
|
|
2
|
+
const KEY = 'dsh-partner:pendant-position:v1';
|
|
3
|
+
const clamp = (value, low, high) => Math.max(low, Math.min(value, Math.max(low, high)));
|
|
4
|
+
export function readerPlacement(anchor, viewport) {
|
|
5
|
+
const width = Math.min(360, viewport.width - 24), maxHeight = Math.min(480, viewport.height - 32), gap = 16;
|
|
6
|
+
const left = anchor.x - width - gap, right = anchor.x + anchor.width + gap;
|
|
7
|
+
if (left >= 12 || right + width <= viewport.width - 12) {
|
|
8
|
+
return { width, maxHeight, left: clamp(left >= 12 ? left : right, 12, viewport.width - width - 12), top: clamp(anchor.y - 12, 16, viewport.height - maxHeight - 16) };
|
|
9
|
+
}
|
|
10
|
+
// Narrow screens: reserve the card's actual footprint, choose the larger
|
|
11
|
+
// vertical space and scroll the message instead of covering the card.
|
|
12
|
+
const below = clamp(anchor.y + anchor.height + gap, 16, viewport.height - 16);
|
|
13
|
+
const above = clamp(anchor.y - gap, 16, viewport.height - 16);
|
|
14
|
+
const useBelow = viewport.height - below - 16 >= above - 16;
|
|
15
|
+
const available = useBelow ? viewport.height - below - 16 : above - 16;
|
|
16
|
+
const height = Math.max(0, Math.min(maxHeight, available));
|
|
17
|
+
return { width, maxHeight: height, left: clamp(anchor.x + anchor.width / 2 - width / 2, 12, viewport.width - width - 12), top: useBelow ? below : above - height };
|
|
18
|
+
}
|
|
19
|
+
/** Moving the hook changes placement, not the badge's elastic drag gesture.
|
|
20
|
+
* Persist only at gesture completion; movement has no React render loop.
|
|
21
|
+
*/
|
|
22
|
+
export function usePendantPlacement(root, handle) {
|
|
23
|
+
const handlers = useRef({ down: (_) => { }, move: (_) => { }, end: (_) => { }, key: (_) => { } });
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
const element = root.current;
|
|
26
|
+
if (!element)
|
|
27
|
+
return;
|
|
28
|
+
let saved, pending, frame = 0;
|
|
29
|
+
let drag;
|
|
30
|
+
try {
|
|
31
|
+
const value = JSON.parse(localStorage.getItem(KEY) ?? 'null');
|
|
32
|
+
if (value && Number.isFinite(value.x) && Number.isFinite(value.y))
|
|
33
|
+
saved = { x: clamp(value.x, 0, 1), y: clamp(value.y, 0, 1) };
|
|
34
|
+
}
|
|
35
|
+
catch { /* Storage restrictions must not disable the pendant. */ }
|
|
36
|
+
const limits = () => ({ x: Math.max(0, innerWidth - element.offsetWidth), y: Math.max(28, innerHeight - element.offsetHeight - 12) });
|
|
37
|
+
const place = (p) => {
|
|
38
|
+
const max = limits();
|
|
39
|
+
element.style.left = `${clamp(p.x, 0, max.x)}px`;
|
|
40
|
+
element.style.top = `${clamp(p.y, 28, max.y)}px`;
|
|
41
|
+
element.style.right = 'auto';
|
|
42
|
+
handle.current?.relayout();
|
|
43
|
+
};
|
|
44
|
+
const restore = () => {
|
|
45
|
+
const max = limits();
|
|
46
|
+
place(saved ? { x: saved.x * max.x, y: 28 + saved.y * (max.y - 28) } : { x: max.x - 8, y: 46 });
|
|
47
|
+
};
|
|
48
|
+
const flush = () => { cancelAnimationFrame(frame); frame = 0; if (pending) {
|
|
49
|
+
place(pending);
|
|
50
|
+
pending = undefined;
|
|
51
|
+
} };
|
|
52
|
+
const persist = () => {
|
|
53
|
+
const max = limits();
|
|
54
|
+
saved = { x: parseFloat(element.style.left) / (max.x || 1), y: (parseFloat(element.style.top) - 28) / (max.y - 28 || 1) };
|
|
55
|
+
try {
|
|
56
|
+
localStorage.setItem(KEY, JSON.stringify(saved));
|
|
57
|
+
}
|
|
58
|
+
catch { /* In-memory movement still works. */ }
|
|
59
|
+
};
|
|
60
|
+
const finish = () => {
|
|
61
|
+
if (!drag)
|
|
62
|
+
return;
|
|
63
|
+
const previous = drag;
|
|
64
|
+
drag = undefined;
|
|
65
|
+
flush();
|
|
66
|
+
persist();
|
|
67
|
+
if (previous.button.hasPointerCapture(previous.id))
|
|
68
|
+
previous.button.releasePointerCapture(previous.id);
|
|
69
|
+
};
|
|
70
|
+
handlers.current = {
|
|
71
|
+
down(event) {
|
|
72
|
+
if (!event.isPrimary || event.button !== 0 || drag)
|
|
73
|
+
return;
|
|
74
|
+
event.preventDefault();
|
|
75
|
+
const box = element.getBoundingClientRect();
|
|
76
|
+
drag = { id: event.pointerId, x: event.clientX, y: event.clientY, left: box.left, top: box.top, button: event.currentTarget };
|
|
77
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
78
|
+
},
|
|
79
|
+
move(event) {
|
|
80
|
+
if (!drag || event.pointerId !== drag.id)
|
|
81
|
+
return;
|
|
82
|
+
pending = { x: drag.left + event.clientX - drag.x, y: drag.top + event.clientY - drag.y };
|
|
83
|
+
if (!frame)
|
|
84
|
+
frame = requestAnimationFrame(flush);
|
|
85
|
+
},
|
|
86
|
+
end(event) { if (drag?.id === event.pointerId)
|
|
87
|
+
finish(); },
|
|
88
|
+
key(event) {
|
|
89
|
+
const step = event.shiftKey ? 32 : 12, delta = { ArrowLeft: [-step, 0], ArrowRight: [step, 0], ArrowUp: [0, -step], ArrowDown: [0, step] }[event.key];
|
|
90
|
+
if (!delta)
|
|
91
|
+
return;
|
|
92
|
+
event.preventDefault();
|
|
93
|
+
const box = element.getBoundingClientRect();
|
|
94
|
+
place({ x: box.left + delta[0], y: box.top + delta[1] });
|
|
95
|
+
persist();
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
const resize = () => { finish(); restore(); };
|
|
99
|
+
const observer = new ResizeObserver(resize);
|
|
100
|
+
observer.observe(element);
|
|
101
|
+
window.addEventListener('resize', resize);
|
|
102
|
+
window.addEventListener('blur', finish);
|
|
103
|
+
restore();
|
|
104
|
+
return () => { finish(); cancelAnimationFrame(frame); observer.disconnect(); window.removeEventListener('resize', resize); window.removeEventListener('blur', finish); };
|
|
105
|
+
}, [root, handle]);
|
|
106
|
+
return { onPointerDown: (e) => handlers.current.down(e), onPointerMove: (e) => handlers.current.move(e), onPointerUp: (e) => handlers.current.end(e), onPointerCancel: (e) => handlers.current.end(e), onLostPointerCapture: (e) => handlers.current.end(e), onKeyDown: (e) => handlers.current.key(e) };
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=use-placement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-placement.js","sourceRoot":"","sources":["../../src/pendant/use-placement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-settings.d.ts","sourceRoot":"","sources":["../../src/pendant/use-settings.ts"],"names":[],"mappings":"AACA,OAAO,EAA4E,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAkB9H,wBAAgB,kBAAkB,IAAI,eAAe,CAEpD;AACD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAKnE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { useSyncExternalStore } from 'react';
|
|
2
|
+
import { DEFAULT_PENDANT_SETTINGS, normalizePendantSettings, PENDANT_SETTINGS_KEY } from './settings.js';
|
|
3
|
+
let current;
|
|
4
|
+
const listeners = new Set();
|
|
5
|
+
function load() {
|
|
6
|
+
try {
|
|
7
|
+
return normalizePendantSettings(JSON.parse(localStorage.getItem(PENDANT_SETTINGS_KEY) ?? 'null'));
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return { ...DEFAULT_PENDANT_SETTINGS };
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function changed() { for (const listener of listeners)
|
|
14
|
+
listener(); }
|
|
15
|
+
function storage(event) {
|
|
16
|
+
if (event.key !== null && event.key !== PENDANT_SETTINGS_KEY)
|
|
17
|
+
return;
|
|
18
|
+
current = load();
|
|
19
|
+
changed();
|
|
20
|
+
}
|
|
21
|
+
function subscribe(listener) {
|
|
22
|
+
if (!listeners.size) {
|
|
23
|
+
current = load();
|
|
24
|
+
window.addEventListener('storage', storage);
|
|
25
|
+
}
|
|
26
|
+
listeners.add(listener);
|
|
27
|
+
return () => { listeners.delete(listener); if (!listeners.size)
|
|
28
|
+
window.removeEventListener('storage', storage); };
|
|
29
|
+
}
|
|
30
|
+
export function usePendantSettings() {
|
|
31
|
+
return useSyncExternalStore(subscribe, () => current ??= load(), () => DEFAULT_PENDANT_SETTINGS);
|
|
32
|
+
}
|
|
33
|
+
export function savePendantSettings(settings) {
|
|
34
|
+
const next = normalizePendantSettings(settings);
|
|
35
|
+
try {
|
|
36
|
+
localStorage.setItem(PENDANT_SETTINGS_KEY, JSON.stringify(next));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
throw new Error('无法保存卡片设置,请检查浏览器存储权限或剩余空间。原设置未更改。');
|
|
40
|
+
}
|
|
41
|
+
current = next;
|
|
42
|
+
changed();
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=use-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-settings.js","sourceRoot":"","sources":["../../src/pendant/use-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;AAC5C,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,oBAAoB,EAAwB,MAAM,eAAe,CAAA;AAE9H,IAAI,OAAoC,CAAA;AACxC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAA;AACvC,SAAS,IAAI;IACX,IAAI,CAAC;QAAC,OAAO,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAA;IAAC,CAAC;IACzG,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,wBAAwB,EAAE,CAAA;IAAC,CAAC;AAClD,CAAC;AACD,SAAS,OAAO,KAAW,KAAK,MAAM,QAAQ,IAAI,SAAS;IAAE,QAAQ,EAAE,CAAA,CAAC,CAAC;AACzE,SAAS,OAAO,CAAC,KAAmB;IAClC,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB;QAAE,OAAM;IACpE,OAAO,GAAG,IAAI,EAAE,CAAC;IAAC,OAAO,EAAE,CAAA;AAC7B,CAAC;AACD,SAAS,SAAS,CAAC,QAAoB;IACrC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAAC,CAAC;IACtF,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACvB,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI;QAAE,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA,CAAC,CAAC,CAAA;AAClH,CAAC;AACD,MAAM,UAAU,kBAAkB;IAChC,OAAO,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,KAAK,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,wBAAwB,CAAC,CAAA;AAClG,CAAC;AACD,MAAM,UAAU,mBAAmB,CAAC,QAAyB;IAC3D,MAAM,IAAI,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAA;IAC/C,IAAI,CAAC;QAAC,YAAY,CAAC,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IAAC,CAAC;IACxE,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IAAC,CAAC;IAC7D,OAAO,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,CAAA;AAC3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget.d.ts","sourceRoot":"","sources":["../../src/pendant/widget.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAehE,wBAAgB,cAAc,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,iBAAiB,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAGpG"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { PARTNER_API } from '../client-api.js';
|
|
4
|
+
import { usePartnerInbox } from './use-inbox.js';
|
|
5
|
+
import { usePendantPlacement } from './use-placement.js';
|
|
6
|
+
import { PendantReader } from './reader.js';
|
|
7
|
+
import { usePendantSettings } from './use-settings.js';
|
|
8
|
+
function messageLabel(notice) {
|
|
9
|
+
if (notice.kind === 'reply')
|
|
10
|
+
return '有新回复';
|
|
11
|
+
if (notice.kind === 'task' && notice.title.startsWith('遇到阻塞 · '))
|
|
12
|
+
return '任务受阻';
|
|
13
|
+
if (notice.kind === 'schedule' && notice.title.startsWith('未完成 · '))
|
|
14
|
+
return '尚未完成';
|
|
15
|
+
return notice.kind === 'task' ? '任务完成' : '定时完成';
|
|
16
|
+
}
|
|
17
|
+
export function PartnerPendant({ controller }) {
|
|
18
|
+
const settings = usePendantSettings();
|
|
19
|
+
return settings.enabled ? _jsx(ActivePendant, { controller: controller, settings: settings }) : null;
|
|
20
|
+
}
|
|
21
|
+
function ActivePendant({ controller, settings }) {
|
|
22
|
+
const root = useRef(null), canvas = useRef(null), hit = useRef(null);
|
|
23
|
+
const handle = useRef(), toggle = useRef(() => { });
|
|
24
|
+
const [open, setOpen] = useState(false), [ready, setReady] = useState(false), [failed, setFailed] = useState(false);
|
|
25
|
+
const [selected, setSelected] = useState(), [navigationError, setNavigationError] = useState('');
|
|
26
|
+
const { inbox, incoming, error, read } = usePartnerInbox();
|
|
27
|
+
const latestUnread = inbox.items.find(item => item.readAt === undefined);
|
|
28
|
+
const badgeMessage = latestUnread ? { id: latestUnread.id, count: inbox.unread, name: latestUnread.companionName, label: messageLabel(latestUnread) } : undefined;
|
|
29
|
+
const messageRef = useRef(badgeMessage);
|
|
30
|
+
const settingsRef = useRef(settings);
|
|
31
|
+
settingsRef.current = settings;
|
|
32
|
+
messageRef.current = badgeMessage;
|
|
33
|
+
const placement = usePendantPlacement(root, handle);
|
|
34
|
+
const close = useCallback((keyboard = false) => {
|
|
35
|
+
setOpen(false);
|
|
36
|
+
if (keyboard)
|
|
37
|
+
requestAnimationFrame(() => hit.current?.focus({ preventScroll: true }));
|
|
38
|
+
}, []);
|
|
39
|
+
const inspect = (item) => { setSelected(item?.id); if (item && item.readAt === undefined)
|
|
40
|
+
void read([item.id]); };
|
|
41
|
+
toggle.current = () => {
|
|
42
|
+
if (open) {
|
|
43
|
+
close();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
setNavigationError('');
|
|
47
|
+
inspect(latestUnread);
|
|
48
|
+
setOpen(true);
|
|
49
|
+
};
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
const abort = new AbortController();
|
|
52
|
+
const url = `${PARTNER_API}/pendant/renderer.js`;
|
|
53
|
+
void import(/* @vite-ignore */ url).then(async (module) => {
|
|
54
|
+
if (abort.signal.aborted || !canvas.current || !hit.current)
|
|
55
|
+
return;
|
|
56
|
+
const instance = await module.createLanyard(canvas.current, hit.current, {
|
|
57
|
+
signal: abort.signal, onTap: () => toggle.current(), onFailure: () => { handle.current?.destroy(); handle.current = undefined; setReady(false); setFailed(true); },
|
|
58
|
+
});
|
|
59
|
+
if (abort.signal.aborted) {
|
|
60
|
+
instance.destroy();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
handle.current = instance;
|
|
64
|
+
instance.setAppearance(settingsRef.current);
|
|
65
|
+
instance.setMessage(messageRef.current);
|
|
66
|
+
setReady(true);
|
|
67
|
+
}).catch(() => { if (!abort.signal.aborted) {
|
|
68
|
+
setFailed(true);
|
|
69
|
+
setReady(false);
|
|
70
|
+
} });
|
|
71
|
+
return () => { abort.abort(); handle.current?.destroy(); handle.current = undefined; };
|
|
72
|
+
}, []);
|
|
73
|
+
useEffect(() => { handle.current?.setMessage(badgeMessage); }, [inbox, ready]);
|
|
74
|
+
useEffect(() => { handle.current?.setAppearance(settings); }, [settings, ready]);
|
|
75
|
+
const visit = async (item) => {
|
|
76
|
+
setNavigationError('');
|
|
77
|
+
try {
|
|
78
|
+
if (item.routeId && item.sessionId)
|
|
79
|
+
await controller.openSession(item.routeId, item.sessionId);
|
|
80
|
+
else
|
|
81
|
+
controller.open(item.companionId, { page: item.kind === 'task' ? 'board' : item.kind === 'schedule' ? 'schedules' : 'home', ...(item.taskId ? { taskId: item.taskId } : {}) });
|
|
82
|
+
close();
|
|
83
|
+
}
|
|
84
|
+
catch (reason) {
|
|
85
|
+
setNavigationError(reason instanceof Error ? reason.message : '无法打开来源');
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const label = `伙伴消息,${inbox.unread} 条未读${latestUnread ? `,${latestUnread.companionName}:${latestUnread.title}` : ''};点击查看,拖动卡牌玩耍`;
|
|
89
|
+
return _jsxs("aside", { ref: root, className: "dsh-partner-pendant", "aria-label": "\u4F19\u4F34\u6302\u9970", children: [_jsx("canvas", { ref: canvas, className: "dsh-partner-pendant-canvas", "aria-hidden": "true" }), _jsx("button", { ref: hit, type: "button", className: `dsh-partner-pendant-hit${ready ? ' is-rendered' : ''}`, "aria-label": label, "aria-expanded": open, "aria-controls": open ? 'dsh-partner-pendant-inbox' : undefined, onClick: () => { if (!ready)
|
|
90
|
+
toggle.current(); }, children: !ready && _jsxs("span", { className: "dsh-partner-pendant-fallback", children: ["\u4F19\u4F34", _jsx("small", { children: failed ? inbox.unread ? `${inbox.unread} 条消息` : '消息' : '加载挂饰…' })] }) }), _jsx("button", { type: "button", className: "dsh-partner-pendant-anchor", "aria-label": "\u79FB\u52A8\u6302\u9970\u4F4D\u7F6E", title: "\u62D6\u52A8\u6302\u70B9\u79FB\u52A8\u4F4D\u7F6E\uFF0C\u4E5F\u53EF\u7528\u65B9\u5411\u952E\u5FAE\u8C03", ...placement, children: _jsx("span", { "aria-hidden": "true" }) }), _jsx("span", { className: "dsh-partner-pendant-announcement", role: "status", "aria-live": "polite", "aria-atomic": "true", children: incoming ? `${incoming.companionName}:${incoming.title}` : '' }), open && _jsx(PendantReader, { inbox: inbox, selected: selected, error: error || navigationError, anchor: hit, onSelect: inspect, onClose: close, onVisit: item => { void visit(item); }, onReadAll: () => { void read(inbox.items.filter(item => item.readAt === undefined).map(item => item.id)); } })] });
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=widget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget.js","sourceRoot":"","sources":["../../src/pendant/widget.tsx"],"names":[],"mappings":"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"}
|