Get replies to a post (nested or flat)
Get replies to a post (nested or flat) in Bitsocial React Hooks. Usage, options, and examples.
import { useReplies, useComment, useAccountComment } from "@bitsocial/bitsocial-react-hooks";
// NOTE: recommended to use the same replies options for all depths, or will load slower
const useRepliesOptions = {
sortType: "best",
flat: false,
repliesPerPage: 20,
onlyIfCached: false,
accountComments: { newerThan: Infinity, append: false },
};
// accountComments keeps pending and published local replies visible while
// canonical replies propagate and deduplicates them by cid; explicitly purged
// replies are hidden after an exhausted feed refreshes past their timestamp
const Reply = ({ reply, updatedReply }) => {
const { replies, updatedReplies, bufferedReplies, hasMore, loadMore } = useReplies({
...useRepliesOptions,
comment: reply,
});
// updatedReply updates values in real time, reply does not
const score = (updatedReply?.upvoteCount || 0) - (updatedReply?.downvoteCount || 0);
// bufferedReplies updates in real time, can show new replies count in real time
const moreReplies =
hasMore && bufferedReplies?.length !== 0 ? `(${bufferedReplies.length} more replies)` : "";
// publishing states exist only on account comment
const accountReply = useAccountComment({ commentIndex: reply.index });
const state = accountReply?.state;
const publishingStateString = useStateString(accountReply);
return (
<div>
<div>
{score} {reply.author.address} {reply.timestamp} {moreReplies}
</div>
{state === "pending" && <div>PENDING ({publishingStateString})</div>}
{state === "failed" && <div>FAILED</div>}
<div>{reply.content}</div>
<div style={{ marginLeft: 4 }}>
{replies.map((reply, index) => (
<Reply
key={reply?.index || reply?.cid}
reply={reply}
updatedReply={updatedReplies[index]}
/>
))}
</div>
</div>
);
};
const comment = useComment({ commentCid });
const { replies, updatedReplies, hasMore, loadMore } = useReplies({
...useRepliesOptions,
comment,
});
const repliesComponents = replies.map((reply, index) => (
<Reply key={reply?.index || reply?.cid} reply={reply} updatedReply={updatedReplies[index]} />
));