@hkyhy/marsun-components-core 0.1.126 → 0.1.127

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.
@@ -1,22 +1,22 @@
1
- import { jsxs as m, jsx as r } from "react/jsx-runtime";
2
- import { Badge as xe, Button as I, Drawer as Ce, Space as ue, Checkbox as J, notification as me, message as pe } from "antd";
3
- import S from "classnames";
4
- import { forwardRef as Pe, useState as g, useRef as E, useMemo as fe, useCallback as O, useImperativeHandle as Re, useEffect as b } from "react";
5
- import { sanitizeInboxHtml as Ae } from "../sanitizeInboxHtml.js";
6
- import { INBOX_BADGE_REFRESH_EVENT as ye } from "../requestInboxBadgeRefresh.js";
7
- import { emphasizeQuoted as H } from "./emphasizeQuoted.js";
8
- import { filterInboxActionsForHost as De, resolveInboxItemActions as _e, isInboxButtonDriven as Me } from "./inboxItemActions.js";
9
- import { inboxSceneLabel as vt, isTerminalActionStatus as bt, normalizeInboxActions as Tt, resolveInboxSceneKey as wt } from "./inboxItemActions.js";
1
+ import { jsxs as u, jsx as r } from "react/jsx-runtime";
2
+ import { notification as fe, Button as H, Badge as xe, Drawer as Ce, Space as pe, Checkbox as Z, message as ye } from "antd";
3
+ import B from "classnames";
4
+ import { forwardRef as Pe, useState as m, useRef as g, useMemo as ge, useCallback as k, useImperativeHandle as Re, useEffect as h } from "react";
5
+ import { sanitizeInboxHtml as De } from "../sanitizeInboxHtml.js";
6
+ import { INBOX_BADGE_REFRESH_EVENT as he } from "../requestInboxBadgeRefresh.js";
7
+ import { emphasizeQuoted as F } from "./emphasizeQuoted.js";
8
+ import { filterInboxActionsForHost as _e, resolveInboxItemActions as Ae, isInboxButtonDriven as Me } from "./inboxItemActions.js";
9
+ import { inboxSceneLabel as bt, isTerminalActionStatus as Tt, normalizeInboxActions as wt, resolveInboxSceneKey as Nt } from "./inboxItemActions.js";
10
10
  import { loadInboxToastPrefs as Ie, shouldToastForMessageType as Oe, saveInboxToastPrefs as He } from "./toastPrefs.js";
11
11
  import { DEFAULT_INBOX_TOAST_PREFS as St } from "./toastPrefs.js";
12
12
  import n from "./style.module.scss.js";
13
+ import U, { SEMANTIC_COLORS as R } from "../../../Tag/SemanticTag.js";
13
14
  import { Bell as Fe } from "../../../Icons/Bell.js";
14
15
  import Ue from "../../../StateBar/StateBar.js";
15
16
  import ze from "../../../SegmentedRadio/SegmentedRadio.js";
16
17
  import Ge from "../../../Layout/PageSpin/index.js";
17
18
  import Ke from "../../../Empty/Empty.js";
18
19
  import $e from "../../../VirtualScrollbar/VirtualScrollbar/index.js";
