@tryghost/activitypub 3.0.6 → 3.0.7
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/dist/activitypub.js +3 -3
- package/dist/at-sign-DjgaOOtV.mjs +15 -0
- package/dist/at-sign-DjgaOOtV.mjs.map +1 -0
- package/dist/avatar-flipboard-8NioODS5.mjs +19 -0
- package/dist/avatar-flipboard-8NioODS5.mjs.map +1 -0
- package/dist/bluesky-sharing-B4oF-0BN.mjs +150 -0
- package/dist/bluesky-sharing-B4oF-0BN.mjs.map +1 -0
- package/dist/copy-BxgO1lWX.mjs +15 -0
- package/dist/copy-BxgO1lWX.mjs.map +1 -0
- package/dist/deleted-feed-item-Ct4Zc7u3.mjs +133 -0
- package/dist/deleted-feed-item-Ct4Zc7u3.mjs.map +1 -0
- package/dist/edit-profile-DVsYbpNY.mjs +3651 -0
- package/dist/edit-profile-DVsYbpNY.mjs.map +1 -0
- package/dist/feed-D0aeoOOJ.mjs +207 -0
- package/dist/feed-D0aeoOOJ.mjs.map +1 -0
- package/dist/hash-B-J30lCU.mjs +17 -0
- package/dist/hash-B-J30lCU.mjs.map +1 -0
- package/dist/inbox-BrLsHadF.mjs +21 -0
- package/dist/inbox-BrLsHadF.mjs.map +1 -0
- package/dist/index-BMm_mIRT.mjs +138 -0
- package/dist/index-BMm_mIRT.mjs.map +1 -0
- package/dist/{index-CFmbpqlr.mjs → index-BdcW7GlH.mjs} +20 -20
- package/dist/{index-CFmbpqlr.mjs.map → index-BdcW7GlH.mjs.map} +1 -1
- package/dist/index-BftxScf5.mjs +4994 -0
- package/dist/index-BftxScf5.mjs.map +1 -0
- package/dist/index-DL7eG3Ac.mjs +367 -0
- package/dist/index-DL7eG3Ac.mjs.map +1 -0
- package/dist/index-DnpX9U7J.mjs +688 -0
- package/dist/index-DnpX9U7J.mjs.map +1 -0
- package/dist/index-DyFr7l3O.mjs +6508 -0
- package/dist/index-DyFr7l3O.mjs.map +1 -0
- package/dist/index-WlK4xdmR.mjs +219 -0
- package/dist/index-WlK4xdmR.mjs.map +1 -0
- package/dist/index-_vEj3NfZ.mjs +27062 -0
- package/dist/index-_vEj3NfZ.mjs.map +1 -0
- package/dist/moderation-KWQp9gQj.mjs +113 -0
- package/dist/moderation-KWQp9gQj.mjs.map +1 -0
- package/dist/note-CfQDRkeT.mjs +249 -0
- package/dist/note-CfQDRkeT.mjs.map +1 -0
- package/dist/reply-BrWarBVQ.mjs +15 -0
- package/dist/reply-BrWarBVQ.mjs.map +1 -0
- package/dist/separator-nDV4oVPB.mjs +39 -0
- package/dist/separator-nDV4oVPB.mjs.map +1 -0
- package/dist/settings-CCnMmVaW.mjs +79 -0
- package/dist/settings-CCnMmVaW.mjs.map +1 -0
- package/dist/step-1-HGv6537o.mjs +73 -0
- package/dist/step-1-HGv6537o.mjs.map +1 -0
- package/dist/step-2-hqeY_dIc.mjs +143 -0
- package/dist/step-2-hqeY_dIc.mjs.map +1 -0
- package/dist/step-3-8yg4QPpr.mjs +345 -0
- package/dist/step-3-8yg4QPpr.mjs.map +1 -0
- package/dist/tabs-BZytpdZ9.mjs +1096 -0
- package/dist/tabs-BZytpdZ9.mjs.map +1 -0
- package/dist/topic-filter-1kNAxvyr.mjs +39 -0
- package/dist/topic-filter-1kNAxvyr.mjs.map +1 -0
- package/package.json +1 -1
- package/dist/index-BJKUA7bK.mjs +0 -46030
- package/dist/index-BJKUA7bK.mjs.map +0 -1
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import { a6 as P, j as t, aI as H, R as u, d as C, aJ as D, c as g, e as L, av as O, aw as V, L as q, E as G, f as K, aK as J, S as w, A as $, B as Q, aL as Z, aa as E, h as b, r as X, ac as U, aM as Y, aN as ee, k as te, P as se } from "./index-_vEj3NfZ.mjs";
|
|
2
|
+
import { A as ae } from "./at-sign-DjgaOOtV.mjs";
|
|
3
|
+
import { R as ne } from "./reply-BrWarBVQ.mjs";
|
|
4
|
+
/**
|
|
5
|
+
* @license lucide-react v0.553.0 - ISC
|
|
6
|
+
*
|
|
7
|
+
* This source code is licensed under the ISC license.
|
|
8
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
9
|
+
*/
|
|
10
|
+
const le = [
|
|
11
|
+
["path", { d: "m2 9 3-3 3 3", key: "1ltn5i" }],
|
|
12
|
+
["path", { d: "M13 18H7a2 2 0 0 1-2-2V6", key: "1r6tfw" }],
|
|
13
|
+
["path", { d: "m22 15-3 3-3-3", key: "4rnwn2" }],
|
|
14
|
+
["path", { d: "M11 6h6a2 2 0 0 1 2 2v10", key: "2f72bc" }]
|
|
15
|
+
], re = P("repeat-2", le);
|
|
16
|
+
/**
|
|
17
|
+
* @license lucide-react v0.553.0 - ISC
|
|
18
|
+
*
|
|
19
|
+
* This source code is licensed under the ISC license.
|
|
20
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
21
|
+
*/
|
|
22
|
+
const ce = [
|
|
23
|
+
["path", { d: "M2 21a8 8 0 0 1 13.292-6", key: "bjp14o" }],
|
|
24
|
+
["circle", { cx: "10", cy: "8", r: "5", key: "o932ke" }],
|
|
25
|
+
["path", { d: "m16 19 2 2 4-4", key: "1b14m6" }]
|
|
26
|
+
], ie = P("user-round-check", ce), B = ({ notificationType: a, size: l = "lg", className: c }) => {
|
|
27
|
+
let r, s = "";
|
|
28
|
+
const n = "white", i = l === "sm" ? 13 : 20, o = l === "sm" ? 2 : 1.5;
|
|
29
|
+
switch (a) {
|
|
30
|
+
case "follow":
|
|
31
|
+
r = /* @__PURE__ */ t.jsx(ie, { className: `-mr-0.5 -mt-0.5 ${l === "sm" && "size-[11px]"}`, color: n, size: i, strokeWidth: o }), s = "bg-blue-600";
|
|
32
|
+
break;
|
|
33
|
+
case "like":
|
|
34
|
+
r = /* @__PURE__ */ t.jsx(H, { className: `${l === "sm" ? "size-[11px]" : "mt-px size-5"}`, color: n, strokeWidth: o }), s = "bg-pink-600";
|
|
35
|
+
break;
|
|
36
|
+
case "reply":
|
|
37
|
+
r = /* @__PURE__ */ t.jsx(ne, { className: "mb-px mr-px", color: n, size: i, strokeWidth: o }), s = "bg-purple-600";
|
|
38
|
+
break;
|
|
39
|
+
case "repost":
|
|
40
|
+
r = /* @__PURE__ */ t.jsx(re, { color: n, size: i, strokeWidth: o }), s = "bg-green-500";
|
|
41
|
+
break;
|
|
42
|
+
case "mention":
|
|
43
|
+
r = /* @__PURE__ */ t.jsx(ae, { className: `${l === "sm" ? "size-[12px]" : "size-5"}`, color: n, size: i, strokeWidth: o }), s = "bg-orange-500";
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
return /* @__PURE__ */ t.jsx("div", { className: `flex ${l === "sm" ? "size-5" : "size-9"} items-center justify-center rounded-full ${s} ${c && c}`, children: r });
|
|
47
|
+
}, oe = u.createContext(void 0), f = ({ isGrouped: a, centerAlign: l, children: c, onClick: r, url: s, className: n }) => /* @__PURE__ */ t.jsx(oe.Provider, { value: { onClick: r, url: s }, children: /* @__PURE__ */ t.jsx(
|
|
48
|
+
"div",
|
|
49
|
+
{
|
|
50
|
+
className: `group relative -mx-4 -my-px ${a ? "grid" : "flex"} ${l ? "items-center" : "items-start"} cursor-pointer grid-cols-[auto_1fr] gap-x-4 gap-y-2.5 rounded-lg px-4 py-5 text-left break-anywhere hover:bg-gray-75 ${n}`,
|
|
51
|
+
role: "button",
|
|
52
|
+
onClick: r,
|
|
53
|
+
children: c
|
|
54
|
+
}
|
|
55
|
+
) }), de = ({ size: a = "lg", type: l }) => /* @__PURE__ */ t.jsx("div", { className: "col-start-1 row-start-1", children: /* @__PURE__ */ t.jsx(B, { notificationType: l, size: a }) }), me = ({ children: a }) => /* @__PURE__ */ t.jsx("div", { className: "col-start-2 row-start-1 flex gap-2", children: a }), he = ({ children: a }) => /* @__PURE__ */ t.jsx("div", { className: "col-start-2 row-start-2 -mt-0.5 grow overflow-hidden", children: a });
|
|
56
|
+
f.Icon = de;
|
|
57
|
+
f.Avatars = me;
|
|
58
|
+
f.Content = he;
|
|
59
|
+
const xe = () => /* @__PURE__ */ t.jsx("div", { className: "h-px w-full bg-gray-150 dark:bg-gray-950" });
|
|
60
|
+
function pe(a) {
|
|
61
|
+
const r = new Date(a).getTime();
|
|
62
|
+
return (Math.floor(r / 864e5) * 864e5).toString();
|
|
63
|
+
}
|
|
64
|
+
function ye(a) {
|
|
65
|
+
const l = {};
|
|
66
|
+
let c = null, r = 0;
|
|
67
|
+
return a.forEach((s) => {
|
|
68
|
+
var x, h;
|
|
69
|
+
s.type !== c && (r += 1, c = s.type);
|
|
70
|
+
let n = "";
|
|
71
|
+
const i = `_${pe(s.createdAt)}`, o = `_seq${r}`;
|
|
72
|
+
switch (s.type) {
|
|
73
|
+
case "like":
|
|
74
|
+
(x = s.post) != null && x.id && (n = `like_${s.post.id}${i}${o}`);
|
|
75
|
+
break;
|
|
76
|
+
case "reply":
|
|
77
|
+
n = `reply_${s.id}`;
|
|
78
|
+
break;
|
|
79
|
+
case "repost":
|
|
80
|
+
(h = s.post) != null && h.id && (n = `repost_${s.post.id}${i}${o}`);
|
|
81
|
+
break;
|
|
82
|
+
case "follow":
|
|
83
|
+
n = `follow_${i}${o}`;
|
|
84
|
+
break;
|
|
85
|
+
case "mention":
|
|
86
|
+
n = `mention_${s.id}`;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
l[n] || (l[n] = {
|
|
90
|
+
id: s.id,
|
|
91
|
+
type: s.type,
|
|
92
|
+
actors: [],
|
|
93
|
+
post: s.post,
|
|
94
|
+
inReplyTo: s.inReplyTo,
|
|
95
|
+
createdAt: s.createdAt
|
|
96
|
+
}), l[n].actors.find((p) => p.id === s.actor.id) || l[n].actors.push(s.actor);
|
|
97
|
+
}), Object.values(l);
|
|
98
|
+
}
|
|
99
|
+
const fe = ({ group: a }) => {
|
|
100
|
+
var o, x;
|
|
101
|
+
const [l, ...c] = a.actors, r = c.length > 0, s = "cursor-pointer font-semibold hover:underline text-black dark:text-white", n = C(), i = /* @__PURE__ */ t.jsxs(t.Fragment, { children: [
|
|
102
|
+
/* @__PURE__ */ t.jsx(se, { actor: l, align: "center", isCurrentUser: !1, children: /* @__PURE__ */ t.jsx(
|
|
103
|
+
"span",
|
|
104
|
+
{
|
|
105
|
+
className: s,
|
|
106
|
+
onClick: (h) => {
|
|
107
|
+
h == null || h.stopPropagation(), b(l.handle, n);
|
|
108
|
+
},
|
|
109
|
+
children: l.name
|
|
110
|
+
}
|
|
111
|
+
) }),
|
|
112
|
+
r && ` and ${c.length} ${c.length > 1 ? "others" : "other"}`
|
|
113
|
+
] });
|
|
114
|
+
switch (a.type) {
|
|
115
|
+
case "follow":
|
|
116
|
+
return /* @__PURE__ */ t.jsxs(t.Fragment, { children: [
|
|
117
|
+
i,
|
|
118
|
+
" followed you"
|
|
119
|
+
] });
|
|
120
|
+
case "like":
|
|
121
|
+
return /* @__PURE__ */ t.jsxs(t.Fragment, { children: [
|
|
122
|
+
i,
|
|
123
|
+
" liked your ",
|
|
124
|
+
((o = a.post) == null ? void 0 : o.type) === "article" ? "post" : "note"
|
|
125
|
+
] });
|
|
126
|
+
case "repost":
|
|
127
|
+
return /* @__PURE__ */ t.jsxs(t.Fragment, { children: [
|
|
128
|
+
i,
|
|
129
|
+
" reposted your ",
|
|
130
|
+
((x = a.post) == null ? void 0 : x.type) === "article" ? "post" : "note"
|
|
131
|
+
] });
|
|
132
|
+
case "reply":
|
|
133
|
+
if (a.inReplyTo && typeof a.inReplyTo != "string")
|
|
134
|
+
return i;
|
|
135
|
+
break;
|
|
136
|
+
case "mention":
|
|
137
|
+
return i;
|
|
138
|
+
}
|
|
139
|
+
return /* @__PURE__ */ t.jsx(t.Fragment, {});
|
|
140
|
+
}, je = ({ content: a, className: l, stripTags: c = [] }) => {
|
|
141
|
+
const r = g(null), s = C();
|
|
142
|
+
return L(() => {
|
|
143
|
+
const n = r.current;
|
|
144
|
+
if (!n)
|
|
145
|
+
return;
|
|
146
|
+
const i = (o) => {
|
|
147
|
+
var p;
|
|
148
|
+
const h = o.target.closest("a[data-profile]");
|
|
149
|
+
if (h) {
|
|
150
|
+
const y = (p = h.getAttribute("data-profile")) == null ? void 0 : p.trim();
|
|
151
|
+
/^@([\w.-]+)@([\w-]+\.[\w.-]+[a-zA-Z])$/.test(y || "") && y && (o.preventDefault(), o.stopPropagation(), b(y, s));
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
return n.addEventListener("click", i), () => {
|
|
155
|
+
n.removeEventListener("click", i);
|
|
156
|
+
};
|
|
157
|
+
}, [s, a]), /* @__PURE__ */ t.jsx(
|
|
158
|
+
"div",
|
|
159
|
+
{
|
|
160
|
+
dangerouslySetInnerHTML: { __html: U(a || "", c) },
|
|
161
|
+
ref: r,
|
|
162
|
+
className: l
|
|
163
|
+
}
|
|
164
|
+
);
|
|
165
|
+
}, Ne = () => {
|
|
166
|
+
const [a, l] = u.useState({}), c = C(), r = (e) => {
|
|
167
|
+
l((m) => ({
|
|
168
|
+
...m,
|
|
169
|
+
[e]: !m[e]
|
|
170
|
+
}));
|
|
171
|
+
}, s = () => {
|
|
172
|
+
}, n = 5, { data: i, error: o, fetchNextPage: x, hasNextPage: h, isFetchingNextPage: p, isLoading: y } = D("index"), k = (i == null ? void 0 : i.pages.flatMap((e) => ye(e.notifications))) ?? Array(10).fill({ actors: [{}] }), j = g(null), v = g(null);
|
|
173
|
+
L(() => (j.current && j.current.disconnect(), j.current = new IntersectionObserver((e) => {
|
|
174
|
+
e[0].isIntersecting && h && !p && x();
|
|
175
|
+
}), v.current && j.current.observe(v.current), () => {
|
|
176
|
+
j.current && j.current.disconnect();
|
|
177
|
+
}), [h, p, x]);
|
|
178
|
+
const W = (e, m) => {
|
|
179
|
+
switch (e.type) {
|
|
180
|
+
case "like":
|
|
181
|
+
e.post && c(`/${e.post.type === "article" ? "reader" : "notes"}/${encodeURIComponent(e.post.id)}`);
|
|
182
|
+
break;
|
|
183
|
+
case "reply":
|
|
184
|
+
e.post && e.inReplyTo && c(`/notes/${encodeURIComponent(e.post.id)}`);
|
|
185
|
+
break;
|
|
186
|
+
case "repost":
|
|
187
|
+
e.post && c(`/${e.post.type === "article" ? "reader" : "notes"}/${encodeURIComponent(e.post.id)}`);
|
|
188
|
+
break;
|
|
189
|
+
case "follow":
|
|
190
|
+
e.actors.length > 1 ? r(e.id || `${e.type}_${m}`) : b(e.actors[0].handle, c);
|
|
191
|
+
break;
|
|
192
|
+
case "mention":
|
|
193
|
+
e.post && c(`/notes/${encodeURIComponent(e.post.id)}`);
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
return o && O(o) ? /* @__PURE__ */ t.jsx(V, { errorCode: o.code, statusCode: o.statusCode }) : /* @__PURE__ */ t.jsx(q, { children: /* @__PURE__ */ t.jsxs("div", { className: "z-0 flex w-full flex-col items-center", children: [
|
|
198
|
+
y === !1 && k.length === 0 && /* @__PURE__ */ t.jsxs(G, { children: [
|
|
199
|
+
/* @__PURE__ */ t.jsx(K, { children: /* @__PURE__ */ t.jsx(J, {}) }),
|
|
200
|
+
"Quiet for now, but not for long! When someone likes, boosts, or replies to you, you'll find it here."
|
|
201
|
+
] }),
|
|
202
|
+
k.length > 0 && /* @__PURE__ */ t.jsxs(t.Fragment, { children: [
|
|
203
|
+
/* @__PURE__ */ t.jsx("div", { className: "my-8 flex w-full max-w-[620px] flex-col max-md:mt-5", children: k.map((e, m) => {
|
|
204
|
+
var _, I, R, A, F, M, T, z, S;
|
|
205
|
+
return /* @__PURE__ */ t.jsxs(u.Fragment, { children: [
|
|
206
|
+
/* @__PURE__ */ t.jsxs(
|
|
207
|
+
f,
|
|
208
|
+
{
|
|
209
|
+
centerAlign: e.actors.length < 2 && e.type === "follow",
|
|
210
|
+
className: "hover:bg-gray-75 dark:hover:bg-gray-950",
|
|
211
|
+
isGrouped: e.actors.length > 1,
|
|
212
|
+
onClick: () => W(e, m),
|
|
213
|
+
children: [
|
|
214
|
+
y ? /* @__PURE__ */ t.jsx(w, { className: "rounded-full", containerClassName: "flex h-10 w-10" }) : e.actors.length > 1 ? /* @__PURE__ */ t.jsx(f.Icon, { type: e.type }) : /* @__PURE__ */ t.jsxs("div", { className: "relative", children: [
|
|
215
|
+
/* @__PURE__ */ t.jsx(
|
|
216
|
+
$,
|
|
217
|
+
{
|
|
218
|
+
author: {
|
|
219
|
+
icon: {
|
|
220
|
+
url: e.actors[0].avatarUrl || ""
|
|
221
|
+
},
|
|
222
|
+
name: e.actors[0].name,
|
|
223
|
+
handle: e.actors[0].handle
|
|
224
|
+
},
|
|
225
|
+
size: "notification"
|
|
226
|
+
},
|
|
227
|
+
e.actors[0].id
|
|
228
|
+
),
|
|
229
|
+
/* @__PURE__ */ t.jsx(B, { className: "absolute -bottom-1 -right-1 z-10 border-2 border-white dark:border-black", notificationType: e.type, size: "sm" })
|
|
230
|
+
] }),
|
|
231
|
+
e.actors.length > 1 && /* @__PURE__ */ t.jsx(f.Avatars, { children: /* @__PURE__ */ t.jsxs("div", { className: "flex w-full flex-col", children: [
|
|
232
|
+
/* @__PURE__ */ t.jsxs("div", { className: "relative flex items-center pl-2", children: [
|
|
233
|
+
!a[e.id || `${e.type}_${m}`] && e.actors.slice(0, n).map((d) => /* @__PURE__ */ t.jsx(
|
|
234
|
+
$,
|
|
235
|
+
{
|
|
236
|
+
author: {
|
|
237
|
+
icon: {
|
|
238
|
+
url: d.avatarUrl || ""
|
|
239
|
+
},
|
|
240
|
+
name: d.name,
|
|
241
|
+
handle: d.handle
|
|
242
|
+
},
|
|
243
|
+
className: "-ml-2 !bg-[#F3F3F3] outline outline-2 outline-white group-hover:!bg-[#EDEEF0] group-hover:outline-gray-75 dark:outline-black group-hover:dark:outline-gray-950",
|
|
244
|
+
size: "notification"
|
|
245
|
+
},
|
|
246
|
+
d.id
|
|
247
|
+
)),
|
|
248
|
+
e.actors.length > n && !a[e.id || `${e.type}_${m}`] && /* @__PURE__ */ t.jsx("div", { className: "absolute right-[28px] z-10 flex size-9 items-center justify-center rounded-full bg-black/50 text-base font-semibold tracking-tightest text-white", children: `+${e.actors.length - n}` }),
|
|
249
|
+
e.actors.length > 1 && /* @__PURE__ */ t.jsxs(Q, { className: `group flex items-center gap-0.5 text-gray-700 hover:bg-transparent hover:text-black dark:text-gray-600 dark:hover:text-white ${a[e.id || `${e.type}_${m}`] ? "ml-[-20px]" : "ml-0 w-[28px]"}`, variant: "ghost", onClick: (d) => {
|
|
250
|
+
d == null || d.stopPropagation(), r(e.id || `${e.type}_${m}`);
|
|
251
|
+
}, children: [
|
|
252
|
+
/* @__PURE__ */ t.jsx(Z, { className: `${a[e.id || `${e.type}_${m}`] ? "rotate-180" : ""}`, size: 20, strokeWidth: 1.5 }),
|
|
253
|
+
a[e.id || `${e.type}_${m}`] ? "Hide" : /* @__PURE__ */ t.jsx("span", { className: "sr-only", children: "Show all" })
|
|
254
|
+
] })
|
|
255
|
+
] }),
|
|
256
|
+
/* @__PURE__ */ t.jsx("div", { className: `overflow-hidden transition-all duration-300 ease-in-out ${a[e.id || `${e.type}_${m}`] ? "mb-2 max-h-[1384px] opacity-100" : "max-h-0 opacity-0"}`, children: a[e.id || `${e.type}_${m}`] && e.actors.length > 1 && /* @__PURE__ */ t.jsx("div", { className: "flex flex-col gap-2 pt-2", children: e.actors.map((d) => /* @__PURE__ */ t.jsxs(
|
|
257
|
+
"div",
|
|
258
|
+
{
|
|
259
|
+
className: "group/item flex items-center justify-between gap-4 break-anywhere",
|
|
260
|
+
onClick: (N) => {
|
|
261
|
+
N == null || N.stopPropagation(), b(d.handle, c);
|
|
262
|
+
},
|
|
263
|
+
children: [
|
|
264
|
+
/* @__PURE__ */ t.jsxs("div", { className: "flex min-w-0 items-center", children: [
|
|
265
|
+
/* @__PURE__ */ t.jsx($, { author: {
|
|
266
|
+
icon: {
|
|
267
|
+
url: d.avatarUrl || ""
|
|
268
|
+
},
|
|
269
|
+
name: d.name,
|
|
270
|
+
handle: d.handle
|
|
271
|
+
}, size: "xs" }),
|
|
272
|
+
/* @__PURE__ */ t.jsx("span", { className: "ml-2 line-clamp-1 text-base font-semibold group-hover/item:underline dark:text-white", children: d.name }),
|
|
273
|
+
/* @__PURE__ */ t.jsx("span", { className: "ml-1 line-clamp-1 text-base text-gray-700 dark:text-gray-600", children: d.handle })
|
|
274
|
+
] }),
|
|
275
|
+
e.type === "follow" && !d.followedByMe && /* @__PURE__ */ t.jsx(
|
|
276
|
+
E,
|
|
277
|
+
{
|
|
278
|
+
following: !1,
|
|
279
|
+
handle: d.handle,
|
|
280
|
+
variant: "link"
|
|
281
|
+
}
|
|
282
|
+
)
|
|
283
|
+
]
|
|
284
|
+
},
|
|
285
|
+
d.id
|
|
286
|
+
)) }) })
|
|
287
|
+
] }) }),
|
|
288
|
+
/* @__PURE__ */ t.jsxs(f.Content, { children: [
|
|
289
|
+
/* @__PURE__ */ t.jsx("div", { children: y ? /* @__PURE__ */ t.jsxs(t.Fragment, { children: [
|
|
290
|
+
/* @__PURE__ */ t.jsx(w, {}),
|
|
291
|
+
/* @__PURE__ */ t.jsx(w, { className: "w-full max-w-60" })
|
|
292
|
+
] }) : /* @__PURE__ */ t.jsxs("div", { className: "flex justify-between", children: [
|
|
293
|
+
/* @__PURE__ */ t.jsxs("div", { className: "flex items-center gap-1", children: [
|
|
294
|
+
/* @__PURE__ */ t.jsx("span", { className: "truncate", children: /* @__PURE__ */ t.jsx(fe, { group: e }) }),
|
|
295
|
+
e.actors.length < 2 && /* @__PURE__ */ t.jsxs(t.Fragment, { children: [
|
|
296
|
+
/* @__PURE__ */ t.jsx("span", { className: "mt-px text-[8px] text-gray-700 dark:text-gray-600", children: "•" }),
|
|
297
|
+
/* @__PURE__ */ t.jsx("span", { className: "mt-0.5 text-sm text-gray-700 dark:text-gray-600", children: X(e, !1) })
|
|
298
|
+
] })
|
|
299
|
+
] }),
|
|
300
|
+
e.actors.length === 1 && (e.type === "follow" || e.type === "reply" || e.type === "mention") && !e.actors[0].followedByMe && /* @__PURE__ */ t.jsx(
|
|
301
|
+
E,
|
|
302
|
+
{
|
|
303
|
+
following: !1,
|
|
304
|
+
handle: e.actors[0].handle,
|
|
305
|
+
variant: "link"
|
|
306
|
+
}
|
|
307
|
+
)
|
|
308
|
+
] }) }),
|
|
309
|
+
(e.type === "reply" && e.inReplyTo || e.type === "mention" || e.type === "like" && !((_ = e.post) != null && _.name) && ((I = e.post) == null ? void 0 : I.content) || e.type === "repost" && !((R = e.post) != null && R.name) && ((A = e.post) == null ? void 0 : A.content)) && (e.type !== "reply" && e.type !== "mention" ? /* @__PURE__ */ t.jsxs("div", { className: "ap-note-content mt-0.5 line-clamp-1 text-pretty text-sm text-gray-700 dark:text-gray-600", children: [
|
|
310
|
+
((F = e.post) == null ? void 0 : F.type) === "article" && ((M = e.post) == null ? void 0 : M.title) && /* @__PURE__ */ t.jsxs(t.Fragment, { children: [
|
|
311
|
+
e.post.title,
|
|
312
|
+
" — "
|
|
313
|
+
] }),
|
|
314
|
+
/* @__PURE__ */ t.jsx("span", { dangerouslySetInnerHTML: { __html: U(((T = e.post) == null ? void 0 : T.content) || "") } })
|
|
315
|
+
] }) : /* @__PURE__ */ t.jsx(t.Fragment, { children: /* @__PURE__ */ t.jsxs("div", { className: "mt-2.5 rounded-md bg-gray-100 px-5 py-[14px] group-hover:bg-gray-200 dark:bg-gray-925/30 group-hover:dark:bg-black/40", children: [
|
|
316
|
+
/* @__PURE__ */ t.jsx(
|
|
317
|
+
je,
|
|
318
|
+
{
|
|
319
|
+
className: "ap-note-content text-pretty",
|
|
320
|
+
content: ((z = e.post) == null ? void 0 : z.content) || "",
|
|
321
|
+
stripTags: ["a"]
|
|
322
|
+
}
|
|
323
|
+
),
|
|
324
|
+
e.post && e.post.attachments && e.post.attachments.length > 0 && /* @__PURE__ */ t.jsx("div", { className: "notification-attachments mb-1 [&_.attachment-gallery]:flex [&_.attachment-gallery]:flex-wrap [&_img]:aspect-square [&_img]:max-w-[calc(20%-6.4px)]", children: Y(
|
|
325
|
+
{ ...e.post, type: "Note", attachment: e.post.attachments }
|
|
326
|
+
) })
|
|
327
|
+
] }) })),
|
|
328
|
+
(e.type === "reply" && e.post || e.type === "mention") && /* @__PURE__ */ t.jsx("div", { className: "mt-1.5", children: /* @__PURE__ */ t.jsx(
|
|
329
|
+
ee,
|
|
330
|
+
{
|
|
331
|
+
actor: {
|
|
332
|
+
...e.actors[0],
|
|
333
|
+
icon: {
|
|
334
|
+
url: e.actors[0].avatarUrl || ""
|
|
335
|
+
},
|
|
336
|
+
id: e.actors[0].url,
|
|
337
|
+
preferredUsername: ((S = e.actors[0].handle) == null ? void 0 : S.replace(/^@([^@]+)@.*$/, "$1")) || "unknown"
|
|
338
|
+
},
|
|
339
|
+
buttonClassName: "hover:bg-gray-200",
|
|
340
|
+
commentCount: e.post.replyCount || 0,
|
|
341
|
+
layout: "notification",
|
|
342
|
+
likeCount: e.post.likeCount || 0,
|
|
343
|
+
object: {
|
|
344
|
+
...e.post,
|
|
345
|
+
liked: e.post.likedByMe,
|
|
346
|
+
reposted: e.post.repostedByMe
|
|
347
|
+
},
|
|
348
|
+
repostCount: e.post.repostCount || 0,
|
|
349
|
+
onLikeClick: s
|
|
350
|
+
}
|
|
351
|
+
) })
|
|
352
|
+
] })
|
|
353
|
+
]
|
|
354
|
+
}
|
|
355
|
+
),
|
|
356
|
+
m < k.length - 1 && /* @__PURE__ */ t.jsx("div", { className: "pl-[52px]", children: /* @__PURE__ */ t.jsx(xe, {}) })
|
|
357
|
+
] }, e.id || `${e.type}_${m}`);
|
|
358
|
+
}) }),
|
|
359
|
+
/* @__PURE__ */ t.jsx("div", { ref: v, className: "h-1" }),
|
|
360
|
+
p && /* @__PURE__ */ t.jsx("div", { className: "-mt-4 mb-8 flex flex-col items-center justify-center space-y-4 text-center", children: /* @__PURE__ */ t.jsx(te, { size: "md" }) })
|
|
361
|
+
] })
|
|
362
|
+
] }) });
|
|
363
|
+
};
|
|
364
|
+
export {
|
|
365
|
+
Ne as default
|
|
366
|
+
};
|
|
367
|
+
//# sourceMappingURL=index-DL7eG3Ac.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-DL7eG3Ac.mjs","sources":["../../../node_modules/lucide-react/dist/esm/icons/repeat-2.js","../../../node_modules/lucide-react/dist/esm/icons/user-round-check.js","../src/views/notifications/components/notification-icon.tsx","../src/views/notifications/components/notification-item.tsx","../src/components/global/separator.tsx","../src/views/notifications/notifications.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.553.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m2 9 3-3 3 3\", key: \"1ltn5i\" }],\n [\"path\", { d: \"M13 18H7a2 2 0 0 1-2-2V6\", key: \"1r6tfw\" }],\n [\"path\", { d: \"m22 15-3 3-3-3\", key: \"4rnwn2\" }],\n [\"path\", { d: \"M11 6h6a2 2 0 0 1 2 2v10\", key: \"2f72bc\" }]\n];\nconst Repeat2 = createLucideIcon(\"repeat-2\", __iconNode);\n\nexport { __iconNode, Repeat2 as default };\n//# sourceMappingURL=repeat-2.js.map\n","/**\n * @license lucide-react v0.553.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M2 21a8 8 0 0 1 13.292-6\", key: \"bjp14o\" }],\n [\"circle\", { cx: \"10\", cy: \"8\", r: \"5\", key: \"o932ke\" }],\n [\"path\", { d: \"m16 19 2 2 4-4\", key: \"1b14m6\" }]\n];\nconst UserRoundCheck = createLucideIcon(\"user-round-check\", __iconNode);\n\nexport { __iconNode, UserRoundCheck as default };\n//# sourceMappingURL=user-round-check.js.map\n","import React from 'react';\nimport {LucideIcon} from '@tryghost/shade';\n\nexport type NotificationType = 'like' | 'follow' | 'reply' | 'repost' | 'mention';\nexport type NotificationIconSize = 'sm' | 'lg';\n\ninterface NotificationIconProps {\n notificationType: NotificationType;\n size?: NotificationIconSize;\n className?: string;\n}\n\nconst NotificationIcon: React.FC<NotificationIconProps> = ({notificationType, size = 'lg', className}) => {\n let icon;\n let badgeColor = '';\n const iconColor = 'white';\n const iconSize = size === 'sm' ? 13 : 20;\n const strokeWidth = size === 'sm' ? 2 : 1.5;\n\n switch (notificationType) {\n case 'follow':\n icon = <LucideIcon.UserRoundCheck className={`-mr-0.5 -mt-0.5 ${size === 'sm' && 'size-[11px]'}`} color={iconColor} size={iconSize} strokeWidth={strokeWidth} />;\n badgeColor = 'bg-blue-600';\n break;\n case 'like':\n icon = <LucideIcon.Heart className={`${size === 'sm' ? 'size-[11px]' : 'mt-px size-5'}`} color={iconColor} strokeWidth={strokeWidth} />;\n badgeColor = 'bg-pink-600';\n break;\n case 'reply':\n icon = <LucideIcon.Reply className='mb-px mr-px' color={iconColor} size={iconSize} strokeWidth={strokeWidth} />;\n badgeColor = 'bg-purple-600';\n break;\n case 'repost':\n icon = <LucideIcon.Repeat2 color={iconColor} size={iconSize} strokeWidth={strokeWidth} />;\n badgeColor = 'bg-green-500';\n break;\n case 'mention':\n icon = <LucideIcon.AtSign className={`${size === 'sm' ? 'size-[12px]' : 'size-5'}`} color={iconColor} size={iconSize} strokeWidth={strokeWidth} />;\n badgeColor = 'bg-orange-500';\n break;\n }\n\n return (\n <div className={`flex ${size === 'sm' ? 'size-5' : 'size-9'} items-center justify-center rounded-full ${badgeColor} ${className && className}`}>\n {icon}\n </div>\n );\n};\n\nexport default NotificationIcon;\n","import NotificationIcon, {NotificationIconSize, NotificationType} from './notification-icon';\nimport React from 'react';\n\n// Context to share common props between compound components\ninterface NotificationContextType {\n onClick?: () => void;\n url?: string;\n}\n\nconst NotificationContext = React.createContext<NotificationContextType | undefined>(undefined);\n\n// Root component\ninterface NotificationItemProps {\n isGrouped?: boolean;\n centerAlign?: boolean;\n children: React.ReactNode;\n onClick?: () => void;\n url?: string;\n className?: string;\n}\n\nconst NotificationItem = ({isGrouped, centerAlign, children, onClick, url, className}: NotificationItemProps) => {\n return (\n <NotificationContext.Provider value={{onClick, url}}>\n <div className={`group relative -mx-4 -my-px ${isGrouped ? 'grid' : 'flex'} ${centerAlign ? 'items-center' : 'items-start'} cursor-pointer grid-cols-[auto_1fr] gap-x-4 gap-y-2.5 rounded-lg px-4 py-5 text-left break-anywhere hover:bg-gray-75 ${className}`}\n role='button'\n onClick={onClick}\n >\n {children}\n </div>\n </NotificationContext.Provider>\n );\n};\n\n// Sub-components\nconst Icon = ({size = 'lg', type}: {size?: NotificationIconSize; type: NotificationType}) => {\n return (\n <div className='col-start-1 row-start-1'>\n <NotificationIcon notificationType={type} size={size} />\n </div>\n );\n};\n\nconst Avatars = ({children}: {children: React.ReactNode}) => {\n return (\n <div className='col-start-2 row-start-1 flex gap-2'>\n {children}\n </div>\n );\n};\n\nconst Content = ({children}: {children: React.ReactNode}) => {\n return (\n <div className='col-start-2 row-start-2 -mt-0.5 grow overflow-hidden'>\n {children}\n </div>\n );\n};\n\n// Attach sub-components to the main component\nNotificationItem.Icon = Icon;\nNotificationItem.Avatars = Avatars;\nNotificationItem.Content = Content;\n\nexport default NotificationItem;\n","import React from 'react';\n\nconst Separator: React.FC = () => {\n return <div className='h-px w-full bg-gray-150 dark:bg-gray-950' />;\n};\n\nexport default Separator;","import React, {useEffect, useRef} from 'react';\nimport {ActorProperties} from '@tryghost/admin-x-framework/api/activitypub';\nimport {Button, LoadingIndicator, LucideIcon, Skeleton} from '@tryghost/shade';\n\nimport APAvatar from '@components/global/ap-avatar';\nimport AppError from '@components/layout/error';\nimport FeedItemStats from '@components/feed/feed-item-stats';\nimport FollowButton from '@components/global/follow-button';\nimport Layout from '@components/layout';\nimport NotificationIcon from './components/notification-icon';\nimport NotificationItem from './components/notification-item';\nimport ProfilePreviewHoverCard from '@components/global/profile-preview-hover-card';\nimport Separator from '@components/global/separator';\nimport {EmptyViewIcon, EmptyViewIndicator} from '@src/components/global/empty-view-indicator';\nimport {Notification, isApiError} from '@src/api/activitypub';\nimport {handleProfileClick} from '@utils/handle-profile-click';\nimport {renderFeedAttachment} from '@components/feed/feed-item';\nimport {renderTimestamp} from '@src/utils/render-timestamp';\nimport {stripHtml} from '@src/utils/content-formatters';\nimport {useNavigateWithBasePath} from '@src/hooks/use-navigate-with-base-path';\nimport {useNotificationsForUser} from '@hooks/use-activity-pub-queries';\n\ninterface NotificationGroup {\n id: string;\n type: Notification['type'];\n actors: Notification['actor'][];\n post: Notification['post'];\n inReplyTo: Notification['inReplyTo'];\n createdAt: string;\n}\n\ninterface NotificationGroupDescriptionProps {\n group: NotificationGroup;\n}\n\n/**\n * Calculate a time bucket for grouping notifications\n * Groups notifications into time windows\n */\nfunction getTimeBucket(timestamp: string): string {\n const TIME_WINDOW_MS = 24 * 60 * 60 * 1000; // 24 hours\n const date = new Date(timestamp);\n const timeMs = date.getTime();\n const bucketStart = Math.floor(timeMs / TIME_WINDOW_MS) * TIME_WINDOW_MS;\n return bucketStart.toString();\n}\n\nfunction groupNotifications(notifications: Notification[]): NotificationGroup[] {\n const groups: {\n [key: string]: NotificationGroup\n } = {};\n\n let lastType: string | null = null;\n let sequenceCounter = 0;\n\n notifications.forEach((notification) => {\n // Increment sequence counter when we encounter a different type\n // This preserves chronological order by preventing grouping across type boundaries\n if (notification.type !== lastType) {\n sequenceCounter += 1;\n lastType = notification.type;\n }\n\n let groupKey = '';\n const timeBucket = `_${getTimeBucket(notification.createdAt)}`;\n const sequence = `_seq${sequenceCounter}`;\n\n switch (notification.type) {\n case 'like':\n if (notification.post?.id) {\n groupKey = `like_${notification.post.id}${timeBucket}${sequence}`;\n }\n break;\n case 'reply':\n // Don't group replies\n groupKey = `reply_${notification.id}`;\n break;\n case 'repost':\n if (notification.post?.id) {\n groupKey = `repost_${notification.post.id}${timeBucket}${sequence}`;\n }\n break;\n case 'follow':\n groupKey = `follow_${timeBucket}${sequence}`;\n break;\n case 'mention':\n // Don't group mentions\n groupKey = `mention_${notification.id}`;\n break;\n }\n\n if (!groups[groupKey]) {\n groups[groupKey] = {\n id: notification.id,\n type: notification.type,\n actors: [],\n post: notification.post,\n inReplyTo: notification.inReplyTo,\n createdAt: notification.createdAt\n };\n }\n\n // Add actor if not already in the group\n if (!groups[groupKey].actors.find(a => a.id === notification.actor.id)) {\n groups[groupKey].actors.push(notification.actor);\n }\n });\n\n return Object.values(groups);\n};\n\nconst NotificationGroupDescription: React.FC<NotificationGroupDescriptionProps> = ({group}) => {\n const [firstActor, ...otherActors] = group.actors;\n const hasOthers = otherActors.length > 0;\n\n const actorClass = 'cursor-pointer font-semibold hover:underline text-black dark:text-white';\n\n const navigate = useNavigateWithBasePath();\n\n const actorText = (\n <>\n <ProfilePreviewHoverCard actor={firstActor as unknown as ActorProperties} align=\"center\" isCurrentUser={false}>\n <span\n className={actorClass}\n onClick={(e) => {\n e?.stopPropagation();\n handleProfileClick(firstActor.handle, navigate);\n }}\n >\n {firstActor.name}\n </span>\n </ProfilePreviewHoverCard>\n {hasOthers && ` and ${otherActors.length} ${otherActors.length > 1 ? 'others' : 'other'}`}\n </>\n );\n\n switch (group.type) {\n case 'follow':\n return <>{actorText} followed you</>;\n case 'like':\n return <>{actorText} liked your {group.post?.type === 'article' ? 'post' : 'note'}</>;\n case 'repost':\n return <>{actorText} reposted your {group.post?.type === 'article' ? 'post' : 'note'}</>;\n case 'reply':\n if (group.inReplyTo && typeof group.inReplyTo !== 'string') {\n return actorText;\n }\n break;\n case 'mention':\n return actorText;\n }\n\n return <></>;\n};\n\nconst ProfileLinkedContent: React.FC<{\n content: string;\n className?: string;\n stripTags?: string[];\n}> = ({content, className, stripTags = []}) => {\n const contentRef = useRef<HTMLDivElement>(null);\n const navigate = useNavigateWithBasePath();\n\n useEffect(() => {\n const element = contentRef.current;\n if (!element) {\n return;\n }\n\n const handleProfileLinkClick = (e: Event) => {\n const target = (e as MouseEvent).target as HTMLElement;\n const link = target.closest('a[data-profile]');\n\n if (link) {\n const handle = link.getAttribute('data-profile')?.trim();\n const isValidHandle = /^@([\\w.-]+)@([\\w-]+\\.[\\w.-]+[a-zA-Z])$/.test(handle || '');\n\n if (isValidHandle && handle) {\n e.preventDefault();\n e.stopPropagation();\n handleProfileClick(handle, navigate);\n }\n }\n };\n\n element.addEventListener('click', handleProfileLinkClick);\n return () => {\n element.removeEventListener('click', handleProfileLinkClick);\n };\n }, [navigate, content]);\n\n return (\n <div\n dangerouslySetInnerHTML={{__html: stripHtml(content || '', stripTags)}}\n ref={contentRef}\n className={className}\n />\n );\n};\n\nconst Notifications: React.FC = () => {\n const [openStates, setOpenStates] = React.useState<{[key: string]: boolean}>({});\n const navigate = useNavigateWithBasePath();\n\n const toggleOpen = (groupId: string) => {\n setOpenStates(prev => ({\n ...prev,\n [groupId]: !prev[groupId]\n }));\n };\n\n const handleLikeClick = () => {\n // Do API req or smth\n // Don't need to know about setting timeouts or anything like that\n };\n\n const maxAvatars = 5;\n\n const {data, error, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading} = useNotificationsForUser('index');\n\n const notificationGroups = (\n data?.pages.flatMap((page) => {\n return groupNotifications(page.notifications);\n })\n // If no notifications, return 10 empty groups for the loading state\n ?? Array(10).fill({actors: [{}]}));\n\n const observerRef = useRef<IntersectionObserver | null>(null);\n const loadMoreRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n }\n\n observerRef.current = new IntersectionObserver((entries) => {\n if (entries[0].isIntersecting && hasNextPage && !isFetchingNextPage) {\n fetchNextPage();\n }\n });\n\n if (loadMoreRef.current) {\n observerRef.current.observe(loadMoreRef.current);\n }\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n }\n };\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n const handleNotificationClick = (group: NotificationGroup, index: number) => {\n switch (group.type) {\n case 'like':\n if (group.post) {\n navigate(`/${group.post.type === 'article' ? 'reader' : 'notes'}/${encodeURIComponent(group.post.id)}`);\n }\n break;\n case 'reply':\n if (group.post && group.inReplyTo) {\n navigate(`/notes/${encodeURIComponent(group.post.id)}`);\n }\n break;\n case 'repost':\n if (group.post) {\n navigate(`/${group.post.type === 'article' ? 'reader' : 'notes'}/${encodeURIComponent(group.post.id)}`);\n }\n break;\n case 'follow':\n if (group.actors.length > 1) {\n toggleOpen(group.id || `${group.type}_${index}`);\n } else {\n handleProfileClick(group.actors[0].handle, navigate);\n }\n break;\n case 'mention':\n if (group.post) {\n navigate(`/notes/${encodeURIComponent(group.post.id)}`);\n }\n break;\n }\n };\n\n if (error && isApiError(error)) {\n return <AppError errorCode={error.code} statusCode={error.statusCode}/>;\n }\n\n return (\n <Layout>\n <div className='z-0 flex w-full flex-col items-center'>\n {\n isLoading === false && notificationGroups.length === 0 && (\n <EmptyViewIndicator>\n <EmptyViewIcon><LucideIcon.Bell /></EmptyViewIcon>\n Quiet for now, but not for long! When someone likes, boosts, or replies to you, you'll find it here.\n </EmptyViewIndicator>\n )\n }\n {\n (notificationGroups.length > 0) && (\n <>\n <div className='my-8 flex w-full max-w-[620px] flex-col max-md:mt-5'>\n {notificationGroups.map((group, index) => (\n <React.Fragment key={group.id || `${group.type}_${index}`}>\n <NotificationItem\n centerAlign={group.actors.length < 2 && group.type === 'follow'}\n className='hover:bg-gray-75 dark:hover:bg-gray-950'\n isGrouped={group.actors.length > 1}\n onClick={() => handleNotificationClick(group, index)}\n >\n {isLoading ?\n <Skeleton className='rounded-full' containerClassName='flex h-10 w-10' /> :\n (group.actors.length > 1 ?\n <NotificationItem.Icon type={group.type} /> :\n <div className='relative'>\n <APAvatar\n key={group.actors[0].id}\n author={{\n icon: {\n url: group.actors[0].avatarUrl || ''\n },\n name: group.actors[0].name,\n handle: group.actors[0].handle\n }}\n size='notification'\n />\n <NotificationIcon className='absolute -bottom-1 -right-1 z-10 border-2 border-white dark:border-black' notificationType={group.type} size='sm' />\n </div>\n )\n }\n {group.actors.length > 1 && <NotificationItem.Avatars>\n <div className='flex w-full flex-col'>\n <div className='relative flex items-center pl-2'>\n {!openStates[group.id || `${group.type}_${index}`] && group.actors.slice(0, maxAvatars).map((actor: ActorProperties) => (\n <APAvatar\n key={actor.id}\n author={{\n icon: {\n url: actor.avatarUrl || ''\n },\n name: actor.name,\n handle: actor.handle\n }}\n className='-ml-2 !bg-[#F3F3F3] outline outline-2 outline-white group-hover:!bg-[#EDEEF0] group-hover:outline-gray-75 dark:outline-black group-hover:dark:outline-gray-950'\n size='notification'\n />\n ))}\n {group.actors.length > maxAvatars && (!openStates[group.id || `${group.type}_${index}`]) && (\n <div className='absolute right-[28px] z-10 flex size-9 items-center justify-center rounded-full bg-black/50 text-base font-semibold tracking-tightest text-white'>\n {`+${group.actors.length - maxAvatars}`}\n </div>\n )}\n\n {group.actors.length > 1 && (\n <Button className={`group flex items-center gap-0.5 text-gray-700 hover:bg-transparent hover:text-black dark:text-gray-600 dark:hover:text-white ${openStates[group.id || `${group.type}_${index}`] ? 'ml-[-20px]' : 'ml-0 w-[28px]'}`} variant='ghost' onClick={(event?: React.MouseEvent<HTMLElement>) => {\n event?.stopPropagation();\n toggleOpen(group.id || `${group.type}_${index}`);\n }}>\n <LucideIcon.ChevronDown className={`${openStates[group.id || `${group.type}_${index}`] ? 'rotate-180' : ''}`} size={20} strokeWidth={1.5} />\n {openStates[group.id || `${group.type}_${index}`] ? 'Hide' : <span className='sr-only'>Show all</span>}\n </Button>\n )}\n </div>\n <div className={`overflow-hidden transition-all duration-300 ease-in-out ${openStates[group.id || `${group.type}_${index}`] ? 'mb-2 max-h-[1384px] opacity-100' : 'max-h-0 opacity-0'}`}>\n {openStates[group.id || `${group.type}_${index}`] && group.actors.length > 1 && (\n <div className='flex flex-col gap-2 pt-2'>\n {group.actors.map((actor: ActorProperties) => (\n <div\n key={actor.id}\n className='group/item flex items-center justify-between gap-4 break-anywhere'\n onClick={(e) => {\n e?.stopPropagation();\n handleProfileClick(actor.handle, navigate);\n }}\n >\n <div className='flex min-w-0 items-center'>\n <APAvatar author={{\n icon: {\n url: actor.avatarUrl || ''\n },\n name: actor.name,\n handle: actor.handle\n }} size='xs' />\n <span className='ml-2 line-clamp-1 text-base font-semibold group-hover/item:underline dark:text-white'>{actor.name}</span>\n <span className='ml-1 line-clamp-1 text-base text-gray-700 dark:text-gray-600'>{actor.handle}</span>\n </div>\n {group.type === 'follow' && !actor.followedByMe && (\n <FollowButton\n following={false}\n handle={actor.handle}\n variant=\"link\"\n />\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </NotificationItem.Avatars>}\n <NotificationItem.Content>\n <div>\n {isLoading ?\n <>\n <Skeleton />\n <Skeleton className='w-full max-w-60' />\n </> :\n <div className='flex justify-between'>\n <div className='flex items-center gap-1'>\n <span className='truncate'><NotificationGroupDescription group={group} /></span>\n {group.actors.length < 2 &&\n <>\n <span className='mt-px text-[8px] text-gray-700 dark:text-gray-600'>•</span>\n <span className='mt-0.5 text-sm text-gray-700 dark:text-gray-600'>{renderTimestamp(group, false)}</span>\n </>\n }\n </div>\n {/* Follow button for singular follow, reply, and mention */}\n {group.actors.length === 1 && (group.type === 'follow' || group.type === 'reply' || group.type === 'mention') && !group.actors[0].followedByMe && (\n <FollowButton\n following={false}\n handle={group.actors[0].handle}\n variant=\"link\"\n />\n )}\n </div>\n }\n </div>\n {(\n ((group.type === 'reply' && group.inReplyTo) || group.type === 'mention') ||\n (group.type === 'like' && !group.post?.name && group.post?.content) ||\n (group.type === 'repost' && !group.post?.name && group.post?.content)\n ) && (\n (group.type !== 'reply' && group.type !== 'mention' ?\n <div className='ap-note-content mt-0.5 line-clamp-1 text-pretty text-sm text-gray-700 dark:text-gray-600'>\n {group.post?.type === 'article' && group.post?.title && <>{group.post.title} — </>}\n <span dangerouslySetInnerHTML={{__html: stripHtml(group.post?.content || '')}} />\n </div> :\n <>\n <div className='mt-2.5 rounded-md bg-gray-100 px-5 py-[14px] group-hover:bg-gray-200 dark:bg-gray-925/30 group-hover:dark:bg-black/40'>\n <ProfileLinkedContent\n className='ap-note-content text-pretty'\n content={group.post?.content || ''}\n stripTags={['a']}\n />\n {group.post && group.post.attachments && group.post.attachments.length > 0 && (\n <div className='notification-attachments mb-1 [&_.attachment-gallery]:flex [&_.attachment-gallery]:flex-wrap [&_img]:aspect-square [&_img]:max-w-[calc(20%-6.4px)]'>\n {renderFeedAttachment(\n {...group.post, type: 'Note', attachment: group.post.attachments}\n )}\n </div>\n )}\n </div>\n </>\n )\n )}\n {((group.type === 'reply' && group.post) || group.type === 'mention') && (\n <div className=\"mt-1.5\">\n <FeedItemStats\n actor={{\n ...group.actors[0],\n icon: {\n url: group.actors[0].avatarUrl || ''\n },\n id: group.actors[0].url,\n preferredUsername: group.actors[0].handle?.replace(/^@([^@]+)@.*$/, '$1') || 'unknown'\n }}\n buttonClassName='hover:bg-gray-200'\n commentCount={group.post.replyCount || 0}\n layout=\"notification\"\n likeCount={group.post.likeCount || 0}\n object={{\n ...group.post,\n liked: group.post.likedByMe,\n reposted: group.post.repostedByMe\n }}\n repostCount={group.post.repostCount || 0}\n onLikeClick={handleLikeClick}\n />\n </div>\n )}\n </NotificationItem.Content>\n </NotificationItem>\n {index < notificationGroups.length - 1 &&\n <div className='pl-[52px]'><Separator /></div>\n }\n </React.Fragment>\n ))}\n </div>\n <div ref={loadMoreRef} className='h-1'></div>\n {isFetchingNextPage && (\n <div className='-mt-4 mb-8 flex flex-col items-center justify-center space-y-4 text-center'>\n <LoadingIndicator size='md' />\n </div>\n )}\n </>\n )\n }\n </div>\n </Layout>\n );\n};\n\nexport default Notifications;\n"],"names":["__iconNode","Repeat2","createLucideIcon","UserRoundCheck","NotificationIcon","notificationType","size","className","icon","badgeColor","iconColor","iconSize","strokeWidth","jsx","LucideIcon.UserRoundCheck","LucideIcon.Heart","LucideIcon.Reply","LucideIcon.Repeat2","LucideIcon.AtSign","NotificationContext","React","NotificationItem","isGrouped","centerAlign","children","onClick","url","Icon","type","Avatars","Content","Separator","getTimeBucket","timestamp","timeMs","groupNotifications","notifications","groups","lastType","sequenceCounter","notification","groupKey","timeBucket","sequence","_a","_b","a","NotificationGroupDescription","group","firstActor","otherActors","hasOthers","actorClass","navigate","useNavigateWithBasePath","actorText","jsxs","Fragment","ProfilePreviewHoverCard","e","handleProfileClick","ProfileLinkedContent","content","stripTags","contentRef","useRef","useEffect","element","handleProfileLinkClick","link","handle","stripHtml","Notifications","openStates","setOpenStates","toggleOpen","groupId","prev","handleLikeClick","maxAvatars","data","error","fetchNextPage","hasNextPage","isFetchingNextPage","isLoading","useNotificationsForUser","notificationGroups","page","observerRef","loadMoreRef","entries","handleNotificationClick","index","isApiError","AppError","Layout","EmptyViewIndicator","EmptyViewIcon","LucideIcon.Bell","Skeleton","APAvatar","actor","Button","event","LucideIcon.ChevronDown","FollowButton","renderTimestamp","_c","_d","_e","_f","_g","_h","renderFeedAttachment","FeedItemStats","_i","LoadingIndicator"],"mappings":"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","x_google_ignoreList":[0,1]}
|