Skip to content

Commit a99c397

Browse files
committed
refactor: 게시물 추가 기능 로직 캡슐화
1 parent 52f42cf commit a99c397

File tree

4 files changed

+36
-37
lines changed

4 files changed

+36
-37
lines changed

src/features/add-post/model/useAddPost.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1+
import { useSetAtom } from "jotai"
12
import { useMutation, useQueryClient } from "@tanstack/react-query"
23
import { addPostApi } from "../../../entities/posts/api"
4+
import { isAddPostModalOpenAtom } from "./atoms"
35

4-
export const useAddPost = (onSuccessCallback?: () => void) => {
6+
export const useAddPost = () => {
57
const queryClient = useQueryClient()
8+
const setIsAddPostModalOpen = useSetAtom(isAddPostModalOpenAtom)
69

710
return useMutation({
811
mutationFn: addPostApi,
912
onSuccess: () => {
1013
queryClient.invalidateQueries({ queryKey: ["posts"] })
11-
onSuccessCallback?.()
14+
setIsAddPostModalOpen(false)
1215
},
1316
onError: (error) => {
1417
console.error("게시물 추가 오류:", error)

src/features/add-post/ui/AddPostForm.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { useState } from "react"
22
import { Input, Textarea, Button } from "../../../shared/ui"
3+
import { useAddPost } from "../model/useAddPost"
34

4-
interface AddPostFormProps {
5-
onAddPost: () => void
6-
}
7-
8-
const AddPostForm = ({ onAddPost }: AddPostFormProps) => {
5+
const AddPostForm = () => {
96
const [newPost, setNewPost] = useState({ title: "", body: "", userId: 1 })
7+
const { mutate: addPost } = useAddPost()
8+
9+
const handleAddPost = () => {
10+
addPost(newPost)
11+
}
1012

1113
return (
1214
<div className="space-y-4">
@@ -27,7 +29,7 @@ const AddPostForm = ({ onAddPost }: AddPostFormProps) => {
2729
value={newPost.userId}
2830
onChange={(e) => setNewPost({ ...newPost, userId: Number(e.target.value) })}
2931
/>
30-
<Button onClick={onAddPost}>게시물 추가</Button>
32+
<Button onClick={handleAddPost}>게시물 추가</Button>
3133
</div>
3234
)
3335
}

src/pages/posts-manager/index.tsx

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,20 @@ import { useEffect, useState } from "react"
33
import { Plus } from "lucide-react"
44
import { useLocation, useNavigate } from "react-router-dom"
55
import { isAddPostModalOpenAtom } from "../../features/add-post/model/atoms"
6-
import { editingPostAtom, isEditPostModalOpenAtom } from "../../features/edit-post/model/atoms"
7-
import { isUserInfoModalOpenAtom, viewingUserIdAtom } from "../../features/user-management/model/atoms"
8-
import { detailPostAtom, isPostDetailModalOpenAtom } from "../../features/view-post-detail/model/atoms"
6+
import {
7+
editingPostAtom,
8+
isEditPostModalOpenAtom,
9+
} from "../../features/edit-post/model/atoms"
10+
import {
11+
isUserInfoModalOpenAtom,
12+
viewingUserIdAtom,
13+
} from "../../features/user-management/model/atoms"
14+
import {
15+
detailPostAtom,
16+
isPostDetailModalOpenAtom,
17+
} from "../../features/view-post-detail/model/atoms"
918
import { Button, Card, CardContent, CardHeader, CardTitle } from "../../shared/ui"
1019
import {
11-
addPostApi,
1220
deletePostApi,
1321
fetchPostsApi,
1422
PostDTO,
@@ -17,7 +25,11 @@ import {
1725
} from "../../entities/posts/api"
1826
import { fetchTagsApi } from "../../entities/tags/api"
1927
import { fetchUsersApi } from "../../entities/users/api"
20-
import { deleteCommentApi, fetchCommentsApi, likeCommentApi } from "../../entities/comments/api"
28+
import {
29+
deleteCommentApi,
30+
fetchCommentsApi,
31+
likeCommentApi,
32+
} from "../../entities/comments/api"
2133
import { fetchPostsByTagApi } from "../../entities/posts/api/fetchPostsByTag"
2234
import PostsTable from "../../features/posts-management/ui/posts-table"
2335
import UserInfoModal from "../../widgets/user-modal"
@@ -115,22 +127,6 @@ const PostsManager = () => {
115127
updateURL()
116128
}
117129

118-
// 게시물 추가
119-
const { mutate: addPostMutate } = useMutation({
120-
mutationFn: addPostApi,
121-
onSuccess: () => {
122-
queryClient.invalidateQueries({ queryKey: ["posts"] })
123-
setIsAddPostModalOpen(false)
124-
},
125-
onError: (error) => {
126-
console.error("게시물 추가 오류:", error)
127-
},
128-
})
129-
130-
const addPostFlow = (newPost: { title: string; body: string; userId: number }) => {
131-
addPostMutate(newPost)
132-
}
133-
134130
// 게시물 업데이트
135131
const { mutate: updatePostMutate } = useMutation({
136132
mutationFn: updatePostApi,
@@ -295,7 +291,7 @@ const PostsManager = () => {
295291
</div>
296292
</CardContent>
297293

298-
<AddPostModal onAddPost={addPostFlow} />
294+
<AddPostModal />
299295

300296
<EditPostModal onUpdatePost={updatePost} />
301297

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
import { useAtom } from "jotai"
2-
import AddPostForm from "../../features/add-post/ui/AddPostForm"
32
import { isAddPostModalOpenAtom } from "../../features/add-post/model/atoms"
3+
import AddPostForm from "../../features/add-post/ui/AddPostForm"
44
import { Dialog, DialogContent, DialogHeader, DialogTitle } from "../../shared/ui"
55

6-
interface AddPostModalProps {
7-
onAddPost: (post: { title: string; body: string; userId: number }) => void
8-
}
9-
10-
const AddPostModal = ({ onAddPost }: AddPostModalProps) => {
6+
const AddPostModal = () => {
117
const [isOpen, setIsOpen] = useAtom(isAddPostModalOpenAtom)
128

139
return (
@@ -16,10 +12,12 @@ const AddPostModal = ({ onAddPost }: AddPostModalProps) => {
1612
<DialogHeader>
1713
<DialogTitle>새 게시물 추가</DialogTitle>
1814
</DialogHeader>
19-
<AddPostForm onAddPost={onAddPost} />
15+
<AddPostForm />
2016
</DialogContent>
2117
</Dialog>
2218
)
2319
}
2420

2521
export default AddPostModal
22+
23+
export default AddPostModal

0 commit comments

Comments
 (0)