@awiki/dsh-plugin 0.3.16 → 0.3.18

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.
Files changed (87) hide show
  1. package/README.md +4 -0
  2. package/THIRD_PARTY_NOTICES.md +6 -0
  3. package/lib/client.js +3543 -746
  4. package/lib/client.js.map +1 -1
  5. package/lib/index.js +218 -41
  6. package/lib/{sdk-adapter-DGcTiEZz.mjs → package-version.generated-D0MSDRZn.mjs} +83 -10
  7. package/lib/provider.js +5 -3
  8. package/lib/typert.host.js +481 -127
  9. package/lib/typert.remote-client.d.ts +9 -3
  10. package/lib/typert.remote-client.d.ts.map +1 -1
  11. package/lib/typert.remote-client.js +481 -127
  12. package/lib/types/client/AwikiAvatar.d.ts +40 -0
  13. package/lib/types/client/AwikiAvatar.d.ts.map +1 -0
  14. package/lib/types/client/AwikiAvatar.js +201 -0
  15. package/lib/types/client/AwikiAvatar.js.map +1 -0
  16. package/lib/types/client/AwikiAvatarEditor.d.ts +11 -0
  17. package/lib/types/client/AwikiAvatarEditor.d.ts.map +1 -0
  18. package/lib/types/client/AwikiAvatarEditor.js +113 -0
  19. package/lib/types/client/AwikiAvatarEditor.js.map +1 -0
  20. package/lib/types/client/AwikiAvatarPreview.d.ts +8 -0
  21. package/lib/types/client/AwikiAvatarPreview.d.ts.map +1 -0
  22. package/lib/types/client/AwikiAvatarPreview.js +68 -0
  23. package/lib/types/client/AwikiAvatarPreview.js.map +1 -0
  24. package/lib/types/client/AwikiGroupDetails.js +2 -2
  25. package/lib/types/client/AwikiGroupDetails.js.map +1 -1
  26. package/lib/types/client/AwikiIdentityAccess.d.ts +1 -0
  27. package/lib/types/client/AwikiIdentityAccess.d.ts.map +1 -1
  28. package/lib/types/client/AwikiIdentityAccess.js +10 -2
  29. package/lib/types/client/AwikiIdentityAccess.js.map +1 -1
  30. package/lib/types/client/AwikiOverlay.d.ts.map +1 -1
  31. package/lib/types/client/AwikiOverlay.js +92 -27
  32. package/lib/types/client/AwikiOverlay.js.map +1 -1
  33. package/lib/types/client/AwikiProfileCard.d.ts +1 -1
  34. package/lib/types/client/AwikiProfileCard.d.ts.map +1 -1
  35. package/lib/types/client/AwikiProfileCard.js +6 -2
  36. package/lib/types/client/AwikiProfileCard.js.map +1 -1
  37. package/lib/types/client/avatar-cache.d.ts +24 -0
  38. package/lib/types/client/avatar-cache.d.ts.map +1 -0
  39. package/lib/types/client/avatar-cache.js +336 -0
  40. package/lib/types/client/avatar-cache.js.map +1 -0
  41. package/lib/types/client/avatar-dialog.d.ts +3 -0
  42. package/lib/types/client/avatar-dialog.d.ts.map +1 -0
  43. package/lib/types/client/avatar-dialog.js +18 -0
  44. package/lib/types/client/avatar-dialog.js.map +1 -0
  45. package/lib/types/client/avatar-image.d.ts +26 -0
  46. package/lib/types/client/avatar-image.d.ts.map +1 -0
  47. package/lib/types/client/avatar-image.js +193 -0
  48. package/lib/types/client/avatar-image.js.map +1 -0
  49. package/lib/types/client/controller.d.ts +30 -4
  50. package/lib/types/client/controller.d.ts.map +1 -1
  51. package/lib/types/client/controller.js +267 -56
  52. package/lib/types/client/controller.js.map +1 -1
  53. package/lib/types/client/index.d.ts.map +1 -1
  54. package/lib/types/client/index.js +10 -2
  55. package/lib/types/client/index.js.map +1 -1
  56. package/lib/types/client/slots.d.ts +12 -3
  57. package/lib/types/client/slots.d.ts.map +1 -1
  58. package/lib/types/conversation-preferences.d.ts.map +1 -1
  59. package/lib/types/conversation-preferences.js +27 -0
  60. package/lib/types/conversation-preferences.js.map +1 -1
  61. package/lib/types/index.d.ts +8 -2
  62. package/lib/types/index.d.ts.map +1 -1
  63. package/lib/types/index.js +76 -11
  64. package/lib/types/index.js.map +1 -1
  65. package/lib/types/listener.d.ts.map +1 -1
  66. package/lib/types/listener.js +9 -8
  67. package/lib/types/listener.js.map +1 -1
  68. package/lib/types/package-version.generated.d.ts +2 -2
  69. package/lib/types/package-version.generated.js +2 -2
  70. package/lib/types/provider-api.d.ts +9 -3
  71. package/lib/types/provider-api.d.ts.map +1 -1
  72. package/lib/types/provider.d.ts.map +1 -1
  73. package/lib/types/provider.js +5 -2
  74. package/lib/types/provider.js.map +1 -1
  75. package/lib/types/sdk-adapter.d.ts +6 -3
  76. package/lib/types/sdk-adapter.d.ts.map +1 -1
  77. package/lib/types/sdk-adapter.js +58 -7
  78. package/lib/types/sdk-adapter.js.map +1 -1
  79. package/lib/types/tenant-registry.d.ts +2 -0
  80. package/lib/types/tenant-registry.d.ts.map +1 -1
  81. package/lib/types/tenant-registry.js +83 -16
  82. package/lib/types/tenant-registry.js.map +1 -1
  83. package/lib/types/types.d.ts +63 -7
  84. package/lib/types/types.d.ts.map +1 -1
  85. package/lib/types/types.js.map +1 -1
  86. package/lib/types/update-policy.d.ts +2 -2
  87. package/package.json +33 -34