19
- import F, { SEMANTIC_COLORS as x } from "../../../Tag/SemanticTag.js";
20
20
  const je = [
21
21
  { key: "", label: "全部" },
22
22
  { key: "alert", label: "预警" },
@@ -26,267 +26,278 @@ const je = [
26
26
  alert: "预警",
27
27
  action: "行动",
28
28
  remind: "提醒"
29
- }, We = 300, Qe = 72;
30
- function ge(u) {
31
- const a = String(u || "").trim().toLowerCase();
32
- return a ? Ve[a] || a : "";
29
+ }, We = 300, Qe = 1500, Xe = 72;
30
+ function ve(d) {
31
+ const s = String(d || "").trim().toLowerCase();
32
+ return s ? Ve[s] || s : "";
33
33
  }
34
- function q(u) {
35
- const a = String(u || "").trim().toLowerCase();
36
- return a === "alert" ? x.DANGER : a === "action" ? x.PRIMARY : a === "remind" ? x.WARNING : x.DEFAULT;
34
+ function ee(d) {
35
+ const s = String(d || "").trim().toLowerCase();
36
+ return s === "alert" ? R.DANGER : s === "action" ? R.PRIMARY : s === "remind" ? R.WARNING : R.DEFAULT;
37
37
  }
38
- function Xe(u) {
39
- return [u.factory, u.variety, u.metric].map((a) => String(a || "").trim()).filter(Boolean).join(" · ");
38
+ function Ye(d) {
39
+ return [d.factory, d.variety, d.metric].map((s) => String(s || "").trim()).filter(Boolean).join(" · ");
40
40
  }
41
- function Ye(u) {
42
- return String(u || "").trim() || x.DEFAULT;
41
+ function Je(d) {
42
+ return String(d || "").trim() || R.DEFAULT;
43
43
  }
44
- function Je(u) {
44
+ function qe(d) {
45
45
  try {
46
- const a = JSON.parse(u);
47
- if (!a || typeof a != "object") return null;
48
- const C = String(a.messageType || a.message_type || "").trim(), L = String(a.title || "").trim(), T = String(a.summary || "").trim();
49
- return !C && !L && !T ? null : {
50
- messageType: C || void 0,
51
- title: L || void 0,
52
- summary: T || void 0
46
+ const s = JSON.parse(d);
47
+ if (!s || typeof s != "object") return null;
48
+ const D = String(s.messageType || s.message_type || "").trim(), x = String(s.title || "").trim(), E = String(s.summary || "").trim();
49
+ return !D && !x && !E ? null : {
50
+ messageType: D || void 0,
51
+ title: x || void 0,
52
+ summary: E || void 0
53
53
  };
54
54
  } catch {
55
55
  return null;
56
56
  }
57
57
  }
58
- const yt = Pe(function({
59
- fetchInbox: a,
60
- markRead: C,
61
- onNavigate: L,
62
- pollMs: T = 0,
63
- locationKey: Z,
64
- pageSize: h = 20,
65
- className: he,
66
- title: ve = "站内信",
67
- streamPath: U = "/api/v1/msg-center/inbox/stream",
68
- getAccessToken: z,
69
- onItemAction: ee
70
- }, be) {
71
- const [G, w] = g(!1), [te, ne] = g(!1), [K, re] = g(""), [P, R] = g([]), [k, A] = g(0), [ae, $] = g({}), [j, Te] = g(""), [D, we] = g("all"), [B, Ne] = g(() => Ie()), [Se, oe] = g(!1), v = E(null), se = E(!1), le = E(B);
72
- le.current = B;
73
- const V = E(1), W = E(!1), N = E(!1), _ = fe(
58
+ const gt = Pe(function({
59
+ fetchInbox: s,
60
+ markRead: D,
61
+ onNavigate: x,
62
+ pollMs: E = 0,
63
+ locationKey: te,
64
+ pageSize: v = 20,
65
+ className: be,
66
+ title: Te = "站内信",
67
+ streamPath: z = "/api/v1/msg-center/inbox/stream",
68
+ getAccessToken: G,
69
+ onItemAction: ne
70
+ }, we) {
71
+ const [K, S] = m(!1), [re, ae] = m(!1), [$, oe] = m(""), [_, A] = m([]), [C, M] = m(0), [se, j] = m({}), [V, Ne] = m(""), [I, Ee] = m("all"), [P, Se] = m(() => Ie()), [Le, le] = m(!1), b = g(null), T = g(null), W = g(null), ie = g(!1), ce = g(P);
72
+ ce.current = P;
73
+ const Q = g(1), X = g(!1), L = g(!1), O = ge(
74
74
  () => ({
75
- messageType: j || void 0,
76
- unreadOnly: D === "unread" || void 0,
77
- readOnly: D === "read" || void 0
75
+ messageType: V || void 0,
76
+ unreadOnly: I === "unread" || void 0,
77
+ readOnly: I === "read" || void 0
78
78
  }),
79
- [j, D]
80
- ), Q = O(async () => {
81
- ne(!0), re(""), V.current = 1, N.current = !1;
79
+ [V, I]
80
+ ), Y = k(async () => {
81
+ ae(!0), oe(""), Q.current = 1, L.current = !1;
82
82
  try {
83
- const e = await a({
83
+ const e = await s({
84
84
  currentPage: 1,
85
- pageSize: h,
86
- ..._
87
- }), t = (e == null ? void 0 : e.pageData) || [], s = typeof (e == null ? void 0 : e.total) == "number" ? e.total : t.length;
88
- R(t), N.current = t.length > 0 && t.length < s, A(typeof (e == null ? void 0 : e.unreadTotal) == "number" ? e.unreadTotal : 0), $((e == null ? void 0 : e.unreadByMessageType) || {});
85
+ pageSize: v,
86
+ ...O
87
+ }), t = (e == null ? void 0 : e.pageData) || [], o = typeof (e == null ? void 0 : e.total) == "number" ? e.total : t.length;
88
+ A(t), L.current = t.length > 0 && t.length < o, M(typeof (e == null ? void 0 : e.unreadTotal) == "number" ? e.unreadTotal : 0), j((e == null ? void 0 : e.unreadByMessageType) || {});
89
89
  } catch (e) {
90
- R([]), N.current = !1, re(e instanceof Error ? e.message : String(e));
90
+ A([]), L.current = !1, oe(e instanceof Error ? e.message : String(e));
91
91
  } finally {
92
- ne(!1);
92
+ ae(!1);
93
93
  }
94
- }, [a, h, _]), ie = O(async () => {
95
- if (!(W.current || !N.current)) {
96
- W.current = !0, oe(!0);
94
+ }, [s, v, O]), de = k(async () => {
95
+ if (!(X.current || !L.current)) {
96
+ X.current = !0, le(!0);
97
97
  try {
98
- const e = V.current + 1, t = await a({
98
+ const e = Q.current + 1, t = await s({
99
99
  currentPage: e,
100
- pageSize: h,
101
- ..._
102
- }), s = (t == null ? void 0 : t.pageData) || [], o = typeof (t == null ? void 0 : t.total) == "number" ? t.total : 0;
103
- R((i) => {
104
- const p = new Set(i.map((f) => f.id)), c = s.filter((f) => (f == null ? void 0 : f.id) && !p.has(f.id)), d = c.length ? [...i, ...c] : i;
105
- return N.current = c.length > 0 && (o > 0 ? d.length < o : c.length >= h), d;
106
- }), s.length && (V.current = e), typeof (t == null ? void 0 : t.unreadTotal) == "number" && A(t.unreadTotal), t != null && t.unreadByMessageType && $(t.unreadByMessageType);
100
+ pageSize: v,
101
+ ...O
102
+ }), o = (t == null ? void 0 : t.pageData) || [], a = typeof (t == null ? void 0 : t.total) == "number" ? t.total : 0;
103
+ A((l) => {
104
+ const c = new Set(l.map((y) => y.id)), i = o.filter((y) => (y == null ? void 0 : y.id) && !c.has(y.id)), w = i.length ? [...l, ...i] : l;
105
+ return L.current = i.length > 0 && (a > 0 ? w.length < a : i.length >= v), w;
106
+ }), o.length && (Q.current = e), typeof (t == null ? void 0 : t.unreadTotal) == "number" && M(t.unreadTotal), t != null && t.unreadByMessageType && j(t.unreadByMessageType);
107
107
  } catch {
108
- N.current = !1;
108
+ L.current = !1;
109
109
  } finally {
110
- W.current = !1, oe(!1);
110
+ X.current = !1, le(!1);
111
111
  }
112
112
  }
113
- }, [a, h, _]), Ee = O(
113
+ }, [s, v, O]), Be = k(
114
114
  (e) => {
115
115
  const t = e.currentTarget;
116
- t.scrollHeight - t.scrollTop - t.clientHeight <= Qe && ie();
116
+ t.scrollHeight - t.scrollTop - t.clientHeight <= Xe && de();
117
117
  },
118
- [ie]
119
- ), l = O(async () => {
118
+ [de]
119
+ ), f = k(async () => {
120
120
  try {
121
- const e = await a({ currentPage: 1, pageSize: h });
122
- A(typeof (e == null ? void 0 : e.unreadTotal) == "number" ? e.unreadTotal : 0), $((e == null ? void 0 : e.unreadByMessageType) || {});
121
+ const e = await s({ currentPage: 1, pageSize: v });
122
+ M(typeof (e == null ? void 0 : e.unreadTotal) == "number" ? e.unreadTotal : 0), j((e == null ? void 0 : e.unreadByMessageType) || {});
123
123
  } catch {
124
124
  }
125
- }, [a, h]);
126
- Re(be, () => ({ refreshBadge: l }), [l]), b(() => {
127
- l();
128
- }, [l]), b(() => {
129
- if (Z !== void 0) {
130
- if (!se.current) {
131
- se.current = !0;
125
+ }, [s, v]), ue = k(() => {
126
+ const e = W.current;
127
+ if (W.current = null, !e || !Oe(ce.current, e.messageType)) return;
128
+ const t = e.title || "新站内信", o = e.summary || "", a = ve(e.messageType), l = () => {
129
+ fe.destroy(), S(!0);
130
+ }, c = `inbox-badge-${e.messageType || "msg"}-${Date.now()}`;
131
+ fe.open({
132
+ key: c,
133
+ className: B("marsun-inbox-toast", n.toastNotice),
134
+ closable: !0,
135
+ title: /* @__PURE__ */ u("div", { className: n.toastHead, children: [
136
+ /* @__PURE__ */ r("span", { className: n.toastTitle, children: F(t) }),
137
+ a ? /* @__PURE__ */ r(
138
+ U,
139
+ {
140
+ color: ee(e.messageType),
141
+ className: n.typeTag,
142
+ children: a
143
+ }
144
+ ) : null
145
+ ] }),
146
+ message: /* @__PURE__ */ u("div", { className: n.toastHead, children: [
147
+ /* @__PURE__ */ r("span", { className: n.toastTitle, children: F(t) }),
148
+ a ? /* @__PURE__ */ r(
149
+ U,
150
+ {
151
+ color: ee(e.messageType),
152
+ className: n.typeTag,
153
+ children: a
154
+ }
155
+ ) : null
156
+ ] }),
157
+ description: /* @__PURE__ */ u("div", { className: n.toastBody, children: [
158
+ o ? /* @__PURE__ */ r("div", { className: n.toastDesc, children: F(o) }) : null,
159
+ /* @__PURE__ */ r("div", { className: n.toastActions, children: /* @__PURE__ */ r(
160
+ H,
161
+ {
162
+ type: "primary",
163
+ size: "small",
164
+ onClick: (i) => {
165
+ i.stopPropagation(), l();
166
+ },
167
+ children: "查看"
168
+ }
169
+ ) })
170
+ ] }),
171
+ placement: "topRight",
172
+ duration: 6,
173
+ onClick: l
174
+ });
175
+ }, []), p = k(
176
+ (e) => {
177
+ e && (W.current = e), T.current != null && window.clearTimeout(T.current), T.current = window.setTimeout(() => {
178
+ T.current = null, f(), ue();
179
+ }, Qe);
180
+ },
181
+ [f, ue]
182
+ );
183
+ Re(we, () => ({ refreshBadge: f }), [f]), h(() => {
184
+ f();
185
+ }, [f]), h(() => {
186
+ if (te !== void 0) {
187
+ if (!ie.current) {
188
+ ie.current = !0;
132
189
  return;
133
190
  }
134
- l();
191
+ p();
135
192
  }
136
- }, [Z, l]), b(() => {
137
- if (T <= 0) return;
193
+ }, [te, p]), h(() => {
194
+ if (E <= 0) return;
138
195
  const e = window.setInterval(() => {
139
- l();
140
- }, T);
196
+ f();
197
+ }, E);
141
198
  return () => window.clearInterval(e);
142
- }, [T, l]), b(() => {
199
+ }, [E, f]), h(() => {
143
200
  const e = () => {
144
- v.current != null && window.clearTimeout(v.current), v.current = window.setTimeout(() => {
145
- v.current = null, l();
201
+ b.current != null && window.clearTimeout(b.current), b.current = window.setTimeout(() => {
202
+ b.current = null, p();
146
203
  }, We);
147
204
  }, t = () => {
148
205
  document.visibilityState === "visible" && e();
149
206
  };
150
207
  return window.addEventListener("focus", e), document.addEventListener("visibilitychange", t), () => {
151
- window.removeEventListener("focus", e), document.removeEventListener("visibilitychange", t), v.current != null && (window.clearTimeout(v.current), v.current = null);
208
+ window.removeEventListener("focus", e), document.removeEventListener("visibilitychange", t), b.current != null && (window.clearTimeout(b.current), b.current = null);
152
209
  };
153
- }, [l]), b(() => {
210
+ }, [p]), h(() => {
154
211
  const e = () => {
155
- l();
212
+ p();
156
213
  };
157
- return window.addEventListener(ye, e), () => window.removeEventListener(ye, e);
158
- }, [l]), b(() => {
159
- if (U === !1 || typeof z != "function" || typeof window > "u" || typeof EventSource > "u") return;
160
- const e = String(z() || "").trim();
214
+ return window.addEventListener(he, e), () => window.removeEventListener(he, e);
215
+ }, [p]), h(() => () => {
216
+ T.current != null && (window.clearTimeout(T.current), T.current = null);
217
+ }, []), h(() => {
218
+ if (z === !1 || typeof G != "function" || typeof window > "u" || typeof EventSource > "u") return;
219
+ const e = String(G() || "").trim();
161
220
  if (!e) return;
162
- const t = String(U || "/api/v1/msg-center/inbox/stream").trim(), s = new URL(t, window.location.origin);
163
- s.searchParams.set("access_token", e);
164
- let o;
221
+ const t = String(z || "/api/v1/msg-center/inbox/stream").trim(), o = new URL(t, window.location.origin);
222
+ o.searchParams.set("access_token", e);
223
+ let a;
165
224
  try {
166
- o = new EventSource(s.toString());
225
+ a = new EventSource(o.toString());
167
226
  } catch {
168
227
  return;
169
228
  }
170
- const i = (p) => {
171
- l();
172
- const c = p, d = typeof (c == null ? void 0 : c.data) == "string" ? Je(c.data) : null;
173
- if (!d || !Oe(le.current, d.messageType)) return;
174
- const f = d.title || "新站内信", y = d.summary || "", M = ge(d.messageType), de = () => {
175
- me.destroy(), w(!0);
176
- }, ke = `inbox-badge-${d.messageType || "msg"}-${Date.now()}`;
177
- me.open({
178
- key: ke,
179
- className: S("marsun-inbox-toast", n.toastNotice),
180
- closable: !0,
181
- title: /* @__PURE__ */ m("div", { className: n.toastHead, children: [
182
- /* @__PURE__ */ r("span", { className: n.toastTitle, children: H(f) }),
183
- M ? /* @__PURE__ */ r(
184
- F,
185
- {
186
- color: q(d.messageType),
187
- className: n.typeTag,
188
- children: M
189
- }
190
- ) : null
191
- ] }),
192
- message: /* @__PURE__ */ m("div", { className: n.toastHead, children: [
193
- /* @__PURE__ */ r("span", { className: n.toastTitle, children: H(f) }),
194
- M ? /* @__PURE__ */ r(
195
- F,
196
- {
197
- color: q(d.messageType),
198
- className: n.typeTag,
199
- children: M
200
- }
201
- ) : null
202
- ] }),
203
- description: /* @__PURE__ */ m("div", { className: n.toastBody, children: [
204
- y ? /* @__PURE__ */ r("div", { className: n.toastDesc, children: H(y) }) : null,
205
- /* @__PURE__ */ r("div", { className: n.toastActions, children: /* @__PURE__ */ r(
206
- I,
207
- {
208
- type: "primary",
209
- size: "small",
210
- onClick: (Be) => {
211
- Be.stopPropagation(), de();
212
- },
213
- children: "查看"
214
- }
215
- ) })
216
- ] }),
217
- placement: "topRight",
218
- duration: 6,
219
- onClick: de
220
- });
229
+ const l = (c) => {
230
+ const i = c, w = typeof (i == null ? void 0 : i.data) == "string" ? qe(i.data) : null;
231
+ p(w);
221
232
  };
222
- return o.addEventListener("badge", i), o.addEventListener("inbox", i), o.onerror = () => {
223
- o.close();
233
+ return a.addEventListener("badge", l), a.addEventListener("inbox", l), a.onerror = () => {
234
+ a.close();
224
235
  }, () => {
225
- o.removeEventListener("badge", i), o.removeEventListener("inbox", i), o.close();
236
+ a.removeEventListener("badge", l), a.removeEventListener("inbox", l), a.close();
226
237
  };
227
- }, [U, z, l]), b(() => {
228
- G && Q();
229
- }, [G, Q]);
230
- const Le = fe(
238
+ }, [z, G, p]), h(() => {
239
+ K && Y();
240
+ }, [K, Y]);
241
+ const ke = ge(
231
242
  () => je.map((e) => {
232
- const t = e.key ? ae[e.key] || 0 : k;
243
+ const t = e.key ? se[e.key] || 0 : C;
233
244
  return {
234
245
  key: e.key || "all",
235
246
  label: t > 0 ? `${e.label} (${t})` : e.label
236
247
  };
237
248
  }),
238
- [ae, k]
239
- ), X = (e, t) => {
240
- Ne((s) => {
241
- const o = { ...s, [e]: t };
242
- return He(o), o;
249
+ [se, C]
250
+ ), J = (e, t) => {
251
+ Se((o) => {
252
+ const a = { ...o, [e]: t };
253
+ return He(a), a;
243
254
  });
244
- }, Y = async (e, t) => {
255
+ }, q = async (e, t) => {
245
256
  if (!e.read)
246
257
  try {
247
- await C(e.id), R((o) => o.map((i) => i.id === e.id ? { ...i, read: !0 } : i)), A((o) => Math.max(0, o - 1));
248
- } catch (o) {
249
- pe.error(o instanceof Error ? o.message : "标记已读失败");
258
+ await D(e.id), A((a) => a.map((l) => l.id === e.id ? { ...l, read: !0 } : l)), M((a) => Math.max(0, a - 1));
259
+ } catch (a) {
260
+ ye.error(a instanceof Error ? a.message : "标记已读失败");
250
261
  return;
251
262
  }
252
- const s = String(e.href || "").trim();
253
- if (s) {
254
- if (L) {
255
- L(s, e), w(!1);
263
+ const o = String(e.href || "").trim();
264
+ if (o) {
265
+ if (x) {
266
+ x(o, e), S(!1);
256
267
  return;
257
268
  }
258
- s.startsWith("http://") || s.startsWith("https://") ? window.open(s, "_blank", "noopener,noreferrer") : window.location.assign(s), w(!1);
269
+ o.startsWith("http://") || o.startsWith("https://") ? window.open(o, "_blank", "noopener,noreferrer") : window.location.assign(o), S(!1);
259
270
  }
260
- }, ce = async (e, t) => {
271
+ }, me = async (e, t) => {
261
272
  if (!t.disabled) {
262
- if (ee) {
273
+ if (ne) {
263
274
  try {
264
- await ee(t.kind, e), w(!1), Q(), l();
265
- } catch (s) {
266
- pe.error(s instanceof Error ? s.message : "操作失败");
275
+ await ne(t.kind, e), S(!1), Y(), f();
276
+ } catch (o) {
277
+ ye.error(o instanceof Error ? o.message : "操作失败");
267
278
  }
268
279
  return;
269
280
  }
270
- await Y(e);
281
+ await q(e);
271
282
  }
272
283
  };
273
- return /* @__PURE__ */ m("div", { className: S(n.bellWrap, he), children: [
274
- /* @__PURE__ */ r(xe, { count: k, size: "small", overflowCount: 99, offset: [-4, 4], children: /* @__PURE__ */ r(
275
- I,
284
+ return /* @__PURE__ */ u("div", { className: B(n.bellWrap, be), children: [
285
+ /* @__PURE__ */ r(xe, { count: C, size: "small", overflowCount: 99, offset: [-4, 4], children: /* @__PURE__ */ r(
286
+ H,
276
287
  {
277
288
  type: "text",
278
289
  className: n.bellBtn,
279
290
  icon: /* @__PURE__ */ r(Fe, { size: 16, "aria-hidden": !0 }),
280
- "aria-label": k > 0 ? `站内信,${k} 条未读` : "站内信",
281
- onClick: () => w(!0)
291
+ "aria-label": C > 0 ? `站内信,${C} 条未读` : "站内信",
292
+ onClick: () => S(!0)
282
293
  }
283
294
  ) }),
284
- /* @__PURE__ */ m(
295
+ /* @__PURE__ */ u(
285
296
  Ce,
286
297
  {
287
- title: ve,
288
- open: G,
289
- onClose: () => w(!1),
298
+ title: Te,
299
+ open: K,
300
+ onClose: () => S(!1),
290
301
  size: 420,
291
302
  destroyOnClose: !1,
292
303
  className: n.drawer,
@@ -300,9 +311,9 @@ const yt = Pe(function({
300
311
  {
301
312
  className: n.typeTabs,
302
313
  size: "small",
303
- activeKey: j || "all",
304
- onChange: (e) => Te(e === "all" ? "" : e),
305
- stateOption: Le,
314
+ activeKey: V || "all",
315
+ onChange: (e) => Ne(e === "all" ? "" : e),
316
+ stateOption: ke,
306
317
  isInner: !0
307
318
  }
308
319
  ),
@@ -310,8 +321,8 @@ const yt = Pe(function({
310
321
  ze,
311
322
  {
312
323
  size: "small",
313
- value: D,
314
- onChange: (e) => we(e),
324
+ value: I,
325
+ onChange: (e) => Ee(e),
315
326
  options: [
316
327
  { value: "all", label: "全部" },
317
328
  { value: "unread", label: "未读" },
@@ -319,71 +330,71 @@ const yt = Pe(function({
319
330
  ]
320
331
  }
321
332
  ) }),
322
- /* @__PURE__ */ m("div", { className: n.toastPrefs, "data-testid": "inbox-toast-prefs", children: [
333
+ /* @__PURE__ */ u("div", { className: n.toastPrefs, "data-testid": "inbox-toast-prefs", children: [
323
334
  /* @__PURE__ */ r("div", { className: n.toastPrefsTitle, children: "消息提示" }),
324
335
  /* @__PURE__ */ r("p", { className: n.toastPrefsHint, children: "本机浏览器偏好,非租户策略" }),
325
- /* @__PURE__ */ m(ue, { size: 12, wrap: !0, children: [
336
+ /* @__PURE__ */ u(pe, { size: 12, wrap: !0, children: [
326
337
  /* @__PURE__ */ r(
327
- J,
338
+ Z,
328
339
  {
329
- checked: B.alert,
330
- onChange: (e) => X("alert", e.target.checked),
340
+ checked: P.alert,
341
+ onChange: (e) => J("alert", e.target.checked),
331
342
  children: "预警弹出"
332
343
  }
333
344
  ),
334
345
  /* @__PURE__ */ r(
335
- J,
346
+ Z,
336
347
  {
337
- checked: B.action,
338
- onChange: (e) => X("action", e.target.checked),
348
+ checked: P.action,
349
+ onChange: (e) => J("action", e.target.checked),
339
350
  children: "行动弹出"
340
351
  }
341
352
  ),
342
353
  /* @__PURE__ */ r(
343
- J,
354
+ Z,
344
355
  {
345
- checked: B.remind,
346
- onChange: (e) => X("remind", e.target.checked),
356
+ checked: P.remind,
357
+ onChange: (e) => J("remind", e.target.checked),
347
358
  children: "提醒弹出"
348
359
  }
349
360
  )
350
361
  ] })
351
362
  ] }),
352
- K ? /* @__PURE__ */ r("p", { className: n.error, children: K }) : null,
353
- /* @__PURE__ */ r("div", { className: S("inbox-bell-list-pane", n.listPane), children: /* @__PURE__ */ r(Ge, { spinning: te && P.length === 0, children: !te && !K && P.length === 0 ? /* @__PURE__ */ r(Ke, { description: "暂无站内信" }) : P.length === 0 ? null : /* @__PURE__ */ m(
363
+ $ ? /* @__PURE__ */ r("p", { className: n.error, children: $ }) : null,
364
+ /* @__PURE__ */ r("div", { className: B("inbox-bell-list-pane", n.listPane), children: /* @__PURE__ */ r(Ge, { spinning: re && _.length === 0, children: !re && !$ && _.length === 0 ? /* @__PURE__ */ r(Ke, { description: "暂无站内信" }) : _.length === 0 ? null : /* @__PURE__ */ u(
354
365
  $e,
355
366
  {
356
- wrapperClassName: S("inbox-bell-list-scroll", n.listScroll),
367
+ wrapperClassName: B("inbox-bell-list-scroll", n.listScroll),
357
368
  className: n.listViewport,
358
369
  "data-testid": "inbox-bell-list-scroll",
359
- onScroll: Ee,
370
+ onScroll: Be,
360
371
  children: [
361
- /* @__PURE__ */ r("ul", { className: n.list, children: P.map((e) => {
362
- const t = ge(e.messageType), s = String(e.levelLabel || e.level || "").trim(), o = !!s, i = Ae(e.bodyHtml), p = De(
363
- _e(e)
364
- ), c = Me(e), d = Xe(e), f = !!p.primary;
365
- return /* @__PURE__ */ r("li", { children: /* @__PURE__ */ m(
372
+ /* @__PURE__ */ r("ul", { className: n.list, children: _.map((e) => {
373
+ const t = ve(e.messageType), o = String(e.levelLabel || e.level || "").trim(), a = !!o, l = De(e.bodyHtml), c = _e(
374
+ Ae(e)
375
+ ), i = Me(e), w = Ye(e), y = !!c.primary;
376
+ return /* @__PURE__ */ r("li", { children: /* @__PURE__ */ u(
366
377
  "div",
367
378
  {
368
- className: S(
379
+ className: B(
369
380
  n.item,
370
381
  !e.read && n.itemUnread,
371
- c && n.itemStatic
382
+ i && n.itemStatic
372
383
  ),
373
- role: c ? void 0 : "button",
374
- tabIndex: c ? void 0 : 0,
375
- onClick: c ? void 0 : () => void Y(e),
376
- onKeyDown: c ? void 0 : (y) => {
377
- (y.key === "Enter" || y.key === " ") && (y.preventDefault(), Y(e));
384
+ role: i ? void 0 : "button",
385
+ tabIndex: i ? void 0 : 0,
386
+ onClick: i ? void 0 : () => void q(e),
387
+ onKeyDown: i ? void 0 : (N) => {
388
+ (N.key === "Enter" || N.key === " ") && (N.preventDefault(), q(e));
378
389
  },
379
390
  children: [
380
- /* @__PURE__ */ m("div", { className: n.itemHeader, children: [
381
- /* @__PURE__ */ m("span", { className: n.itemHeaderLeft, children: [
391
+ /* @__PURE__ */ u("div", { className: n.itemHeader, children: [
392
+ /* @__PURE__ */ u("span", { className: n.itemHeaderLeft, children: [
382
393
  /* @__PURE__ */ r("span", { className: n.itemTitle, title: e.title || "(无标题)", children: e.title || "(无标题)" }),
383
394
  t ? /* @__PURE__ */ r(
384
- F,
395
+ U,
385
396
  {
386
- color: q(e.messageType),
397
+ color: ee(e.messageType),
387
398
  className: n.typeTag,
388
399
  children: t
389
400
  }
@@ -391,45 +402,45 @@ const yt = Pe(function({
391
402
  ] }),
392
403
  /* @__PURE__ */ r("span", { className: n.itemTime, children: e.createdAt || "" })
393
404
  ] }),
394
- /* @__PURE__ */ r("div", { className: n.itemBody, children: i ? /* @__PURE__ */ r(
405
+ /* @__PURE__ */ r("div", { className: n.itemBody, children: l ? /* @__PURE__ */ r(
395
406
  "div",
396
407
  {
397
408
  className: n.itemBodyHtml,
398
- dangerouslySetInnerHTML: { __html: i }
409
+ dangerouslySetInnerHTML: { __html: l }
399
410
  }
400
- ) : e.summary ? /* @__PURE__ */ r("span", { className: n.itemSummary, children: H(e.summary) }) : null }),
401
- d ? /* @__PURE__ */ r("span", { className: n.itemMeta, children: d }) : null,
402
- o ? /* @__PURE__ */ r("div", { className: n.itemFooterTags, children: /* @__PURE__ */ r(
403
- F,
411
+ ) : e.summary ? /* @__PURE__ */ r("span", { className: n.itemSummary, children: F(e.summary) }) : null }),
412
+ w ? /* @__PURE__ */ r("span", { className: n.itemMeta, children: w }) : null,
413
+ a ? /* @__PURE__ */ r("div", { className: n.itemFooterTags, children: /* @__PURE__ */ r(
414
+ U,
404
415
  {
405
- color: Ye(e.levelColor),
416
+ color: Je(e.levelColor),
406
417
  className: n.typeTag,
407
- children: s
418
+ children: o
408
419
  }
409
420
  ) }) : null,
410
- f && p.primary ? /* @__PURE__ */ r(
421
+ y && c.primary ? /* @__PURE__ */ r(
411
422
  "div",
412
423
  {
413
424
  className: n.itemActions,
414
- onClick: (y) => y.stopPropagation(),
415
- onKeyDown: (y) => y.stopPropagation(),
416
- children: /* @__PURE__ */ m(ue, { size: 8, wrap: !0, children: [
425
+ onClick: (N) => N.stopPropagation(),
426
+ onKeyDown: (N) => N.stopPropagation(),
427
+ children: /* @__PURE__ */ u(pe, { size: 8, wrap: !0, children: [
417
428
  /* @__PURE__ */ r(
418
- I,
429
+ H,
419
430
  {
420
431
  size: "small",
421
432
  type: "primary",
422
- onClick: () => void ce(e, p.primary),
423
- children: p.primary.label
433
+ onClick: () => void me(e, c.primary),
434
+ children: c.primary.label
424
435
  }
425
436
  ),
426
- p.secondary ? /* @__PURE__ */ r(
427
- I,
437
+ c.secondary ? /* @__PURE__ */ r(
438
+ H,
428
439
  {
429
440
  size: "small",
430
441
  type: "link",
431
- onClick: () => void ce(e, p.secondary),
432
- children: p.secondary.label
442
+ onClick: () => void me(e, c.secondary),
443
+ children: c.secondary.label
433
444
  }
434
445
  ) : null
435
446
  ] })
@@ -439,7 +450,7 @@ const yt = Pe(function({
439
450
  }
440
451
  ) }, e.id);
441
452
  }) }),
442
- Se ? /* @__PURE__ */ r("p", { className: S("inbox-bell-list-footer", n.listFooter), children: "加载中…" }) : null
453
+ Le ? /* @__PURE__ */ r("p", { className: B("inbox-bell-list-footer", n.listFooter), children: "加载中…" }) : null
443
454
  ]
444
455
  }
445
456
  ) }) })
@@ -450,15 +461,15 @@ const yt = Pe(function({
450
461
  });
451
462
  export {
452
463
  St as DEFAULT_INBOX_TOAST_PREFS,
453
- yt as default,
454
- De as filterInboxActionsForHost,
455
- vt as inboxSceneLabel,
464
+ gt as default,
465
+ _e as filterInboxActionsForHost,
466
+ bt as inboxSceneLabel,
456
467
  Me as isInboxButtonDriven,
457
- bt as isTerminalActionStatus,
468
+ Tt as isTerminalActionStatus,
458
469
  Ie as loadInboxToastPrefs,
459
- Tt as normalizeInboxActions,
460
- _e as resolveInboxItemActions,
461
- wt as resolveInboxSceneKey,
470
+ wt as normalizeInboxActions,
471
+ Ae as resolveInboxItemActions,
472
+ Nt as resolveInboxSceneKey,
462
473
  He as saveInboxToastPrefs,
463
474
  Oe as shouldToastForMessageType
464
475
  };
@@ -1 +1 @@
1
- {"version":3,"file":"InboxBell.js","sources":["../../../../../src/components/Tools/Inbox/InboxBell/InboxBell.tsx"],"sourcesContent":["import { Badge, Button, Checkbox, Drawer, Space, message, notification } from 'antd';\nimport classNames from 'classnames';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type UIEvent,\n} from 'react';\nimport { Empty } from '@/components/Empty';\nimport { Bell } from '@/components/Icons';\nimport { PageSpin } from '@/components/Layout';\nimport { SegmentedRadio } from '@/components/SegmentedRadio';\nimport { StateBar } from '@/components/StateBar';\nimport { SEMANTIC_COLORS, SemanticTag } from '@/components/Tag';\nimport { VirtualScrollbar } from '@/components/VirtualScrollbar';\nimport { sanitizeInboxHtml } from '../sanitizeInboxHtml';\nimport { INBOX_BADGE_REFRESH_EVENT } from '../requestInboxBadgeRefresh';\nimport { emphasizeQuoted } from './emphasizeQuoted';\nimport {\n filterInboxActionsForHost,\n isInboxButtonDriven,\n resolveInboxItemActions,\n type InboxItemActionKind,\n type InboxItemQuickAction,\n} from './inboxItemActions';\nimport {\n loadInboxToastPrefs,\n saveInboxToastPrefs,\n shouldToastForMessageType,\n type InboxToastPrefs,\n} from './toastPrefs';\nimport styles from './style.module.scss';\n\nexport type InboxBellMessageType = 'alert' | 'action' | 'remind' | string;\n\nexport type InboxBellItem = {\n id: string;\n title?: string;\n /** 纯文本摘要(列表兼容) */\n summary?: string;\n /** 已渲染 HTML 正文;空则主摘要位回落 summary */\n bodyHtml?: string | null;\n read?: boolean;\n messageType?: InboxBellMessageType;\n href?: string;\n createdAt?: string;\n level?: string;\n /** 级别展示名(业务仓从已有维表/工具函数填;空则回落 level) */\n levelLabel?: string;\n /**\n * 级别 Tag 色:业务仓传入预警级别设置色(如 QA `ALERT_LEVEL_COLORS.*.accent`)。\n * 支持 SemanticColor 键或 `#hex`;core 不自造级别色表。\n */\n levelColor?: string;\n category?: string;\n scene?: string;\n eventKey?: string;\n categoryLabel?: string;\n alertId?: string | null;\n actionId?: string | null;\n claimed?: boolean;\n started?: boolean;\n /** 行动当前状态(enrich / contextJson);终态时底栏只保留查看任务 */\n actionStatus?: string;\n factory?: string;\n variety?: string;\n metric?: string;\n /** 业务日/月份(如 2026-07-31);预警深链 date 用 */\n month?: string;\n};\n\nexport type InboxBellListResult = {\n /** 分页列表(Marsun list-api 唯一数组名) */\n pageData: InboxBellItem[];\n total?: number;\n unreadTotal?: number;\n unreadByMessageType?: Partial<Record<string, number>>;\n};\n\nexport type InboxBellListParams = {\n unreadOnly?: boolean;\n readOnly?: boolean;\n messageType?: InboxBellMessageType;\n currentPage?: number;\n pageSize?: number;\n};\n\nexport type InboxBellProps = {\n /** 拉取站内信(业务注入;须带 JWT 身份,禁止无身份全表) */\n fetchInbox: (params: InboxBellListParams) => Promise<InboxBellListResult>;\n /** 标记已读 */\n markRead: (id: string) => Promise<void | InboxBellItem>;\n /** 点击条目:默认用 window.location / 业务 navigate */\n onNavigate?: (href: string, item: InboxBellItem) => void;\n /**\n * 轮询未读角标(ms)。默认 `0`(关定时);`>0` 才 setInterval。\n * 角标另由:挂载首刷、`locationKey`、focus/visibility、`requestInboxBadgeRefresh` 触发。\n */\n pollMs?: number;\n /**\n * 路由/页面身份;变化时刷新角标(如 React Router `location.pathname`)。\n * 整页加载靠挂载首刷,不必另传。\n */\n locationKey?: string | number;\n pageSize?: number;\n className?: string;\n /** Drawer 标题 */\n title?: string;\n /**\n * 同源 SSE 路径(默认 `/api/v1/msg-center/inbox/stream`)。\n * 传 `false` 关闭。须配合 `getAccessToken`(EventSource 用 `access_token` 查询参数传 JWT)。\n * 失败回落写后刷新 / 焦点刷新,不定时轮询冒充。\n */\n streamPath?: string | false;\n /** 返回当前 JWT;空则不开 SSE */\n getAccessToken?: () => string | null | undefined;\n /**\n * 卡片底栏动作(认领/去执行/查看等)。不传则底栏按钮一律走 onNavigate / href。\n * 业务仓拦截 claim_alert / start_action;铃铛不解析新建任务。\n */\n onItemAction?: (kind: InboxItemActionKind, item: InboxBellItem) => void | Promise<void>;\n};\n\nexport type InboxBellHandle = {\n refreshBadge: () => Promise<void>;\n};\n\nconst TYPE_TABS: Array<{ key: string; label: string }> = [\n { key: '', label: '全部' },\n { key: 'alert', label: '预警' },\n { key: 'action', label: '行动' },\n { key: 'remind', label: '提醒' },\n];\n\nconst TYPE_TAG_LABEL: Record<string, string> = {\n alert: '预警',\n action: '行动',\n remind: '提醒',\n};\n\nconst FOCUS_DEBOUNCE_MS = 300;\n/** 距底部小于该值时拉下一页 */\nconst LOAD_MORE_GAP_PX = 72;\n\nfunction messageTypeLabel(raw?: string): string {\n const key = String(raw || '')\n .trim()\n .toLowerCase();\n if (!key) return '';\n return TYPE_TAG_LABEL[key] || key;\n}\n\nfunction messageTypeSemanticColor(raw?: string): string {\n const key = String(raw || '')\n .trim()\n .toLowerCase();\n if (key === 'alert') return SEMANTIC_COLORS.DANGER;\n if (key === 'action') return SEMANTIC_COLORS.PRIMARY;\n if (key === 'remind') return SEMANTIC_COLORS.WARNING;\n return SEMANTIC_COLORS.DEFAULT;\n}\n\nfunction itemMetaLine(item: InboxBellItem): string {\n return [item.factory, item.variety, item.metric]\n .map((x) => String(x || '').trim())\n .filter(Boolean)\n .join(' · ');\n}\n\n/** 业务传入色;无则 DEFAULT(禁止在 core 造级别→色平行表) */\nfunction resolveLevelTagColor(raw?: string): string {\n const c = String(raw || '').trim();\n return c || SEMANTIC_COLORS.DEFAULT;\n}\n\ntype BadgePreview = {\n messageType?: string;\n title?: string;\n summary?: string;\n};\n\nfunction parseBadgePreview(raw: string): BadgePreview | null {\n try {\n const data = JSON.parse(raw) as Record<string, unknown>;\n if (!data || typeof data !== 'object') return null;\n const messageType = String(data.messageType || data.message_type || '').trim();\n const title = String(data.title || '').trim();\n const summary = String(data.summary || '').trim();\n if (!messageType && !title && !summary) return null;\n return {\n messageType: messageType || undefined,\n title: title || undefined,\n summary: summary || undefined,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * 通用站内信铃铛:列表 / 已读 / Tab / 角标 / 卡片底栏动作 / 可选 SSE toast。\n * 认领、去执行等业务动作由 `onItemAction` 注入;默认底栏按钮走 onNavigate / href。\n * 默认不定时轮询;有消息侧靠业务回调 / 路由 / 焦点 / 可选 SSE 再拉角标。\n */\nconst InboxBell = forwardRef<InboxBellHandle, InboxBellProps>(function InboxBell(\n {\n fetchInbox,\n markRead,\n onNavigate,\n pollMs = 0,\n locationKey,\n pageSize = 20,\n className,\n title = '站内信',\n streamPath = '/api/v1/msg-center/inbox/stream',\n getAccessToken,\n onItemAction,\n },\n ref,\n) {\n const [open, setOpen] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [items, setItems] = useState<InboxBellItem[]>([]);\n const [unreadTotal, setUnreadTotal] = useState(0);\n const [unreadByType, setUnreadByType] = useState<Partial<Record<string, number>>>({});\n const [messageType, setMessageType] = useState<string>('');\n const [readFilter, setReadFilter] = useState<'all' | 'unread' | 'read'>('all');\n const [toastPrefs, setToastPrefs] = useState<InboxToastPrefs>(() => loadInboxToastPrefs());\n const [loadingMore, setLoadingMore] = useState(false);\n const focusDebounceRef = useRef<number | null>(null);\n const locationKeyPrimedRef = useRef(false);\n const toastPrefsRef = useRef(toastPrefs);\n toastPrefsRef.current = toastPrefs;\n const currentPageRef = useRef(1);\n const loadingMoreRef = useRef(false);\n const hasMoreRef = useRef(false);\n\n const listQuery = useMemo(\n () => ({\n messageType: messageType || undefined,\n unreadOnly: readFilter === 'unread' || undefined,\n readOnly: readFilter === 'read' || undefined,\n }),\n [messageType, readFilter],\n );\n\n const load = useCallback(async () => {\n setLoading(true);\n setError('');\n currentPageRef.current = 1;\n hasMoreRef.current = false;\n try {\n const res = await fetchInbox({\n currentPage: 1,\n pageSize,\n ...listQuery,\n });\n const page = res?.pageData || [];\n const total = typeof res?.total === 'number' ? res.total : page.length;\n setItems(page);\n hasMoreRef.current = page.length > 0 && page.length < total;\n setUnreadTotal(typeof res?.unreadTotal === 'number' ? res.unreadTotal : 0);\n setUnreadByType(res?.unreadByMessageType || {});\n } catch (e) {\n setItems([]);\n hasMoreRef.current = false;\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoading(false);\n }\n }, [fetchInbox, pageSize, listQuery]);\n\n const loadMore = useCallback(async () => {\n if (loadingMoreRef.current || !hasMoreRef.current) return;\n loadingMoreRef.current = true;\n setLoadingMore(true);\n try {\n const next = currentPageRef.current + 1;\n const res = await fetchInbox({\n currentPage: next,\n pageSize,\n ...listQuery,\n });\n const page = res?.pageData || [];\n const total = typeof res?.total === 'number' ? res.total : 0;\n setItems((prev) => {\n const seen = new Set(prev.map((x) => x.id));\n const extra = page.filter((x) => x?.id && !seen.has(x.id));\n const merged = extra.length ? [...prev, ...extra] : prev;\n hasMoreRef.current =\n extra.length > 0 && (total > 0 ? merged.length < total : extra.length >= pageSize);\n return merged;\n });\n if (page.length) currentPageRef.current = next;\n if (typeof res?.unreadTotal === 'number') setUnreadTotal(res.unreadTotal);\n if (res?.unreadByMessageType) setUnreadByType(res.unreadByMessageType);\n } catch {\n hasMoreRef.current = false;\n } finally {\n loadingMoreRef.current = false;\n setLoadingMore(false);\n }\n }, [fetchInbox, pageSize, listQuery]);\n\n const onListScroll = useCallback(\n (e: UIEvent<HTMLDivElement>) => {\n const el = e.currentTarget;\n if (el.scrollHeight - el.scrollTop - el.clientHeight <= LOAD_MORE_GAP_PX) {\n void loadMore();\n }\n },\n [loadMore],\n );\n\n const refreshBadge = useCallback(async () => {\n try {\n // 与列表同 pageSize(禁硬编码 1);角标只消费 unread* 字段\n const res = await fetchInbox({ currentPage: 1, pageSize });\n setUnreadTotal(typeof res?.unreadTotal === 'number' ? res.unreadTotal : 0);\n setUnreadByType(res?.unreadByMessageType || {});\n } catch {\n /* 角标失败不打断 UI */\n }\n }, [fetchInbox, pageSize]);\n\n useImperativeHandle(ref, () => ({ refreshBadge }), [refreshBadge]);\n\n useEffect(() => {\n void refreshBadge();\n }, [refreshBadge]);\n\n useEffect(() => {\n if (locationKey === undefined) return;\n // 挂载首刷已由 refreshBadge effect 覆盖;仅后续路由变化再拉\n if (!locationKeyPrimedRef.current) {\n locationKeyPrimedRef.current = true;\n return;\n }\n void refreshBadge();\n }, [locationKey, refreshBadge]);\n\n useEffect(() => {\n if (pollMs <= 0) return undefined;\n const t = window.setInterval(() => {\n void refreshBadge();\n }, pollMs);\n return () => window.clearInterval(t);\n }, [pollMs, refreshBadge]);\n\n useEffect(() => {\n const schedule = () => {\n if (focusDebounceRef.current != null) {\n window.clearTimeout(focusDebounceRef.current);\n }\n focusDebounceRef.current = window.setTimeout(() => {\n focusDebounceRef.current = null;\n void refreshBadge();\n }, FOCUS_DEBOUNCE_MS);\n };\n\n const onVisibility = () => {\n if (document.visibilityState === 'visible') schedule();\n };\n\n window.addEventListener('focus', schedule);\n document.addEventListener('visibilitychange', onVisibility);\n return () => {\n window.removeEventListener('focus', schedule);\n document.removeEventListener('visibilitychange', onVisibility);\n if (focusDebounceRef.current != null) {\n window.clearTimeout(focusDebounceRef.current);\n focusDebounceRef.current = null;\n }\n };\n }, [refreshBadge]);\n\n useEffect(() => {\n const onExternal = () => {\n void refreshBadge();\n };\n window.addEventListener(INBOX_BADGE_REFRESH_EVENT, onExternal);\n return () => window.removeEventListener(INBOX_BADGE_REFRESH_EVENT, onExternal);\n }, [refreshBadge]);\n\n useEffect(() => {\n if (streamPath === false) return undefined;\n if (typeof getAccessToken !== 'function') return undefined;\n if (typeof window === 'undefined' || typeof EventSource === 'undefined') return undefined;\n\n const token = String(getAccessToken() || '').trim();\n if (!token) return undefined;\n\n const base = String(streamPath || '/api/v1/msg-center/inbox/stream').trim();\n const url = new URL(base, window.location.origin);\n url.searchParams.set('access_token', token);\n\n let es: EventSource;\n try {\n es = new EventSource(url.toString());\n } catch {\n return undefined;\n }\n\n const onBadge = (ev: Event) => {\n void refreshBadge();\n const msgEv = ev as MessageEvent;\n const preview = typeof msgEv?.data === 'string' ? parseBadgePreview(msgEv.data) : null;\n if (!preview) return;\n if (!shouldToastForMessageType(toastPrefsRef.current, preview.messageType)) return;\n const toastTitle = preview.title || '新站内信';\n const toastDesc = preview.summary || '';\n const typeLabel = messageTypeLabel(preview.messageType);\n const openDrawer = () => {\n notification.destroy();\n setOpen(true);\n };\n const toastKey = `inbox-badge-${preview.messageType || 'msg'}-${Date.now()}`;\n notification.open({\n key: toastKey,\n className: classNames('marsun-inbox-toast', styles.toastNotice),\n closable: true,\n title: (\n <div className={styles.toastHead}>\n <span className={styles.toastTitle}>{emphasizeQuoted(toastTitle)}</span>\n {typeLabel ? (\n <SemanticTag\n color={messageTypeSemanticColor(preview.messageType)}\n className={styles.typeTag}\n >\n {typeLabel}\n </SemanticTag>\n ) : null}\n </div>\n ),\n message: (\n <div className={styles.toastHead}>\n <span className={styles.toastTitle}>{emphasizeQuoted(toastTitle)}</span>\n {typeLabel ? (\n <SemanticTag\n color={messageTypeSemanticColor(preview.messageType)}\n className={styles.typeTag}\n >\n {typeLabel}\n </SemanticTag>\n ) : null}\n </div>\n ),\n description: (\n <div className={styles.toastBody}>\n {toastDesc ? (\n <div className={styles.toastDesc}>{emphasizeQuoted(toastDesc)}</div>\n ) : null}\n <div className={styles.toastActions}>\n <Button\n type=\"primary\"\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n openDrawer();\n }}\n >\n 查看\n </Button>\n </div>\n </div>\n ),\n placement: 'topRight',\n duration: 6,\n onClick: openDrawer,\n });\n };\n es.addEventListener('badge', onBadge);\n es.addEventListener('inbox', onBadge);\n // 失败回落写后/焦点刷新;关连接防 EventSource 自动重连刷屏\n es.onerror = () => {\n es.close();\n };\n\n return () => {\n es.removeEventListener('badge', onBadge);\n es.removeEventListener('inbox', onBadge);\n es.close();\n };\n }, [streamPath, getAccessToken, refreshBadge]);\n\n useEffect(() => {\n if (open) void load();\n }, [open, load]);\n\n const typeTabOptions = useMemo(\n () =>\n TYPE_TABS.map((t) => {\n const n = t.key ? unreadByType[t.key] || 0 : unreadTotal;\n return {\n key: t.key || 'all',\n label: n > 0 ? `${t.label} (${n})` : t.label,\n };\n }),\n [unreadByType, unreadTotal],\n );\n\n const updateToastPref = (key: keyof InboxToastPrefs, checked: boolean) => {\n setToastPrefs((prev) => {\n const next = { ...prev, [key]: checked };\n saveInboxToastPrefs(next);\n return next;\n });\n };\n\n const handleOpenItem = async (item: InboxBellItem, opts?: { skipRead?: boolean }) => {\n if (!opts?.skipRead && !item.read) {\n try {\n await markRead(item.id);\n setItems((prev) => prev.map((x) => (x.id === item.id ? { ...x, read: true } : x)));\n setUnreadTotal((n) => Math.max(0, n - 1));\n } catch (e) {\n message.error(e instanceof Error ? e.message : '标记已读失败');\n return;\n }\n }\n const href = String(item.href || '').trim();\n if (!href) return;\n if (onNavigate) {\n onNavigate(href, item);\n setOpen(false);\n return;\n }\n if (href.startsWith('http://') || href.startsWith('https://')) {\n window.open(href, '_blank', 'noopener,noreferrer');\n } else {\n window.location.assign(href);\n }\n setOpen(false);\n };\n\n const runQuickAction = async (item: InboxBellItem, action: InboxItemQuickAction) => {\n if (action.disabled) return;\n if (onItemAction) {\n try {\n await onItemAction(action.kind, item);\n setOpen(false);\n void load();\n void refreshBadge();\n } catch (e) {\n message.error(e instanceof Error ? e.message : '操作失败');\n }\n return;\n }\n await handleOpenItem(item);\n };\n\n return (\n <div className={classNames(styles.bellWrap, className)}>\n <Badge count={unreadTotal} size=\"small\" overflowCount={99} offset={[-4, 4]}>\n <Button\n type=\"text\"\n className={styles.bellBtn}\n icon={<Bell size={16} aria-hidden />}\n aria-label={unreadTotal > 0 ? `站内信,${unreadTotal} 条未读` : '站内信'}\n onClick={() => setOpen(true)}\n />\n </Badge>\n <Drawer\n title={title}\n open={open}\n onClose={() => setOpen(false)}\n size={420}\n destroyOnClose={false}\n className={styles.drawer}\n styles={{\n header: { padding: '12px 16px' },\n body: { padding: '12px 16px' },\n }}\n >\n <StateBar\n className={styles.typeTabs}\n size=\"small\"\n activeKey={messageType || 'all'}\n onChange={(k) => setMessageType(k === 'all' ? '' : k)}\n stateOption={typeTabOptions}\n isInner\n />\n <div className={styles.filterRow}>\n <SegmentedRadio<'all' | 'unread' | 'read'>\n size=\"small\"\n value={readFilter}\n onChange={(v) => setReadFilter(v)}\n options={[\n { value: 'all', label: '全部' },\n { value: 'unread', label: '未读' },\n { value: 'read', label: '已读' },\n ]}\n />\n </div>\n <div className={styles.toastPrefs} data-testid=\"inbox-toast-prefs\">\n <div className={styles.toastPrefsTitle}>消息提示</div>\n <p className={styles.toastPrefsHint}>本机浏览器偏好,非租户策略</p>\n <Space size={12} wrap>\n <Checkbox\n checked={toastPrefs.alert}\n onChange={(e) => updateToastPref('alert', e.target.checked)}\n >\n 预警弹出\n </Checkbox>\n <Checkbox\n checked={toastPrefs.action}\n onChange={(e) => updateToastPref('action', e.target.checked)}\n >\n 行动弹出\n </Checkbox>\n <Checkbox\n checked={toastPrefs.remind}\n onChange={(e) => updateToastPref('remind', e.target.checked)}\n >\n 提醒弹出\n </Checkbox>\n </Space>\n </div>\n {error ? <p className={styles.error}>{error}</p> : null}\n <div className={classNames('inbox-bell-list-pane', styles.listPane)}>\n <PageSpin spinning={loading && items.length === 0}>\n {!loading && !error && items.length === 0 ? (\n <Empty description=\"暂无站内信\" />\n ) : items.length === 0 ? null : (\n <VirtualScrollbar\n wrapperClassName={classNames('inbox-bell-list-scroll', styles.listScroll)}\n className={styles.listViewport}\n data-testid=\"inbox-bell-list-scroll\"\n onScroll={onListScroll}\n >\n <ul className={styles.list}>\n {items.map((item) => {\n const typeLabel = messageTypeLabel(item.messageType);\n const levelText = String(item.levelLabel || item.level || '').trim();\n const showLevel = Boolean(levelText);\n const safeHtml = sanitizeInboxHtml(item.bodyHtml);\n const actions = filterInboxActionsForHost(\n resolveInboxItemActions(item),\n Boolean(onItemAction),\n );\n const buttonDriven = isInboxButtonDriven(item);\n const meta = itemMetaLine(item);\n const showActions = Boolean(actions.primary);\n return (\n <li key={item.id}>\n <div\n className={classNames(\n styles.item,\n !item.read && styles.itemUnread,\n buttonDriven && styles.itemStatic,\n )}\n role={buttonDriven ? undefined : 'button'}\n tabIndex={buttonDriven ? undefined : 0}\n onClick={buttonDriven ? undefined : () => void handleOpenItem(item)}\n onKeyDown={\n buttonDriven\n ? undefined\n : (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n void handleOpenItem(item);\n }\n }\n }\n >\n <div className={styles.itemHeader}>\n <span className={styles.itemHeaderLeft}>\n <span className={styles.itemTitle} title={item.title || '(无标题)'}>\n {item.title || '(无标题)'}\n </span>\n {typeLabel ? (\n <SemanticTag\n color={messageTypeSemanticColor(item.messageType)}\n className={styles.typeTag}\n >\n {typeLabel}\n </SemanticTag>\n ) : null}\n </span>\n <span className={styles.itemTime}>{item.createdAt || ''}</span>\n </div>\n <div className={styles.itemBody}>\n {safeHtml ? (\n <div\n className={styles.itemBodyHtml}\n dangerouslySetInnerHTML={{ __html: safeHtml }}\n />\n ) : item.summary ? (\n <span className={styles.itemSummary}>\n {emphasizeQuoted(item.summary)}\n </span>\n ) : null}\n </div>\n {meta ? <span className={styles.itemMeta}>{meta}</span> : null}\n {showLevel ? (\n <div className={styles.itemFooterTags}>\n <SemanticTag\n color={resolveLevelTagColor(item.levelColor)}\n className={styles.typeTag}\n >\n {levelText}\n </SemanticTag>\n </div>\n ) : null}\n {showActions && actions.primary ? (\n <div\n className={styles.itemActions}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <Space size={8} wrap>\n <Button\n size=\"small\"\n type=\"primary\"\n onClick={() => void runQuickAction(item, actions.primary!)}\n >\n {actions.primary.label}\n </Button>\n {actions.secondary ? (\n <Button\n size=\"small\"\n type=\"link\"\n onClick={() => void runQuickAction(item, actions.secondary!)}\n >\n {actions.secondary.label}\n </Button>\n ) : null}\n </Space>\n </div>\n ) : null}\n </div>\n </li>\n );\n })}\n </ul>\n {loadingMore ? (\n <p className={classNames('inbox-bell-list-footer', styles.listFooter)}>加载中…</p>\n ) : null}\n </VirtualScrollbar>\n )}\n </PageSpin>\n </div>\n </Drawer>\n </div>\n );\n});\n\nexport default InboxBell;\nexport {\n DEFAULT_INBOX_TOAST_PREFS,\n loadInboxToastPrefs,\n saveInboxToastPrefs,\n shouldToastForMessageType,\n} from './toastPrefs';\nexport type { InboxToastPrefs } from './toastPrefs';\nexport {\n resolveInboxItemActions,\n resolveInboxSceneKey,\n filterInboxActionsForHost,\n normalizeInboxActions,\n inboxSceneLabel,\n isInboxButtonDriven,\n isTerminalActionStatus,\n} from './inboxItemActions';\nexport type {\n InboxItemActionKind,\n InboxItemQuickAction,\n InboxItemActionsResolved,\n} from './inboxItemActions';\n"],"names":["TYPE_TABS","TYPE_TAG_LABEL","FOCUS_DEBOUNCE_MS","LOAD_MORE_GAP_PX","messageTypeLabel","raw","key","messageTypeSemanticColor","SEMANTIC_COLORS","itemMetaLine","item","x","resolveLevelTagColor","parseBadgePreview","data","messageType","title","summary","InboxBell","forwardRef","fetchInbox","markRead","onNavigate","pollMs","locationKey","pageSize","className","streamPath","getAccessToken","onItemAction","ref","open","setOpen","useState","loading","setLoading","error","setError","items","setItems","unreadTotal","setUnreadTotal","unreadByType","setUnreadByType","setMessageType","readFilter","setReadFilter","toastPrefs","setToastPrefs","loadInboxToastPrefs","loadingMore","setLoadingMore","focusDebounceRef","useRef","locationKeyPrimedRef","toastPrefsRef","currentPageRef","loadingMoreRef","hasMoreRef","listQuery","useMemo","load","useCallback","res","page","total","loadMore","next","prev","seen","extra","merged","onListScroll","el","refreshBadge","useImperativeHandle","useEffect","t","schedule","onVisibility","onExternal","INBOX_BADGE_REFRESH_EVENT","token","base","url","es","onBadge","ev","msgEv","preview","shouldToastForMessageType","toastTitle","toastDesc","typeLabel","openDrawer","notification","toastKey","classNames","styles","jsxs","jsx","emphasizeQuoted","SemanticTag","Button","e","typeTabOptions","n","updateToastPref","checked","saveInboxToastPrefs","handleOpenItem","opts","message","href","runQuickAction","action","Badge","Bell","Drawer","StateBar","k","SegmentedRadio","v","Space","Checkbox","PageSpin","Empty","VirtualScrollbar","levelText","showLevel","safeHtml","sanitizeInboxHtml","actions","filterInboxActionsForHost","resolveInboxItemActions","buttonDriven","isInboxButtonDriven","meta","showActions"],"mappings":";;;;;;;;;;;;;;;;;;;AAmIA,MAAMA,KAAmD;AAAA,EACvD,EAAE,KAAK,IAAI,OAAO,KAAA;AAAA,EAClB,EAAE,KAAK,SAAS,OAAO,KAAA;AAAA,EACvB,EAAE,KAAK,UAAU,OAAO,KAAA;AAAA,EACxB,EAAE,KAAK,UAAU,OAAO,KAAA;AAC1B,GAEMC,KAAyC;AAAA,EAC7C,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AACV,GAEMC,KAAoB,KAEpBC,KAAmB;AAEzB,SAASC,GAAiBC,GAAsB;AAC9C,QAAMC,IAAM,OAAOD,KAAO,EAAE,EACzB,KAAA,EACA,YAAA;AACH,SAAKC,IACEL,GAAeK,CAAG,KAAKA,IADb;AAEnB;AAEA,SAASC,EAAyBF,GAAsB;AACtD,QAAMC,IAAM,OAAOD,KAAO,EAAE,EACzB,KAAA,EACA,YAAA;AACH,SAAIC,MAAQ,UAAgBE,EAAgB,SACxCF,MAAQ,WAAiBE,EAAgB,UACzCF,MAAQ,WAAiBE,EAAgB,UACtCA,EAAgB;AACzB;AAEA,SAASC,GAAaC,GAA6B;AACjD,SAAO,CAACA,EAAK,SAASA,EAAK,SAASA,EAAK,MAAM,EAC5C,IAAI,CAACC,MAAM,OAAOA,KAAK,EAAE,EAAE,KAAA,CAAM,EACjC,OAAO,OAAO,EACd,KAAK,KAAK;AACf;AAGA,SAASC,GAAqBP,GAAsB;AAElD,SADU,OAAOA,KAAO,EAAE,EAAE,KAAA,KAChBG,EAAgB;AAC9B;AAQA,SAASK,GAAkBR,GAAkC;AAC3D,MAAI;AACF,UAAMS,IAAO,KAAK,MAAMT,CAAG;AAC3B,QAAI,CAACS,KAAQ,OAAOA,KAAS,SAAU,QAAO;AAC9C,UAAMC,IAAc,OAAOD,EAAK,eAAeA,EAAK,gBAAgB,EAAE,EAAE,KAAA,GAClEE,IAAQ,OAAOF,EAAK,SAAS,EAAE,EAAE,KAAA,GACjCG,IAAU,OAAOH,EAAK,WAAW,EAAE,EAAE,KAAA;AAC3C,WAAI,CAACC,KAAe,CAACC,KAAS,CAACC,IAAgB,OACxC;AAAA,MACL,aAAaF,KAAe;AAAA,MAC5B,OAAOC,KAAS;AAAA,MAChB,SAASC,KAAW;AAAA,IAAA;AAAA,EAExB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOA,MAAMC,KAAYC,GAA4C,SAC5D;AAAA,EACE,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,aAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC;AAAA,EACA,OAAAV,KAAQ;AAAA,EACR,YAAAW,IAAa;AAAA,EACb,gBAAAC;AAAA,EACA,cAAAC;AACF,GACAC,IACA;AACA,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAS,EAAK,GAChC,CAACC,IAASC,EAAU,IAAIF,EAAS,EAAK,GACtC,CAACG,GAAOC,EAAQ,IAAIJ,EAAS,EAAE,GAC/B,CAACK,GAAOC,CAAQ,IAAIN,EAA0B,CAAA,CAAE,GAChD,CAACO,GAAaC,CAAc,IAAIR,EAAS,CAAC,GAC1C,CAACS,IAAcC,CAAe,IAAIV,EAA0C,CAAA,CAAE,GAC9E,CAAClB,GAAa6B,EAAc,IAAIX,EAAiB,EAAE,GACnD,CAACY,GAAYC,EAAa,IAAIb,EAAoC,KAAK,GACvE,CAACc,GAAYC,EAAa,IAAIf,EAA0B,MAAMgB,IAAqB,GACnF,CAACC,IAAaC,EAAc,IAAIlB,EAAS,EAAK,GAC9CmB,IAAmBC,EAAsB,IAAI,GAC7CC,KAAuBD,EAAO,EAAK,GACnCE,KAAgBF,EAAON,CAAU;AACvC,EAAAQ,GAAc,UAAUR;AACxB,QAAMS,IAAiBH,EAAO,CAAC,GACzBI,IAAiBJ,EAAO,EAAK,GAC7BK,IAAaL,EAAO,EAAK,GAEzBM,IAAYC;AAAA,IAChB,OAAO;AAAA,MACL,aAAa7C,KAAe;AAAA,MAC5B,YAAY8B,MAAe,YAAY;AAAA,MACvC,UAAUA,MAAe,UAAU;AAAA,IAAA;AAAA,IAErC,CAAC9B,GAAa8B,CAAU;AAAA,EAAA,GAGpBgB,IAAOC,EAAY,YAAY;AACnC,IAAA3B,GAAW,EAAI,GACfE,GAAS,EAAE,GACXmB,EAAe,UAAU,GACzBE,EAAW,UAAU;AACrB,QAAI;AACF,YAAMK,IAAM,MAAM3C,EAAW;AAAA,QAC3B,aAAa;AAAA,QACb,UAAAK;AAAA,QACA,GAAGkC;AAAA,MAAA,CACJ,GACKK,KAAOD,KAAA,gBAAAA,EAAK,aAAY,CAAA,GACxBE,IAAQ,QAAOF,KAAA,gBAAAA,EAAK,UAAU,WAAWA,EAAI,QAAQC,EAAK;AAChE,MAAAzB,EAASyB,CAAI,GACbN,EAAW,UAAUM,EAAK,SAAS,KAAKA,EAAK,SAASC,GACtDxB,EAAe,QAAOsB,KAAA,gBAAAA,EAAK,gBAAgB,WAAWA,EAAI,cAAc,CAAC,GACzEpB,GAAgBoB,KAAA,gBAAAA,EAAK,wBAAuB,EAAE;AAAA,IAChD,SAAS,GAAG;AACV,MAAAxB,EAAS,CAAA,CAAE,GACXmB,EAAW,UAAU,IACrBrB,GAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,IACrD,UAAA;AACE,MAAAF,GAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACf,GAAYK,GAAUkC,CAAS,CAAC,GAE9BO,KAAWJ,EAAY,YAAY;AACvC,QAAI,EAAAL,EAAe,WAAW,CAACC,EAAW,UAC1C;AAAA,MAAAD,EAAe,UAAU,IACzBN,GAAe,EAAI;AACnB,UAAI;AACF,cAAMgB,IAAOX,EAAe,UAAU,GAChCO,IAAM,MAAM3C,EAAW;AAAA,UAC3B,aAAa+C;AAAA,UACb,UAAA1C;AAAA,UACA,GAAGkC;AAAA,QAAA,CACJ,GACKK,KAAOD,KAAA,gBAAAA,EAAK,aAAY,CAAA,GACxBE,IAAQ,QAAOF,KAAA,gBAAAA,EAAK,UAAU,WAAWA,EAAI,QAAQ;AAC3D,QAAAxB,EAAS,CAAC6B,MAAS;AACjB,gBAAMC,IAAO,IAAI,IAAID,EAAK,IAAI,CAACzD,MAAMA,EAAE,EAAE,CAAC,GACpC2D,IAAQN,EAAK,OAAO,CAACrD,OAAMA,KAAA,gBAAAA,EAAG,OAAM,CAAC0D,EAAK,IAAI1D,EAAE,EAAE,CAAC,GACnD4D,IAASD,EAAM,SAAS,CAAC,GAAGF,GAAM,GAAGE,CAAK,IAAIF;AACpD,iBAAAV,EAAW,UACTY,EAAM,SAAS,MAAML,IAAQ,IAAIM,EAAO,SAASN,IAAQK,EAAM,UAAU7C,IACpE8C;AAAA,QACT,CAAC,GACGP,EAAK,WAAQR,EAAe,UAAUW,IACtC,QAAOJ,KAAA,gBAAAA,EAAK,gBAAgB,YAAUtB,EAAesB,EAAI,WAAW,GACpEA,KAAA,QAAAA,EAAK,uBAAqBpB,EAAgBoB,EAAI,mBAAmB;AAAA,MACvE,QAAQ;AACN,QAAAL,EAAW,UAAU;AAAA,MACvB,UAAA;AACE,QAAAD,EAAe,UAAU,IACzBN,GAAe,EAAK;AAAA,MACtB;AAAA;AAAA,EACF,GAAG,CAAC/B,GAAYK,GAAUkC,CAAS,CAAC,GAE9Ba,KAAeV;AAAA,IACnB,CAAC,MAA+B;AAC9B,YAAMW,IAAK,EAAE;AACb,MAAIA,EAAG,eAAeA,EAAG,YAAYA,EAAG,gBAAgBtE,MACjD+D,GAAA;AAAA,IAET;AAAA,IACA,CAACA,EAAQ;AAAA,EAAA,GAGLQ,IAAeZ,EAAY,YAAY;AAC3C,QAAI;AAEF,YAAMC,IAAM,MAAM3C,EAAW,EAAE,aAAa,GAAG,UAAAK,GAAU;AACzD,MAAAgB,EAAe,QAAOsB,KAAA,gBAAAA,EAAK,gBAAgB,WAAWA,EAAI,cAAc,CAAC,GACzEpB,GAAgBoB,KAAA,gBAAAA,EAAK,wBAAuB,EAAE;AAAA,IAChD,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC3C,GAAYK,CAAQ,CAAC;AAEzB,EAAAkD,GAAoB7C,IAAK,OAAO,EAAE,cAAA4C,MAAiB,CAACA,CAAY,CAAC,GAEjEE,EAAU,MAAM;AACd,IAAKF,EAAA;AAAA,EACP,GAAG,CAACA,CAAY,CAAC,GAEjBE,EAAU,MAAM;AACd,QAAIpD,MAAgB,QAEpB;AAAA,UAAI,CAAC8B,GAAqB,SAAS;AACjC,QAAAA,GAAqB,UAAU;AAC/B;AAAA,MACF;AACA,MAAKoB,EAAA;AAAA;AAAA,EACP,GAAG,CAAClD,GAAakD,CAAY,CAAC,GAE9BE,EAAU,MAAM;AACd,QAAIrD,KAAU,EAAG;AACjB,UAAMsD,IAAI,OAAO,YAAY,MAAM;AACjC,MAAKH,EAAA;AAAA,IACP,GAAGnD,CAAM;AACT,WAAO,MAAM,OAAO,cAAcsD,CAAC;AAAA,EACrC,GAAG,CAACtD,GAAQmD,CAAY,CAAC,GAEzBE,EAAU,MAAM;AACd,UAAME,IAAW,MAAM;AACrB,MAAI1B,EAAiB,WAAW,QAC9B,OAAO,aAAaA,EAAiB,OAAO,GAE9CA,EAAiB,UAAU,OAAO,WAAW,MAAM;AACjD,QAAAA,EAAiB,UAAU,MACtBsB,EAAA;AAAA,MACP,GAAGxE,EAAiB;AAAA,IACtB,GAEM6E,IAAe,MAAM;AACzB,MAAI,SAAS,oBAAoB,aAAWD,EAAA;AAAA,IAC9C;AAEA,kBAAO,iBAAiB,SAASA,CAAQ,GACzC,SAAS,iBAAiB,oBAAoBC,CAAY,GACnD,MAAM;AACX,aAAO,oBAAoB,SAASD,CAAQ,GAC5C,SAAS,oBAAoB,oBAAoBC,CAAY,GACzD3B,EAAiB,WAAW,SAC9B,OAAO,aAAaA,EAAiB,OAAO,GAC5CA,EAAiB,UAAU;AAAA,IAE/B;AAAA,EACF,GAAG,CAACsB,CAAY,CAAC,GAEjBE,EAAU,MAAM;AACd,UAAMI,IAAa,MAAM;AACvB,MAAKN,EAAA;AAAA,IACP;AACA,kBAAO,iBAAiBO,IAA2BD,CAAU,GACtD,MAAM,OAAO,oBAAoBC,IAA2BD,CAAU;AAAA,EAC/E,GAAG,CAACN,CAAY,CAAC,GAEjBE,EAAU,MAAM;AAGd,QAFIjD,MAAe,MACf,OAAOC,KAAmB,cAC1B,OAAO,SAAW,OAAe,OAAO,cAAgB,IAAa;AAEzE,UAAMsD,IAAQ,OAAOtD,EAAA,KAAoB,EAAE,EAAE,KAAA;AAC7C,QAAI,CAACsD,EAAO;AAEZ,UAAMC,IAAO,OAAOxD,KAAc,iCAAiC,EAAE,KAAA,GAC/DyD,IAAM,IAAI,IAAID,GAAM,OAAO,SAAS,MAAM;AAChD,IAAAC,EAAI,aAAa,IAAI,gBAAgBF,CAAK;AAE1C,QAAIG;AACJ,QAAI;AACF,MAAAA,IAAK,IAAI,YAAYD,EAAI,SAAA,CAAU;AAAA,IACrC,QAAQ;AACN;AAAA,IACF;AAEA,UAAME,IAAU,CAACC,MAAc;AAC7B,MAAKb,EAAA;AACL,YAAMc,IAAQD,GACRE,IAAU,QAAOD,KAAA,gBAAAA,EAAO,SAAS,WAAW3E,GAAkB2E,EAAM,IAAI,IAAI;AAElF,UADI,CAACC,KACD,CAACC,GAA0BnC,GAAc,SAASkC,EAAQ,WAAW,EAAG;AAC5E,YAAME,IAAaF,EAAQ,SAAS,QAC9BG,IAAYH,EAAQ,WAAW,IAC/BI,IAAYzF,GAAiBqF,EAAQ,WAAW,GAChDK,KAAa,MAAM;AACvB,QAAAC,GAAa,QAAA,GACb/D,EAAQ,EAAI;AAAA,MACd,GACMgE,KAAW,eAAeP,EAAQ,eAAe,KAAK,IAAI,KAAK,KAAK;AAC1E,MAAAM,GAAa,KAAK;AAAA,QAChB,KAAKC;AAAA,QACL,WAAWC,EAAW,sBAAsBC,EAAO,WAAW;AAAA,QAC9D,UAAU;AAAA,QACV,OACE,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAO,WACrB,UAAA;AAAA,UAAA,gBAAAE,EAAC,UAAK,WAAWF,EAAO,YAAa,UAAAG,EAAgBV,CAAU,GAAE;AAAA,UAChEE,IACC,gBAAAO;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,OAAO/F,EAAyBkF,EAAQ,WAAW;AAAA,cACnD,WAAWS,EAAO;AAAA,cAEjB,UAAAL;AAAA,YAAA;AAAA,UAAA,IAED;AAAA,QAAA,GACN;AAAA,QAEF,SACE,gBAAAM,EAAC,OAAA,EAAI,WAAWD,EAAO,WACrB,UAAA;AAAA,UAAA,gBAAAE,EAAC,UAAK,WAAWF,EAAO,YAAa,UAAAG,EAAgBV,CAAU,GAAE;AAAA,UAChEE,IACC,gBAAAO;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,OAAO/F,EAAyBkF,EAAQ,WAAW;AAAA,cACnD,WAAWS,EAAO;AAAA,cAEjB,UAAAL;AAAA,YAAA;AAAA,UAAA,IAED;AAAA,QAAA,GACN;AAAA,QAEF,aACE,gBAAAM,EAAC,OAAA,EAAI,WAAWD,EAAO,WACpB,UAAA;AAAA,UAAAN,IACC,gBAAAQ,EAAC,SAAI,WAAWF,EAAO,WAAY,UAAAG,EAAgBT,CAAS,GAAE,IAC5D;AAAA,UACJ,gBAAAQ,EAAC,OAAA,EAAI,WAAWF,EAAO,cACrB,UAAA,gBAAAE;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,SAAS,CAACC,OAAM;AACd,gBAAAA,GAAE,gBAAA,GACFV,GAAA;AAAA,cACF;AAAA,cACD,UAAA;AAAA,YAAA;AAAA,UAAA,EAED,CACF;AAAA,QAAA,GACF;AAAA,QAEF,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAASA;AAAA,MAAA,CACV;AAAA,IACH;AACA,WAAAT,EAAG,iBAAiB,SAASC,CAAO,GACpCD,EAAG,iBAAiB,SAASC,CAAO,GAEpCD,EAAG,UAAU,MAAM;AACjB,MAAAA,EAAG,MAAA;AAAA,IACL,GAEO,MAAM;AACX,MAAAA,EAAG,oBAAoB,SAASC,CAAO,GACvCD,EAAG,oBAAoB,SAASC,CAAO,GACvCD,EAAG,MAAA;AAAA,IACL;AAAA,EACF,GAAG,CAAC1D,GAAYC,GAAgB8C,CAAY,CAAC,GAE7CE,EAAU,MAAM;AACd,IAAI7C,KAAW8B,EAAA;AAAA,EACjB,GAAG,CAAC9B,GAAM8B,CAAI,CAAC;AAEf,QAAM4C,KAAiB7C;AAAA,IACrB,MACE5D,GAAU,IAAI,CAAC6E,MAAM;AACnB,YAAM6B,IAAI7B,EAAE,MAAMnC,GAAamC,EAAE,GAAG,KAAK,IAAIrC;AAC7C,aAAO;AAAA,QACL,KAAKqC,EAAE,OAAO;AAAA,QACd,OAAO6B,IAAI,IAAI,GAAG7B,EAAE,KAAK,KAAK6B,CAAC,MAAM7B,EAAE;AAAA,MAAA;AAAA,IAE3C,CAAC;AAAA,IACH,CAACnC,IAAcF,CAAW;AAAA,EAAA,GAGtBmE,IAAkB,CAACrG,GAA4BsG,MAAqB;AACxE,IAAA5D,GAAc,CAACoB,MAAS;AACtB,YAAMD,IAAO,EAAE,GAAGC,GAAM,CAAC9D,CAAG,GAAGsG,EAAA;AAC/B,aAAAC,GAAoB1C,CAAI,GACjBA;AAAA,IACT,CAAC;AAAA,EACH,GAEM2C,IAAiB,OAAOpG,GAAqBqG,MAAkC;AACnF,QAAuB,CAACrG,EAAK;AAC3B,UAAI;AACF,cAAMW,EAASX,EAAK,EAAE,GACtB6B,EAAS,CAAC6B,MAASA,EAAK,IAAI,CAACzD,MAAOA,EAAE,OAAOD,EAAK,KAAK,EAAE,GAAGC,GAAG,MAAM,GAAA,IAASA,CAAE,CAAC,GACjF8B,EAAe,CAACiE,MAAM,KAAK,IAAI,GAAGA,IAAI,CAAC,CAAC;AAAA,MAC1C,SAASF,GAAG;AACV,QAAAQ,GAAQ,MAAMR,aAAa,QAAQA,EAAE,UAAU,QAAQ;AACvD;AAAA,MACF;AAEF,UAAMS,IAAO,OAAOvG,EAAK,QAAQ,EAAE,EAAE,KAAA;AACrC,QAAKuG,GACL;AAAA,UAAI3F,GAAY;AACd,QAAAA,EAAW2F,GAAMvG,CAAI,GACrBsB,EAAQ,EAAK;AACb;AAAA,MACF;AACA,MAAIiF,EAAK,WAAW,SAAS,KAAKA,EAAK,WAAW,UAAU,IAC1D,OAAO,KAAKA,GAAM,UAAU,qBAAqB,IAEjD,OAAO,SAAS,OAAOA,CAAI,GAE7BjF,EAAQ,EAAK;AAAA;AAAA,EACf,GAEMkF,KAAiB,OAAOxG,GAAqByG,MAAiC;AAClF,QAAI,CAAAA,EAAO,UACX;AAAA,UAAItF,IAAc;AAChB,YAAI;AACF,gBAAMA,GAAasF,EAAO,MAAMzG,CAAI,GACpCsB,EAAQ,EAAK,GACR6B,EAAA,GACAa,EAAA;AAAA,QACP,SAAS8B,GAAG;AACV,UAAAQ,GAAQ,MAAMR,aAAa,QAAQA,EAAE,UAAU,MAAM;AAAA,QACvD;AACA;AAAA,MACF;AACA,YAAMM,EAAepG,CAAI;AAAA;AAAA,EAC3B;AAEA,2BACG,OAAA,EAAI,WAAWuF,EAAWC,EAAO,UAAUxE,EAAS,GACnD,UAAA;AAAA,IAAA,gBAAA0E,EAACgB,IAAA,EAAM,OAAO5E,GAAa,MAAK,SAAQ,eAAe,IAAI,QAAQ,CAAC,IAAI,CAAC,GACvE,UAAA,gBAAA4D;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWL,EAAO;AAAA,QAClB,MAAM,gBAAAE,EAACiB,IAAA,EAAK,MAAM,IAAI,eAAW,IAAC;AAAA,QAClC,cAAY7E,IAAc,IAAI,OAAOA,CAAW,SAAS;AAAA,QACzD,SAAS,MAAMR,EAAQ,EAAI;AAAA,MAAA;AAAA,IAAA,GAE/B;AAAA,IACA,gBAAAmE;AAAA,MAACmB;AAAA,MAAA;AAAA,QACC,OAAAtG;AAAA,QACA,MAAAe;AAAA,QACA,SAAS,MAAMC,EAAQ,EAAK;AAAA,QAC5B,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,WAAWkE,EAAO;AAAA,QAClB,QAAQ;AAAA,UACN,QAAQ,EAAE,SAAS,YAAA;AAAA,UACnB,MAAM,EAAE,SAAS,YAAA;AAAA,QAAY;AAAA,QAG/B,UAAA;AAAA,UAAA,gBAAAE;AAAA,YAACmB;AAAA,YAAA;AAAA,cACC,WAAWrB,EAAO;AAAA,cAClB,MAAK;AAAA,cACL,WAAWnF,KAAe;AAAA,cAC1B,UAAU,CAACyG,MAAM5E,GAAe4E,MAAM,QAAQ,KAAKA,CAAC;AAAA,cACpD,aAAaf;AAAA,cACb,SAAO;AAAA,YAAA;AAAA,UAAA;AAAA,UAET,gBAAAL,EAAC,OAAA,EAAI,WAAWF,EAAO,WACrB,UAAA,gBAAAE;AAAA,YAACqB;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO5E;AAAA,cACP,UAAU,CAAC6E,MAAM5E,GAAc4E,CAAC;AAAA,cAChC,SAAS;AAAA,gBACP,EAAE,OAAO,OAAO,OAAO,KAAA;AAAA,gBACvB,EAAE,OAAO,UAAU,OAAO,KAAA;AAAA,gBAC1B,EAAE,OAAO,QAAQ,OAAO,KAAA;AAAA,cAAK;AAAA,YAC/B;AAAA,UAAA,GAEJ;AAAA,4BACC,OAAA,EAAI,WAAWxB,EAAO,YAAY,eAAY,qBAC7C,UAAA;AAAA,YAAA,gBAAAE,EAAC,OAAA,EAAI,WAAWF,EAAO,iBAAiB,UAAA,QAAI;AAAA,YAC5C,gBAAAE,EAAC,KAAA,EAAE,WAAWF,EAAO,gBAAgB,UAAA,iBAAa;AAAA,YAClD,gBAAAC,EAACwB,IAAA,EAAM,MAAM,IAAI,MAAI,IACnB,UAAA;AAAA,cAAA,gBAAAvB;AAAA,gBAACwB;AAAA,gBAAA;AAAA,kBACC,SAAS7E,EAAW;AAAA,kBACpB,UAAU,CAAC,MAAM4D,EAAgB,SAAS,EAAE,OAAO,OAAO;AAAA,kBAC3D,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGD,gBAAAP;AAAA,gBAACwB;AAAA,gBAAA;AAAA,kBACC,SAAS7E,EAAW;AAAA,kBACpB,UAAU,CAAC,MAAM4D,EAAgB,UAAU,EAAE,OAAO,OAAO;AAAA,kBAC5D,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGD,gBAAAP;AAAA,gBAACwB;AAAA,gBAAA;AAAA,kBACC,SAAS7E,EAAW;AAAA,kBACpB,UAAU,CAAC,MAAM4D,EAAgB,UAAU,EAAE,OAAO,OAAO;AAAA,kBAC5D,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAED,EAAA,CACF;AAAA,UAAA,GACF;AAAA,UACCvE,IAAQ,gBAAAgE,EAAC,KAAA,EAAE,WAAWF,EAAO,OAAQ,aAAM,IAAO;AAAA,UACnD,gBAAAE,EAAC,OAAA,EAAI,WAAWH,EAAW,wBAAwBC,EAAO,QAAQ,GAChE,UAAA,gBAAAE,EAACyB,IAAA,EAAS,UAAU3F,MAAWI,EAAM,WAAW,GAC7C,UAAA,CAACJ,MAAW,CAACE,KAASE,EAAM,WAAW,IACtC,gBAAA8D,EAAC0B,IAAA,EAAM,aAAY,QAAA,CAAQ,IACzBxF,EAAM,WAAW,IAAI,OACvB,gBAAA6D;AAAA,YAAC4B;AAAA,YAAA;AAAA,cACC,kBAAkB9B,EAAW,0BAA0BC,EAAO,UAAU;AAAA,cACxE,WAAWA,EAAO;AAAA,cAClB,eAAY;AAAA,cACZ,UAAU1B;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAA4B,EAAC,QAAG,WAAWF,EAAO,MACnB,UAAA5D,EAAM,IAAI,CAAC5B,MAAS;AACnB,wBAAMmF,IAAYzF,GAAiBM,EAAK,WAAW,GAC7CsH,IAAY,OAAOtH,EAAK,cAAcA,EAAK,SAAS,EAAE,EAAE,KAAA,GACxDuH,IAAY,EAAQD,GACpBE,IAAWC,GAAkBzH,EAAK,QAAQ,GAC1C0H,IAAUC;AAAA,oBACdC,GAAwB5H,CAAI;AAAA,kBAE9B,GACM6H,IAAeC,GAAoB9H,CAAI,GACvC+H,IAAOhI,GAAaC,CAAI,GACxBgI,IAAc,EAAQN,EAAQ;AACpC,2CACG,MAAA,EACC,UAAA,gBAAAjC;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAWF;AAAA,wBACTC,EAAO;AAAA,wBACP,CAACxF,EAAK,QAAQwF,EAAO;AAAA,wBACrBqC,KAAgBrC,EAAO;AAAA,sBAAA;AAAA,sBAEzB,MAAMqC,IAAe,SAAY;AAAA,sBACjC,UAAUA,IAAe,SAAY;AAAA,sBACrC,SAASA,IAAe,SAAY,MAAM,KAAKzB,EAAepG,CAAI;AAAA,sBAClE,WACE6H,IACI,SACA,CAAC/B,MAAM;AACL,yBAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACGM,EAAepG,CAAI;AAAA,sBAE5B;AAAA,sBAGN,UAAA;AAAA,wBAAA,gBAAAyF,EAAC,OAAA,EAAI,WAAWD,EAAO,YACrB,UAAA;AAAA,0BAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,gBACtB,UAAA;AAAA,4BAAA,gBAAAE,EAAC,QAAA,EAAK,WAAWF,EAAO,WAAW,OAAOxF,EAAK,SAAS,SACrD,UAAAA,EAAK,SAAS,QAAA,CACjB;AAAA,4BACCmF,IACC,gBAAAO;AAAA,8BAACE;AAAA,8BAAA;AAAA,gCACC,OAAO/F,EAAyBG,EAAK,WAAW;AAAA,gCAChD,WAAWwF,EAAO;AAAA,gCAEjB,UAAAL;AAAA,8BAAA;AAAA,4BAAA,IAED;AAAA,0BAAA,GACN;AAAA,4CACC,QAAA,EAAK,WAAWK,EAAO,UAAW,UAAAxF,EAAK,aAAa,GAAA,CAAG;AAAA,wBAAA,GAC1D;AAAA,wBACA,gBAAA0F,EAAC,OAAA,EAAI,WAAWF,EAAO,UACpB,UAAAgC,IACC,gBAAA9B;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,WAAWF,EAAO;AAAA,4BAClB,yBAAyB,EAAE,QAAQgC,EAAA;AAAA,0BAAS;AAAA,wBAAA,IAE5CxH,EAAK,UACP,gBAAA0F,EAAC,QAAA,EAAK,WAAWF,EAAO,aACrB,UAAAG,EAAgB3F,EAAK,OAAO,EAAA,CAC/B,IACE,MACN;AAAA,wBACC+H,IAAO,gBAAArC,EAAC,QAAA,EAAK,WAAWF,EAAO,UAAW,aAAK,IAAU;AAAA,wBACzD+B,IACC,gBAAA7B,EAAC,OAAA,EAAI,WAAWF,EAAO,gBACrB,UAAA,gBAAAE;AAAA,0BAACE;AAAA,0BAAA;AAAA,4BACC,OAAO1F,GAAqBF,EAAK,UAAU;AAAA,4BAC3C,WAAWwF,EAAO;AAAA,4BAEjB,UAAA8B;AAAA,0BAAA;AAAA,wBAAA,GAEL,IACE;AAAA,wBACHU,KAAeN,EAAQ,UACtB,gBAAAhC;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,WAAWF,EAAO;AAAA,4BAClB,SAAS,CAACM,MAAMA,EAAE,gBAAA;AAAA,4BAClB,WAAW,CAACA,MAAMA,EAAE,gBAAA;AAAA,4BAEpB,UAAA,gBAAAL,EAACwB,IAAA,EAAM,MAAM,GAAG,MAAI,IAClB,UAAA;AAAA,8BAAA,gBAAAvB;AAAA,gCAACG;AAAA,gCAAA;AAAA,kCACC,MAAK;AAAA,kCACL,MAAK;AAAA,kCACL,SAAS,MAAM,KAAKW,GAAexG,GAAM0H,EAAQ,OAAQ;AAAA,kCAExD,YAAQ,QAAQ;AAAA,gCAAA;AAAA,8BAAA;AAAA,8BAElBA,EAAQ,YACP,gBAAAhC;AAAA,gCAACG;AAAA,gCAAA;AAAA,kCACC,MAAK;AAAA,kCACL,MAAK;AAAA,kCACL,SAAS,MAAM,KAAKW,GAAexG,GAAM0H,EAAQ,SAAU;AAAA,kCAE1D,YAAQ,UAAU;AAAA,gCAAA;AAAA,8BAAA,IAEnB;AAAA,4BAAA,EAAA,CACN;AAAA,0BAAA;AAAA,wBAAA,IAEA;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA,EACN,GAtFO1H,EAAK,EAuFd;AAAA,gBAEJ,CAAC,EAAA,CACH;AAAA,gBACCwC,KACC,gBAAAkD,EAAC,KAAA,EAAE,WAAWH,EAAW,0BAA0BC,EAAO,UAAU,GAAG,UAAA,OAAA,CAAI,IACzE;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA,GAGV,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ,CAAC;"}
1
+ {"version":3,"file":"InboxBell.js","sources":["../../../../../src/components/Tools/Inbox/InboxBell/InboxBell.tsx"],"sourcesContent":["import { Badge, Button, Checkbox, Drawer, Space, message, notification } from 'antd';\nimport classNames from 'classnames';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type UIEvent,\n} from 'react';\nimport { Empty } from '@/components/Empty';\nimport { Bell } from '@/components/Icons';\nimport { PageSpin } from '@/components/Layout';\nimport { SegmentedRadio } from '@/components/SegmentedRadio';\nimport { StateBar } from '@/components/StateBar';\nimport { SEMANTIC_COLORS, SemanticTag } from '@/components/Tag';\nimport { VirtualScrollbar } from '@/components/VirtualScrollbar';\nimport { sanitizeInboxHtml } from '../sanitizeInboxHtml';\nimport { INBOX_BADGE_REFRESH_EVENT } from '../requestInboxBadgeRefresh';\nimport { emphasizeQuoted } from './emphasizeQuoted';\nimport {\n filterInboxActionsForHost,\n isInboxButtonDriven,\n resolveInboxItemActions,\n type InboxItemActionKind,\n type InboxItemQuickAction,\n} from './inboxItemActions';\nimport {\n loadInboxToastPrefs,\n saveInboxToastPrefs,\n shouldToastForMessageType,\n type InboxToastPrefs,\n} from './toastPrefs';\nimport styles from './style.module.scss';\n\nexport type InboxBellMessageType = 'alert' | 'action' | 'remind' | string;\n\nexport type InboxBellItem = {\n id: string;\n title?: string;\n /** 纯文本摘要(列表兼容) */\n summary?: string;\n /** 已渲染 HTML 正文;空则主摘要位回落 summary */\n bodyHtml?: string | null;\n read?: boolean;\n messageType?: InboxBellMessageType;\n href?: string;\n createdAt?: string;\n level?: string;\n /** 级别展示名(业务仓从已有维表/工具函数填;空则回落 level) */\n levelLabel?: string;\n /**\n * 级别 Tag 色:业务仓传入预警级别设置色(如 QA `ALERT_LEVEL_COLORS.*.accent`)。\n * 支持 SemanticColor 键或 `#hex`;core 不自造级别色表。\n */\n levelColor?: string;\n category?: string;\n scene?: string;\n eventKey?: string;\n categoryLabel?: string;\n alertId?: string | null;\n actionId?: string | null;\n claimed?: boolean;\n started?: boolean;\n /** 行动当前状态(enrich / contextJson);终态时底栏只保留查看任务 */\n actionStatus?: string;\n factory?: string;\n variety?: string;\n metric?: string;\n /** 业务日/月份(如 2026-07-31);预警深链 date 用 */\n month?: string;\n};\n\nexport type InboxBellListResult = {\n /** 分页列表(Marsun list-api 唯一数组名) */\n pageData: InboxBellItem[];\n total?: number;\n unreadTotal?: number;\n unreadByMessageType?: Partial<Record<string, number>>;\n};\n\nexport type InboxBellListParams = {\n unreadOnly?: boolean;\n readOnly?: boolean;\n messageType?: InboxBellMessageType;\n currentPage?: number;\n pageSize?: number;\n};\n\nexport type InboxBellProps = {\n /** 拉取站内信(业务注入;须带 JWT 身份,禁止无身份全表) */\n fetchInbox: (params: InboxBellListParams) => Promise<InboxBellListResult>;\n /** 标记已读 */\n markRead: (id: string) => Promise<void | InboxBellItem>;\n /** 点击条目:默认用 window.location / 业务 navigate */\n onNavigate?: (href: string, item: InboxBellItem) => void;\n /**\n * 轮询未读角标(ms)。默认 `0`(关定时);`>0` 才 setInterval。\n * 角标另由:挂载首刷、`locationKey`、focus/visibility、`requestInboxBadgeRefresh` 触发。\n */\n pollMs?: number;\n /**\n * 路由/页面身份;变化时刷新角标(如 React Router `location.pathname`)。\n * 整页加载靠挂载首刷,不必另传。\n */\n locationKey?: string | number;\n pageSize?: number;\n className?: string;\n /** Drawer 标题 */\n title?: string;\n /**\n * 同源 SSE 路径(默认 `/api/v1/msg-center/inbox/stream`)。\n * 传 `false` 关闭。须配合 `getAccessToken`(EventSource 用 `access_token` 查询参数传 JWT)。\n * 失败回落写后刷新 / 焦点刷新,不定时轮询冒充。\n */\n streamPath?: string | false;\n /** 返回当前 JWT;空则不开 SSE */\n getAccessToken?: () => string | null | undefined;\n /**\n * 卡片底栏动作(认领/去执行/查看等)。不传则底栏按钮一律走 onNavigate / href。\n * 业务仓拦截 claim_alert / start_action;铃铛不解析新建任务。\n */\n onItemAction?: (kind: InboxItemActionKind, item: InboxBellItem) => void | Promise<void>;\n};\n\nexport type InboxBellHandle = {\n refreshBadge: () => Promise<void>;\n};\n\nconst TYPE_TABS: Array<{ key: string; label: string }> = [\n { key: '', label: '全部' },\n { key: 'alert', label: '预警' },\n { key: 'action', label: '行动' },\n { key: 'remind', label: '提醒' },\n];\n\nconst TYPE_TAG_LABEL: Record<string, string> = {\n alert: '预警',\n action: '行动',\n remind: '提醒',\n};\n\nconst FOCUS_DEBOUNCE_MS = 300;\n/** SSE / 写后 / 外部刷角标合并窗口,避免扫描风暴打爆 inbox */\nconst BADGE_DEBOUNCE_MS = 1_500;\n/** 距底部小于该值时拉下一页 */\nconst LOAD_MORE_GAP_PX = 72;\n\nfunction messageTypeLabel(raw?: string): string {\n const key = String(raw || '')\n .trim()\n .toLowerCase();\n if (!key) return '';\n return TYPE_TAG_LABEL[key] || key;\n}\n\nfunction messageTypeSemanticColor(raw?: string): string {\n const key = String(raw || '')\n .trim()\n .toLowerCase();\n if (key === 'alert') return SEMANTIC_COLORS.DANGER;\n if (key === 'action') return SEMANTIC_COLORS.PRIMARY;\n if (key === 'remind') return SEMANTIC_COLORS.WARNING;\n return SEMANTIC_COLORS.DEFAULT;\n}\n\nfunction itemMetaLine(item: InboxBellItem): string {\n return [item.factory, item.variety, item.metric]\n .map((x) => String(x || '').trim())\n .filter(Boolean)\n .join(' · ');\n}\n\n/** 业务传入色;无则 DEFAULT(禁止在 core 造级别→色平行表) */\nfunction resolveLevelTagColor(raw?: string): string {\n const c = String(raw || '').trim();\n return c || SEMANTIC_COLORS.DEFAULT;\n}\n\ntype BadgePreview = {\n messageType?: string;\n title?: string;\n summary?: string;\n};\n\nfunction parseBadgePreview(raw: string): BadgePreview | null {\n try {\n const data = JSON.parse(raw) as Record<string, unknown>;\n if (!data || typeof data !== 'object') return null;\n const messageType = String(data.messageType || data.message_type || '').trim();\n const title = String(data.title || '').trim();\n const summary = String(data.summary || '').trim();\n if (!messageType && !title && !summary) return null;\n return {\n messageType: messageType || undefined,\n title: title || undefined,\n summary: summary || undefined,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * 通用站内信铃铛:列表 / 已读 / Tab / 角标 / 卡片底栏动作 / 可选 SSE toast。\n * 认领、去执行等业务动作由 `onItemAction` 注入;默认底栏按钮走 onNavigate / href。\n * 默认不定时轮询;有消息侧靠业务回调 / 路由 / 焦点 / 可选 SSE 再拉角标。\n */\nconst InboxBell = forwardRef<InboxBellHandle, InboxBellProps>(function InboxBell(\n {\n fetchInbox,\n markRead,\n onNavigate,\n pollMs = 0,\n locationKey,\n pageSize = 20,\n className,\n title = '站内信',\n streamPath = '/api/v1/msg-center/inbox/stream',\n getAccessToken,\n onItemAction,\n },\n ref,\n) {\n const [open, setOpen] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [items, setItems] = useState<InboxBellItem[]>([]);\n const [unreadTotal, setUnreadTotal] = useState(0);\n const [unreadByType, setUnreadByType] = useState<Partial<Record<string, number>>>({});\n const [messageType, setMessageType] = useState<string>('');\n const [readFilter, setReadFilter] = useState<'all' | 'unread' | 'read'>('all');\n const [toastPrefs, setToastPrefs] = useState<InboxToastPrefs>(() => loadInboxToastPrefs());\n const [loadingMore, setLoadingMore] = useState(false);\n const focusDebounceRef = useRef<number | null>(null);\n const badgeDebounceRef = useRef<number | null>(null);\n const pendingToastRef = useRef<BadgePreview | null>(null);\n const locationKeyPrimedRef = useRef(false);\n const toastPrefsRef = useRef(toastPrefs);\n toastPrefsRef.current = toastPrefs;\n const currentPageRef = useRef(1);\n const loadingMoreRef = useRef(false);\n const hasMoreRef = useRef(false);\n\n const listQuery = useMemo(\n () => ({\n messageType: messageType || undefined,\n unreadOnly: readFilter === 'unread' || undefined,\n readOnly: readFilter === 'read' || undefined,\n }),\n [messageType, readFilter],\n );\n\n const load = useCallback(async () => {\n setLoading(true);\n setError('');\n currentPageRef.current = 1;\n hasMoreRef.current = false;\n try {\n const res = await fetchInbox({\n currentPage: 1,\n pageSize,\n ...listQuery,\n });\n const page = res?.pageData || [];\n const total = typeof res?.total === 'number' ? res.total : page.length;\n setItems(page);\n hasMoreRef.current = page.length > 0 && page.length < total;\n setUnreadTotal(typeof res?.unreadTotal === 'number' ? res.unreadTotal : 0);\n setUnreadByType(res?.unreadByMessageType || {});\n } catch (e) {\n setItems([]);\n hasMoreRef.current = false;\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoading(false);\n }\n }, [fetchInbox, pageSize, listQuery]);\n\n const loadMore = useCallback(async () => {\n if (loadingMoreRef.current || !hasMoreRef.current) return;\n loadingMoreRef.current = true;\n setLoadingMore(true);\n try {\n const next = currentPageRef.current + 1;\n const res = await fetchInbox({\n currentPage: next,\n pageSize,\n ...listQuery,\n });\n const page = res?.pageData || [];\n const total = typeof res?.total === 'number' ? res.total : 0;\n setItems((prev) => {\n const seen = new Set(prev.map((x) => x.id));\n const extra = page.filter((x) => x?.id && !seen.has(x.id));\n const merged = extra.length ? [...prev, ...extra] : prev;\n hasMoreRef.current =\n extra.length > 0 && (total > 0 ? merged.length < total : extra.length >= pageSize);\n return merged;\n });\n if (page.length) currentPageRef.current = next;\n if (typeof res?.unreadTotal === 'number') setUnreadTotal(res.unreadTotal);\n if (res?.unreadByMessageType) setUnreadByType(res.unreadByMessageType);\n } catch {\n hasMoreRef.current = false;\n } finally {\n loadingMoreRef.current = false;\n setLoadingMore(false);\n }\n }, [fetchInbox, pageSize, listQuery]);\n\n const onListScroll = useCallback(\n (e: UIEvent<HTMLDivElement>) => {\n const el = e.currentTarget;\n if (el.scrollHeight - el.scrollTop - el.clientHeight <= LOAD_MORE_GAP_PX) {\n void loadMore();\n }\n },\n [loadMore],\n );\n\n const refreshBadge = useCallback(async () => {\n try {\n // 与列表同 pageSize(禁硬编码 1);角标只消费 unread* 字段\n const res = await fetchInbox({ currentPage: 1, pageSize });\n setUnreadTotal(typeof res?.unreadTotal === 'number' ? res.unreadTotal : 0);\n setUnreadByType(res?.unreadByMessageType || {});\n } catch {\n /* 角标失败不打断 UI */\n }\n }, [fetchInbox, pageSize]);\n\n const flushPendingToast = useCallback(() => {\n const preview = pendingToastRef.current;\n pendingToastRef.current = null;\n if (!preview) return;\n if (!shouldToastForMessageType(toastPrefsRef.current, preview.messageType)) return;\n const toastTitle = preview.title || '新站内信';\n const toastDesc = preview.summary || '';\n const typeLabel = messageTypeLabel(preview.messageType);\n const openDrawer = () => {\n notification.destroy();\n setOpen(true);\n };\n const toastKey = `inbox-badge-${preview.messageType || 'msg'}-${Date.now()}`;\n notification.open({\n key: toastKey,\n className: classNames('marsun-inbox-toast', styles.toastNotice),\n closable: true,\n title: (\n <div className={styles.toastHead}>\n <span className={styles.toastTitle}>{emphasizeQuoted(toastTitle)}</span>\n {typeLabel ? (\n <SemanticTag\n color={messageTypeSemanticColor(preview.messageType)}\n className={styles.typeTag}\n >\n {typeLabel}\n </SemanticTag>\n ) : null}\n </div>\n ),\n message: (\n <div className={styles.toastHead}>\n <span className={styles.toastTitle}>{emphasizeQuoted(toastTitle)}</span>\n {typeLabel ? (\n <SemanticTag\n color={messageTypeSemanticColor(preview.messageType)}\n className={styles.typeTag}\n >\n {typeLabel}\n </SemanticTag>\n ) : null}\n </div>\n ),\n description: (\n <div className={styles.toastBody}>\n {toastDesc ? <div className={styles.toastDesc}>{emphasizeQuoted(toastDesc)}</div> : null}\n <div className={styles.toastActions}>\n <Button\n type=\"primary\"\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n openDrawer();\n }}\n >\n 查看\n </Button>\n </div>\n </div>\n ),\n placement: 'topRight',\n duration: 6,\n onClick: openDrawer,\n });\n }, []);\n\n /** 合并高频角标刷新(SSE 扫描风暴 / 写后 / 路由 / 焦点);命令式 refreshBadge 仍立即执行 */\n const scheduleBadgeRefresh = useCallback(\n (preview?: BadgePreview | null) => {\n if (preview) pendingToastRef.current = preview;\n if (badgeDebounceRef.current != null) {\n window.clearTimeout(badgeDebounceRef.current);\n }\n badgeDebounceRef.current = window.setTimeout(() => {\n badgeDebounceRef.current = null;\n void refreshBadge();\n flushPendingToast();\n }, BADGE_DEBOUNCE_MS);\n },\n [refreshBadge, flushPendingToast],\n );\n\n useImperativeHandle(ref, () => ({ refreshBadge }), [refreshBadge]);\n\n useEffect(() => {\n void refreshBadge();\n }, [refreshBadge]);\n\n useEffect(() => {\n if (locationKey === undefined) return;\n // 挂载首刷已由 refreshBadge effect 覆盖;仅后续路由变化再拉\n if (!locationKeyPrimedRef.current) {\n locationKeyPrimedRef.current = true;\n return;\n }\n scheduleBadgeRefresh();\n }, [locationKey, scheduleBadgeRefresh]);\n\n useEffect(() => {\n if (pollMs <= 0) return undefined;\n const t = window.setInterval(() => {\n void refreshBadge();\n }, pollMs);\n return () => window.clearInterval(t);\n }, [pollMs, refreshBadge]);\n\n useEffect(() => {\n const schedule = () => {\n if (focusDebounceRef.current != null) {\n window.clearTimeout(focusDebounceRef.current);\n }\n focusDebounceRef.current = window.setTimeout(() => {\n focusDebounceRef.current = null;\n scheduleBadgeRefresh();\n }, FOCUS_DEBOUNCE_MS);\n };\n\n const onVisibility = () => {\n if (document.visibilityState === 'visible') schedule();\n };\n\n window.addEventListener('focus', schedule);\n document.addEventListener('visibilitychange', onVisibility);\n return () => {\n window.removeEventListener('focus', schedule);\n document.removeEventListener('visibilitychange', onVisibility);\n if (focusDebounceRef.current != null) {\n window.clearTimeout(focusDebounceRef.current);\n focusDebounceRef.current = null;\n }\n };\n }, [scheduleBadgeRefresh]);\n\n useEffect(() => {\n const onExternal = () => {\n scheduleBadgeRefresh();\n };\n window.addEventListener(INBOX_BADGE_REFRESH_EVENT, onExternal);\n return () => window.removeEventListener(INBOX_BADGE_REFRESH_EVENT, onExternal);\n }, [scheduleBadgeRefresh]);\n\n useEffect(() => {\n return () => {\n if (badgeDebounceRef.current != null) {\n window.clearTimeout(badgeDebounceRef.current);\n badgeDebounceRef.current = null;\n }\n };\n }, []);\n\n useEffect(() => {\n if (streamPath === false) return undefined;\n if (typeof getAccessToken !== 'function') return undefined;\n if (typeof window === 'undefined' || typeof EventSource === 'undefined') return undefined;\n\n const token = String(getAccessToken() || '').trim();\n if (!token) return undefined;\n\n const base = String(streamPath || '/api/v1/msg-center/inbox/stream').trim();\n const url = new URL(base, window.location.origin);\n url.searchParams.set('access_token', token);\n\n let es: EventSource;\n try {\n es = new EventSource(url.toString());\n } catch {\n return undefined;\n }\n\n const onBadge = (ev: Event) => {\n const msgEv = ev as MessageEvent;\n const preview = typeof msgEv?.data === 'string' ? parseBadgePreview(msgEv.data) : null;\n scheduleBadgeRefresh(preview);\n };\n es.addEventListener('badge', onBadge);\n es.addEventListener('inbox', onBadge);\n // 失败回落写后/焦点刷新;关连接防 EventSource 自动重连刷屏\n es.onerror = () => {\n es.close();\n };\n\n return () => {\n es.removeEventListener('badge', onBadge);\n es.removeEventListener('inbox', onBadge);\n es.close();\n };\n }, [streamPath, getAccessToken, scheduleBadgeRefresh]);\n\n useEffect(() => {\n if (open) void load();\n }, [open, load]);\n\n const typeTabOptions = useMemo(\n () =>\n TYPE_TABS.map((t) => {\n const n = t.key ? unreadByType[t.key] || 0 : unreadTotal;\n return {\n key: t.key || 'all',\n label: n > 0 ? `${t.label} (${n})` : t.label,\n };\n }),\n [unreadByType, unreadTotal],\n );\n\n const updateToastPref = (key: keyof InboxToastPrefs, checked: boolean) => {\n setToastPrefs((prev) => {\n const next = { ...prev, [key]: checked };\n saveInboxToastPrefs(next);\n return next;\n });\n };\n\n const handleOpenItem = async (item: InboxBellItem, opts?: { skipRead?: boolean }) => {\n if (!opts?.skipRead && !item.read) {\n try {\n await markRead(item.id);\n setItems((prev) => prev.map((x) => (x.id === item.id ? { ...x, read: true } : x)));\n setUnreadTotal((n) => Math.max(0, n - 1));\n } catch (e) {\n message.error(e instanceof Error ? e.message : '标记已读失败');\n return;\n }\n }\n const href = String(item.href || '').trim();\n if (!href) return;\n if (onNavigate) {\n onNavigate(href, item);\n setOpen(false);\n return;\n }\n if (href.startsWith('http://') || href.startsWith('https://')) {\n window.open(href, '_blank', 'noopener,noreferrer');\n } else {\n window.location.assign(href);\n }\n setOpen(false);\n };\n\n const runQuickAction = async (item: InboxBellItem, action: InboxItemQuickAction) => {\n if (action.disabled) return;\n if (onItemAction) {\n try {\n await onItemAction(action.kind, item);\n setOpen(false);\n void load();\n void refreshBadge();\n } catch (e) {\n message.error(e instanceof Error ? e.message : '操作失败');\n }\n return;\n }\n await handleOpenItem(item);\n };\n\n return (\n <div className={classNames(styles.bellWrap, className)}>\n <Badge count={unreadTotal} size=\"small\" overflowCount={99} offset={[-4, 4]}>\n <Button\n type=\"text\"\n className={styles.bellBtn}\n icon={<Bell size={16} aria-hidden />}\n aria-label={unreadTotal > 0 ? `站内信,${unreadTotal} 条未读` : '站内信'}\n onClick={() => setOpen(true)}\n />\n </Badge>\n <Drawer\n title={title}\n open={open}\n onClose={() => setOpen(false)}\n size={420}\n destroyOnClose={false}\n className={styles.drawer}\n styles={{\n header: { padding: '12px 16px' },\n body: { padding: '12px 16px' },\n }}\n >\n <StateBar\n className={styles.typeTabs}\n size=\"small\"\n activeKey={messageType || 'all'}\n onChange={(k) => setMessageType(k === 'all' ? '' : k)}\n stateOption={typeTabOptions}\n isInner\n />\n <div className={styles.filterRow}>\n <SegmentedRadio<'all' | 'unread' | 'read'>\n size=\"small\"\n value={readFilter}\n onChange={(v) => setReadFilter(v)}\n options={[\n { value: 'all', label: '全部' },\n { value: 'unread', label: '未读' },\n { value: 'read', label: '已读' },\n ]}\n />\n </div>\n <div className={styles.toastPrefs} data-testid=\"inbox-toast-prefs\">\n <div className={styles.toastPrefsTitle}>消息提示</div>\n <p className={styles.toastPrefsHint}>本机浏览器偏好,非租户策略</p>\n <Space size={12} wrap>\n <Checkbox\n checked={toastPrefs.alert}\n onChange={(e) => updateToastPref('alert', e.target.checked)}\n >\n 预警弹出\n </Checkbox>\n <Checkbox\n checked={toastPrefs.action}\n onChange={(e) => updateToastPref('action', e.target.checked)}\n >\n 行动弹出\n </Checkbox>\n <Checkbox\n checked={toastPrefs.remind}\n onChange={(e) => updateToastPref('remind', e.target.checked)}\n >\n 提醒弹出\n </Checkbox>\n </Space>\n </div>\n {error ? <p className={styles.error}>{error}</p> : null}\n <div className={classNames('inbox-bell-list-pane', styles.listPane)}>\n <PageSpin spinning={loading && items.length === 0}>\n {!loading && !error && items.length === 0 ? (\n <Empty description=\"暂无站内信\" />\n ) : items.length === 0 ? null : (\n <VirtualScrollbar\n wrapperClassName={classNames('inbox-bell-list-scroll', styles.listScroll)}\n className={styles.listViewport}\n data-testid=\"inbox-bell-list-scroll\"\n onScroll={onListScroll}\n >\n <ul className={styles.list}>\n {items.map((item) => {\n const typeLabel = messageTypeLabel(item.messageType);\n const levelText = String(item.levelLabel || item.level || '').trim();\n const showLevel = Boolean(levelText);\n const safeHtml = sanitizeInboxHtml(item.bodyHtml);\n const actions = filterInboxActionsForHost(\n resolveInboxItemActions(item),\n Boolean(onItemAction),\n );\n const buttonDriven = isInboxButtonDriven(item);\n const meta = itemMetaLine(item);\n const showActions = Boolean(actions.primary);\n return (\n <li key={item.id}>\n <div\n className={classNames(\n styles.item,\n !item.read && styles.itemUnread,\n buttonDriven && styles.itemStatic,\n )}\n role={buttonDriven ? undefined : 'button'}\n tabIndex={buttonDriven ? undefined : 0}\n onClick={buttonDriven ? undefined : () => void handleOpenItem(item)}\n onKeyDown={\n buttonDriven\n ? undefined\n : (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n void handleOpenItem(item);\n }\n }\n }\n >\n <div className={styles.itemHeader}>\n <span className={styles.itemHeaderLeft}>\n <span className={styles.itemTitle} title={item.title || '(无标题)'}>\n {item.title || '(无标题)'}\n </span>\n {typeLabel ? (\n <SemanticTag\n color={messageTypeSemanticColor(item.messageType)}\n className={styles.typeTag}\n >\n {typeLabel}\n </SemanticTag>\n ) : null}\n </span>\n <span className={styles.itemTime}>{item.createdAt || ''}</span>\n </div>\n <div className={styles.itemBody}>\n {safeHtml ? (\n <div\n className={styles.itemBodyHtml}\n dangerouslySetInnerHTML={{ __html: safeHtml }}\n />\n ) : item.summary ? (\n <span className={styles.itemSummary}>\n {emphasizeQuoted(item.summary)}\n </span>\n ) : null}\n </div>\n {meta ? <span className={styles.itemMeta}>{meta}</span> : null}\n {showLevel ? (\n <div className={styles.itemFooterTags}>\n <SemanticTag\n color={resolveLevelTagColor(item.levelColor)}\n className={styles.typeTag}\n >\n {levelText}\n </SemanticTag>\n </div>\n ) : null}\n {showActions && actions.primary ? (\n <div\n className={styles.itemActions}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <Space size={8} wrap>\n <Button\n size=\"small\"\n type=\"primary\"\n onClick={() => void runQuickAction(item, actions.primary!)}\n >\n {actions.primary.label}\n </Button>\n {actions.secondary ? (\n <Button\n size=\"small\"\n type=\"link\"\n onClick={() => void runQuickAction(item, actions.secondary!)}\n >\n {actions.secondary.label}\n </Button>\n ) : null}\n </Space>\n </div>\n ) : null}\n </div>\n </li>\n );\n })}\n </ul>\n {loadingMore ? (\n <p className={classNames('inbox-bell-list-footer', styles.listFooter)}>加载中…</p>\n ) : null}\n </VirtualScrollbar>\n )}\n </PageSpin>\n </div>\n </Drawer>\n </div>\n );\n});\n\nexport default InboxBell;\nexport {\n DEFAULT_INBOX_TOAST_PREFS,\n loadInboxToastPrefs,\n saveInboxToastPrefs,\n shouldToastForMessageType,\n} from './toastPrefs';\nexport type { InboxToastPrefs } from './toastPrefs';\nexport {\n resolveInboxItemActions,\n resolveInboxSceneKey,\n filterInboxActionsForHost,\n normalizeInboxActions,\n inboxSceneLabel,\n isInboxButtonDriven,\n isTerminalActionStatus,\n} from './inboxItemActions';\nexport type {\n InboxItemActionKind,\n InboxItemQuickAction,\n InboxItemActionsResolved,\n} from './inboxItemActions';\n"],"names":["TYPE_TABS","TYPE_TAG_LABEL","FOCUS_DEBOUNCE_MS","BADGE_DEBOUNCE_MS","LOAD_MORE_GAP_PX","messageTypeLabel","raw","key","messageTypeSemanticColor","SEMANTIC_COLORS","itemMetaLine","item","x","resolveLevelTagColor","parseBadgePreview","data","messageType","title","summary","InboxBell","forwardRef","fetchInbox","markRead","onNavigate","pollMs","locationKey","pageSize","className","streamPath","getAccessToken","onItemAction","ref","open","setOpen","useState","loading","setLoading","error","setError","items","setItems","unreadTotal","setUnreadTotal","unreadByType","setUnreadByType","setMessageType","readFilter","setReadFilter","toastPrefs","setToastPrefs","loadInboxToastPrefs","loadingMore","setLoadingMore","focusDebounceRef","useRef","badgeDebounceRef","pendingToastRef","locationKeyPrimedRef","toastPrefsRef","currentPageRef","loadingMoreRef","hasMoreRef","listQuery","useMemo","load","useCallback","res","page","total","loadMore","next","prev","seen","extra","merged","onListScroll","el","refreshBadge","flushPendingToast","preview","shouldToastForMessageType","toastTitle","toastDesc","typeLabel","openDrawer","notification","toastKey","classNames","styles","jsxs","jsx","emphasizeQuoted","SemanticTag","Button","e","scheduleBadgeRefresh","useImperativeHandle","useEffect","t","schedule","onVisibility","onExternal","INBOX_BADGE_REFRESH_EVENT","token","base","url","es","onBadge","ev","msgEv","typeTabOptions","n","updateToastPref","checked","saveInboxToastPrefs","handleOpenItem","opts","message","href","runQuickAction","action","Badge","Bell","Drawer","StateBar","k","SegmentedRadio","v","Space","Checkbox","PageSpin","Empty","VirtualScrollbar","levelText","showLevel","safeHtml","sanitizeInboxHtml","actions","filterInboxActionsForHost","resolveInboxItemActions","buttonDriven","isInboxButtonDriven","meta","showActions"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hkyhy/marsun-components-core",
3
- "version": "0.1.126",
3
+ "version": "0.1.127",
4
4
  "description": "Marsun pure UI component library",
5
5
  "type": "module",
6
6
  "repository": {