@tryghost/activitypub 3.1.9 → 3.1.11
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 +1 -1
- package/dist/{at-sign-HA7s9_yo.mjs → at-sign-Mjg-pZ6w.mjs} +2 -2
- package/dist/at-sign-Mjg-pZ6w.mjs.map +1 -0
- package/dist/{avatar-flipboard-swo-37SU.mjs → avatar-flipboard-DrqqZst3.mjs} +2 -2
- package/dist/avatar-flipboard-DrqqZst3.mjs.map +1 -0
- package/dist/{bluesky-sharing-CLCMkEbr.mjs → bluesky-sharing-Chejq-Bq.mjs} +7 -7
- package/dist/bluesky-sharing-Chejq-Bq.mjs.map +1 -0
- package/dist/{copy-DpM3ttP6.mjs → copy-Ba_lzzCd.mjs} +2 -2
- package/dist/copy-Ba_lzzCd.mjs.map +1 -0
- package/dist/{deleted-feed-item-Dpgdv7Am.mjs → deleted-feed-item-BfpxKMlB.mjs} +8 -8
- package/dist/deleted-feed-item-BfpxKMlB.mjs.map +1 -0
- package/dist/edit-profile-jtzZtWG8.mjs +3810 -0
- package/dist/edit-profile-jtzZtWG8.mjs.map +1 -0
- package/dist/{feed-CUigsjj5.mjs → feed-BkSec9BE.mjs} +12 -12
- package/dist/feed-BkSec9BE.mjs.map +1 -0
- package/dist/{hash-cJ8IUw77.mjs → hash-D8uyJrFB.mjs} +2 -2
- package/dist/hash-D8uyJrFB.mjs.map +1 -0
- package/dist/{inbox-gnZvtbNZ.mjs → inbox-DZqNPQ3D.mjs} +2 -2
- package/dist/inbox-DZqNPQ3D.mjs.map +1 -0
- package/dist/{index-BC1Q-I5Z.mjs → index-Bq0BHGkI.mjs} +24 -24
- package/dist/index-Bq0BHGkI.mjs.map +1 -0
- package/dist/{index-Dc5IUcEt.mjs → index-CCW2g6Oi.mjs} +49 -49
- package/dist/index-CCW2g6Oi.mjs.map +1 -0
- package/dist/{index-DOW1_Ph3.mjs → index-CQNBd3-F.mjs} +54 -54
- package/dist/index-CQNBd3-F.mjs.map +1 -0
- package/dist/{index-DJ5p5ESW.mjs → index-CSkOAA7W.mjs} +13531 -12734
- package/dist/index-CSkOAA7W.mjs.map +1 -0
- package/dist/{index-BHjT-eBh.mjs → index-D8Ct0JF0.mjs} +19 -19
- package/dist/index-D8Ct0JF0.mjs.map +1 -0
- package/dist/{index-DRdHe0Xx.mjs → index-DYjHwtl7.mjs} +7 -7
- package/dist/index-DYjHwtl7.mjs.map +1 -0
- package/dist/{index-DBDE7Pwv.mjs → index-nevBSPxu.mjs} +2 -2
- package/dist/index-nevBSPxu.mjs.map +1 -0
- package/dist/{index-VTkGUYnZ.mjs → index-psiB4m1D.mjs} +92 -92
- package/dist/index-psiB4m1D.mjs.map +1 -0
- package/dist/{moderation-CF26LtsR.mjs → moderation-DFdpfisa.mjs} +7 -7
- package/dist/moderation-DFdpfisa.mjs.map +1 -0
- package/dist/{note-C7a3fpfu.mjs → note-kWeM_V5e.mjs} +6 -6
- package/dist/note-kWeM_V5e.mjs.map +1 -0
- package/dist/{reply-DNHDDszZ.mjs → reply-1lPjfeAY.mjs} +2 -2
- package/dist/reply-1lPjfeAY.mjs.map +1 -0
- package/dist/separator-COhI8ngj.mjs +39 -0
- package/dist/separator-COhI8ngj.mjs.map +1 -0
- package/dist/{settings-CK06at6A.mjs → settings-CEx9EwpB.mjs} +3 -3
- package/dist/settings-CEx9EwpB.mjs.map +1 -0
- package/dist/{step-1-CWOu7-_P.mjs → step-1-DoxN5zA3.mjs} +8 -8
- package/dist/{step-1-CWOu7-_P.mjs.map → step-1-DoxN5zA3.mjs.map} +1 -1
- package/dist/{step-2-Dcy43H6c.mjs → step-2-BWvVMlaH.mjs} +13 -13
- package/dist/step-2-BWvVMlaH.mjs.map +1 -0
- package/dist/{step-3-Dav_Yy5B.mjs → step-3-Dnq4l5zZ.mjs} +14 -14
- package/dist/step-3-Dnq4l5zZ.mjs.map +1 -0
- package/dist/{tabs-B7coKvuk.mjs → tabs-DTWhZwdk.mjs} +224 -226
- package/dist/tabs-DTWhZwdk.mjs.map +1 -0
- package/dist/{topic-filter-BIhCARLH.mjs → topic-filter-4W4f_LiH.mjs} +4 -4
- package/dist/topic-filter-4W4f_LiH.mjs.map +1 -0
- package/package.json +11 -11
- package/dist/at-sign-HA7s9_yo.mjs.map +0 -1
- package/dist/avatar-flipboard-swo-37SU.mjs.map +0 -1
- package/dist/bluesky-sharing-CLCMkEbr.mjs.map +0 -1
- package/dist/copy-DpM3ttP6.mjs.map +0 -1
- package/dist/deleted-feed-item-Dpgdv7Am.mjs.map +0 -1
- package/dist/edit-profile-C4Z2TwUh.mjs +0 -3741
- package/dist/edit-profile-C4Z2TwUh.mjs.map +0 -1
- package/dist/feed-CUigsjj5.mjs.map +0 -1
- package/dist/hash-cJ8IUw77.mjs.map +0 -1
- package/dist/inbox-gnZvtbNZ.mjs.map +0 -1
- package/dist/index-BC1Q-I5Z.mjs.map +0 -1
- package/dist/index-BHjT-eBh.mjs.map +0 -1
- package/dist/index-DBDE7Pwv.mjs.map +0 -1
- package/dist/index-DJ5p5ESW.mjs.map +0 -1
- package/dist/index-DOW1_Ph3.mjs.map +0 -1
- package/dist/index-DRdHe0Xx.mjs.map +0 -1
- package/dist/index-Dc5IUcEt.mjs.map +0 -1
- package/dist/index-VTkGUYnZ.mjs.map +0 -1
- package/dist/moderation-CF26LtsR.mjs.map +0 -1
- package/dist/note-C7a3fpfu.mjs.map +0 -1
- package/dist/reply-DNHDDszZ.mjs.map +0 -1
- package/dist/separator-D4W12X08.mjs +0 -116
- package/dist/separator-D4W12X08.mjs.map +0 -1
- package/dist/settings-CK06at6A.mjs.map +0 -1
- package/dist/step-2-Dcy43H6c.mjs.map +0 -1
- package/dist/step-3-Dav_Yy5B.mjs.map +0 -1
- package/dist/tabs-B7coKvuk.mjs.map +0 -1
- package/dist/topic-filter-BIhCARLH.mjs.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { a6 as de, Q as X, c as y, e as C, d as z, j as e, N as O, J as _,
|
|
2
|
-
import { S as ue } from "./separator-
|
|
3
|
-
import { E as fs } from "./edit-profile-
|
|
4
|
-
import { T as ps, a as
|
|
5
|
-
import { S as
|
|
6
|
-
import { C as us } from "./copy-
|
|
1
|
+
import { a6 as de, Q as X, c as y, e as C, d as z, j as e, N as O, J as _, b4 as Me, g as Be, R as De, P as Pe, M as Te, A as ce, B as u, aa as xe, h as Ie, k as Z, aK as Fe, F as he, b as v, W as Ae, Z as me, b5 as Re, _ as fe, $ as G, a0 as K, a1 as W, H as q, b6 as $e, b7 as Ee, a2 as J, a3 as pe, O as B, b8 as He, b9 as Le, ba as Se, bb as oe, a4 as ze, a5 as Oe, u as be, bc as _e, a as Ve, az as Qe, x as Ye, y as Ge, z as Ke, G as We, L as ae, E as qe, f as Je, S as E, bd as Xe, D as Ze, m as es, n as ss, o as ls, p as rs, I as ns, Y as os, be as as, ab as te, ac as ts, ad as is, bf as Q, K as ds, ax as cs, ay as xs, bg as hs, bh as je, bi as ms } from "./index-CSkOAA7W.mjs";
|
|
2
|
+
import { S as ue } from "./separator-COhI8ngj.mjs";
|
|
3
|
+
import { E as fs } from "./edit-profile-jtzZtWG8.mjs";
|
|
4
|
+
import { T as ps, a as bs, b as L, d as Y, c as S } from "./tabs-DTWhZwdk.mjs";
|
|
5
|
+
import { S as js } from "./settings-CEx9EwpB.mjs";
|
|
6
|
+
import { C as us } from "./copy-Ba_lzzCd.mjs";
|
|
7
7
|
/**
|
|
8
8
|
* @license lucide-react v0.553.0 - ISC
|
|
9
9
|
*
|
|
@@ -55,8 +55,8 @@ const ge = ({
|
|
|
55
55
|
/* @__PURE__ */ e.jsx(_, { children: /* @__PURE__ */ e.jsx(Me, {}) }),
|
|
56
56
|
s
|
|
57
57
|
] }) : /* @__PURE__ */ e.jsx("div", { className: "flex flex-col", children: n.map(({ actor: l, isFollowing: f, blockedByMe: g, domainBlockedByMe: w }) => {
|
|
58
|
-
const
|
|
59
|
-
return /* @__PURE__ */ e.jsx(
|
|
58
|
+
const j = l.handle || Be(l), N = j === (a == null ? void 0 : a.handle);
|
|
59
|
+
return /* @__PURE__ */ e.jsx(De.Fragment, { children: /* @__PURE__ */ e.jsx(Pe, { actor: l, align: "center", isCurrentUser: N, side: "left", children: /* @__PURE__ */ e.jsx("div", { children: /* @__PURE__ */ e.jsxs(
|
|
60
60
|
Te,
|
|
61
61
|
{
|
|
62
62
|
"data-testid": "actor-item",
|
|
@@ -65,9 +65,9 @@ const ge = ({
|
|
|
65
65
|
},
|
|
66
66
|
children: [
|
|
67
67
|
/* @__PURE__ */ e.jsx(ce, { author: l }),
|
|
68
|
-
/* @__PURE__ */ e.jsx("div", { children: /* @__PURE__ */ e.jsxs("div", { className: "text-gray-600
|
|
68
|
+
/* @__PURE__ */ e.jsx("div", { children: /* @__PURE__ */ e.jsxs("div", { className: "break-anywhere text-gray-600", children: [
|
|
69
69
|
/* @__PURE__ */ e.jsx("span", { className: "mr-1 line-clamp-1 font-bold text-black dark:text-white", children: ys(l) }),
|
|
70
|
-
/* @__PURE__ */ e.jsx("div", { className: "line-clamp-1 text-sm", children:
|
|
70
|
+
/* @__PURE__ */ e.jsx("div", { className: "line-clamp-1 text-sm", children: j })
|
|
71
71
|
] }) }),
|
|
72
72
|
g || w ? /* @__PURE__ */ e.jsx(u, { className: "pointer-events-none ml-auto min-w-[90px]", variant: "destructive", children: "Blocked" }) : N ? null : /* @__PURE__ */ e.jsx(
|
|
73
73
|
xe,
|
|
@@ -75,7 +75,7 @@ const ge = ({
|
|
|
75
75
|
className: "ml-auto",
|
|
76
76
|
"data-testid": "follow-button",
|
|
77
77
|
following: f,
|
|
78
|
-
handle:
|
|
78
|
+
handle: j,
|
|
79
79
|
type: "secondary"
|
|
80
80
|
}
|
|
81
81
|
)
|
|
@@ -213,7 +213,7 @@ const ge = ({
|
|
|
213
213
|
userUnblocked: !1,
|
|
214
214
|
domainUnblocked: !1
|
|
215
215
|
};
|
|
216
|
-
}), g = a !== void 0, w = g ? a : i, [
|
|
216
|
+
}), g = a !== void 0, w = g ? a : i, [j, N] = v(!1), D = Ae(() => {
|
|
217
217
|
const p = n && r, U = n && !r, R = !n && r;
|
|
218
218
|
let k = "idle";
|
|
219
219
|
p ? k = "dual" : U ? k = "userOnly" : R && (k = "domainOnly"), f((M) => ({
|
|
@@ -224,8 +224,8 @@ const ge = ({
|
|
|
224
224
|
}));
|
|
225
225
|
}, [n, r]);
|
|
226
226
|
C(() => {
|
|
227
|
-
w && !
|
|
228
|
-
}, [w,
|
|
227
|
+
w && !j ? (D(), N(!0)) : w || N(!1);
|
|
228
|
+
}, [w, j, D]);
|
|
229
229
|
const F = () => {
|
|
230
230
|
g ? o == null || o(!0) : x(!0);
|
|
231
231
|
}, m = (p) => {
|
|
@@ -235,18 +235,18 @@ const ge = ({
|
|
|
235
235
|
...p,
|
|
236
236
|
userUnblocked: !0
|
|
237
237
|
})), (l.mode !== "dual" || l.domainUnblocked) && (m(!1), t == null || t()), B.success("User unblocked");
|
|
238
|
-
},
|
|
238
|
+
}, P = async () => {
|
|
239
239
|
await h(), f((p) => ({
|
|
240
240
|
...p,
|
|
241
241
|
domainUnblocked: !0
|
|
242
242
|
})), (l.mode !== "dual" || l.userUnblocked) && (m(!1), t == null || t()), B.success("Domain unblocked");
|
|
243
243
|
}, A = s.split("@").filter(Boolean)[1], T = () => /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
244
244
|
/* @__PURE__ */ e.jsxs(G, { children: [
|
|
245
|
-
/* @__PURE__ */ e.jsx(
|
|
246
|
-
/* @__PURE__ */ e.jsx(
|
|
245
|
+
/* @__PURE__ */ e.jsx(K, { className: "mb-1 flex flex-col gap-1", children: "Unblock" }),
|
|
246
|
+
/* @__PURE__ */ e.jsx(W, { className: "mt-4!", asChild: !0, children: /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col rounded-md border", children: [
|
|
247
247
|
/* @__PURE__ */ e.jsxs("div", { className: "flex justify-between gap-6 p-5", children: [
|
|
248
248
|
/* @__PURE__ */ e.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
249
|
-
/* @__PURE__ */ e.jsx(
|
|
249
|
+
/* @__PURE__ */ e.jsx(q, { children: "Unblock user" }),
|
|
250
250
|
/* @__PURE__ */ e.jsxs("p", { children: [
|
|
251
251
|
/* @__PURE__ */ e.jsx("span", { className: "font-semibold text-black", children: s }),
|
|
252
252
|
" will be able to follow you and engage with your public posts."
|
|
@@ -260,14 +260,14 @@ const ge = ({
|
|
|
260
260
|
/* @__PURE__ */ e.jsx("div", { className: "border-t" }),
|
|
261
261
|
/* @__PURE__ */ e.jsxs("div", { className: "flex justify-between gap-6 p-5", children: [
|
|
262
262
|
/* @__PURE__ */ e.jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
263
|
-
/* @__PURE__ */ e.jsx(
|
|
263
|
+
/* @__PURE__ */ e.jsx(q, { children: "Unblock domain" }),
|
|
264
264
|
/* @__PURE__ */ e.jsxs("p", { children: [
|
|
265
265
|
"Users from ",
|
|
266
266
|
/* @__PURE__ */ e.jsx("span", { className: "font-semibold text-black", children: A }),
|
|
267
267
|
" will be able to follow you and engage with your public posts."
|
|
268
268
|
] })
|
|
269
269
|
] }),
|
|
270
|
-
/* @__PURE__ */ e.jsxs(u, { className: `gap-1 ${l.domainUnblocked ? "pointer-events-none border-green bg-green text-white hover:bg-green hover:text-white" : "text-red hover:text-red-400"}`, variant: "outline", onClick:
|
|
270
|
+
/* @__PURE__ */ e.jsxs(u, { className: `gap-1 ${l.domainUnblocked ? "pointer-events-none border-green bg-green text-white hover:bg-green hover:text-white" : "text-red hover:text-red-400"}`, variant: "outline", onClick: P, children: [
|
|
271
271
|
/* @__PURE__ */ e.jsx(Ee, {}),
|
|
272
272
|
l.domainUnblocked ? "Domain unblocked" : "Unblock domain"
|
|
273
273
|
] })
|
|
@@ -279,8 +279,8 @@ const ge = ({
|
|
|
279
279
|
const p = l.mode === "userOnly";
|
|
280
280
|
return /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
281
281
|
/* @__PURE__ */ e.jsxs(G, { children: [
|
|
282
|
-
/* @__PURE__ */ e.jsx(
|
|
283
|
-
/* @__PURE__ */ e.jsx(
|
|
282
|
+
/* @__PURE__ */ e.jsx(K, { className: "mb-1 flex flex-col gap-1", children: p ? "Unblock this user?" : "Unblock this domain?" }),
|
|
283
|
+
/* @__PURE__ */ e.jsx(W, { children: p ? /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
284
284
|
/* @__PURE__ */ e.jsx("span", { className: "font-semibold text-black", children: s }),
|
|
285
285
|
" will be able to follow you and engage with your public posts."
|
|
286
286
|
] }) : /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
@@ -291,7 +291,7 @@ const ge = ({
|
|
|
291
291
|
] }),
|
|
292
292
|
/* @__PURE__ */ e.jsxs(J, { children: [
|
|
293
293
|
/* @__PURE__ */ e.jsx(pe, { children: "Cancel" }),
|
|
294
|
-
/* @__PURE__ */ e.jsx(u, { onClick: p ? H :
|
|
294
|
+
/* @__PURE__ */ e.jsx(u, { onClick: p ? H : P, children: "Unblock" })
|
|
295
295
|
] })
|
|
296
296
|
] });
|
|
297
297
|
};
|
|
@@ -315,11 +315,11 @@ const ge = ({
|
|
|
315
315
|
m.stopPropagation(), d();
|
|
316
316
|
}, w = (m) => {
|
|
317
317
|
m.stopPropagation(), h();
|
|
318
|
-
},
|
|
318
|
+
}, j = s == null ? void 0 : s.handle, N = j == null ? void 0 : j.split("@").filter(Boolean)[1], D = () => /* @__PURE__ */ e.jsx(me, { open: x, onOpenChange: l, children: /* @__PURE__ */ e.jsxs(fe, { onClick: (m) => m.stopPropagation(), children: [
|
|
319
319
|
/* @__PURE__ */ e.jsxs(G, { children: [
|
|
320
|
-
/* @__PURE__ */ e.jsx(
|
|
321
|
-
/* @__PURE__ */ e.jsx(
|
|
322
|
-
/* @__PURE__ */ e.jsx("span", { className: "font-semibold text-black", children:
|
|
320
|
+
/* @__PURE__ */ e.jsx(K, { className: "mb-1 flex flex-col gap-1", children: o === "user" ? "Block this user?" : "Block this domain?" }),
|
|
321
|
+
/* @__PURE__ */ e.jsx(W, { children: o === "user" ? /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
322
|
+
/* @__PURE__ */ e.jsx("span", { className: "font-semibold text-black", children: j }),
|
|
323
323
|
" will be able to see your public posts, but will no longer be able follow you or interact with your content on the social web."
|
|
324
324
|
] }) : /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
325
325
|
"All users from ",
|
|
@@ -328,7 +328,7 @@ const ge = ({
|
|
|
328
328
|
] }) })
|
|
329
329
|
] }),
|
|
330
330
|
/* @__PURE__ */ e.jsxs(J, { children: [
|
|
331
|
-
o !== "domain" && /* @__PURE__ */ e.jsx(u, { className: "-ml-3
|
|
331
|
+
o !== "domain" && /* @__PURE__ */ e.jsx(u, { className: "mr-auto -ml-3 hover:bg-transparent hover:opacity-80", variant: "ghost", onClick: (m) => {
|
|
332
332
|
m.stopPropagation(), i("domain");
|
|
333
333
|
}, children: "Block domain instead" }),
|
|
334
334
|
/* @__PURE__ */ e.jsx(pe, { onClick: (m) => m.stopPropagation(), children: "Cancel" }),
|
|
@@ -363,7 +363,7 @@ const ge = ({
|
|
|
363
363
|
}, children: t ? "Unblock user" : a ? "Unblock domain" : "Block user" }) })
|
|
364
364
|
] }) })
|
|
365
365
|
] }),
|
|
366
|
-
t || a ? F() :
|
|
366
|
+
t || a ? F() : D()
|
|
367
367
|
] });
|
|
368
368
|
}, Ms = ({
|
|
369
369
|
account: s,
|
|
@@ -402,17 +402,17 @@ const ge = ({
|
|
|
402
402
|
followingTab: c,
|
|
403
403
|
followersTab: t
|
|
404
404
|
}) => {
|
|
405
|
-
const a =
|
|
405
|
+
const a = be(), o = _e(), i = z(), { canGoBack: x } = Ve(), l = a.handle ? `/profile/${a.handle}` : "/profile", f = !a.handle, g = a.handle ? a.tab || "" : o.pathname.split("/").pop() || "", w = Qe(() => f ? ["likes", "following", "followers"] : ["following", "followers"], [f]), j = w.includes(g) ? g : "posts", N = Ye("index"), D = Ge("index"), F = Ke("index"), m = We("index"), H = X("index", "me"), { data: P } = a.handle ? H : { data: void 0 }, A = a.handle === (P == null ? void 0 : P.handle) || !a.handle, T = s == null ? void 0 : s.blockedByMe, I = s == null ? void 0 : s.domainBlockedByMe, [p, U] = v(!1), [R, k] = v(!1), M = y(null);
|
|
406
406
|
C(() => () => {
|
|
407
407
|
M.current && window.clearTimeout(M.current);
|
|
408
408
|
}, []);
|
|
409
409
|
const ee = () => {
|
|
410
|
-
T ?
|
|
410
|
+
T ? D.mutate(s) : (N.mutate(s), B.success("User blocked")), U(!1);
|
|
411
411
|
}, se = () => {
|
|
412
412
|
I ? m.mutate({ url: s.apId, handle: s.handle }) : (F.mutate({ url: s.apId, handle: s.handle }), B.success("Domain blocked")), U(!1);
|
|
413
413
|
}, le = async () => {
|
|
414
|
-
var
|
|
415
|
-
if (!(s != null && s.handle) || !((
|
|
414
|
+
var b;
|
|
415
|
+
if (!(s != null && s.handle) || !((b = navigator == null ? void 0 : navigator.clipboard) != null && b.writeText)) {
|
|
416
416
|
B.error("Unable to copy handle");
|
|
417
417
|
return;
|
|
418
418
|
}
|
|
@@ -429,10 +429,10 @@ const ge = ({
|
|
|
429
429
|
}, [$, s == null ? void 0 : s.bio, n, r]), C(() => {
|
|
430
430
|
g && (w.includes(g) || i(l, { replace: !0 }));
|
|
431
431
|
}, [w, l, i, g]);
|
|
432
|
-
const Ce = (
|
|
433
|
-
|
|
432
|
+
const Ce = (b) => b === "posts" ? l : `${l}/${b}`, Ue = (b) => {
|
|
433
|
+
b !== j && i(Ce(b), { replace: !0 });
|
|
434
434
|
};
|
|
435
|
-
return !r && !s ? /* @__PURE__ */ e.jsx(ae, { children: /* @__PURE__ */ e.jsx("div", { className: "mx-auto mt-4 flex w-full max-w-[620px] flex-col items-center [&_svg]:translate-x-px", children: /* @__PURE__ */ e.jsxs(
|
|
435
|
+
return !r && !s ? /* @__PURE__ */ e.jsx(ae, { children: /* @__PURE__ */ e.jsx("div", { className: "mx-auto mt-4 flex w-full max-w-[620px] flex-col items-center [&_svg]:translate-x-px", children: /* @__PURE__ */ e.jsxs(qe, { children: [
|
|
436
436
|
/* @__PURE__ */ e.jsx(Je, { children: /* @__PURE__ */ e.jsx(vs, {}) }),
|
|
437
437
|
/* @__PURE__ */ e.jsx("div", { children: "Profile not found" })
|
|
438
438
|
] }) }) }) : /* @__PURE__ */ e.jsx(ae, { children: /* @__PURE__ */ e.jsx("div", { className: "z-0 mx-[max(-4vw,-32px)] -mt-9 flex flex-col items-center pb-16", children: /* @__PURE__ */ e.jsx("div", { className: "mx-auto w-full", children: /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
@@ -492,27 +492,27 @@ const ge = ({
|
|
|
492
492
|
)
|
|
493
493
|
] }),
|
|
494
494
|
A && !r && /* @__PURE__ */ e.jsxs(Ze, { open: ve, onOpenChange: re, children: [
|
|
495
|
-
/* @__PURE__ */ e.jsx(es, { children: /* @__PURE__ */ e.jsx(
|
|
496
|
-
/* @__PURE__ */ e.jsxs(ss, { className: "w-full max-w-[520px]", onOpenAutoFocus: (
|
|
495
|
+
/* @__PURE__ */ e.jsx(es, { children: /* @__PURE__ */ e.jsx(js, { children: /* @__PURE__ */ e.jsx(u, { variant: "secondary", children: "Edit profile" }) }) }),
|
|
496
|
+
/* @__PURE__ */ e.jsxs(ss, { className: "w-full max-w-[520px]", onOpenAutoFocus: (b) => b.preventDefault(), children: [
|
|
497
497
|
/* @__PURE__ */ e.jsx(ls, { children: /* @__PURE__ */ e.jsx(rs, { children: "Profile settings" }) }),
|
|
498
498
|
s && /* @__PURE__ */ e.jsx(fs, { account: s, setIsEditingProfile: re })
|
|
499
499
|
] })
|
|
500
500
|
] })
|
|
501
501
|
] }),
|
|
502
|
-
/* @__PURE__ */ e.jsx(ns, { className: "mt-4 truncate
|
|
502
|
+
/* @__PURE__ */ e.jsx(ns, { className: "break-anywhere mt-4 truncate", children: r ? /* @__PURE__ */ e.jsx(E, { className: "w-32" }) : s == null ? void 0 : s.name }),
|
|
503
503
|
/* @__PURE__ */ e.jsxs("div", { className: "mb-4 flex items-center gap-2", children: [
|
|
504
504
|
/* @__PURE__ */ e.jsx("a", { className: "inline-flex max-w-full truncate text-[1.5rem] text-gray-800 hover:text-gray-900 dark:text-gray-600 dark:hover:text-gray-500", href: s == null ? void 0 : s.url, rel: "noopener noreferrer", target: "_blank", children: /* @__PURE__ */ e.jsx("span", { className: "truncate", children: r ? /* @__PURE__ */ e.jsx(E, { className: "w-full max-w-56" }) : s == null ? void 0 : s.handle }) }),
|
|
505
505
|
!r && /* @__PURE__ */ e.jsx(u, { className: "-ml-1.5 size-6 p-0 text-gray-800 hover:text-gray-900 dark:text-gray-700 dark:hover:text-gray-600", title: "Copy handle", variant: "link", onClick: le, children: R ? /* @__PURE__ */ e.jsx(os, { size: 16 }) : /* @__PURE__ */ e.jsx(us, { size: 16 }) }),
|
|
506
506
|
(s == null ? void 0 : s.followsMe) && !r && /* @__PURE__ */ e.jsx(as, { className: "mt-px whitespace-nowrap", variant: "secondary", children: "Follows you" })
|
|
507
507
|
] }),
|
|
508
|
-
((s == null ? void 0 : s.bio) || (n == null ? void 0 : n.length) > 0) && /* @__PURE__ */ e.jsxs("div", { ref: V, className: `ap-profile-content relative text-[1.5rem]
|
|
508
|
+
((s == null ? void 0 : s.bio) || (n == null ? void 0 : n.length) > 0) && /* @__PURE__ */ e.jsxs("div", { ref: V, className: `ap-profile-content break-anywhere relative text-[1.5rem] [&>p]:mb-3 ${$ ? "max-h-none pb-7" : "max-h-[160px] overflow-hidden"} relative`, children: [
|
|
509
509
|
r ? /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
510
510
|
/* @__PURE__ */ e.jsx(E, {}),
|
|
511
511
|
/* @__PURE__ */ e.jsx(E, { className: "w-full max-w-48" })
|
|
512
512
|
] }) : /* @__PURE__ */ e.jsx("div", { dangerouslySetInnerHTML: { __html: te(ts(is((s == null ? void 0 : s.bio) ?? "", ["a", "br"]))) } }),
|
|
513
|
-
n == null ? void 0 : n.map((
|
|
514
|
-
/* @__PURE__ */ e.jsx("span", { className: "text-xs font-semibold", children:
|
|
515
|
-
/* @__PURE__ */ e.jsx("span", { dangerouslySetInnerHTML: { __html: te(
|
|
513
|
+
n == null ? void 0 : n.map((b) => /* @__PURE__ */ e.jsxs("span", { className: "mt-3 line-clamp-1 flex flex-col text-[1.5rem]", children: [
|
|
514
|
+
/* @__PURE__ */ e.jsx("span", { className: "text-xs font-semibold", children: b.name }),
|
|
515
|
+
/* @__PURE__ */ e.jsx("span", { dangerouslySetInnerHTML: { __html: te(b.value) }, className: "ap-profile-content truncate" })
|
|
516
516
|
] })),
|
|
517
517
|
!$ && ne && /* @__PURE__ */ e.jsx("div", { className: "absolute inset-x-0 bottom-0 h-16 bg-gradient-to-t from-white via-white/100 via-60% to-transparent dark:from-black dark:via-black/100" }),
|
|
518
518
|
ne && /* @__PURE__ */ e.jsx(
|
|
@@ -529,11 +529,11 @@ const ge = ({
|
|
|
529
529
|
ps,
|
|
530
530
|
{
|
|
531
531
|
className: "mt-5",
|
|
532
|
-
value:
|
|
532
|
+
value: j,
|
|
533
533
|
variant: "underline",
|
|
534
|
-
onValueChange: (
|
|
534
|
+
onValueChange: (b) => Ue(b),
|
|
535
535
|
children: [
|
|
536
|
-
/* @__PURE__ */ e.jsxs(
|
|
536
|
+
/* @__PURE__ */ e.jsxs(bs, { children: [
|
|
537
537
|
/* @__PURE__ */ e.jsx(L, { value: "posts", children: "Posts" }),
|
|
538
538
|
f && /* @__PURE__ */ e.jsxs(L, { value: "likes", children: [
|
|
539
539
|
"Likes",
|
|
@@ -551,7 +551,7 @@ const ge = ({
|
|
|
551
551
|
/* @__PURE__ */ e.jsx(S, { value: "posts", children: (T || I) && !p ? /* @__PURE__ */ e.jsxs(O, { children: [
|
|
552
552
|
/* @__PURE__ */ e.jsx(_, { children: /* @__PURE__ */ e.jsx(ds, {}) }),
|
|
553
553
|
/* @__PURE__ */ e.jsxs("div", { className: "mt-2 flex flex-col items-center gap-0.5", children: [
|
|
554
|
-
/* @__PURE__ */ e.jsxs(
|
|
554
|
+
/* @__PURE__ */ e.jsxs(q, { children: [
|
|
555
555
|
s.name,
|
|
556
556
|
" is blocked"
|
|
557
557
|
] }),
|
|
@@ -568,7 +568,7 @@ const ge = ({
|
|
|
568
568
|
)
|
|
569
569
|
] })
|
|
570
570
|
] }) }) }) });
|
|
571
|
-
},
|
|
571
|
+
}, Ds = ({ handle: s }) => {
|
|
572
572
|
const { postsByAccountQuery: n } = hs(s || "me", { enabled: !0 }), {
|
|
573
573
|
data: r,
|
|
574
574
|
fetchNextPage: d,
|
|
@@ -587,7 +587,7 @@ const ge = ({
|
|
|
587
587
|
posts: a
|
|
588
588
|
}
|
|
589
589
|
);
|
|
590
|
-
},
|
|
590
|
+
}, Ps = () => {
|
|
591
591
|
const { postsLikedByAccountQuery: s } = ms({ enabled: !0 }), { data: n, fetchNextPage: r, hasNextPage: d, isFetchingNextPage: h, isLoading: c } = s, t = (n == null ? void 0 : n.pages.flatMap((a) => a.posts)) ?? Array.from({ length: 5 }, (a, o) => ({ id: `placeholder-${o}`, object: {} }));
|
|
592
592
|
return /* @__PURE__ */ e.jsx(
|
|
593
593
|
Ns,
|
|
@@ -600,7 +600,7 @@ const ge = ({
|
|
|
600
600
|
}
|
|
601
601
|
);
|
|
602
602
|
}, Ts = ({ handle: s }) => {
|
|
603
|
-
const n =
|
|
603
|
+
const n = je(s === "" ? "me" : s, "following"), {
|
|
604
604
|
data: r,
|
|
605
605
|
fetchNextPage: d,
|
|
606
606
|
hasNextPage: h,
|
|
@@ -631,7 +631,7 @@ const ge = ({
|
|
|
631
631
|
}
|
|
632
632
|
);
|
|
633
633
|
}, Is = ({ handle: s }) => {
|
|
634
|
-
const n =
|
|
634
|
+
const n = je(s === "" ? "me" : s, "followers"), {
|
|
635
635
|
data: r,
|
|
636
636
|
fetchNextPage: d,
|
|
637
637
|
hasNextPage: h,
|
|
@@ -660,7 +660,7 @@ const ge = ({
|
|
|
660
660
|
}
|
|
661
661
|
);
|
|
662
662
|
}, Ls = ({}) => {
|
|
663
|
-
const s =
|
|
663
|
+
const s = be(), { data: n, isLoading: r, error: d, refetch: h } = X("index", s.handle || "me");
|
|
664
664
|
if (C(() => {
|
|
665
665
|
h();
|
|
666
666
|
}, [s.handle, h]), d && cs(d) && d.statusCode !== 404)
|
|
@@ -668,7 +668,7 @@ const ge = ({
|
|
|
668
668
|
const c = Object.keys((n == null ? void 0 : n.customFields) || {}).map((x) => ({
|
|
669
669
|
name: x,
|
|
670
670
|
value: n.customFields[x]
|
|
671
|
-
})) || [], t = /* @__PURE__ */ e.jsx(
|
|
671
|
+
})) || [], t = /* @__PURE__ */ e.jsx(Ds, { handle: s.handle || "" }), a = /* @__PURE__ */ e.jsx(Ps, {}), o = /* @__PURE__ */ e.jsx(Ts, { handle: s.handle || "" }), i = /* @__PURE__ */ e.jsx(Is, { handle: s.handle || "" });
|
|
672
672
|
return /* @__PURE__ */ e.jsx(
|
|
673
673
|
Bs,
|
|
674
674
|
{
|
|
@@ -685,4 +685,4 @@ const ge = ({
|
|
|
685
685
|
export {
|
|
686
686
|
Ls as default
|
|
687
687
|
};
|
|
688
|
-
//# sourceMappingURL=index-
|
|
688
|
+
//# sourceMappingURL=index-CQNBd3-F.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CQNBd3-F.mjs","sources":["../../../node_modules/.pnpm/lucide-react@0.553.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/pencil.js","../../../node_modules/.pnpm/lucide-react@0.553.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/user-round-x.js","../src/utils/get-name.ts","../src/views/profile/components/actor-list.tsx","../src/views/profile/components/likes.tsx","../src/views/profile/components/posts.tsx","../src/views/profile/components/unblock-dialog.tsx","../src/views/profile/components/profile-menu.tsx","../src/views/profile/components/unblock-button.tsx","../src/views/profile/components/profile-page.tsx","../src/views/profile/profile.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 [\n \"path\",\n {\n d: \"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\n key: \"1a8usu\"\n }\n ],\n [\"path\", { d: \"m15 5 4 4\", key: \"1mk7zo\" }]\n];\nconst Pencil = createLucideIcon(\"pencil\", __iconNode);\n\nexport { __iconNode, Pencil as default };\n//# sourceMappingURL=pencil.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 11.873-7\", key: \"74fkxq\" }],\n [\"circle\", { cx: \"10\", cy: \"8\", r: \"5\", key: \"o932ke\" }],\n [\"path\", { d: \"m17 17 5 5\", key: \"p7ous7\" }],\n [\"path\", { d: \"m22 17-5 5\", key: \"gqnmv0\" }]\n];\nconst UserRoundX = createLucideIcon(\"user-round-x\", __iconNode);\n\nexport { __iconNode, UserRoundX as default };\n//# sourceMappingURL=user-round-x.js.map\n","export default function getName(actor: {name: unknown, preferredUsername: unknown}): string {\n if (typeof actor.name === 'string') {\n return actor.name;\n }\n if (typeof actor.preferredUsername === 'string') {\n return actor.preferredUsername;\n }\n if (typeof actor.preferredUsername === 'object' && actor.preferredUsername !== null) {\n if ('@value' in actor.preferredUsername) {\n if (typeof actor.preferredUsername['@value'] === 'string') {\n return actor.preferredUsername['@value'];\n }\n }\n }\n return 'Unknown';\n}\n","import APAvatar from '@src/components/global/ap-avatar';\nimport ActivityItem from '@src/components/activities/activity-item';\nimport FollowButton from '@src/components/global/follow-button';\nimport ProfilePreviewHoverCard from '@components/global/profile-preview-hover-card';\nimport React, {useEffect, useRef} from 'react';\nimport getName from '@src/utils/get-name';\nimport getUsername from '@src/utils/get-username';\nimport {Actor} from '@src/api/activitypub';\nimport {Button, LoadingIndicator, NoValueLabel, NoValueLabelIcon} from '@tryghost/shade/components';\nimport {LucideIcon} from '@tryghost/shade/utils';\nimport {handleProfileClick} from '@src/utils/handle-profile-click';\nimport {useAccountForUser} from '@src/hooks/use-activity-pub-queries';\nimport {useNavigateWithBasePath} from '@src/hooks/use-navigate-with-base-path';\n\ntype ActorListProps = {\n noResultsMessage: string,\n actors: Actor[],\n isLoading: boolean,\n fetchNextPage: () => void,\n hasNextPage: boolean,\n isFetchingNextPage: boolean\n};\n\nconst ActorList: React.FC<ActorListProps> = ({\n noResultsMessage,\n actors,\n isLoading,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage\n}) => {\n const currentAccountQuery = useAccountForUser('index', 'me');\n const {data: currentUser} = currentAccountQuery;\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 navigate = useNavigateWithBasePath();\n\n return (\n <div className='pt-3' data-testid=\"actor-list\">\n {\n hasNextPage === false && actors.length === 0 ? (\n <NoValueLabel>\n <NoValueLabelIcon><LucideIcon.UserRoundPlus /></NoValueLabelIcon>\n {noResultsMessage}\n </NoValueLabel>\n ) : (\n <div className='flex flex-col'>\n {actors.map(({actor, isFollowing, blockedByMe, domainBlockedByMe}) => {\n const actorHandle = actor.handle || getUsername(actor);\n const isCurrentUser = actorHandle === currentUser?.handle;\n\n return (\n <React.Fragment key={actor.id}>\n <ProfilePreviewHoverCard actor={actor} align='center' isCurrentUser={isCurrentUser} side='left'>\n <div>\n <ActivityItem key={actor.id}\n data-testid=\"actor-item\"\n onClick={() => {\n handleProfileClick(actor, navigate);\n }}\n >\n <APAvatar author={actor} />\n <div>\n <div className='break-anywhere text-gray-600'>\n <span className='mr-1 line-clamp-1 font-bold text-black dark:text-white'>{getName(actor)}</span>\n <div className='line-clamp-1 text-sm'>{actorHandle}</div>\n </div>\n </div>\n {blockedByMe || domainBlockedByMe ?\n <Button className='pointer-events-none ml-auto min-w-[90px]' variant='destructive'>Blocked</Button> :\n !isCurrentUser ? (\n <FollowButton\n className='ml-auto'\n data-testid=\"follow-button\"\n following={isFollowing}\n handle={actorHandle}\n type='secondary'\n />\n ) : null\n }\n </ActivityItem>\n </div>\n </ProfilePreviewHoverCard>\n </React.Fragment>\n );\n })}\n </div>\n )\n }\n <div ref={loadMoreRef} className='h-1'></div>\n {\n (isFetchingNextPage || isLoading) && (\n <div className='mt-6 flex flex-col items-center justify-center gap-4 text-center'>\n <LoadingIndicator size='md' />\n </div>\n )\n }\n </div>\n );\n};\n\nexport default ActorList;\n","import FeedItem from '@src/components/feed/feed-item';\nimport {Activity} from '@src/api/activitypub';\nimport {LoadingIndicator, NoValueLabel, NoValueLabelIcon, Separator} from '@tryghost/shade/components';\nimport {LucideIcon} from '@tryghost/shade/utils';\nimport {useEffect, useRef} from 'react';\nimport {useNavigateWithBasePath} from '@src/hooks/use-navigate-with-base-path';\n\nexport type LikesProps = {\n isLoading: boolean,\n posts: Activity[],\n fetchNextPage: () => void,\n hasNextPage: boolean,\n isFetchingNextPage: boolean\n}\n\nconst Likes: React.FC<LikesProps> = ({\n posts,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n isLoading\n}) => {\n const observerRef = useRef<IntersectionObserver | null>(null);\n const loadMoreRef = useRef<HTMLDivElement | null>(null);\n const endLoadMoreRef = useRef<HTMLDivElement | null>(null);\n\n // Calculate the index at which to place the loadMoreRef - This will place it ~75% through the list\n const loadMoreIndex = Math.max(0, Math.floor(posts.length * 0.75) - 1);\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 if (endLoadMoreRef.current) {\n observerRef.current.observe(endLoadMoreRef.current);\n }\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n }\n };\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n const navigate = useNavigateWithBasePath();\n\n return (\n <>\n {hasNextPage === false && posts.length === 0 && (\n <NoValueLabel>\n <NoValueLabelIcon><LucideIcon.Heart /></NoValueLabelIcon>\n You haven't liked anything yet.\n </NoValueLabel>\n )}\n <ul className='mx-auto flex max-w-[640px] flex-col' data-testid=\"profile-likes-list\">\n {posts.map((activity, index) => (\n <li\n key={`likes-${activity.id}`}\n data-testid=\"profile-like-item\"\n data-test-view-article\n >\n <FeedItem\n actor={activity.actor}\n allowDelete={activity.object.authored}\n commentCount={activity.object.replyCount}\n isLoading={isLoading}\n layout='feed'\n likeCount={activity.object.likeCount}\n object={activity.object}\n repostCount={activity.object.repostCount}\n type={activity.type}\n onClick={() => {\n if (activity.object.type === 'Note') {\n navigate(`/notes/${encodeURIComponent(activity.object.id)}`);\n } else if (activity.object.type === 'Article') {\n navigate(`/reader/${encodeURIComponent(activity.object.id)}`);\n }\n }}\n />\n {index < posts.length - 1 && <Separator />}\n {index === loadMoreIndex && (\n <div ref={loadMoreRef} className='h-1'></div>\n )}\n </li>\n ))}\n {isFetchingNextPage && (\n <li className='flex flex-col items-center justify-center gap-4 text-center'>\n <LoadingIndicator size='md' />\n </li>\n )}\n </ul>\n <div ref={endLoadMoreRef} className='h-1'></div>\n </>\n );\n};\n\nexport default Likes;\n","import FeedItem from '@src/components/feed/feed-item';\nimport {Activity} from '@src/api/activitypub';\nimport {LoadingIndicator, NoValueLabel, NoValueLabelIcon, Separator} from '@tryghost/shade/components';\nimport {LucideIcon} from '@tryghost/shade/utils';\nimport {useEffect, useRef} from 'react';\nimport {useNavigateWithBasePath} from '@src/hooks/use-navigate-with-base-path';\n\nexport type PostsProps = {\n posts: Activity[],\n isLoading: boolean,\n fetchNextPage: () => void,\n hasNextPage: boolean,\n isFetchingNextPage: boolean,\n noResultsMessage: string\n}\n\nconst Posts: React.FC<PostsProps> = ({\n posts,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n isLoading,\n noResultsMessage\n}) => {\n const observerRef = useRef<IntersectionObserver | null>(null);\n const loadMoreRef = useRef<HTMLDivElement | null>(null);\n const endLoadMoreRef = useRef<HTMLDivElement | null>(null);\n\n // Calculate the index at which to place the loadMoreRef - This will place it ~75% through the list\n const loadMoreIndex = Math.max(0, Math.floor(posts.length * 0.75) - 1);\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 if (endLoadMoreRef.current) {\n observerRef.current.observe(endLoadMoreRef.current);\n }\n\n return () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n }\n };\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n const navigate = useNavigateWithBasePath();\n\n return (\n <>\n {hasNextPage === false && posts.length === 0 && (\n <NoValueLabel>\n <NoValueLabelIcon><LucideIcon.Pencil /></NoValueLabelIcon>\n {noResultsMessage}\n </NoValueLabel>\n )}\n <ul className='mx-auto flex max-w-[640px] flex-col' data-testid=\"profile-posts-list\">\n {posts.map((activity, index) => (\n <li\n key={`posts-${activity.id}`}\n data-testid=\"profile-post-item\"\n data-test-view-article\n >\n <FeedItem\n actor={activity.actor}\n allowDelete={activity.object.authored}\n commentCount={activity.object.replyCount}\n isLoading={isLoading}\n layout='feed'\n likeCount={activity.object.likeCount}\n object={activity.object}\n repostCount={activity.object.repostCount}\n type={activity.type}\n onClick={() => {\n if (activity.object.type === 'Note') {\n navigate(`/notes/${encodeURIComponent(activity.object.id)}`);\n } else if (activity.object.type === 'Article') {\n navigate(`/reader/${encodeURIComponent(activity.object.id)}`);\n }\n }}\n />\n {index < posts.length - 1 && <Separator />}\n {index === loadMoreIndex && (\n <div ref={loadMoreRef} className='h-1'></div>\n )}\n </li>\n ))}\n {isFetchingNextPage && (\n <li className='flex flex-col items-center justify-center gap-4 text-center'>\n <LoadingIndicator size='md' />\n </li>\n )}\n </ul>\n <div ref={endLoadMoreRef} className='h-1'></div>\n </>\n );\n};\n\nexport default Posts;\n","import React, {useCallback, useEffect, useState} from 'react';\nimport {AlertDialog, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, Button} from '@tryghost/shade/components';\nimport {H4} from '@tryghost/shade/primitives';\nimport {LucideIcon} from '@tryghost/shade/utils';\nimport {toast} from 'sonner';\n\ntype DialogMode = 'idle' | 'dual' | 'userOnly' | 'domainOnly';\n\ninterface UnblockDialogProps {\n handle: string;\n isUserBlocked: boolean;\n isDomainBlocked: boolean;\n onUnblockUser: () => Promise<void> | void;\n onUnblockDomain: () => Promise<void> | void;\n trigger?: React.ReactNode;\n onUnblockComplete?: () => void;\n isOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nconst UnblockDialog: React.FC<UnblockDialogProps> = ({\n handle,\n isUserBlocked,\n isDomainBlocked,\n onUnblockUser,\n onUnblockDomain,\n trigger,\n onUnblockComplete,\n isOpen: externalIsOpen,\n onOpenChange: externalOnOpenChange\n}) => {\n const [internalDialogOpen, setInternalDialogOpen] = useState(false);\n const [dialogState, setDialogState] = useState(() => {\n const bothBlocked = isUserBlocked && isDomainBlocked;\n const userOnlyBlocked = isUserBlocked && !isDomainBlocked;\n const domainOnlyBlocked = !isUserBlocked && isDomainBlocked;\n\n let mode: DialogMode = 'idle';\n if (bothBlocked) {\n mode = 'dual';\n } else if (userOnlyBlocked) {\n mode = 'userOnly';\n } else if (domainOnlyBlocked) {\n mode = 'domainOnly';\n }\n\n return {\n mode,\n userUnblocked: false,\n domainUnblocked: false\n };\n });\n\n const isControlled = externalIsOpen !== undefined;\n const dialogOpen = isControlled ? externalIsOpen : internalDialogOpen;\n\n const [wasOpened, setWasOpened] = useState(false);\n\n const initializeDialogState = useCallback(() => {\n const bothBlocked = isUserBlocked && isDomainBlocked;\n const userOnlyBlocked = isUserBlocked && !isDomainBlocked;\n const domainOnlyBlocked = !isUserBlocked && isDomainBlocked;\n\n let mode: DialogMode = 'idle';\n if (bothBlocked) {\n mode = 'dual';\n } else if (userOnlyBlocked) {\n mode = 'userOnly';\n } else if (domainOnlyBlocked) {\n mode = 'domainOnly';\n }\n\n setDialogState(prev => ({\n ...prev,\n mode,\n userUnblocked: false,\n domainUnblocked: false\n }));\n }, [isUserBlocked, isDomainBlocked]);\n\n useEffect(() => {\n if (dialogOpen && !wasOpened) {\n initializeDialogState();\n setWasOpened(true);\n } else if (!dialogOpen) {\n setWasOpened(false);\n }\n }, [dialogOpen, wasOpened, initializeDialogState]);\n\n const handleDialogOpen = () => {\n if (isControlled) {\n externalOnOpenChange?.(true);\n } else {\n setInternalDialogOpen(true);\n }\n };\n\n const handleDialogClose = (open: boolean) => {\n if (!open) {\n if (isControlled) {\n externalOnOpenChange?.(false);\n } else {\n setInternalDialogOpen(false);\n }\n }\n };\n\n const handleUnblock = async () => {\n await onUnblockUser();\n\n setDialogState(prev => ({\n ...prev,\n userUnblocked: true\n }));\n\n if (dialogState.mode !== 'dual' || dialogState.domainUnblocked) {\n handleDialogClose(false);\n onUnblockComplete?.();\n }\n\n toast.success('User unblocked');\n };\n\n const handleDomainUnblock = async () => {\n await onUnblockDomain();\n\n setDialogState(prev => ({\n ...prev,\n domainUnblocked: true\n }));\n\n if (dialogState.mode !== 'dual' || dialogState.userUnblocked) {\n handleDialogClose(false);\n onUnblockComplete?.();\n }\n\n toast.success('Domain unblocked');\n };\n\n const domain = handle.split('@').filter(Boolean)[1];\n\n const renderDualView = () => (\n <>\n <AlertDialogHeader>\n <AlertDialogTitle className='mb-1 flex flex-col gap-1'>\n Unblock\n </AlertDialogTitle>\n <AlertDialogDescription className='mt-4!' asChild>\n <div className='flex flex-col rounded-md border'>\n <div className='flex justify-between gap-6 p-5'>\n <div className='flex flex-col gap-1'>\n <H4>Unblock user</H4>\n <p><span className='font-semibold text-black'>{handle}</span> will be able to follow you and engage with your public posts.</p>\n </div>\n <Button className={`gap-1 ${dialogState.userUnblocked ? 'pointer-events-none border-green bg-green text-white hover:bg-green hover:text-white' : 'text-red hover:text-red-400'}`} variant='outline' onClick={handleUnblock}>\n <LucideIcon.User />\n {dialogState.userUnblocked ? 'User unblocked' : 'Unblock user'}\n </Button>\n </div>\n <div className='border-t' />\n <div className='flex justify-between gap-6 p-5'>\n <div className='flex flex-col gap-1'>\n <H4>Unblock domain</H4>\n <p>Users from <span className='font-semibold text-black'>{domain}</span> will be able to follow you and engage with your public posts.</p>\n </div>\n <Button className={`gap-1 ${dialogState.domainUnblocked ? 'pointer-events-none border-green bg-green text-white hover:bg-green hover:text-white' : 'text-red hover:text-red-400'}`} variant='outline' onClick={handleDomainUnblock}>\n <LucideIcon.Globe />\n {dialogState.domainUnblocked ? 'Domain unblocked' : 'Unblock domain'}\n </Button>\n </div>\n </div>\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <Button onClick={() => handleDialogClose(false)}>OK</Button>\n </AlertDialogFooter>\n </>\n );\n\n const renderSingleView = () => {\n const isUserBlock = dialogState.mode === 'userOnly';\n\n return (\n <>\n <AlertDialogHeader>\n <AlertDialogTitle className='mb-1 flex flex-col gap-1'>\n {isUserBlock ? 'Unblock this user?' : 'Unblock this domain?'}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {isUserBlock\n ? <><span className='font-semibold text-black'>{handle}</span> will be able to follow you and engage with your public posts.</>\n : <>Users from <span className='font-semibold text-black'>{domain}</span> will be able to follow you and engage with your public posts.</>\n }\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <Button onClick={isUserBlock ? handleUnblock : handleDomainUnblock}>\n Unblock\n </Button>\n </AlertDialogFooter>\n </>\n );\n };\n\n return (\n <AlertDialog open={dialogOpen} onOpenChange={handleDialogClose}>\n {trigger && (\n <AlertDialogTrigger asChild onClick={handleDialogOpen}>\n {trigger}\n </AlertDialogTrigger>\n )}\n <AlertDialogContent className={`${dialogState.mode === 'dual' && 'max-w-[600px]'}`}>\n {dialogState.mode === 'dual' ? renderDualView() : renderSingleView()}\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n\nexport default UnblockDialog;\n","import React, {useState} from 'react';\nimport UnblockDialog from './unblock-dialog';\nimport {Account} from '@src/api/activitypub';\nimport {AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, Button, Popover, PopoverClose, PopoverContent, PopoverTrigger, buttonVariants} from '@tryghost/shade/components';\n\ninterface ProfileMenuProps {\n account?: Account,\n children: React.ReactNode;\n onCopyHandle: () => void;\n onBlockAccount: () => void;\n onBlockDomain: () => void;\n disabled?: boolean;\n isBlocked?: boolean;\n isDomainBlocked?: boolean;\n}\n\nconst ProfileMenu: React.FC<ProfileMenuProps> = ({\n account,\n children,\n onCopyHandle,\n onBlockAccount,\n onBlockDomain,\n disabled = false,\n isBlocked = false,\n isDomainBlocked = false\n}) => {\n const [dialogType, setDialogType] = useState<'user' | 'domain' | null>(null);\n const [dialogOpen, setDialogOpen] = useState(false);\n\n const handleCopyHandleClick = (e: React.MouseEvent<HTMLElement>) => {\n e.stopPropagation();\n onCopyHandle();\n };\n\n const handleBlockAccountClick = (e: React.MouseEvent<HTMLElement>) => {\n e.stopPropagation();\n onBlockAccount();\n };\n\n const handleBlockDomainClick = (e: React.MouseEvent<HTMLElement>) => {\n e.stopPropagation();\n onBlockDomain();\n };\n\n const handle = account?.handle;\n const domain = handle?.split('@').filter(Boolean)[1];\n\n const renderBlockView = () => (\n <AlertDialog open={dialogOpen} onOpenChange={setDialogOpen}>\n <AlertDialogContent onClick={e => e.stopPropagation()}>\n <AlertDialogHeader>\n <AlertDialogTitle className='mb-1 flex flex-col gap-1'>\n {dialogType === 'user' ? 'Block this user?' : 'Block this domain?'}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {dialogType === 'user'\n ? <><span className='font-semibold text-black'>{handle}</span> will be able to see your public posts, but will no longer be able follow you or interact with your content on the social web.</>\n : <>All users from <span className='font-semibold text-black'>{domain}</span> will be able to see your public posts, but won't be able to follow you or interact with your content.</>\n }\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n {dialogType !== 'domain' &&\n <Button className='mr-auto -ml-3 hover:bg-transparent hover:opacity-80' variant='ghost' onClick={(e) => {\n e.stopPropagation();\n setDialogType('domain');\n }}>Block domain instead</Button>\n }\n <AlertDialogCancel onClick={e => e.stopPropagation()}>\n Cancel\n </AlertDialogCancel>\n <AlertDialogAction\n className={buttonVariants({variant: 'destructive'})}\n onClick={dialogType === 'user' ? handleBlockAccountClick : handleBlockDomainClick}\n >\n Block\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n\n const renderUnblockView = () => (\n account && <UnblockDialog\n handle={account.handle}\n isDomainBlocked={account.domainBlockedByMe}\n isOpen={dialogOpen}\n isUserBlocked={account.blockedByMe}\n onOpenChange={setDialogOpen}\n onUnblockDomain={onBlockDomain}\n onUnblockUser={onBlockAccount}\n />\n );\n\n return (\n <>\n <Popover>\n <PopoverTrigger disabled={disabled} asChild onClick={e => e.stopPropagation()}>\n {children}\n </PopoverTrigger>\n <PopoverContent align=\"end\" className='p-2'>\n <div className='flex w-48 flex-col'>\n <PopoverClose asChild>\n <Button className='justify-start' variant='ghost' onClick={handleCopyHandleClick}>\n Copy handle\n </Button>\n </PopoverClose>\n <PopoverClose asChild>\n <Button className='justify-start text-red hover:bg-red/5 hover:text-red' variant='ghost' onClick={(e) => {\n e.stopPropagation();\n if (!isBlocked && !isDomainBlocked) {\n setDialogType('user');\n }\n setDialogOpen(true);\n }}>\n {isBlocked ? 'Unblock user' : isDomainBlocked ? 'Unblock domain' : 'Block user'}\n </Button>\n </PopoverClose>\n </div>\n </PopoverContent>\n </Popover>\n {isBlocked || isDomainBlocked ? renderUnblockView() : renderBlockView()}\n </>\n );\n};\n\nexport default ProfileMenu;\n","import React, {useState} from 'react';\nimport UnblockDialog from './unblock-dialog';\nimport {Account} from '@src/api/activitypub';\nimport {Button} from '@tryghost/shade/components';\n\ninterface UnblockButtonProps {\n account: Account,\n onUnblock: () => void;\n onDomainUnblock: () => void;\n className?: string;\n}\n\nconst UnblockButton: React.FC<UnblockButtonProps> = ({\n account,\n onUnblock,\n onDomainUnblock,\n className = ''\n}) => {\n const [isHovered, setIsHovered] = useState(false);\n\n const trigger = (\n <Button\n className={`min-w-[90px] ${className}`}\n variant='destructive'\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {isHovered ? 'Unblock' : 'Blocked'}\n </Button>\n );\n\n return (\n <UnblockDialog\n handle={account.handle}\n isDomainBlocked={account.domainBlockedByMe}\n isUserBlocked={account.blockedByMe}\n trigger={trigger}\n onUnblockDomain={onDomainUnblock}\n onUnblockUser={onUnblock}\n />\n );\n};\n\nexport default UnblockButton;\n","import APAvatar from '@src/components/global/ap-avatar';\nimport EditProfile from '@src/views/preferences/components/edit-profile';\nimport FollowButton from '@src/components/global/follow-button';\nimport Layout from '@src/components/layout';\nimport ProfileMenu from './profile-menu';\nimport UnblockButton from './unblock-button';\nimport {Account} from '@src/api/activitypub';\nimport {Badge, Button, Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, NoValueLabel, NoValueLabelIcon, Skeleton, Tabs, TabsContent, TabsList, TabsTrigger, TabsTriggerCount} from '@tryghost/shade/components';\nimport {EmptyViewIcon, EmptyViewIndicator} from '@src/components/global/empty-view-indicator';\nimport {H2, H4} from '@tryghost/shade/primitives';\nimport {LucideIcon, abbreviateNumber} from '@tryghost/shade/utils';\nimport {SettingAction} from '@src/views/preferences/components/settings';\nimport {openLinksInNewTab, sanitizeHtml, stripHtml} from '@src/utils/content-formatters';\nimport {toast} from 'sonner';\nimport {useAccountForUser, useBlockDomainMutationForUser, useBlockMutationForUser, useUnblockDomainMutationForUser, useUnblockMutationForUser} from '@src/hooks/use-activity-pub-queries';\nimport {useEffect, useMemo, useRef, useState} from 'react';\nimport {useLocation, useNavigationStack, useParams} from '@tryghost/admin-x-framework';\nimport {useNavigateWithBasePath} from '@src/hooks/use-navigate-with-base-path';\nimport type {ProfileTab} from '../profile';\n\nconst noop = () => {};\n\ntype ProfilePageProps = {\n account: Account,\n customFields: Array<{\n name: string;\n value: string;\n }>,\n postsTab: React.ReactNode,\n likesTab: React.ReactNode,\n followingTab: React.ReactNode,\n followersTab: React.ReactNode,\n isLoadingAccount: boolean\n}\n\nconst ProfilePage:React.FC<ProfilePageProps> = ({\n account,\n customFields,\n isLoadingAccount,\n postsTab,\n likesTab,\n followingTab,\n followersTab\n}) => {\n const params = useParams<{handle?: string; tab?: string}>();\n const location = useLocation();\n const navigate = useNavigateWithBasePath();\n const {canGoBack} = useNavigationStack();\n\n const profilePath = params.handle ? `/profile/${params.handle}` : '/profile';\n const likesEnabled = !params.handle;\n\n const tabSlug = params.handle\n ? (params.tab || '')\n : (location.pathname.split('/').pop() || '');\n\n const allowedTabs = useMemo<ProfileTab[]>(() => (\n likesEnabled ? ['likes', 'following', 'followers'] : ['following', 'followers']\n ), [likesEnabled]);\n const activeTab: ProfileTab = allowedTabs.includes(tabSlug as ProfileTab) ? tabSlug as ProfileTab : 'posts';\n\n const blockMutation = useBlockMutationForUser('index');\n const unblockMutation = useUnblockMutationForUser('index');\n const blockDomainMutation = useBlockDomainMutationForUser('index');\n const unblockDomainMutation = useUnblockDomainMutationForUser('index');\n\n const currentAccountQuery = useAccountForUser('index', 'me');\n const {data: currentUser} = params.handle ? currentAccountQuery : {data: undefined};\n const isCurrentUser = params.handle === currentUser?.handle || !params.handle;\n\n const isBlocked = account?.blockedByMe;\n const isDomainBlocked = account?.domainBlockedByMe;\n const [viewBlockedPosts, setViewBlockedPosts] = useState(false);\n const [copied, setCopied] = useState(false);\n const copyTimeoutRef = useRef<number | null>(null);\n\n useEffect(() => () => {\n if (copyTimeoutRef.current) {\n window.clearTimeout(copyTimeoutRef.current);\n }\n }, []);\n\n const handleBlock = () => {\n if (isBlocked) {\n unblockMutation.mutate(account);\n } else {\n blockMutation.mutate(account);\n toast.success('User blocked');\n }\n setViewBlockedPosts(false);\n };\n\n const handleDomainBlock = () => {\n if (isDomainBlocked) {\n unblockDomainMutation.mutate({url: account.apId, handle: account.handle});\n } else {\n blockDomainMutation.mutate({url: account.apId, handle: account.handle});\n toast.success('Domain blocked');\n }\n setViewBlockedPosts(false);\n };\n\n const handleCopy = async () => {\n if (!account?.handle || !navigator?.clipboard?.writeText) {\n toast.error('Unable to copy handle');\n return;\n }\n try {\n await navigator.clipboard.writeText(account.handle);\n setCopied(true);\n toast.success('Handle copied');\n if (copyTimeoutRef.current) {\n window.clearTimeout(copyTimeoutRef.current);\n }\n copyTimeoutRef.current = window.setTimeout(() => setCopied(false), 2000);\n } catch {\n toast.error('Failed to copy handle');\n setCopied(false);\n }\n };\n\n const [isExpanded, setisExpanded] = useState(false);\n const [isEditingProfile, setIsEditingProfile] = useState(false);\n\n const toggleExpand = () => {\n setisExpanded(!isExpanded);\n };\n\n const contentRef = useRef<HTMLDivElement | null>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n\n useEffect(() => {\n if (contentRef.current) {\n setIsOverflowing(contentRef.current.scrollHeight > 160); // Compare content height to max height\n }\n }, [isExpanded, account?.bio, customFields, isLoadingAccount]);\n\n useEffect(() => {\n if (!tabSlug) {\n return;\n }\n\n if (!allowedTabs.includes(tabSlug as ProfileTab)) {\n navigate(profilePath, {replace: true});\n }\n }, [allowedTabs, profilePath, navigate, tabSlug]);\n\n const createTabPath = (tab: ProfileTab) => {\n if (tab === 'posts') {\n return profilePath;\n }\n\n return `${profilePath}/${tab}`;\n };\n\n const handleTabChange = (tab: ProfileTab) => {\n if (tab === activeTab) {\n return;\n }\n\n navigate(createTabPath(tab), {replace: true});\n };\n\n if (!isLoadingAccount && !account) {\n return (\n <Layout>\n <div className='mx-auto mt-4 flex w-full max-w-[620px] flex-col items-center [&_svg]:translate-x-px'>\n <EmptyViewIndicator>\n <EmptyViewIcon><LucideIcon.UserRoundX /></EmptyViewIcon>\n <div>Profile not found</div>\n </EmptyViewIndicator>\n </div>\n </Layout>\n );\n }\n\n return (\n <Layout>\n <div className='z-0 mx-[max(-4vw,-32px)] -mt-9 flex flex-col items-center pb-16'>\n <div className='mx-auto w-full'>\n <>\n {account?.bannerImageUrl ?\n <div className='h-[15vw] min-h-[200px] w-full overflow-hidden bg-gradient-to-tr from-gray-200 to-gray-100'>\n <img\n alt={account?.name}\n className='size-full object-cover'\n referrerPolicy='no-referrer'\n src={account?.bannerImageUrl}\n />\n </div>\n :\n <div className='h-[max(8vw,132px)] w-full overflow-hidden bg-gradient-to-tr from-white to-white dark:from-black dark:to-black'></div>\n }\n <div className={`mx-auto max-w-[620px] px-6 ${(!account?.bannerImageUrl && !canGoBack) ? '-mt-8' : '-mt-12'}`}>\n <div className='flex items-end justify-between'>\n <div className='-ml-2 rounded-full bg-white p-1 dark:bg-black'>\n {isLoadingAccount ?\n <Skeleton className='size-[92px] rounded-full' />\n :\n <APAvatar\n author={\n {\n icon: {\n url: account?.avatarUrl\n },\n name: account?.name,\n handle: account?.handle\n }\n }\n size='lg'\n />\n }\n </div>\n {!isCurrentUser && !isLoadingAccount &&\n <div className='flex gap-2'>\n {!(isBlocked || isDomainBlocked) ?\n <FollowButton\n following={account?.followedByMe}\n handle={account?.handle}\n type='primary'\n onFollow={noop}\n onUnfollow={noop}\n /> :\n <UnblockButton\n account={account}\n onDomainUnblock={handleDomainBlock}\n onUnblock={handleBlock}\n />\n }\n <ProfileMenu\n account={account}\n isBlocked={isBlocked}\n isDomainBlocked={isDomainBlocked}\n onBlockAccount={handleBlock}\n onBlockDomain={handleDomainBlock}\n onCopyHandle={handleCopy}\n >\n <Button aria-label='Open profile menu' variant='outline'><LucideIcon.Ellipsis /></Button>\n </ProfileMenu>\n </div>\n }\n {isCurrentUser && !isLoadingAccount &&\n <Dialog open={isEditingProfile} onOpenChange={setIsEditingProfile}>\n <DialogTrigger>\n <SettingAction><Button variant='secondary'>Edit profile</Button></SettingAction>\n </DialogTrigger>\n <DialogContent className='w-full max-w-[520px]' onOpenAutoFocus={e => e.preventDefault()}>\n <DialogHeader>\n <DialogTitle>Profile settings</DialogTitle>\n </DialogHeader>\n {account && <EditProfile account={account} setIsEditingProfile={setIsEditingProfile} />}\n </DialogContent>\n </Dialog>\n }\n </div>\n <H2 className='break-anywhere mt-4 truncate'>{!isLoadingAccount ? account?.name : <Skeleton className='w-32' />}</H2>\n <div className='mb-4 flex items-center gap-2'>\n <a className='inline-flex max-w-full truncate text-[1.5rem] text-gray-800 hover:text-gray-900 dark:text-gray-600 dark:hover:text-gray-500' href={account?.url} rel='noopener noreferrer' target='_blank'>\n <span className='truncate'>{!isLoadingAccount ? account?.handle : <Skeleton className='w-full max-w-56' />}</span>\n </a>\n {!isLoadingAccount && (\n <Button className='-ml-1.5 size-6 p-0 text-gray-800 hover:text-gray-900 dark:text-gray-700 dark:hover:text-gray-600' title='Copy handle' variant='link' onClick={handleCopy}>\n {!copied ?\n <LucideIcon.Copy size={16} /> :\n <LucideIcon.Check size={16} />\n }\n </Button>\n )}\n {account?.followsMe && !isLoadingAccount && (\n <Badge className='mt-px whitespace-nowrap' variant='secondary'>Follows you</Badge>\n )}\n </div>\n {(account?.bio || customFields?.length > 0) && (<div ref={contentRef} className={`ap-profile-content break-anywhere relative text-[1.5rem] [&>p]:mb-3 ${isExpanded ? 'max-h-none pb-7' : 'max-h-[160px] overflow-hidden'} relative`}>\n {!isLoadingAccount ?\n <div dangerouslySetInnerHTML={{__html: sanitizeHtml(openLinksInNewTab(stripHtml(account?.bio ?? '', ['a', 'br'])))}} /> :\n <>\n <Skeleton />\n <Skeleton className='w-full max-w-48' />\n </>\n }\n {customFields?.map((attachment: {name: string, value: string}) => (\n <span className='mt-3 line-clamp-1 flex flex-col text-[1.5rem]'>\n <span className={`text-xs font-semibold`}>{attachment.name}</span>\n <span dangerouslySetInnerHTML={{__html: sanitizeHtml(attachment.value)}} className='ap-profile-content truncate'/>\n </span>\n ))}\n {!isExpanded && isOverflowing && (\n <div className='absolute inset-x-0 bottom-0 h-16 bg-gradient-to-t from-white via-white/100 via-60% to-transparent dark:from-black dark:via-black/100' />\n )}\n {isOverflowing && <Button\n className='absolute bottom-0 h-auto p-0 text-md'\n variant='link'\n onClick={toggleExpand}\n >{isExpanded ? 'Show less' : 'Show all'}</Button>}\n </div>)}\n <Tabs\n key={params.handle || account?.handle || 'current-user'}\n className='mt-5'\n value={activeTab}\n variant='underline'\n onValueChange={value => handleTabChange(value as ProfileTab)}\n >\n <TabsList>\n <TabsTrigger value=\"posts\">Posts</TabsTrigger>\n {likesEnabled && <TabsTrigger value=\"likes\">\n Likes\n <TabsTriggerCount>{abbreviateNumber(account?.likedCount || 0)}</TabsTriggerCount>\n </TabsTrigger>}\n <TabsTrigger value=\"following\">\n Following\n <TabsTriggerCount>{abbreviateNumber(account?.followingCount || 0)}</TabsTriggerCount>\n </TabsTrigger>\n <TabsTrigger value=\"followers\">\n Followers\n <TabsTriggerCount>{abbreviateNumber(account?.followerCount || 0)}</TabsTriggerCount>\n </TabsTrigger>\n </TabsList>\n <TabsContent value='posts'>\n {((isBlocked || isDomainBlocked) && !viewBlockedPosts) ?\n <NoValueLabel>\n <NoValueLabelIcon><LucideIcon.Ban /></NoValueLabelIcon>\n <div className='mt-2 flex flex-col items-center gap-0.5'>\n <H4>{account.name} is blocked</H4>\n <p>You can view the posts, but it won't unblock the user.</p>\n <Button className='mt-4' variant='secondary' onClick={() => setViewBlockedPosts(true)}>View posts</Button>\n </div>\n </NoValueLabel> :\n postsTab\n }\n </TabsContent>\n {likesEnabled && <TabsContent value='likes'>\n {likesTab}\n </TabsContent>}\n <TabsContent value='following'>\n {followingTab}\n </TabsContent>\n <TabsContent value='followers'>\n {followersTab}\n </TabsContent>\n </Tabs>\n </div>\n </>\n </div>\n </div>\n </Layout>\n );\n};\n\nexport default ProfilePage;\n","import ActorList from './components/actor-list';\nimport AppError from '@components/layout/error';\nimport Likes from './components/likes';\nimport Posts from './components/posts';\nimport ProfilePage from './components/profile-page';\nimport React, {useEffect} from 'react';\nimport {Activity, isApiError} from '@src/api/activitypub';\nimport {useAccountFollowsForUser, useAccountForUser, usePostsByAccount, usePostsLikedByAccount} from '@hooks/use-activity-pub-queries';\nimport {useParams} from '@tryghost/admin-x-framework';\n\nexport type ProfileTab = 'posts' | 'likes' | 'following' | 'followers';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\ninterface ProfileProps {}\n\nconst PostsTab:React.FC<{handle: string}> = ({handle}) => {\n const {postsByAccountQuery} = usePostsByAccount(handle ? handle : 'me', {enabled: true});\n\n const {\n data,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n isLoading\n } = postsByAccountQuery;\n\n const posts = data?.pages.flatMap((page: {posts: Activity[]}) => page.posts) ?? Array.from({length: 5}, (_, index) => ({id: `placeholder-${index}`, object: {}}));\n\n return <Posts\n fetchNextPage={fetchNextPage}\n hasNextPage={hasNextPage!}\n isFetchingNextPage={isFetchingNextPage}\n isLoading={isLoading}\n noResultsMessage={handle ? `${handle} hasn't posted anything yet` : `You haven't posted anything yet.`}\n posts={posts}\n />;\n};\n\nconst LikesTab: React.FC = () => {\n const {postsLikedByAccountQuery} = usePostsLikedByAccount({enabled: true});\n const {data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading} = postsLikedByAccountQuery;\n\n const posts = data?.pages.flatMap(page => page.posts) ?? Array.from({length: 5}, (_, index) => ({id: `placeholder-${index}`, object: {}}));\n\n return <Likes\n fetchNextPage={fetchNextPage}\n hasNextPage={hasNextPage!}\n isFetchingNextPage={isFetchingNextPage}\n isLoading={isLoading}\n posts={posts}\n />;\n};\n\nconst FollowingTab: React.FC<{handle: string}> = ({handle}) => {\n const accountQuery = useAccountFollowsForUser(handle === '' ? 'me' : handle, 'following');\n\n const {\n data,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n isLoading\n } = accountQuery;\n\n const actors = data?.pages.flatMap((page) => {\n if ('following' in page) {\n return page.following;\n } else if ('accounts' in page) {\n return page.accounts.map(account => ({\n actor: {\n id: account.id,\n name: account.name,\n handle: account.handle,\n icon: {\n url: account.avatarUrl\n }\n },\n isFollowing: account.isFollowing,\n blockedByMe: account.blockedByMe,\n domainBlockedByMe: account.domainBlockedByMe\n }));\n }\n return [];\n }) ?? [];\n\n return (\n <ActorList\n actors={actors}\n fetchNextPage={fetchNextPage}\n hasNextPage={hasNextPage!}\n isFetchingNextPage={isFetchingNextPage}\n isLoading={isLoading}\n noResultsMessage={`${handle || 'You'} have no following`}\n />\n );\n};\n\nconst FollowersTab: React.FC<{handle: string}> = ({handle}) => {\n const accountQuery = useAccountFollowsForUser(handle === '' ? 'me' : handle, 'followers');\n\n const {\n data,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n isLoading\n } = accountQuery;\n\n const actors = data?.pages.flatMap((page) => {\n if ('followers' in page) {\n return page.followers;\n } else if ('accounts' in page) {\n return page.accounts.map(account => ({\n actor: {\n id: account.id,\n name: account.name,\n handle: account.handle,\n icon: {\n url: account.avatarUrl\n }\n },\n isFollowing: account.isFollowing\n }));\n }\n return [];\n }) ?? [];\n\n return (\n <ActorList\n actors={actors}\n fetchNextPage={fetchNextPage}\n hasNextPage={hasNextPage!}\n isFetchingNextPage={isFetchingNextPage}\n isLoading={isLoading}\n noResultsMessage={`${handle || 'You'} have no followers yet`}\n />\n );\n};\n\nconst Profile: React.FC<ProfileProps> = ({}) => {\n const params = useParams();\n\n const {data: account, isLoading: isLoadingAccount, error: accountError, refetch} = useAccountForUser('index', (params.handle || 'me'));\n\n useEffect(() => {\n refetch();\n }, [params.handle, refetch]);\n\n if (accountError && isApiError(accountError) && accountError.statusCode !== 404) {\n return <AppError errorCode={accountError.code} statusCode={accountError.statusCode} />;\n }\n\n const customFields = Object.keys(account?.customFields || {}).map((key) => {\n return {\n name: key,\n value: account!.customFields[key]\n };\n }) || [];\n\n const postsTab = <PostsTab handle={params.handle || ''} />;\n const likesTab = <LikesTab />;\n const followingTab = <FollowingTab handle={params.handle || ''} />;\n const followersTab = <FollowersTab handle={params.handle || ''} />;\n\n return <ProfilePage\n account={account!}\n customFields={customFields}\n followersTab={followersTab}\n followingTab={followingTab}\n isLoadingAccount={isLoadingAccount}\n likesTab={likesTab}\n postsTab={postsTab}\n />;\n};\n\nexport default Profile;\n"],"names":["__iconNode","Pencil","createLucideIcon","UserRoundX","getName","actor","ActorList","noResultsMessage","actors","isLoading","fetchNextPage","hasNextPage","isFetchingNextPage","currentAccountQuery","useAccountForUser","currentUser","observerRef","useRef","loadMoreRef","useEffect","entries","navigate","useNavigateWithBasePath","jsxs","NoValueLabel","jsx","NoValueLabelIcon","LucideIcon.UserRoundPlus","isFollowing","blockedByMe","domainBlockedByMe","actorHandle","getUsername","isCurrentUser","React","ProfilePreviewHoverCard","ActivityItem","handleProfileClick","APAvatar","Button","FollowButton","LoadingIndicator","Likes","posts","endLoadMoreRef","loadMoreIndex","Fragment","LucideIcon.Heart","activity","index","FeedItem","Separator","Posts","LucideIcon.Pencil","UnblockDialog","handle","isUserBlocked","isDomainBlocked","onUnblockUser","onUnblockDomain","trigger","onUnblockComplete","externalIsOpen","externalOnOpenChange","internalDialogOpen","setInternalDialogOpen","useState","dialogState","setDialogState","bothBlocked","userOnlyBlocked","domainOnlyBlocked","mode","isControlled","dialogOpen","wasOpened","setWasOpened","initializeDialogState","useCallback","prev","handleDialogOpen","handleDialogClose","open","handleUnblock","toast","handleDomainUnblock","domain","renderDualView","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","H4","LucideIcon.User","LucideIcon.Globe","AlertDialogFooter","renderSingleView","isUserBlock","AlertDialogCancel","AlertDialog","AlertDialogTrigger","AlertDialogContent","ProfileMenu","account","children","onCopyHandle","onBlockAccount","onBlockDomain","disabled","isBlocked","dialogType","setDialogType","setDialogOpen","handleCopyHandleClick","e","handleBlockAccountClick","handleBlockDomainClick","renderBlockView","AlertDialogAction","buttonVariants","renderUnblockView","Popover","PopoverTrigger","PopoverContent","PopoverClose","UnblockButton","onUnblock","onDomainUnblock","className","isHovered","setIsHovered","noop","ProfilePage","customFields","isLoadingAccount","postsTab","likesTab","followingTab","followersTab","params","useParams","location","useLocation","canGoBack","useNavigationStack","profilePath","likesEnabled","tabSlug","allowedTabs","useMemo","activeTab","blockMutation","useBlockMutationForUser","unblockMutation","useUnblockMutationForUser","blockDomainMutation","useBlockDomainMutationForUser","unblockDomainMutation","useUnblockDomainMutationForUser","viewBlockedPosts","setViewBlockedPosts","copied","setCopied","copyTimeoutRef","handleBlock","handleDomainBlock","handleCopy","_a","isExpanded","setisExpanded","isEditingProfile","setIsEditingProfile","toggleExpand","contentRef","isOverflowing","setIsOverflowing","createTabPath","tab","handleTabChange","Layout","EmptyViewIndicator","EmptyViewIcon","LucideIcon.UserRoundX","Skeleton","LucideIcon.Ellipsis","Dialog","DialogTrigger","SettingAction","DialogContent","DialogHeader","DialogTitle","EditProfile","H2","LucideIcon.Check","LucideIcon.Copy","Badge","sanitizeHtml","openLinksInNewTab","stripHtml","attachment","Tabs","value","TabsList","TabsTrigger","TabsTriggerCount","abbreviateNumber","TabsContent","LucideIcon.Ban","PostsTab","postsByAccountQuery","usePostsByAccount","data","page","_","LikesTab","postsLikedByAccountQuery","usePostsLikedByAccount","FollowingTab","accountQuery","useAccountFollowsForUser","FollowersTab","Profile","accountError","refetch","isApiError","AppError","key"],"mappings":"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","x_google_ignoreList":[0,1]}
|