@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.
- package/README.md +4 -0
- package/THIRD_PARTY_NOTICES.md +6 -0
- package/lib/client.js +3543 -746
- package/lib/client.js.map +1 -1
- package/lib/index.js +218 -41
- package/lib/{sdk-adapter-DGcTiEZz.mjs → package-version.generated-D0MSDRZn.mjs} +83 -10
- package/lib/provider.js +5 -3
- package/lib/typert.host.js +481 -127
- package/lib/typert.remote-client.d.ts +9 -3
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +481 -127
- package/lib/types/client/AwikiAvatar.d.ts +40 -0
- package/lib/types/client/AwikiAvatar.d.ts.map +1 -0
- package/lib/types/client/AwikiAvatar.js +201 -0
- package/lib/types/client/AwikiAvatar.js.map +1 -0
- package/lib/types/client/AwikiAvatarEditor.d.ts +11 -0
- package/lib/types/client/AwikiAvatarEditor.d.ts.map +1 -0
- package/lib/types/client/AwikiAvatarEditor.js +113 -0
- package/lib/types/client/AwikiAvatarEditor.js.map +1 -0
- package/lib/types/client/AwikiAvatarPreview.d.ts +8 -0
- package/lib/types/client/AwikiAvatarPreview.d.ts.map +1 -0
- package/lib/types/client/AwikiAvatarPreview.js +68 -0
- package/lib/types/client/AwikiAvatarPreview.js.map +1 -0
- package/lib/types/client/AwikiGroupDetails.js +2 -2
- package/lib/types/client/AwikiGroupDetails.js.map +1 -1
- package/lib/types/client/AwikiIdentityAccess.d.ts +1 -0
- package/lib/types/client/AwikiIdentityAccess.d.ts.map +1 -1
- package/lib/types/client/AwikiIdentityAccess.js +10 -2
- package/lib/types/client/AwikiIdentityAccess.js.map +1 -1
- package/lib/types/client/AwikiOverlay.d.ts.map +1 -1
- package/lib/types/client/AwikiOverlay.js +92 -27
- package/lib/types/client/AwikiOverlay.js.map +1 -1
- package/lib/types/client/AwikiProfileCard.d.ts +1 -1
- package/lib/types/client/AwikiProfileCard.d.ts.map +1 -1
- package/lib/types/client/AwikiProfileCard.js +6 -2
- package/lib/types/client/AwikiProfileCard.js.map +1 -1
- package/lib/types/client/avatar-cache.d.ts +24 -0
- package/lib/types/client/avatar-cache.d.ts.map +1 -0
- package/lib/types/client/avatar-cache.js +336 -0
- package/lib/types/client/avatar-cache.js.map +1 -0
- package/lib/types/client/avatar-dialog.d.ts +3 -0
- package/lib/types/client/avatar-dialog.d.ts.map +1 -0
- package/lib/types/client/avatar-dialog.js +18 -0
- package/lib/types/client/avatar-dialog.js.map +1 -0
- package/lib/types/client/avatar-image.d.ts +26 -0
- package/lib/types/client/avatar-image.d.ts.map +1 -0
- package/lib/types/client/avatar-image.js +193 -0
- package/lib/types/client/avatar-image.js.map +1 -0
- package/lib/types/client/controller.d.ts +30 -4
- package/lib/types/client/controller.d.ts.map +1 -1
- package/lib/types/client/controller.js +267 -56
- package/lib/types/client/controller.js.map +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +10 -2
- package/lib/types/client/index.js.map +1 -1
- package/lib/types/client/slots.d.ts +12 -3
- package/lib/types/client/slots.d.ts.map +1 -1
- package/lib/types/conversation-preferences.d.ts.map +1 -1
- package/lib/types/conversation-preferences.js +27 -0
- package/lib/types/conversation-preferences.js.map +1 -1
- package/lib/types/index.d.ts +8 -2
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +76 -11
- package/lib/types/index.js.map +1 -1
- package/lib/types/listener.d.ts.map +1 -1
- package/lib/types/listener.js +9 -8
- package/lib/types/listener.js.map +1 -1
- package/lib/types/package-version.generated.d.ts +2 -2
- package/lib/types/package-version.generated.js +2 -2
- package/lib/types/provider-api.d.ts +9 -3
- package/lib/types/provider-api.d.ts.map +1 -1
- package/lib/types/provider.d.ts.map +1 -1
- package/lib/types/provider.js +5 -2
- package/lib/types/provider.js.map +1 -1
- package/lib/types/sdk-adapter.d.ts +6 -3
- package/lib/types/sdk-adapter.d.ts.map +1 -1
- package/lib/types/sdk-adapter.js +58 -7
- package/lib/types/sdk-adapter.js.map +1 -1
- package/lib/types/tenant-registry.d.ts +2 -0
- package/lib/types/tenant-registry.d.ts.map +1 -1
- package/lib/types/tenant-registry.js +83 -16
- package/lib/types/tenant-registry.js.map +1 -1
- package/lib/types/types.d.ts +63 -7
- package/lib/types/types.d.ts.map +1 -1
- package/lib/types/types.js.map +1 -1
- package/lib/types/update-policy.d.ts +2 -2
- 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":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAA;AAE7D,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAmB,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,GAAG,MAAM,0BAA0B,CAAA;AAE1C,MAAM,UAAU,kBAAkB,CAAC,KAA8G;IAC/I,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvC,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;IACrD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAC3E,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IAC/B,SAAS,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IAC7E,SAAS,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IAChE,OAAO,8BACJ,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,KAAC,WAAW,OAAK,KAAK,GAAI,CAAC,CAAC,CAAC,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,CAAC,YAAY,gBAAc,KAAK,KAAK,CAAC,IAAI,KAAK,EAAE,KAAK,EAAC,0BAAM,EACjJ,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC,YAAE,KAAC,WAAW,OAAK,KAAK,GAAI,GAAS,EACxG,IAAI,IAAI,KAAC,KAAK,IAAC,IAAI,QAAC,KAAK,EAAC,cAAI,EAAC,UAAU,EAAC,0BAAM,EAAC,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,YACjF,KAAC,gBAAgB,IAAC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,GAAI,GAC3I,IACP,CAAA;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA6G;IACrI,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACrC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAkG,CAAA;IACpI,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,kCAAkC,CAAC,CAAA;QACrE,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAA,CAAC,CAAC,CAAA;QAC5F,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAAC,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAA;QAC1G,OAAO,GAAG,EAAE,GAAG,KAAK,EAAE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAA,CAAC,CAAC,CAAA;IACzH,CAAC,EAAE,EAAE,CAAC,CAAA;IACN,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,MAAM,IAAI,CAAC,MAAM,CAAA;IAClD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAA;IAC3D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;QACvB,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,OAAM;QAC7C,IAAI,MAAM,GAAG,IAAI,CAAA;QACjB,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,KAAgD,CAAA;QACpD,MAAM,IAAI,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE;YACnC,IAAI,CAAC,MAAM,IAAI,OAAO;gBAAE,OAAM;YAC9B,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,OAAO,GAAG,IAAI,CAAA;YACd,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YAC5F,OAAO,GAAG,KAAK,CAAA;YACf,IAAI,CAAC,MAAM;gBAAE,OAAM;YACnB,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAAC,OAAM;YAAC,CAAC;YAC7F,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,KAAK,IAAI,QAAQ,CAAC,GAAG,KAAK,GAAG,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;YACjM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,EAAE,CAAA,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;QACpD,CAAC,CAAA;QACD,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC,CAAA;QAC7D,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QACzC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAA;QACf,OAAO,GAAG,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA,CAAC,CAAC,CAAA;IACpG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;IACpD,MAAM,OAAO,GAAG,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,KAAK,EAAE,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IACnH,OAAO,cAAK,SAAS,EAAE,GAAG,CAAC,WAAW,YACnC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,+DAAa,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,cAAK,SAAS,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAC,0BAAM,EAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE;gBACzK,IAAI,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;oBAAE,SAAS,CAAC,IAAI,CAAC,CAAA;;oBACrD,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;YAC3E,CAAC,GAAI,CAAC,CAAC,CAAC,8BAAE,eAAM,IAAI,EAAC,KAAK,gBAAa,KAAK,CAAC,IAAI,YAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAQ,EACrG,YAAG,IAAI,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,YAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,GAAK,EAC5G,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA,CAAC,CAAC,6BAAa,IAAG,GACrG,CAAA;AACR,CAAC"}
|
|
@@ -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' &&
|
|
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);
|