@@ -0,0 +1,40 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { AwikiDid, AwikiDisplayProfile, AwikiGroupSnapshot, AwikiProfile } from '../types.ts';
3
+ import type { AwikiOverlayProps } from './slots.ts';
4
+ type Sources = Pick<AwikiOverlayProps, 'avatarDisplayProfiles' | 'avatarGroup'>;
5
+ interface Projection {
6
+ owner: string;
7
+ self: AwikiProfile | null;
8
+ profiles: ReadonlyMap<string, AwikiDisplayProfile>;
9
+ groups: ReadonlyMap<string, AwikiGroupSnapshot>;
10
+ demand: (did: AwikiDid, force?: boolean) => void;
11
+ demandGroup: (did: AwikiDid) => void;
12
+ subscribe: (key: string, listener: () => void) => () => void;
13
+ }
14
+ export declare function AwikiAvatarProvider(props: Sources & {
15
+ owner: string;
16
+ profile: AwikiProfile | null;
17
+ children: ReactNode;
18
+ }): import("react").JSX.Element;
19
+ /** Shared source selection for badges and profile-image previews. */
20
+ export declare function useAvatarReference(props: {
21
+ did?: AwikiDid | undefined;
22
+ uri?: string | null | undefined;
23
+ thumbnail?: string | null | undefined;
24
+ }): {
25
+ context: Projection | undefined;
26
+ profile: AwikiProfile | AwikiDisplayProfile | null | undefined;
27
+ main: string | null | undefined;
28
+ subjectType: string | undefined;
29
+ thumbnail: string | null | undefined;
30
+ };
31
+ export declare function AwikiAvatar(props: {
32
+ name: string;
33
+ did?: AwikiDid;
34
+ groupDid?: AwikiDid;
35
+ uri?: string | null | undefined;
36
+ thumbnail?: string | null | undefined;
37
+ size?: number;
38
+ }): import("react").JSX.Element;
39
+ export {};
40
+ //# sourceMappingURL=AwikiAvatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AwikiAvatar.d.ts","sourceRoot":"","sources":["../../../src/client/AwikiAvatar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuH,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC3J,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAClG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAInD,KAAK,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,uBAAuB,GAAG,aAAa,CAAC,CAAA;AAC/E,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAA;IACxC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;IACnG,MAAM,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAAC,WAAW,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAA;IACtF,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;CAC7D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAwExH;AAED,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAAE;;;;;;EAS/I;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,+BA2D9K"}
@@ -0,0 +1,201 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';
3
+ import { avatarCache, safeAvatarUrl } from "./avatar-cache.js";
4
+ import css from './AwikiAvatar.module.css';
5
+ const Context = createContext(undefined);
6
+ export function AwikiAvatarProvider(props) {
7
+ const profiles = useRef(new Map());
8
+ const groups = useRef(new Map());
9
+ const checked = useRef(new Map());
10
+ const peers = useRef(new Set());
11
+ const scheduled = useRef(false);
12
+ const groupQueue = useRef([]);
13
+ const groupRunning = useRef(0);
14
+ const generation = useRef(0);
15
+ const listeners = useRef(new Map());
16
+ const subscribe = useCallback((key, listener) => {
17
+ const values = listeners.current.get(key) ?? new Set();
18
+ values.add(listener);
19
+ listeners.current.set(key, values);
20
+ return () => { values.delete(listener); if (values.size === 0)
21
+ listeners.current.delete(key); };
22
+ }, []);
23
+ const emit = useCallback((key) => { listeners.current.get(key)?.forEach(listener => { listener(); }); }, []);
24
+ useLayoutEffect(() => {
25
+ generation.current++;
26
+ scheduled.current = false;
27
+ profiles.current.clear();
28
+ groups.current.clear();
29
+ checked.current.clear();
30
+ peers.current.clear();
31
+ groupQueue.current.length = 0;
32
+ avatarCache.reset();
33
+ for (const values of listeners.current.values())
34
+ values.forEach(listener => { listener(); });
35
+ return () => { generation.current++; avatarCache.reset(); };
36
+ }, [props.owner]);
37
+ const demand = useCallback((did, force = false) => {
38
+ if (props.owner === '' || did === props.profile?.did || (checked.current.get(did) ?? 0) > Date.now() - (force ? 5_000 : 300_000))
39
+ return;
40
+ peers.current.add(did);
41
+ if (scheduled.current)
42
+ return;
43
+ scheduled.current = true;
44
+ const operation = generation.current;
45
+ const flush = () => {
46
+ if (operation !== generation.current)
47
+ return;
48
+ const batch = [...peers.current].slice(0, 100);
49
+ batch.forEach(peer => { peers.current.delete(peer); checked.current.set(peer, Date.now()); });
50
+ while (checked.current.size > 8192)
51
+ checked.current.delete(checked.current.keys().next().value);
52
+ if (batch.length === 0) {
53
+ scheduled.current = false;
54
+ return;
55
+ }
56
+ void props.avatarDisplayProfiles(batch).then(values => {
57
+ if (operation !== generation.current)
58
+ return;
59
+ const received = new Set();
60
+ for (const value of values)
61
+ if (value.cacheHit) {
62
+ profiles.current.set(value.did, value);
63
+ received.add(value.did);
64
+ emit(`peer:${value.did}`);
65
+ }
66
+ for (const peer of batch)
67
+ if (!received.has(peer))
68
+ checked.current.set(peer, Date.now() - 270_000);
69
+ while (profiles.current.size > 2048) {
70
+ const key = profiles.current.keys().next().value;
71
+ profiles.current.delete(key);
72
+ emit(`peer:${key}`);
73
+ }
74
+ }).catch(() => { if (operation === generation.current)
75
+ for (const peer of batch)
76
+ checked.current.set(peer, Date.now() - 270_000); })
77
+ .finally(() => { if (operation === generation.current)
78
+ queueMicrotask(flush); });
79
+ };
80
+ queueMicrotask(flush);
81
+ }, [props.owner, props.profile?.did, props.avatarDisplayProfiles, emit]);
82
+ const demandGroup = useCallback((did) => {
83
+ const key = `group:${did}`;
84
+ if (props.owner === '' || (checked.current.get(key) ?? 0) > Date.now() - 300_000)
85
+ return;
86
+ checked.current.set(key, Date.now());
87
+ while (checked.current.size > 8192)
88
+ checked.current.delete(checked.current.keys().next().value);
89
+ groupQueue.current.push({ did, operation: generation.current });
90
+ const pump = () => {
91
+ while (groupRunning.current < 4 && groupQueue.current.length > 0) {
92
+ const job = groupQueue.current.shift();
93
+ if (job.operation !== generation.current)
94
+ continue;
95
+ groupRunning.current++;
96
+ void props.avatarGroup(job.did).then(value => {
97
+ if (job.operation !== generation.current)
98
+ return;
99
+ if (value === null) {
100
+ checked.current.set(`group:${job.did}`, Date.now() - 270_000);
101
+ return;
102
+ }
103
+ const old = groups.current.get(job.did)?.groupStateVersion;
104
+ const next = value.groupStateVersion;
105
+ if (old !== undefined && next !== undefined && /^(0|[1-9][0-9]*)$/u.test(old) && /^(0|[1-9][0-9]*)$/u.test(next) && BigInt(next) < BigInt(old))
106
+ return;
107
+ groups.current.set(job.did, value);
108
+ emit(`group:${job.did}`);
109
+ while (groups.current.size > 2048) {
110
+ const key = groups.current.keys().next().value;
111
+ groups.current.delete(key);
112
+ emit(`group:${key}`);
113
+ }
114
+ }).catch(() => { if (job.operation === generation.current)
115
+ checked.current.set(`group:${job.did}`, Date.now() - 270_000); })
116
+ .finally(() => { groupRunning.current--; pump(); });
117
+ }
118
+ };
119
+ pump();
120
+ }, [props.owner, props.avatarGroup, emit]);
121
+ const context = useMemo(() => ({ owner: props.owner, self: props.profile, profiles: profiles.current, groups: groups.current, demand, demandGroup, subscribe }), [props.owner, props.profile, demand, demandGroup, subscribe]);
122
+ return _jsx(Context.Provider, { value: context, children: props.children });
123
+ }
124
+ /** Shared source selection for badges and profile-image previews. */
125
+ export function useAvatarReference(props) {
126
+ const context = useContext(Context);
127
+ const peer = useSyncExternalStore(useCallback(listener => context?.subscribe(`peer:${props.did}`, listener) ?? (() => { }), [context?.subscribe, props.did]), () => props.did === undefined ? undefined : context?.profiles.get(props.did), () => undefined);
128
+ const profile = props.did === context?.self?.did ? context?.self : peer;
129
+ return { context, profile, main: profile !== undefined && profile !== null ? profile.avatarUri : props.uri,
130
+ subjectType: profile?.subjectType ?? props.subjectType,
131
+ thumbnail: profile !== undefined && profile !== null ? profile.avatarThumbnailUri : props.thumbnail };
132
+ }
133
+ export function AwikiAvatar(props) {
134
+ const context = useContext(Context);
135
+ const element = useRef(null);
136
+ const [visible, setVisible] = useState(typeof IntersectionObserver === 'undefined');
137
+ const [loaded, setLoaded] = useState();
138
+ const size = props.size ?? 36;
139
+ const { profile, main: peerMain, thumbnail, subjectType } = useAvatarReference(props);
140
+ const group = useSyncExternalStore(useCallback(listener => context?.subscribe(`group:${props.groupDid}`, listener) ?? (() => { }), [context?.subscribe, props.groupDid]), () => props.groupDid === undefined ? undefined : context?.groups.get(props.groupDid), () => undefined);
141
+ const main = profile !== undefined && profile !== null ? peerMain : group !== undefined ? group.avatarUri : peerMain;
142
+ const uri = main === null ? undefined : safeAvatarUrl(thumbnail ?? main);
143
+ useEffect(() => {
144
+ if (typeof IntersectionObserver === 'undefined' || element.current === null)
145
+ return;
146
+ const observer = new IntersectionObserver(entries => { setVisible(entries.some(entry => entry.isIntersecting)); }, { rootMargin: '96px' });
147
+ observer.observe(element.current);
148
+ return () => observer.disconnect();
149
+ }, []);
150
+ useEffect(() => {
151
+ if (!visible)
152
+ return;
153
+ const refresh = () => {
154
+ if (document.visibilityState === 'hidden')
155
+ return;
156
+ if (props.did !== undefined)
157
+ context?.demand(props.did);
158
+ if (props.groupDid !== undefined)
159
+ context?.demandGroup(props.groupDid);
160
+ };
161
+ refresh();
162
+ const timer = setInterval(refresh, 30_000);
163
+ document.addEventListener('visibilitychange', refresh);
164
+ return () => { clearInterval(timer); document.removeEventListener('visibilitychange', refresh); };
165
+ }, [visible, props.did, props.groupDid, context?.demand, context?.demandGroup]);
166
+ useEffect(() => {
167
+ if (!visible || uri === undefined || context?.owner === undefined || context.owner === '')
168
+ return;
169
+ let active = true;
170
+ let loading = false;
171
+ let timer;
172
+ const load = async (force = false) => {
173
+ if (!active || loading)
174
+ return;
175
+ clearTimeout(timer);
176
+ if (document.visibilityState === 'hidden') {
177
+ timer = setTimeout(() => { void load(); }, 30_000);
178
+ return;
179
+ }
180
+ loading = true;
181
+ const value = await (force
182
+ ? avatarCache.load(context.owner, uri, size <= 64 ? 128 : 512, true)
183
+ : avatarCache.load(context.owner, uri, size <= 64 ? 128 : 512)).catch(() => undefined);
184
+ loading = false;
185
+ if (!active)
186
+ return;
187
+ if (value !== undefined)
188
+ setLoaded({ owner: context.owner, uri, image: value });
189
+ timer = setTimeout(() => { void load(); }, value === undefined ? 30_000 : 300_000);
190
+ };
191
+ const online = () => { clearTimeout(timer); void load(true); };
192
+ window.addEventListener('online', online);
193
+ void load();
194
+ return () => { active = false; clearTimeout(timer); window.removeEventListener('online', online); };
195
+ }, [context?.owner, uri, visible, size]);
196
+ const image = loaded?.owner === context?.owner && loaded?.uri === uri ? loaded?.image : undefined;
197
+ const members = uri === undefined ? group?.avatarMembers : undefined;
198
+ const label = Array.from(props.name.trim()).slice(0, 2).join('') || (props.groupDid === undefined ? '人' : '群');
199
+ return _jsx("span", { ref: element, className: css.avatar, "data-subject-type": subjectType, style: { width: size, height: size, fontSize: size / 3 }, "aria-label": props.name, children: members !== undefined && members.length > 0 && members.length <= 4 ? _jsx("span", { className: css.mosaic, "data-count": members.length, children: members.map(member => _jsx(AwikiAvatar, { name: member.memberHandle ?? member.memberDid, did: member.memberDid, size: members.length === 1 ? size : (size - 6) / 2 }, member.memberKey)) }) : image === undefined ? label : _jsx("img", { src: image, alt: "", width: size, height: size, draggable: false, onError: () => { setLoaded(undefined); } }) });
200
+ }
201
+ //# sourceMappingURL=AwikiAvatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AwikiAvatar.js","sourceRoot":"","sources":["../../../src/client/AwikiAvatar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import 'react-image-crop/dist/ReactCrop.css';
2
+ import type { AwikiProfile } from '../types.ts';
3
+ import type { AwikiOverlayProps } from './slots.ts';
4
+ type Actions = Pick<AwikiOverlayProps, 'setAvatar' | 'clearAvatar' | 'refreshAvatarProfile'>;
5
+ export declare function AwikiAvatarEditor(props: Actions & {
6
+ profile: AwikiProfile | null;
7
+ owner: string;
8
+ onClose: () => void;
9
+ }): import("react").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=AwikiAvatarEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AwikiAvatarEditor.d.ts","sourceRoot":"","sources":["../../../src/client/AwikiAvatarEditor.tsx"],"names":[],"mappings":"AAEA,OAAO,qCAAqC,CAAA;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAOnD,KAAK,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,aAAa,GAAG,sBAAsB,CAAC,CAAA;AAC5F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,+BAwFtH"}
@@ -0,0 +1,113 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from 'react';
3
+ import ReactCrop from 'react-image-crop';
4
+ import 'react-image-crop/dist/ReactCrop.css';
5
+ import { Modal } from '@deepseek-ai/dsh-client-ui-primitives';
6
+ import { AwikiAvatar } from "./AwikiAvatar.js";
7
+ import { useAvatarDialogEscape } from "./avatar-dialog.js";
8
+ import { avatarJpeg, avatarPreview, drawAvatarCrop, initialAvatarCrop, avatarCropRectangle } from "./avatar-image.js";
9
+ import css from './AwikiAvatar.module.css';
10
+ import shared from './AwikiOverlay.module.css';
11
+ export function AwikiAvatarEditor(props) {
12
+ const [bitmap, setBitmap] = useState(null);
13
+ const [crop, setCrop] = useState({ edge: 1, x: 0, y: 0 });
14
+ const [busy, setBusy] = useState(true);
15
+ useAvatarDialogEscape(true, () => { if (!busy)
16
+ props.onClose(); });
17
+ const [error, setError] = useState(null);
18
+ const [confirmClear, setConfirmClear] = useState(false);
19
+ const [operation, setOperation] = useState(null);
20
+ const canvas = useRef(null);
21
+ const input = useRef(null);
22
+ const alive = useRef(true);
23
+ const sourceCanvas = useRef(null);
24
+ useEffect(() => {
25
+ alive.current = true;
26
+ void props.refreshAvatarProfile().then(result => { if (alive.current) {
27
+ if (!result.ok)
28
+ setError(result.error);
29
+ setBusy(false);
30
+ } });
31
+ return () => { alive.current = false; };
32
+ }, [props.owner, props.refreshAvatarProfile]);
33
+ useEffect(() => () => { bitmap?.close(); }, [bitmap]);
34
+ useEffect(() => {
35
+ if (bitmap !== null && sourceCanvas.current !== null) {
36
+ const target = sourceCanvas.current;
37
+ target.width = bitmap.width;
38
+ target.height = bitmap.height;
39
+ target.getContext('2d')?.drawImage(bitmap, 0, 0);
40
+ }
41
+ }, [bitmap]);
42
+ useEffect(() => { if (bitmap !== null && canvas.current !== null)
43
+ drawAvatarCrop(canvas.current, bitmap, crop); }, [bitmap, crop]);
44
+ useEffect(() => {
45
+ if (operation !== null && !busy && props.profile?.profileVersion !== undefined && props.profile.profileVersion !== operation.expectedProfileVersion) {
46
+ setOperation(null);
47
+ setBitmap(null);
48
+ setError('已读取最新头像,请确认当前结果后再操作。');
49
+ }
50
+ }, [operation, busy, props.profile?.profileVersion]);
51
+ const choose = async (file) => {
52
+ if (file === undefined)
53
+ return;
54
+ setBusy(true);
55
+ setError(null);
56
+ setConfirmClear(false);
57
+ try {
58
+ const image = await avatarPreview(file);
59
+ if (!alive.current) {
60
+ image.close();
61
+ return;
62
+ }
63
+ setBitmap(image);
64
+ setCrop(initialAvatarCrop(image));
65
+ }
66
+ catch (error) {
67
+ if (alive.current)
68
+ setError(error instanceof Error ? error.message : '无法读取图片,请换一张照片');
69
+ }
70
+ finally {
71
+ if (alive.current)
72
+ setBusy(false);
73
+ }
74
+ };
75
+ const save = async (clear = false) => {
76
+ const version = props.profile?.profileVersion;
77
+ if (version === undefined || props.profile?.avatarUploadEnabled !== true || busy)
78
+ return;
79
+ setBusy(true);
80
+ setError(null);
81
+ try {
82
+ const pending = operation ?? {
83
+ requestId: crypto.randomUUID(), expectedProfileVersion: version,
84
+ ...clear || bitmap === null ? {} : { imageBase64: await avatarJpeg(bitmap, crop) },
85
+ };
86
+ if (!alive.current)
87
+ return;
88
+ setOperation(pending);
89
+ const result = pending.imageBase64 === undefined ? await props.clearAvatar(pending) : await props.setAvatar({ ...pending, imageBase64: pending.imageBase64 });
90
+ if (!alive.current)
91
+ return;
92
+ if (result.ok)
93
+ props.onClose();
94
+ else
95
+ setError('尚未确认保存结果。请检查网络后重试;重试会继续同一次保存。');
96
+ }
97
+ catch {
98
+ if (alive.current)
99
+ setError('无法处理或保存头像,请重试或换一张照片。');
100
+ }
101
+ finally {
102
+ if (alive.current)
103
+ setBusy(false);
104
+ }
105
+ };
106
+ const enabled = !busy && props.profile?.avatarUploadEnabled === true;
107
+ return _jsx(Modal, { open: true, onClose: () => { if (!busy)
108
+ props.onClose(); }, title: "\u8BBE\u7F6E\u5934\u50CF", closeLabel: "\u53D6\u6D88\u8BBE\u7F6E\u5934\u50CF", className: shared.compactModal ?? '', children: _jsxs("div", { className: css.editor, "aria-busy": busy, children: [bitmap === null ? _jsx(AwikiAvatar, { name: props.profile?.displayName ?? '头像', ...props.profile?.did === undefined ? {} : { did: props.profile.did }, uri: props.profile?.avatarUri, size: 112 }) : _jsxs(_Fragment, { children: [_jsx(ReactCrop, { aspect: 1, keepSelection: true, minWidth: 40, minHeight: 40, disabled: busy || operation !== null, crop: { unit: '%', x: crop.x / bitmap.width * 100, y: crop.y / bitmap.height * 100, width: crop.edge / bitmap.width * 100, height: crop.edge / bitmap.height * 100 }, onChange: (_, percent) => { setCrop(avatarCropRectangle(bitmap, { x: percent.x / 100 * bitmap.width, y: percent.y / 100 * bitmap.height, edge: percent.width / 100 * bitmap.width })); }, ariaLabels: { cropArea: '头像选框,方向键移动,聚焦边角后用方向键调整大小', nwDragHandle: '左上角', nDragHandle: '上边', neDragHandle: '右上角', eDragHandle: '右边', seDragHandle: '右下角', sDragHandle: '下边', swDragHandle: '左下角', wDragHandle: '左边' }, children: _jsx("canvas", { ref: sourceCanvas, className: css.cropSource, "aria-label": "\u56FA\u5B9A\u7684\u5934\u50CF\u56FE\u7247", style: { width: Math.min(1, 340 / bitmap.width, 280 / bitmap.height) * bitmap.width } }) }), _jsxs("div", { className: css.comparison, children: [_jsxs("div", { children: [_jsx(AwikiAvatar, { name: props.profile?.displayName ?? '头像', ...props.profile?.did === undefined ? {} : { did: props.profile.did }, uri: props.profile?.avatarUri, size: 72 }), _jsx("small", { children: "\u5F53\u524D\u5934\u50CF" })] }), _jsxs("div", { children: [_jsx("canvas", { ref: canvas, className: css.cropPreview, width: 128, height: 128, role: "img", "aria-label": "\u65B0\u5934\u50CF\u9884\u89C8" }), _jsx("small", { children: "\u65B0\u5934\u50CF\u9884\u89C8" })] })] })] }), _jsx("p", { className: css.hint, children: bitmap === null ? '选择 JPEG、PNG 或静态 WebP 图片,最大 20 MB。' : '拖动正方形调整位置,拖动四角调整选框大小。' }), bitmap !== null && _jsx("p", { className: css.hint, style: { minHeight: 20 }, children: crop.edge < 512 ? '所选区域较小,头像可能模糊。' : '\u00a0' }), busy && _jsx("p", { role: "status", children: "\u6B63\u5728\u5904\u7406\u5934\u50CF\u2026" }), error !== null && _jsx("p", { role: "alert", className: css.hint, children: error }), confirmClear && _jsx("p", { className: css.hint, children: "\u786E\u5B9A\u6062\u590D\u9ED8\u8BA4\u5934\u50CF\uFF1F" }), !busy && props.profile?.avatarUploadEnabled !== true && _jsx("p", { className: css.hint, children: "\u5F53\u524D\u8D26\u53F7\u6216\u670D\u52A1\u6682\u4E0D\u652F\u6301\u4FEE\u6539\u5934\u50CF\u3002" }), _jsx("input", { ref: input, type: "file", accept: "image/jpeg,image/png,image/webp", hidden: true, "aria-label": "\u9009\u62E9\u5934\u50CF\u56FE\u7247", onChange: event => { const file = event.target.files?.[0]; event.target.value = ''; void choose(file); } }), _jsxs("div", { className: css.actions, children: [_jsx("button", { type: "button", className: shared.secondary, disabled: !enabled || operation !== null, onClick: () => { input.current?.click(); }, children: "\u9009\u62E9\u7167\u7247" }), operation !== null ? _jsx("button", { type: "button", className: shared.primary, disabled: !enabled, onClick: () => { void save(); }, children: "\u91CD\u8BD5\u4FDD\u5B58" }) : bitmap !== null ? _jsx("button", { type: "button", className: shared.primary, disabled: !enabled, onClick: () => { void save(); }, children: "\u4FDD\u5B58\u5934\u50CF" }) : props.profile?.avatarUri != null && _jsx("button", { type: "button", className: shared.secondary, disabled: !enabled, onClick: () => { if (confirmClear)
109
+ void save(true);
110
+ else
111
+ setConfirmClear(true); }, children: confirmClear ? '确认恢复默认头像' : '恢复默认头像' }), _jsx("button", { type: "button", className: shared.secondary, disabled: busy, onClick: props.onClose, children: "\u53D6\u6D88" })] })] }) });
112
+ }
113
+ //# sourceMappingURL=AwikiAvatarEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AwikiAvatarEditor.js","sourceRoot":"","sources":["../../../src/client/AwikiAvatarEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { AwikiDid } from '../types.ts';
2
+ export declare function AwikiAvatarPreview(props: {
3
+ did: AwikiDid;
4
+ name: string;
5
+ uri?: string | null | undefined;
6
+ thumbnail?: string | null | undefined;
7
+ }): import("react").JSX.Element;
8
+ //# sourceMappingURL=AwikiAvatarPreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AwikiAvatarPreview.d.ts","sourceRoot":"","sources":["../../../src/client/AwikiAvatarPreview.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAM3C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IAAE,GAAG,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAAE,+BAchJ"}
@@ -0,0 +1,68 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { Modal } from '@deepseek-ai/dsh-client-ui-primitives';
4
+ import { AwikiAvatar, useAvatarReference } from "./AwikiAvatar.js";
5
+ import { avatarCache, safeAvatarUrl } from "./avatar-cache.js";
6
+ import { useAvatarDialogEscape } from "./avatar-dialog.js";
7
+ import css from './AwikiAvatar.module.css';
8
+ export function AwikiAvatarPreview(props) {
9
+ const [open, setOpen] = useState(false);
10
+ useAvatarDialogEscape(open, () => { setOpen(false); });
11
+ const { context, main, thumbnail, subjectType } = useAvatarReference(props);
12
+ const uri = safeAvatarUrl(main);
13
+ useEffect(() => { context?.demand(props.did); }, [context?.demand, props.did]);
14
+ useEffect(() => { setOpen(false); }, [context?.owner, props.did]);
15
+ return _jsxs(_Fragment, { children: [uri === undefined ? _jsx(AwikiAvatar, { ...props }) : _jsx("button", { type: "button", className: css.avatarAction, "aria-label": `查看${props.name}的头像`, title: "\u67E5\u770B\u5934\u50CF", onClick: () => { context?.demand(props.did, true); setOpen(true); }, children: _jsx(AwikiAvatar, { ...props }) }), open && _jsx(Modal, { open: true, title: "\u5934\u50CF", closeLabel: "\u5173\u95ED\u5934\u50CF", onClose: () => { setOpen(false); }, children: _jsx(AvatarLargeImage, { owner: context?.owner ?? '', uri: uri, poster: safeAvatarUrl(thumbnail), animate: subjectType === 'agent', name: props.name }) })] });
16
+ }
17
+ function AvatarLargeImage(props) {
18
+ const [retry, setRetry] = useState(0);
19
+ const [motion, setMotion] = useState(false);
20
+ const [failed, setFailed] = useState(false);
21
+ const [state, setState] = useState();
22
+ useEffect(() => {
23
+ const media = window.matchMedia?.('(prefers-reduced-motion: reduce)');
24
+ const update = () => { setMotion(!media?.matches && document.visibilityState !== 'hidden'); };
25
+ update();
26
+ media?.addEventListener('change', update);
27
+ document.addEventListener('visibilitychange', update);
28
+ return () => { media?.removeEventListener('change', update); document.removeEventListener('visibilitychange', update); };
29
+ }, []);
30
+ const animate = props.animate && motion && !failed;
31
+ const uri = animate ? props.uri : props.poster ?? props.uri;
32
+ useEffect(() => {
33
+ const { owner } = props;
34
+ if (uri === undefined || owner === '')
35
+ return;
36
+ let active = true;
37
+ let loading = false;
38
+ let timer;
39
+ const load = async (force = false) => {
40
+ if (!active || loading)
41
+ return;
42
+ clearTimeout(timer);
43
+ loading = true;
44
+ const image = await avatarCache.load(owner, uri, 512, force, animate).catch(() => undefined);
45
+ loading = false;
46
+ if (!active)
47
+ return;
48
+ if (image === undefined && animate && props.poster !== undefined) {
49
+ setFailed(true);
50
+ return;
51
+ }
52
+ setState(previous => ({ owner, uri, animate, image: image ?? (previous?.owner === owner && previous.uri === uri && previous.animate === animate ? previous.image : undefined), loading: false }));
53
+ timer = setTimeout(() => { void load(); }, 300_000);
54
+ };
55
+ const online = () => { clearTimeout(timer); void load(true); };
56
+ window.addEventListener('online', online);
57
+ void load(true);
58
+ return () => { active = false; clearTimeout(timer); window.removeEventListener('online', online); };
59
+ }, [props.owner, uri, retry, animate, props.poster]);
60
+ const current = state?.owner === props.owner && state?.uri === uri && state.animate === animate ? state : undefined;
61
+ return _jsx("div", { className: css.previewBody, children: props.uri === undefined ? _jsx("p", { children: "\u5C1A\u672A\u8BBE\u7F6E\u5934\u50CF" }) : current?.image !== undefined ? _jsx("img", { className: css.previewImage, src: current.image, alt: "\u5934\u50CF\u5927\u56FE", draggable: false, onError: () => {
62
+ if (animate && props.poster !== undefined)
63
+ setFailed(true);
64
+ else
65
+ setState({ owner: props.owner, uri: uri, animate, loading: false });
66
+ } }) : _jsxs(_Fragment, { children: [_jsx("span", { role: "img", "aria-label": props.name, children: Array.from(props.name).slice(0, 2).join('') }), _jsx("p", { role: current === undefined ? "status" : "alert", children: current === undefined ? '正在加载头像…' : '头像加载失败,请重试。' }), _jsx("button", { type: "button", onClick: () => { setFailed(false); setRetry(value => value + 1); }, children: "\u91CD\u8BD5" })] }) });
67
+ }
68
+ //# sourceMappingURL=AwikiAvatarPreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AwikiAvatarPreview.js","sourceRoot":"","sources":["../../../src/client/AwikiAvatarPreview.tsx"],"names":[],"mappings":"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"}
@@ -99,7 +99,7 @@ export function AwikiGroupDetails(props) {
99
99
  return;
100
100
  }
