Files
juwan-frontend/store/comments.ts
T

48 lines
1.2 KiB
TypeScript

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),
}
}),
}))
},
}))