aboutsummaryrefslogtreecommitdiffstats
path: root/src/utils/hooks/use-comments.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/hooks/use-comments.tsx')
-rw-r--r--src/utils/hooks/use-comments.tsx33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/utils/hooks/use-comments.tsx b/src/utils/hooks/use-comments.tsx
new file mode 100644
index 0000000..cc9e560
--- /dev/null
+++ b/src/utils/hooks/use-comments.tsx
@@ -0,0 +1,33 @@
+import { fetchAPI, getAPIUrl } from '@services/graphql/api';
+import {
+ buildCommentsTree,
+ getCommentFromRawData,
+} from '@services/graphql/comments';
+import { commentsQuery } from '@services/graphql/comments.query';
+import { Comment } from '@ts/types/app';
+import { RawComment } from '@ts/types/raw-data';
+import useSWR from 'swr';
+
+/**
+ * Retrieve the comments of a page/article.
+ * @param contentId - A page/article id.
+ * @returns {Comment[]|undefined}
+ */
+const useComments = (
+ contentId: string | number,
+ fallback?: Comment[]
+): Comment[] | undefined => {
+ const { data } = useSWR(
+ { api: getAPIUrl(), query: commentsQuery, variables: { contentId } },
+ fetchAPI<RawComment, typeof commentsQuery>,
+ { fallback }
+ );
+
+ const comments = data?.comments.nodes.map((comment) =>
+ getCommentFromRawData(comment)
+ );
+
+ return comments ? buildCommentsTree(comments) : undefined;
+};
+
+export default useComments;