47 lines
1.2 KiB
TypeScript
47 lines
1.2 KiB
TypeScript
import { generateId } from "@/lib/id"
|
|
import type { Comment, User } from "@/lib/types"
|
|
import { create } from "zustand"
|
|
|
|
interface CommentState {
|
|
comments: Comment[]
|
|
addComment: (postId: string, author: User, content: string) => Comment | null
|
|
toggleCommentLike: (commentId: string) => void
|
|
}
|
|
|
|
export const useCommentStore = create<CommentState>((set) => ({
|
|
comments: [],
|
|
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),
|
|
}
|
|
}),
|
|
}))
|
|
},
|
|
}))
|