@btst/stack 2.7.0 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/packages/stack/src/plugins/blog/client/components/loading/post-navigation-skeleton.cjs +13 -0
- package/dist/packages/stack/src/plugins/blog/client/components/loading/post-navigation-skeleton.mjs +11 -0
- package/dist/packages/stack/src/plugins/blog/client/components/loading/recent-posts-carousel-skeleton.cjs +17 -0
- package/dist/packages/stack/src/plugins/blog/client/components/loading/recent-posts-carousel-skeleton.mjs +15 -0
- package/dist/packages/stack/src/plugins/blog/client/components/pages/post-page.internal.cjs +18 -7
- package/dist/packages/stack/src/plugins/blog/client/components/pages/post-page.internal.mjs +18 -7
- package/dist/packages/stack/src/plugins/blog/client/components/shared/post-navigation.cjs +48 -52
- package/dist/packages/stack/src/plugins/blog/client/components/shared/post-navigation.mjs +49 -53
- package/dist/packages/stack/src/plugins/blog/client/components/shared/recent-posts-carousel.cjs +34 -37
- package/dist/packages/stack/src/plugins/blog/client/components/shared/recent-posts-carousel.mjs +35 -38
- package/dist/packages/stack/src/plugins/blog/client/hooks/blog-hooks.cjs +4 -21
- package/dist/packages/stack/src/plugins/blog/client/hooks/blog-hooks.mjs +4 -21
- package/dist/packages/stack/src/plugins/comments/api/getters.cjs +284 -0
- package/dist/packages/stack/src/plugins/comments/api/getters.mjs +280 -0
- package/dist/packages/stack/src/plugins/comments/api/mutations.cjs +118 -0
- package/dist/packages/stack/src/plugins/comments/api/mutations.mjs +112 -0
- package/dist/packages/stack/src/plugins/comments/api/plugin.cjs +335 -0
- package/dist/packages/stack/src/plugins/comments/api/plugin.mjs +333 -0
- package/dist/packages/stack/src/plugins/comments/api/query-key-defs.cjs +60 -0
- package/dist/packages/stack/src/plugins/comments/api/query-key-defs.mjs +55 -0
- package/dist/packages/stack/src/plugins/comments/api/serializers.cjs +23 -0
- package/dist/packages/stack/src/plugins/comments/api/serializers.mjs +21 -0
- package/dist/packages/stack/src/plugins/comments/client/components/comment-count.cjs +46 -0
- package/dist/packages/stack/src/plugins/comments/client/components/comment-count.mjs +44 -0
- package/dist/packages/stack/src/plugins/comments/client/components/comment-form.cjs +86 -0
- package/dist/packages/stack/src/plugins/comments/client/components/comment-form.mjs +84 -0
- package/dist/packages/stack/src/plugins/comments/client/components/comment-thread.cjs +540 -0
- package/dist/packages/stack/src/plugins/comments/client/components/comment-thread.mjs +538 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/moderation-page.cjs +64 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/moderation-page.internal.cjs +426 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/moderation-page.internal.mjs +424 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/moderation-page.mjs +62 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/my-comments-page.cjs +66 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/my-comments-page.internal.cjs +256 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/my-comments-page.internal.mjs +254 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/my-comments-page.mjs +64 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/resource-comments-page.cjs +86 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/resource-comments-page.internal.cjs +191 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/resource-comments-page.internal.mjs +189 -0
- package/dist/packages/stack/src/plugins/comments/client/components/pages/resource-comments-page.mjs +84 -0
- package/dist/packages/stack/src/plugins/comments/client/components/shared/page-wrapper.cjs +27 -0
- package/dist/packages/stack/src/plugins/comments/client/components/shared/page-wrapper.mjs +25 -0
- package/dist/packages/stack/src/plugins/comments/client/components/shared/pagination.cjs +37 -0
- package/dist/packages/stack/src/plugins/comments/client/components/shared/pagination.mjs +35 -0
- package/dist/packages/stack/src/plugins/comments/client/hooks/use-comments.cjs +476 -0
- package/dist/packages/stack/src/plugins/comments/client/hooks/use-comments.mjs +464 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/comments-moderation.cjs +67 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/comments-moderation.mjs +65 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/comments-my.cjs +27 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/comments-my.mjs +25 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/comments-thread.cjs +30 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/comments-thread.mjs +28 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/index.cjs +13 -0
- package/dist/packages/stack/src/plugins/comments/client/localization/index.mjs +11 -0
- package/dist/packages/stack/src/plugins/comments/client/plugin.cjs +116 -0
- package/dist/packages/stack/src/plugins/comments/client/plugin.mjs +114 -0
- package/dist/packages/stack/src/plugins/comments/client/utils.cjs +41 -0
- package/dist/packages/stack/src/plugins/comments/client/utils.mjs +37 -0
- package/dist/packages/stack/src/plugins/comments/db.cjs +75 -0
- package/dist/packages/stack/src/plugins/comments/db.mjs +73 -0
- package/dist/packages/stack/src/plugins/comments/schemas.cjs +45 -0
- package/dist/packages/stack/src/plugins/comments/schemas.mjs +38 -0
- package/dist/packages/stack/src/plugins/kanban/client/components/forms/task-form.cjs +0 -1
- package/dist/packages/stack/src/plugins/kanban/client/components/forms/task-form.mjs +0 -1
- package/dist/packages/stack/src/plugins/kanban/client/components/pages/board-page.internal.cjs +39 -22
- package/dist/packages/stack/src/plugins/kanban/client/components/pages/board-page.internal.mjs +40 -23
- package/dist/packages/ui/src/components/avatar.mjs +1 -1
- package/dist/packages/ui/src/components/pagination-controls.cjs +64 -0
- package/dist/packages/ui/src/components/pagination-controls.mjs +62 -0
- package/dist/packages/ui/src/components/when-visible.cjs +39 -0
- package/dist/packages/ui/src/components/when-visible.mjs +37 -0
- package/dist/plugins/blog/client/hooks/index.d.cts +1 -1
- package/dist/plugins/blog/client/hooks/index.d.mts +1 -1
- package/dist/plugins/blog/client/hooks/index.d.ts +1 -1
- package/dist/plugins/blog/client/index.d.cts +24 -2
- package/dist/plugins/blog/client/index.d.mts +24 -2
- package/dist/plugins/blog/client/index.d.ts +24 -2
- package/dist/plugins/comments/api/index.cjs +21 -0
- package/dist/plugins/comments/api/index.d.cts +126 -0
- package/dist/plugins/comments/api/index.d.mts +126 -0
- package/dist/plugins/comments/api/index.d.ts +126 -0
- package/dist/plugins/comments/api/index.mjs +5 -0
- package/dist/plugins/comments/client/components/index.cjs +15 -0
- package/dist/plugins/comments/client/components/index.d.cts +125 -0
- package/dist/plugins/comments/client/components/index.d.mts +125 -0
- package/dist/plugins/comments/client/components/index.d.ts +125 -0
- package/dist/plugins/comments/client/components/index.mjs +5 -0
- package/dist/plugins/comments/client/hooks/index.cjs +17 -0
- package/dist/plugins/comments/client/hooks/index.d.cts +200 -0
- package/dist/plugins/comments/client/hooks/index.d.mts +200 -0
- package/dist/plugins/comments/client/hooks/index.d.ts +200 -0
- package/dist/plugins/comments/client/hooks/index.mjs +1 -0
- package/dist/plugins/comments/client/index.cjs +9 -0
- package/dist/plugins/comments/client/index.d.cts +262 -0
- package/dist/plugins/comments/client/index.d.mts +262 -0
- package/dist/plugins/comments/client/index.d.ts +262 -0
- package/dist/plugins/comments/client/index.mjs +2 -0
- package/dist/plugins/comments/client.css +2 -0
- package/dist/plugins/comments/query-keys.cjs +113 -0
- package/dist/plugins/comments/query-keys.d.cts +71 -0
- package/dist/plugins/comments/query-keys.d.mts +71 -0
- package/dist/plugins/comments/query-keys.d.ts +71 -0
- package/dist/plugins/comments/query-keys.mjs +111 -0
- package/dist/plugins/comments/style.css +15 -0
- package/dist/plugins/kanban/api/index.d.cts +1 -1
- package/dist/plugins/kanban/api/index.d.mts +1 -1
- package/dist/plugins/kanban/api/index.d.ts +1 -1
- package/dist/plugins/kanban/client/hooks/index.d.cts +1 -1
- package/dist/plugins/kanban/client/hooks/index.d.mts +1 -1
- package/dist/plugins/kanban/client/hooks/index.d.ts +1 -1
- package/dist/plugins/kanban/client/index.d.cts +1 -1
- package/dist/plugins/kanban/client/index.d.mts +1 -1
- package/dist/plugins/kanban/client/index.d.ts +1 -1
- package/dist/plugins/kanban/query-keys.d.cts +1 -1
- package/dist/plugins/kanban/query-keys.d.mts +1 -1
- package/dist/plugins/kanban/query-keys.d.ts +1 -1
- package/dist/shared/{stack.FeaWkglm.d.ts → stack.BxFl46lB.d.cts} +24 -1
- package/dist/shared/stack.C-b3Sn8j.d.cts +142 -0
- package/dist/shared/stack.C-b3Sn8j.d.mts +142 -0
- package/dist/shared/stack.C-b3Sn8j.d.ts +142 -0
- package/dist/shared/stack.CJE9sAjV.d.ts +335 -0
- package/dist/shared/stack.CmHRdhl8.d.cts +335 -0
- package/dist/shared/{stack.CNLHlv7r.d.mts → stack.DOZ1EXjM.d.mts} +6 -12
- package/dist/shared/{stack.FeaWkglm.d.mts → stack.DRpeDS6X.d.ts} +24 -1
- package/dist/shared/{stack.CQAZwXhV.d.cts → stack.DX-tQ93o.d.cts} +6 -12
- package/dist/shared/stack.Dcz6636A.d.mts +335 -0
- package/dist/shared/{stack.FeaWkglm.d.cts → stack.Jb0kQDJC.d.mts} +24 -1
- package/dist/shared/stack.Ldfkr5b2.d.cts +112 -0
- package/dist/shared/stack.Ldfkr5b2.d.mts +112 -0
- package/dist/shared/stack.Ldfkr5b2.d.ts +112 -0
- package/dist/shared/{stack.D3BsrpAz.d.ts → stack.VF6FhyZw.d.ts} +6 -12
- package/package.json +67 -2
- package/src/plugins/blog/client/components/loading/post-navigation-skeleton.tsx +10 -0
- package/src/plugins/blog/client/components/loading/recent-posts-carousel-skeleton.tsx +18 -0
- package/src/plugins/blog/client/components/pages/post-page.internal.tsx +23 -8
- package/src/plugins/blog/client/components/shared/post-navigation.tsx +0 -5
- package/src/plugins/blog/client/components/shared/recent-posts-carousel.tsx +1 -5
- package/src/plugins/blog/client/hooks/blog-hooks.tsx +8 -33
- package/src/plugins/blog/client/overrides.ts +26 -1
- package/src/plugins/cms/client/components/shared/pagination.tsx +14 -42
- package/src/plugins/comments/api/getters.ts +444 -0
- package/src/plugins/comments/api/index.ts +21 -0
- package/src/plugins/comments/api/mutations.ts +206 -0
- package/src/plugins/comments/api/plugin.ts +628 -0
- package/src/plugins/comments/api/query-key-defs.ts +143 -0
- package/src/plugins/comments/api/serializers.ts +37 -0
- package/src/plugins/comments/client/components/comment-count.tsx +66 -0
- package/src/plugins/comments/client/components/comment-form.tsx +112 -0
- package/src/plugins/comments/client/components/comment-thread.tsx +799 -0
- package/src/plugins/comments/client/components/index.tsx +11 -0
- package/src/plugins/comments/client/components/pages/moderation-page.internal.tsx +550 -0
- package/src/plugins/comments/client/components/pages/moderation-page.tsx +70 -0
- package/src/plugins/comments/client/components/pages/my-comments-page.internal.tsx +367 -0
- package/src/plugins/comments/client/components/pages/my-comments-page.tsx +72 -0
- package/src/plugins/comments/client/components/pages/resource-comments-page.internal.tsx +225 -0
- package/src/plugins/comments/client/components/pages/resource-comments-page.tsx +97 -0
- package/src/plugins/comments/client/components/shared/page-wrapper.tsx +32 -0
- package/src/plugins/comments/client/components/shared/pagination.tsx +44 -0
- package/src/plugins/comments/client/hooks/index.tsx +13 -0
- package/src/plugins/comments/client/hooks/use-comments.tsx +717 -0
- package/src/plugins/comments/client/index.ts +14 -0
- package/src/plugins/comments/client/localization/comments-moderation.ts +75 -0
- package/src/plugins/comments/client/localization/comments-my.ts +32 -0
- package/src/plugins/comments/client/localization/comments-thread.ts +32 -0
- package/src/plugins/comments/client/localization/index.ts +11 -0
- package/src/plugins/comments/client/overrides.ts +164 -0
- package/src/plugins/comments/client/plugin.tsx +195 -0
- package/src/plugins/comments/client/utils.ts +67 -0
- package/src/plugins/comments/client.css +2 -0
- package/src/plugins/comments/db.ts +77 -0
- package/src/plugins/comments/query-keys.ts +189 -0
- package/src/plugins/comments/schemas.ts +72 -0
- package/src/plugins/comments/style.css +15 -0
- package/src/plugins/comments/types.ts +73 -0
- package/src/plugins/kanban/client/components/forms/task-form.tsx +0 -1
- package/src/plugins/kanban/client/components/pages/board-page.internal.tsx +46 -27
- package/src/plugins/kanban/client/overrides.ts +27 -1
- package/dist/shared/{stack.Rtcvl8sS.d.cts → stack.BOokfhZD.d.cts} +3 -3
- package/dist/shared/{stack.D4Cea8II.d.ts → stack.BvCR4-9H.d.ts} +3 -3
- package/dist/shared/{stack.HE_IvqV5.d.mts → stack.CWxAl9K3.d.mts} +3 -3
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { a as CommentListParamsSchema, b as CommentCountQuerySchema } from '../../../shared/stack.CmHRdhl8.cjs';
|
|
2
|
+
export { d as CommentsApiContext, C as CommentsApiRouter, e as CommentsBackendOptions, c as commentsBackendPlugin } from '../../../shared/stack.CmHRdhl8.cjs';
|
|
3
|
+
import { DBAdapter } from '@btst/db';
|
|
4
|
+
import { C as CommentListResult, S as SerializedComment, d as Comment } from '../../../shared/stack.C-b3Sn8j.cjs';
|
|
5
|
+
export { e as COMMENTS_QUERY_KEYS } from '../../../shared/stack.C-b3Sn8j.cjs';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import '@btst/stack/plugins/api';
|
|
8
|
+
import 'better-call';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* List comments for a resource, optionally filtered by status and parentId.
|
|
12
|
+
* Server-side resolves author display info and like status.
|
|
13
|
+
*
|
|
14
|
+
* When `status` is "approved" (default) and `currentUserId` is provided, the
|
|
15
|
+
* result also includes the current user's own pending comments so they remain
|
|
16
|
+
* visible after a page refresh without requiring admin access.
|
|
17
|
+
*
|
|
18
|
+
* Pure DB function — no hooks, no HTTP context. Safe for server-side use.
|
|
19
|
+
*
|
|
20
|
+
* @param adapter - The database adapter
|
|
21
|
+
* @param params - Filter/pagination parameters
|
|
22
|
+
* @param resolveUser - Optional consumer hook to resolve author display info
|
|
23
|
+
*/
|
|
24
|
+
declare function listComments(adapter: DBAdapter, params: z.infer<typeof CommentListParamsSchema>, resolveUser?: (authorId: string) => Promise<{
|
|
25
|
+
name: string;
|
|
26
|
+
avatarUrl?: string;
|
|
27
|
+
} | null>): Promise<CommentListResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Get a single comment by ID, enriched with author info.
|
|
30
|
+
* Returns null if not found.
|
|
31
|
+
*
|
|
32
|
+
* Pure DB function — no hooks, no HTTP context.
|
|
33
|
+
*/
|
|
34
|
+
declare function getCommentById(adapter: DBAdapter, id: string, resolveUser?: (authorId: string) => Promise<{
|
|
35
|
+
name: string;
|
|
36
|
+
avatarUrl?: string;
|
|
37
|
+
} | null>, currentUserId?: string): Promise<SerializedComment | null>;
|
|
38
|
+
/**
|
|
39
|
+
* Count comments for a resource, optionally filtered by status.
|
|
40
|
+
*
|
|
41
|
+
* Pure DB function — no hooks, no HTTP context.
|
|
42
|
+
*/
|
|
43
|
+
declare function getCommentCount(adapter: DBAdapter, params: z.infer<typeof CommentCountQuerySchema>): Promise<number>;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Input for creating a new comment.
|
|
47
|
+
*/
|
|
48
|
+
interface CreateCommentInput {
|
|
49
|
+
resourceId: string;
|
|
50
|
+
resourceType: string;
|
|
51
|
+
parentId?: string | null;
|
|
52
|
+
authorId: string;
|
|
53
|
+
body: string;
|
|
54
|
+
status?: "pending" | "approved" | "spam";
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create a new comment.
|
|
58
|
+
*
|
|
59
|
+
* @remarks **Security:** No authorization hooks are called. The caller is
|
|
60
|
+
* responsible for any access-control checks (e.g., onBeforePost) before
|
|
61
|
+
* invoking this function.
|
|
62
|
+
*/
|
|
63
|
+
declare function createComment(adapter: DBAdapter, input: CreateCommentInput): Promise<Comment>;
|
|
64
|
+
/**
|
|
65
|
+
* Update the body of an existing comment and set editedAt.
|
|
66
|
+
*
|
|
67
|
+
* @remarks **Security:** No authorization hooks are called. The caller is
|
|
68
|
+
* responsible for ensuring the requesting user owns the comment (onBeforeEdit).
|
|
69
|
+
*/
|
|
70
|
+
declare function updateComment(adapter: DBAdapter, id: string, body: string): Promise<Comment | null>;
|
|
71
|
+
/**
|
|
72
|
+
* Update the status of a comment (approve, reject, spam).
|
|
73
|
+
*
|
|
74
|
+
* @remarks **Security:** No authorization hooks are called. Callers should
|
|
75
|
+
* ensure the requesting user has moderation privileges.
|
|
76
|
+
*/
|
|
77
|
+
declare function updateCommentStatus(adapter: DBAdapter, id: string, status: "pending" | "approved" | "spam"): Promise<Comment | null>;
|
|
78
|
+
/**
|
|
79
|
+
* Delete a comment by ID, cascading to any child replies.
|
|
80
|
+
*
|
|
81
|
+
* Replies reference the parent via `parentId`. Because the schema declares no
|
|
82
|
+
* DB-level cascade on `comment.parentId`, orphaned replies must be removed here
|
|
83
|
+
* in the application layer. `commentLike` rows are covered by the FK cascade
|
|
84
|
+
* on `commentLike.commentId` (declared in `db.ts`).
|
|
85
|
+
*
|
|
86
|
+
* Comments are only one level deep (the UI prevents replying to replies), so a
|
|
87
|
+
* single-level cascade is sufficient — no recursive walk is needed.
|
|
88
|
+
*
|
|
89
|
+
* @remarks **Security:** No authorization hooks are called. Callers should
|
|
90
|
+
* ensure the requesting user has permission to delete this comment.
|
|
91
|
+
*/
|
|
92
|
+
declare function deleteComment(adapter: DBAdapter, id: string): Promise<boolean>;
|
|
93
|
+
/**
|
|
94
|
+
* Toggle a like on a comment for a given authorId.
|
|
95
|
+
* - If the user has not liked the comment: creates a commentLike row and increments the likes counter.
|
|
96
|
+
* - If the user has already liked the comment: deletes the commentLike row and decrements the likes counter.
|
|
97
|
+
* Returns the updated likes count.
|
|
98
|
+
*
|
|
99
|
+
* All reads and writes are performed inside a single transaction to prevent
|
|
100
|
+
* concurrent requests from causing counter drift or duplicate like rows.
|
|
101
|
+
*
|
|
102
|
+
* @remarks **Security:** No authorization hooks are called. The caller is
|
|
103
|
+
* responsible for ensuring the requesting user is authenticated (authorId is valid).
|
|
104
|
+
*/
|
|
105
|
+
declare function toggleCommentLike(adapter: DBAdapter, commentId: string, authorId: string): Promise<{
|
|
106
|
+
likes: number;
|
|
107
|
+
isLiked: boolean;
|
|
108
|
+
}>;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Serialize a raw Comment DB record into a SerializedComment for SSG/setQueryData.
|
|
112
|
+
* Note: resolvedAuthorName, resolvedAvatarUrl, and isLikedByCurrentUser are not
|
|
113
|
+
* available from the DB record alone — use getters.ts enrichment for those.
|
|
114
|
+
* This serializer is for cases where you already have a SerializedComment from
|
|
115
|
+
* the HTTP layer and just need a type-safe round-trip.
|
|
116
|
+
*
|
|
117
|
+
* Pure function — no DB access, no hooks.
|
|
118
|
+
*/
|
|
119
|
+
declare function serializeComment(comment: Comment): Omit<SerializedComment, "resolvedAuthorName" | "resolvedAvatarUrl" | "isLikedByCurrentUser"> & {
|
|
120
|
+
resolvedAuthorName: string;
|
|
121
|
+
resolvedAvatarUrl: null;
|
|
122
|
+
isLikedByCurrentUser: false;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
export { createComment, deleteComment, getCommentById, getCommentCount, listComments, serializeComment, toggleCommentLike, updateComment, updateCommentStatus };
|
|
126
|
+
export type { CreateCommentInput };
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { a as CommentListParamsSchema, b as CommentCountQuerySchema } from '../../../shared/stack.Dcz6636A.mjs';
|
|
2
|
+
export { d as CommentsApiContext, C as CommentsApiRouter, e as CommentsBackendOptions, c as commentsBackendPlugin } from '../../../shared/stack.Dcz6636A.mjs';
|
|
3
|
+
import { DBAdapter } from '@btst/db';
|
|
4
|
+
import { C as CommentListResult, S as SerializedComment, d as Comment } from '../../../shared/stack.C-b3Sn8j.mjs';
|
|
5
|
+
export { e as COMMENTS_QUERY_KEYS } from '../../../shared/stack.C-b3Sn8j.mjs';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import '@btst/stack/plugins/api';
|
|
8
|
+
import 'better-call';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* List comments for a resource, optionally filtered by status and parentId.
|
|
12
|
+
* Server-side resolves author display info and like status.
|
|
13
|
+
*
|
|
14
|
+
* When `status` is "approved" (default) and `currentUserId` is provided, the
|
|
15
|
+
* result also includes the current user's own pending comments so they remain
|
|
16
|
+
* visible after a page refresh without requiring admin access.
|
|
17
|
+
*
|
|
18
|
+
* Pure DB function — no hooks, no HTTP context. Safe for server-side use.
|
|
19
|
+
*
|
|
20
|
+
* @param adapter - The database adapter
|
|
21
|
+
* @param params - Filter/pagination parameters
|
|
22
|
+
* @param resolveUser - Optional consumer hook to resolve author display info
|
|
23
|
+
*/
|
|
24
|
+
declare function listComments(adapter: DBAdapter, params: z.infer<typeof CommentListParamsSchema>, resolveUser?: (authorId: string) => Promise<{
|
|
25
|
+
name: string;
|
|
26
|
+
avatarUrl?: string;
|
|
27
|
+
} | null>): Promise<CommentListResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Get a single comment by ID, enriched with author info.
|
|
30
|
+
* Returns null if not found.
|
|
31
|
+
*
|
|
32
|
+
* Pure DB function — no hooks, no HTTP context.
|
|
33
|
+
*/
|
|
34
|
+
declare function getCommentById(adapter: DBAdapter, id: string, resolveUser?: (authorId: string) => Promise<{
|
|
35
|
+
name: string;
|
|
36
|
+
avatarUrl?: string;
|
|
37
|
+
} | null>, currentUserId?: string): Promise<SerializedComment | null>;
|
|
38
|
+
/**
|
|
39
|
+
* Count comments for a resource, optionally filtered by status.
|
|
40
|
+
*
|
|
41
|
+
* Pure DB function — no hooks, no HTTP context.
|
|
42
|
+
*/
|
|
43
|
+
declare function getCommentCount(adapter: DBAdapter, params: z.infer<typeof CommentCountQuerySchema>): Promise<number>;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Input for creating a new comment.
|
|
47
|
+
*/
|
|
48
|
+
interface CreateCommentInput {
|
|
49
|
+
resourceId: string;
|
|
50
|
+
resourceType: string;
|
|
51
|
+
parentId?: string | null;
|
|
52
|
+
authorId: string;
|
|
53
|
+
body: string;
|
|
54
|
+
status?: "pending" | "approved" | "spam";
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create a new comment.
|
|
58
|
+
*
|
|
59
|
+
* @remarks **Security:** No authorization hooks are called. The caller is
|
|
60
|
+
* responsible for any access-control checks (e.g., onBeforePost) before
|
|
61
|
+
* invoking this function.
|
|
62
|
+
*/
|
|
63
|
+
declare function createComment(adapter: DBAdapter, input: CreateCommentInput): Promise<Comment>;
|
|
64
|
+
/**
|
|
65
|
+
* Update the body of an existing comment and set editedAt.
|
|
66
|
+
*
|
|
67
|
+
* @remarks **Security:** No authorization hooks are called. The caller is
|
|
68
|
+
* responsible for ensuring the requesting user owns the comment (onBeforeEdit).
|
|
69
|
+
*/
|
|
70
|
+
declare function updateComment(adapter: DBAdapter, id: string, body: string): Promise<Comment | null>;
|
|
71
|
+
/**
|
|
72
|
+
* Update the status of a comment (approve, reject, spam).
|
|
73
|
+
*
|
|
74
|
+
* @remarks **Security:** No authorization hooks are called. Callers should
|
|
75
|
+
* ensure the requesting user has moderation privileges.
|
|
76
|
+
*/
|
|
77
|
+
declare function updateCommentStatus(adapter: DBAdapter, id: string, status: "pending" | "approved" | "spam"): Promise<Comment | null>;
|
|
78
|
+
/**
|
|
79
|
+
* Delete a comment by ID, cascading to any child replies.
|
|
80
|
+
*
|
|
81
|
+
* Replies reference the parent via `parentId`. Because the schema declares no
|
|
82
|
+
* DB-level cascade on `comment.parentId`, orphaned replies must be removed here
|
|
83
|
+
* in the application layer. `commentLike` rows are covered by the FK cascade
|
|
84
|
+
* on `commentLike.commentId` (declared in `db.ts`).
|
|
85
|
+
*
|
|
86
|
+
* Comments are only one level deep (the UI prevents replying to replies), so a
|
|
87
|
+
* single-level cascade is sufficient — no recursive walk is needed.
|
|
88
|
+
*
|
|
89
|
+
* @remarks **Security:** No authorization hooks are called. Callers should
|
|
90
|
+
* ensure the requesting user has permission to delete this comment.
|
|
91
|
+
*/
|
|
92
|
+
declare function deleteComment(adapter: DBAdapter, id: string): Promise<boolean>;
|
|
93
|
+
/**
|
|
94
|
+
* Toggle a like on a comment for a given authorId.
|
|
95
|
+
* - If the user has not liked the comment: creates a commentLike row and increments the likes counter.
|
|
96
|
+
* - If the user has already liked the comment: deletes the commentLike row and decrements the likes counter.
|
|
97
|
+
* Returns the updated likes count.
|
|
98
|
+
*
|
|
99
|
+
* All reads and writes are performed inside a single transaction to prevent
|
|
100
|
+
* concurrent requests from causing counter drift or duplicate like rows.
|
|
101
|
+
*
|
|
102
|
+
* @remarks **Security:** No authorization hooks are called. The caller is
|
|
103
|
+
* responsible for ensuring the requesting user is authenticated (authorId is valid).
|
|
104
|
+
*/
|
|
105
|
+
declare function toggleCommentLike(adapter: DBAdapter, commentId: string, authorId: string): Promise<{
|
|
106
|
+
likes: number;
|
|
107
|
+
isLiked: boolean;
|
|
108
|
+
}>;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Serialize a raw Comment DB record into a SerializedComment for SSG/setQueryData.
|
|
112
|
+
* Note: resolvedAuthorName, resolvedAvatarUrl, and isLikedByCurrentUser are not
|
|
113
|
+
* available from the DB record alone — use getters.ts enrichment for those.
|
|
114
|
+
* This serializer is for cases where you already have a SerializedComment from
|
|
115
|
+
* the HTTP layer and just need a type-safe round-trip.
|
|
116
|
+
*
|
|
117
|
+
* Pure function — no DB access, no hooks.
|
|
118
|
+
*/
|
|
119
|
+
declare function serializeComment(comment: Comment): Omit<SerializedComment, "resolvedAuthorName" | "resolvedAvatarUrl" | "isLikedByCurrentUser"> & {
|
|
120
|
+
resolvedAuthorName: string;
|
|
121
|
+
resolvedAvatarUrl: null;
|
|
122
|
+
isLikedByCurrentUser: false;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
export { createComment, deleteComment, getCommentById, getCommentCount, listComments, serializeComment, toggleCommentLike, updateComment, updateCommentStatus };
|
|
126
|
+
export type { CreateCommentInput };
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { a as CommentListParamsSchema, b as CommentCountQuerySchema } from '../../../shared/stack.CJE9sAjV.js';
|
|
2
|
+
export { d as CommentsApiContext, C as CommentsApiRouter, e as CommentsBackendOptions, c as commentsBackendPlugin } from '../../../shared/stack.CJE9sAjV.js';
|
|
3
|
+
import { DBAdapter } from '@btst/db';
|
|
4
|
+
import { C as CommentListResult, S as SerializedComment, d as Comment } from '../../../shared/stack.C-b3Sn8j.js';
|
|
5
|
+
export { e as COMMENTS_QUERY_KEYS } from '../../../shared/stack.C-b3Sn8j.js';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import '@btst/stack/plugins/api';
|
|
8
|
+
import 'better-call';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* List comments for a resource, optionally filtered by status and parentId.
|
|
12
|
+
* Server-side resolves author display info and like status.
|
|
13
|
+
*
|
|
14
|
+
* When `status` is "approved" (default) and `currentUserId` is provided, the
|
|
15
|
+
* result also includes the current user's own pending comments so they remain
|
|
16
|
+
* visible after a page refresh without requiring admin access.
|
|
17
|
+
*
|
|
18
|
+
* Pure DB function — no hooks, no HTTP context. Safe for server-side use.
|
|
19
|
+
*
|
|
20
|
+
* @param adapter - The database adapter
|
|
21
|
+
* @param params - Filter/pagination parameters
|
|
22
|
+
* @param resolveUser - Optional consumer hook to resolve author display info
|
|
23
|
+
*/
|
|
24
|
+
declare function listComments(adapter: DBAdapter, params: z.infer<typeof CommentListParamsSchema>, resolveUser?: (authorId: string) => Promise<{
|
|
25
|
+
name: string;
|
|
26
|
+
avatarUrl?: string;
|
|
27
|
+
} | null>): Promise<CommentListResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Get a single comment by ID, enriched with author info.
|
|
30
|
+
* Returns null if not found.
|
|
31
|
+
*
|
|
32
|
+
* Pure DB function — no hooks, no HTTP context.
|
|
33
|
+
*/
|
|
34
|
+
declare function getCommentById(adapter: DBAdapter, id: string, resolveUser?: (authorId: string) => Promise<{
|
|
35
|
+
name: string;
|
|
36
|
+
avatarUrl?: string;
|
|
37
|
+
} | null>, currentUserId?: string): Promise<SerializedComment | null>;
|
|
38
|
+
/**
|
|
39
|
+
* Count comments for a resource, optionally filtered by status.
|
|
40
|
+
*
|
|
41
|
+
* Pure DB function — no hooks, no HTTP context.
|
|
42
|
+
*/
|
|
43
|
+
declare function getCommentCount(adapter: DBAdapter, params: z.infer<typeof CommentCountQuerySchema>): Promise<number>;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Input for creating a new comment.
|
|
47
|
+
*/
|
|
48
|
+
interface CreateCommentInput {
|
|
49
|
+
resourceId: string;
|
|
50
|
+
resourceType: string;
|
|
51
|
+
parentId?: string | null;
|
|
52
|
+
authorId: string;
|
|
53
|
+
body: string;
|
|
54
|
+
status?: "pending" | "approved" | "spam";
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create a new comment.
|
|
58
|
+
*
|
|
59
|
+
* @remarks **Security:** No authorization hooks are called. The caller is
|
|
60
|
+
* responsible for any access-control checks (e.g., onBeforePost) before
|
|
61
|
+
* invoking this function.
|
|
62
|
+
*/
|
|
63
|
+
declare function createComment(adapter: DBAdapter, input: CreateCommentInput): Promise<Comment>;
|
|
64
|
+
/**
|
|
65
|
+
* Update the body of an existing comment and set editedAt.
|
|
66
|
+
*
|
|
67
|
+
* @remarks **Security:** No authorization hooks are called. The caller is
|
|
68
|
+
* responsible for ensuring the requesting user owns the comment (onBeforeEdit).
|
|
69
|
+
*/
|
|
70
|
+
declare function updateComment(adapter: DBAdapter, id: string, body: string): Promise<Comment | null>;
|
|
71
|
+
/**
|
|
72
|
+
* Update the status of a comment (approve, reject, spam).
|
|
73
|
+
*
|
|
74
|
+
* @remarks **Security:** No authorization hooks are called. Callers should
|
|
75
|
+
* ensure the requesting user has moderation privileges.
|
|
76
|
+
*/
|
|
77
|
+
declare function updateCommentStatus(adapter: DBAdapter, id: string, status: "pending" | "approved" | "spam"): Promise<Comment | null>;
|
|
78
|
+
/**
|
|
79
|
+
* Delete a comment by ID, cascading to any child replies.
|
|
80
|
+
*
|
|
81
|
+
* Replies reference the parent via `parentId`. Because the schema declares no
|
|
82
|
+
* DB-level cascade on `comment.parentId`, orphaned replies must be removed here
|
|
83
|
+
* in the application layer. `commentLike` rows are covered by the FK cascade
|
|
84
|
+
* on `commentLike.commentId` (declared in `db.ts`).
|
|
85
|
+
*
|
|
86
|
+
* Comments are only one level deep (the UI prevents replying to replies), so a
|
|
87
|
+
* single-level cascade is sufficient — no recursive walk is needed.
|
|
88
|
+
*
|
|
89
|
+
* @remarks **Security:** No authorization hooks are called. Callers should
|
|
90
|
+
* ensure the requesting user has permission to delete this comment.
|
|
91
|
+
*/
|
|
92
|
+
declare function deleteComment(adapter: DBAdapter, id: string): Promise<boolean>;
|
|
93
|
+
/**
|
|
94
|
+
* Toggle a like on a comment for a given authorId.
|
|
95
|
+
* - If the user has not liked the comment: creates a commentLike row and increments the likes counter.
|
|
96
|
+
* - If the user has already liked the comment: deletes the commentLike row and decrements the likes counter.
|
|
97
|
+
* Returns the updated likes count.
|
|
98
|
+
*
|
|
99
|
+
* All reads and writes are performed inside a single transaction to prevent
|
|
100
|
+
* concurrent requests from causing counter drift or duplicate like rows.
|
|
101
|
+
*
|
|
102
|
+
* @remarks **Security:** No authorization hooks are called. The caller is
|
|
103
|
+
* responsible for ensuring the requesting user is authenticated (authorId is valid).
|
|
104
|
+
*/
|
|
105
|
+
declare function toggleCommentLike(adapter: DBAdapter, commentId: string, authorId: string): Promise<{
|
|
106
|
+
likes: number;
|
|
107
|
+
isLiked: boolean;
|
|
108
|
+
}>;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Serialize a raw Comment DB record into a SerializedComment for SSG/setQueryData.
|
|
112
|
+
* Note: resolvedAuthorName, resolvedAvatarUrl, and isLikedByCurrentUser are not
|
|
113
|
+
* available from the DB record alone — use getters.ts enrichment for those.
|
|
114
|
+
* This serializer is for cases where you already have a SerializedComment from
|
|
115
|
+
* the HTTP layer and just need a type-safe round-trip.
|
|
116
|
+
*
|
|
117
|
+
* Pure function — no DB access, no hooks.
|
|
118
|
+
*/
|
|
119
|
+
declare function serializeComment(comment: Comment): Omit<SerializedComment, "resolvedAuthorName" | "resolvedAvatarUrl" | "isLikedByCurrentUser"> & {
|
|
120
|
+
resolvedAuthorName: string;
|
|
121
|
+
resolvedAvatarUrl: null;
|
|
122
|
+
isLikedByCurrentUser: false;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
export { createComment, deleteComment, getCommentById, getCommentCount, listComments, serializeComment, toggleCommentLike, updateComment, updateCommentStatus };
|
|
126
|
+
export type { CreateCommentInput };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { commentsBackendPlugin } from '../../../packages/stack/src/plugins/comments/api/plugin.mjs';
|
|
2
|
+
export { getCommentById, getCommentCount, listComments } from '../../../packages/stack/src/plugins/comments/api/getters.mjs';
|
|
3
|
+
export { createComment, deleteComment, toggleCommentLike, updateComment, updateCommentStatus } from '../../../packages/stack/src/plugins/comments/api/mutations.mjs';
|
|
4
|
+
export { serializeComment } from '../../../packages/stack/src/plugins/comments/api/serializers.mjs';
|
|
5
|
+
export { COMMENTS_QUERY_KEYS } from '../../../packages/stack/src/plugins/comments/api/query-key-defs.mjs';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const commentThread = require('../../../../packages/stack/src/plugins/comments/client/components/comment-thread.cjs');
|
|
4
|
+
const commentCount = require('../../../../packages/stack/src/plugins/comments/client/components/comment-count.cjs');
|
|
5
|
+
const commentForm = require('../../../../packages/stack/src/plugins/comments/client/components/comment-form.cjs');
|
|
6
|
+
const moderationPage = require('../../../../packages/stack/src/plugins/comments/client/components/pages/moderation-page.cjs');
|
|
7
|
+
const resourceCommentsPage = require('../../../../packages/stack/src/plugins/comments/client/components/pages/resource-comments-page.cjs');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
exports.CommentThread = commentThread.CommentThread;
|
|
12
|
+
exports.CommentCount = commentCount.CommentCount;
|
|
13
|
+
exports.CommentForm = commentForm.CommentForm;
|
|
14
|
+
exports.ModerationPageComponent = moderationPage.ModerationPageComponent;
|
|
15
|
+
exports.ResourceCommentsPageComponent = resourceCommentsPage.ResourceCommentsPageComponent;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ComponentType } from 'react';
|
|
3
|
+
import { C as CommentsLocalization } from '../../../../shared/stack.Ldfkr5b2.cjs';
|
|
4
|
+
|
|
5
|
+
/** Custom input component props */
|
|
6
|
+
interface CommentInputProps {
|
|
7
|
+
value: string;
|
|
8
|
+
onChange: (value: string) => void;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
placeholder?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Custom renderer component props */
|
|
13
|
+
interface CommentRendererProps {
|
|
14
|
+
body: string;
|
|
15
|
+
}
|
|
16
|
+
/** Override slot for custom input + renderer */
|
|
17
|
+
interface CommentComponents {
|
|
18
|
+
Input?: ComponentType<CommentInputProps>;
|
|
19
|
+
Renderer?: ComponentType<CommentRendererProps>;
|
|
20
|
+
}
|
|
21
|
+
interface CommentThreadProps {
|
|
22
|
+
/** The resource this thread is attached to (e.g. post slug, task ID) */
|
|
23
|
+
resourceId: string;
|
|
24
|
+
/** Discriminates resources across plugins (e.g. "blog-post", "kanban-task") */
|
|
25
|
+
resourceType: string;
|
|
26
|
+
/** Base URL for API calls */
|
|
27
|
+
apiBaseURL: string;
|
|
28
|
+
/** Path where the API is mounted */
|
|
29
|
+
apiBasePath: string;
|
|
30
|
+
/** Currently authenticated user ID. Omit for read-only / unauthenticated. */
|
|
31
|
+
currentUserId?: string;
|
|
32
|
+
/**
|
|
33
|
+
* URL to redirect unauthenticated users to.
|
|
34
|
+
* When provided and currentUserId is absent, shows a "Please login to comment" prompt.
|
|
35
|
+
*/
|
|
36
|
+
loginHref?: string;
|
|
37
|
+
/** Optional HTTP headers for API calls (e.g. forwarding cookies) */
|
|
38
|
+
headers?: HeadersInit;
|
|
39
|
+
/** Swap in custom Input / Renderer components */
|
|
40
|
+
components?: CommentComponents;
|
|
41
|
+
/** Optional className applied to the root wrapper */
|
|
42
|
+
className?: string;
|
|
43
|
+
/** Localization strings — defaults to English */
|
|
44
|
+
localization?: Partial<CommentsLocalization>;
|
|
45
|
+
/**
|
|
46
|
+
* Number of top-level comments to load per page.
|
|
47
|
+
* Clicking "Load more" fetches the next page. Default: 10.
|
|
48
|
+
*/
|
|
49
|
+
pageSize?: number;
|
|
50
|
+
/**
|
|
51
|
+
* When false, the comment form and reply buttons are hidden.
|
|
52
|
+
* Overrides the global `allowPosting` from `CommentsPluginOverrides`.
|
|
53
|
+
* Defaults to true.
|
|
54
|
+
*/
|
|
55
|
+
allowPosting?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* When false, the edit button is hidden on comment cards.
|
|
58
|
+
* Overrides the global `allowEditing` from `CommentsPluginOverrides`.
|
|
59
|
+
* Defaults to true.
|
|
60
|
+
*/
|
|
61
|
+
allowEditing?: boolean;
|
|
62
|
+
}
|
|
63
|
+
declare function CommentThread(props: CommentThreadProps): react_jsx_runtime.JSX.Element;
|
|
64
|
+
|
|
65
|
+
interface CommentCountProps {
|
|
66
|
+
resourceId: string;
|
|
67
|
+
resourceType: string;
|
|
68
|
+
/** Only count approved comments (default) */
|
|
69
|
+
status?: "pending" | "approved" | "spam";
|
|
70
|
+
apiBaseURL: string;
|
|
71
|
+
apiBasePath: string;
|
|
72
|
+
headers?: HeadersInit;
|
|
73
|
+
/** Optional className for the wrapper span */
|
|
74
|
+
className?: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Lightweight badge showing the comment count for a resource.
|
|
78
|
+
* Does not mount a full comment thread — suitable for post list cards.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```tsx
|
|
82
|
+
* <CommentCount
|
|
83
|
+
* resourceId={post.slug}
|
|
84
|
+
* resourceType="blog-post"
|
|
85
|
+
* apiBaseURL="https://example.com"
|
|
86
|
+
* apiBasePath="/api/data"
|
|
87
|
+
* />
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
declare function CommentCount({ resourceId, resourceType, status, apiBaseURL, apiBasePath, headers, className, }: CommentCountProps): react_jsx_runtime.JSX.Element;
|
|
91
|
+
|
|
92
|
+
interface CommentFormProps {
|
|
93
|
+
/** Current user's ID — required to post */
|
|
94
|
+
authorId: string;
|
|
95
|
+
/** Optional parent comment ID for replies */
|
|
96
|
+
parentId?: string | null;
|
|
97
|
+
/** Initial body value (for editing) */
|
|
98
|
+
initialBody?: string;
|
|
99
|
+
/** Label for the submit button */
|
|
100
|
+
submitLabel?: string;
|
|
101
|
+
/** Called when form is submitted */
|
|
102
|
+
onSubmit: (body: string) => Promise<void>;
|
|
103
|
+
/** Called when cancel is clicked (shows Cancel button when provided) */
|
|
104
|
+
onCancel?: () => void;
|
|
105
|
+
/** Custom input component — defaults to a plain Textarea */
|
|
106
|
+
InputComponent?: ComponentType<{
|
|
107
|
+
value: string;
|
|
108
|
+
onChange: (value: string) => void;
|
|
109
|
+
disabled?: boolean;
|
|
110
|
+
placeholder?: string;
|
|
111
|
+
}>;
|
|
112
|
+
/** Localization strings */
|
|
113
|
+
localization?: Partial<CommentsLocalization>;
|
|
114
|
+
}
|
|
115
|
+
declare function CommentForm({ authorId: _authorId, initialBody, submitLabel, onSubmit, onCancel, InputComponent, localization: localizationProp, }: CommentFormProps): react_jsx_runtime.JSX.Element;
|
|
116
|
+
|
|
117
|
+
declare function ModerationPageComponent(): react_jsx_runtime.JSX.Element;
|
|
118
|
+
|
|
119
|
+
declare function ResourceCommentsPageComponent({ resourceId, resourceType, }: {
|
|
120
|
+
resourceId: string;
|
|
121
|
+
resourceType: string;
|
|
122
|
+
}): react_jsx_runtime.JSX.Element;
|
|
123
|
+
|
|
124
|
+
export { CommentCount, CommentForm, CommentThread, ModerationPageComponent, ResourceCommentsPageComponent };
|
|
125
|
+
export type { CommentComponents, CommentCountProps, CommentFormProps, CommentInputProps, CommentRendererProps, CommentThreadProps };
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ComponentType } from 'react';
|
|
3
|
+
import { C as CommentsLocalization } from '../../../../shared/stack.Ldfkr5b2.mjs';
|
|
4
|
+
|
|
5
|
+
/** Custom input component props */
|
|
6
|
+
interface CommentInputProps {
|
|
7
|
+
value: string;
|
|
8
|
+
onChange: (value: string) => void;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
placeholder?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Custom renderer component props */
|
|
13
|
+
interface CommentRendererProps {
|
|
14
|
+
body: string;
|
|
15
|
+
}
|
|
16
|
+
/** Override slot for custom input + renderer */
|
|
17
|
+
interface CommentComponents {
|
|
18
|
+
Input?: ComponentType<CommentInputProps>;
|
|
19
|
+
Renderer?: ComponentType<CommentRendererProps>;
|
|
20
|
+
}
|
|
21
|
+
interface CommentThreadProps {
|
|
22
|
+
/** The resource this thread is attached to (e.g. post slug, task ID) */
|
|
23
|
+
resourceId: string;
|
|
24
|
+
/** Discriminates resources across plugins (e.g. "blog-post", "kanban-task") */
|
|
25
|
+
resourceType: string;
|
|
26
|
+
/** Base URL for API calls */
|
|
27
|
+
apiBaseURL: string;
|
|
28
|
+
/** Path where the API is mounted */
|
|
29
|
+
apiBasePath: string;
|
|
30
|
+
/** Currently authenticated user ID. Omit for read-only / unauthenticated. */
|
|
31
|
+
currentUserId?: string;
|
|
32
|
+
/**
|
|
33
|
+
* URL to redirect unauthenticated users to.
|
|
34
|
+
* When provided and currentUserId is absent, shows a "Please login to comment" prompt.
|
|
35
|
+
*/
|
|
36
|
+
loginHref?: string;
|
|
37
|
+
/** Optional HTTP headers for API calls (e.g. forwarding cookies) */
|
|
38
|
+
headers?: HeadersInit;
|
|
39
|
+
/** Swap in custom Input / Renderer components */
|
|
40
|
+
components?: CommentComponents;
|
|
41
|
+
/** Optional className applied to the root wrapper */
|
|
42
|
+
className?: string;
|
|
43
|
+
/** Localization strings — defaults to English */
|
|
44
|
+
localization?: Partial<CommentsLocalization>;
|
|
45
|
+
/**
|
|
46
|
+
* Number of top-level comments to load per page.
|
|
47
|
+
* Clicking "Load more" fetches the next page. Default: 10.
|
|
48
|
+
*/
|
|
49
|
+
pageSize?: number;
|
|
50
|
+
/**
|
|
51
|
+
* When false, the comment form and reply buttons are hidden.
|
|
52
|
+
* Overrides the global `allowPosting` from `CommentsPluginOverrides`.
|
|
53
|
+
* Defaults to true.
|
|
54
|
+
*/
|
|
55
|
+
allowPosting?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* When false, the edit button is hidden on comment cards.
|
|
58
|
+
* Overrides the global `allowEditing` from `CommentsPluginOverrides`.
|
|
59
|
+
* Defaults to true.
|
|
60
|
+
*/
|
|
61
|
+
allowEditing?: boolean;
|
|
62
|
+
}
|
|
63
|
+
declare function CommentThread(props: CommentThreadProps): react_jsx_runtime.JSX.Element;
|
|
64
|
+
|
|
65
|
+
interface CommentCountProps {
|
|
66
|
+
resourceId: string;
|
|
67
|
+
resourceType: string;
|
|
68
|
+
/** Only count approved comments (default) */
|
|
69
|
+
status?: "pending" | "approved" | "spam";
|
|
70
|
+
apiBaseURL: string;
|
|
71
|
+
apiBasePath: string;
|
|
72
|
+
headers?: HeadersInit;
|
|
73
|
+
/** Optional className for the wrapper span */
|
|
74
|
+
className?: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Lightweight badge showing the comment count for a resource.
|
|
78
|
+
* Does not mount a full comment thread — suitable for post list cards.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```tsx
|
|
82
|
+
* <CommentCount
|
|
83
|
+
* resourceId={post.slug}
|
|
84
|
+
* resourceType="blog-post"
|
|
85
|
+
* apiBaseURL="https://example.com"
|
|
86
|
+
* apiBasePath="/api/data"
|
|
87
|
+
* />
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
declare function CommentCount({ resourceId, resourceType, status, apiBaseURL, apiBasePath, headers, className, }: CommentCountProps): react_jsx_runtime.JSX.Element;
|
|
91
|
+
|
|
92
|
+
interface CommentFormProps {
|
|
93
|
+
/** Current user's ID — required to post */
|
|
94
|
+
authorId: string;
|
|
95
|
+
/** Optional parent comment ID for replies */
|
|
96
|
+
parentId?: string | null;
|
|
97
|
+
/** Initial body value (for editing) */
|
|
98
|
+
initialBody?: string;
|
|
99
|
+
/** Label for the submit button */
|
|
100
|
+
submitLabel?: string;
|
|
101
|
+
/** Called when form is submitted */
|
|
102
|
+
onSubmit: (body: string) => Promise<void>;
|
|
103
|
+
/** Called when cancel is clicked (shows Cancel button when provided) */
|
|
104
|
+
onCancel?: () => void;
|
|
105
|
+
/** Custom input component — defaults to a plain Textarea */
|
|
106
|
+
InputComponent?: ComponentType<{
|
|
107
|
+
value: string;
|
|
108
|
+
onChange: (value: string) => void;
|
|
109
|
+
disabled?: boolean;
|
|
110
|
+
placeholder?: string;
|
|
111
|
+
}>;
|
|
112
|
+
/** Localization strings */
|
|
113
|
+
localization?: Partial<CommentsLocalization>;
|
|
114
|
+
}
|
|
115
|
+
declare function CommentForm({ authorId: _authorId, initialBody, submitLabel, onSubmit, onCancel, InputComponent, localization: localizationProp, }: CommentFormProps): react_jsx_runtime.JSX.Element;
|
|
116
|
+
|
|
117
|
+
declare function ModerationPageComponent(): react_jsx_runtime.JSX.Element;
|
|
118
|
+
|
|
119
|
+
declare function ResourceCommentsPageComponent({ resourceId, resourceType, }: {
|
|
120
|
+
resourceId: string;
|
|
121
|
+
resourceType: string;
|
|
122
|
+
}): react_jsx_runtime.JSX.Element;
|
|
123
|
+
|
|
124
|
+
export { CommentCount, CommentForm, CommentThread, ModerationPageComponent, ResourceCommentsPageComponent };
|
|
125
|
+
export type { CommentComponents, CommentCountProps, CommentFormProps, CommentInputProps, CommentRendererProps, CommentThreadProps };
|