refactor(community): extract comment store and post/comment API adapters
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
import { create } from "zustand"
|
||||
import { generateId } from "@/lib/id"
|
||||
import { mockComments } from "@/lib/mock"
|
||||
import type { Comment, User } from "@/lib/types"
|
||||
|
||||
interface CommentState {
|
||||
comments: Comment[]
|
||||
addComment: (postId: string, author: User, content: string) => Comment | null
|
||||
toggleCommentLike: (commentId: string) => void
|
||||
}
|
||||
|
||||
export const useCommentStore = create<CommentState>((set) => ({
|
||||
comments: mockComments,
|
||||
addComment: (postId, author, content) => {
|
||||
const normalizedContent = content.trim()
|
||||
if (!normalizedContent) return null
|
||||
|
||||
const comment: Comment = {
|
||||
id: generateId("comment"),
|
||||
postId,
|
||||
author,
|
||||
content: normalizedContent,
|
||||
likeCount: 0,
|
||||
liked: false,
|
||||
createdAt: new Date().toISOString(),
|
||||
}
|
||||
|
||||
set((state) => ({
|
||||
comments: [...state.comments, comment],
|
||||
}))
|
||||
|
||||
return comment
|
||||
},
|
||||
toggleCommentLike: (commentId) => {
|
||||
set((state) => ({
|
||||
comments: state.comments.map((comment) => {
|
||||
if (comment.id !== commentId) return comment
|
||||
const liked = !comment.liked
|
||||
return {
|
||||
...comment,
|
||||
liked,
|
||||
likeCount: liked ? comment.likeCount + 1 : Math.max(0, comment.likeCount - 1),
|
||||
}
|
||||
}),
|
||||
}))
|
||||
},
|
||||
}))
|
||||
Reference in New Issue
Block a user