101
101
  setInvite('');
102
- setInviteStatus({ state: 'success', member });
102
+ setInviteStatus({ state: 'success', member, preparing: result.value.operation?.businessCommitted === true && result.value.operation.encryptionReady !== true });
103
103
  };
104
104
  const remove = async () => {
105
105
  if (removeCandidate === null)
@@ -133,7 +133,7 @@ export function AwikiGroupDetails(props) {
133
133
  };
134
134
  const group = props.group?.groupDid === props.fallback.groupDid ? props.group : null;
135
135
  const available = props.access.status === 'available' && group !== null;
136
- return (_jsxs("aside", { className: css.groupDetails, "aria-label": "\u7FA4\u804A\u8BE6\u60C5", children: [_jsxs("header", { className: css.groupDetailsHeader, children: [_jsxs("div", { children: [_jsx("strong", { children: "\u7FA4\u804A\u8BE6\u60C5" }), _jsx("small", { children: "\u6210\u5458\u4E0E\u6743\u9650\u4EE5\u670D\u52A1\u5668\u6700\u65B0\u72B6\u6001\u4E3A\u51C6" })] }), _jsx(Tooltip, { label: "\u5173\u95ED\u7FA4\u804A\u8BE6\u60C5", side: "right", children: _jsx("button", { type: "button", "aria-label": "\u5173\u95ED\u7FA4\u804A\u8BE6\u60C5", onClick: props.onClose, children: _jsx(IconCloseOutline16, { size: 14 }) }) })] }), _jsxs("section", { className: css.groupSummary, children: [_jsx("strong", { children: group?.title ?? props.fallback.title }), _jsx("code", { title: props.fallback.groupDid, children: props.fallback.groupDid }), group?.description !== undefined && group.description !== '' && _jsx("p", { children: group.description }), available && (_jsxs("dl", { children: [_jsxs("div", { children: [_jsx("dt", { children: "\u6211\u7684\u89D2\u8272" }), _jsx("dd", { children: roleLabel(group.myRole) })] }), _jsxs("div", { children: [_jsx("dt", { children: "\u6210\u5458" }), _jsx("dd", { children: group.memberCount ?? props.members.length })] })] }))] }), !available && (_jsx(AwikiGroupAccessNotice, { access: props.access, pending: props.pending, compact: true, onRetry: () => { void refreshAccess(); }, onRejoin: () => { void rejoin(); }, ...props.onRemove === undefined ? {} : { onRemove: props.onRemove } })), available && (_jsxs(_Fragment, { children: [roleRank(group.myRole) >= 2 && (_jsxs("form", { className: css.groupInvite, onSubmit: (event) => { event.preventDefault(); void add(); }, children: [_jsx("label", { htmlFor: "awiki-group-invite", children: "\u9080\u8BF7\u6210\u5458" }), _jsxs("div", { children: [_jsx("input", { id: "awiki-group-invite", value: invite, disabled: props.pending || inviteStatus.state === 'pending', placeholder: "Handle \u6216 DID", onChange: (event) => { setInvite(event.target.value); setInviteStatus({ state: 'idle' }); } }), _jsx("button", { type: "submit", "aria-label": "\u9080\u8BF7\u7FA4\u6210\u5458", "data-busy": inviteStatus.state === 'pending' ? '' : undefined, disabled: props.pending || inviteStatus.state === 'pending' || invite.trim() === '', children: inviteStatus.state === 'pending' ? _jsx(IconLoadingOutline16, { size: 14 }) : _jsx(IconPlusOutline16, { size: 14 }) })] }), inviteStatus.state !== 'idle' && (_jsxs("p", { className: css.groupInviteStatus, "data-state": inviteStatus.state, role: inviteStatus.state === 'error' ? 'alert' : 'status', "aria-live": "polite", children: [inviteStatus.state === 'pending' && `正在邀请 ${inviteStatus.member}…`, inviteStatus.state === 'success' && `已邀请 ${inviteStatus.member}`, inviteStatus.state === 'error' && inviteStatus.message] }))] })), _jsxs("section", { className: css.groupMemberSection, children: [_jsxs("div", { className: css.groupMemberHeading, children: [_jsx("strong", { children: "\u7FA4\u6210\u5458" }), _jsx(Tooltip, { label: memberRefreshStatus.state === 'pending' ? '正在刷新群成员' : '刷新群成员', side: "right", children: _jsx("button", { type: "button", "aria-label": memberRefreshStatus.state === 'pending' ? '正在刷新群成员' : '刷新群成员', "data-busy": memberRefreshStatus.state === 'pending' ? '' : undefined, disabled: props.pending || memberRefreshStatus.state === 'pending', onClick: () => { void refreshMembers(); }, children: memberRefreshStatus.state === 'pending'
136
+ return (_jsxs("aside", { className: css.groupDetails, "aria-label": "\u7FA4\u804A\u8BE6\u60C5", children: [_jsxs("header", { className: css.groupDetailsHeader, children: [_jsxs("div", { children: [_jsx("strong", { children: "\u7FA4\u804A\u8BE6\u60C5" }), _jsx("small", { children: "\u6210\u5458\u4E0E\u6743\u9650\u4EE5\u670D\u52A1\u5668\u6700\u65B0\u72B6\u6001\u4E3A\u51C6" })] }), _jsx(Tooltip, { label: "\u5173\u95ED\u7FA4\u804A\u8BE6\u60C5", side: "right", children: _jsx("button", { type: "button", "aria-label": "\u5173\u95ED\u7FA4\u804A\u8BE6\u60C5", onClick: props.onClose, children: _jsx(IconCloseOutline16, { size: 14 }) }) })] }), _jsxs("section", { className: css.groupSummary, children: [_jsx("strong", { children: group?.title ?? props.fallback.title }), _jsx("code", { title: props.fallback.groupDid, children: props.fallback.groupDid }), group?.description !== undefined && group.description !== '' && _jsx("p", { children: group.description }), available && (_jsxs("dl", { children: [_jsxs("div", { children: [_jsx("dt", { children: "\u6211\u7684\u89D2\u8272" }), _jsx("dd", { children: roleLabel(group.myRole) })] }), _jsxs("div", { children: [_jsx("dt", { children: "\u6210\u5458" }), _jsx("dd", { children: group.memberCount ?? props.members.length })] })] }))] }), !available && (_jsx(AwikiGroupAccessNotice, { access: props.access, pending: props.pending, compact: true, onRetry: () => { void refreshAccess(); }, onRejoin: () => { void rejoin(); }, ...props.onRemove === undefined ? {} : { onRemove: props.onRemove } })), available && (_jsxs(_Fragment, { children: [roleRank(group.myRole) >= 2 && (_jsxs("form", { className: css.groupInvite, onSubmit: (event) => { event.preventDefault(); void add(); }, children: [_jsx("label", { htmlFor: "awiki-group-invite", children: "\u9080\u8BF7\u6210\u5458" }), _jsxs("div", { children: [_jsx("input", { id: "awiki-group-invite", value: invite, disabled: props.pending || inviteStatus.state === 'pending', placeholder: "Handle \u6216 DID", onChange: (event) => { setInvite(event.target.value); setInviteStatus({ state: 'idle' }); } }), _jsx("button", { type: "submit", "aria-label": "\u9080\u8BF7\u7FA4\u6210\u5458", "data-busy": inviteStatus.state === 'pending' ? '' : undefined, disabled: props.pending || inviteStatus.state === 'pending' || invite.trim() === '', children: inviteStatus.state === 'pending' ? _jsx(IconLoadingOutline16, { size: 14 }) : _jsx(IconPlusOutline16, { size: 14 }) })] }), inviteStatus.state !== 'idle' && (_jsxs("p", { className: css.groupInviteStatus, "data-state": inviteStatus.state, role: inviteStatus.state === 'error' ? 'alert' : 'status', "aria-live": "polite", children: [inviteStatus.state === 'pending' && `正在邀请 ${inviteStatus.member}…`, inviteStatus.state === 'success' && `${inviteStatus.member}:${inviteStatus.preparing ? '已加入,正在完成加密准备' : '已加入'}`, inviteStatus.state === 'error' && inviteStatus.message] }))] })), _jsxs("section", { className: css.groupMemberSection, children: [_jsxs("div", { className: css.groupMemberHeading, children: [_jsx("strong", { children: "\u7FA4\u6210\u5458" }), _jsx(Tooltip, { label: memberRefreshStatus.state === 'pending' ? '正在刷新群成员' : '刷新群成员', side: "right", children: _jsx("button", { type: "button", "aria-label": memberRefreshStatus.state === 'pending' ? '正在刷新群成员' : '刷新群成员', "data-busy": memberRefreshStatus.state === 'pending' ? '' : undefined, disabled: props.pending || memberRefreshStatus.state === 'pending', onClick: () => { void refreshMembers(); }, children: memberRefreshStatus.state === 'pending'
137
137
  ? _jsx(IconLoadingOutline16, { size: 14 })
138
138
  : _jsx(IconRefreshOutline16, { size: 14 }) }) })] }), memberRefreshStatus.state !== 'idle' && (_jsxs("p", { className: css.groupMemberRefreshStatus, "data-state": memberRefreshStatus.state, role: memberRefreshStatus.state === 'error' ? 'alert' : 'status', "aria-live": "polite", children: [memberRefreshStatus.state === 'pending' && '正在刷新群成员…', memberRefreshStatus.state === 'success' && '群成员已更新', memberRefreshStatus.state === 'error' && `刷新失败:${memberRefreshStatus.message}`] })), _jsxs("div", { className: css.groupMemberList, children: [props.members.map((member, index) => {
139
139
  const { label, detail } = memberPresentation(member, props.identity);