Skip to content

Commit d327b38

Browse files
committed
logic seperation
1 parent 3584878 commit d327b38

File tree

2 files changed

+161
-129
lines changed

2 files changed

+161
-129
lines changed

frontend/src/app/my/mentorship/programs/[programKey]/modules/[moduleKey]/issues/[issueId]/page.tsx

Lines changed: 17 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client'
22

3-
import { useMutation, useQuery } from '@apollo/client'
3+
import { useQuery } from '@apollo/client'
44
import {
55
faCodeBranch,
66
faLink,
@@ -10,19 +10,12 @@ import {
1010
faXmark,
1111
} from '@fortawesome/free-solid-svg-icons'
1212
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
13-
import { addToast } from '@heroui/toast'
13+
import { useIssueMutations } from 'hooks/useIssueMutations'
1414
import Image from 'next/image'
1515
import Link from 'next/link'
1616
import { useParams } from 'next/navigation'
17-
import { useState } from 'react'
1817
import { ErrorDisplay } from 'app/global-error'
19-
import {
20-
ASSIGN_ISSUE_TO_USER,
21-
CLEAR_TASK_DEADLINE,
22-
GET_MODULE_ISSUE_VIEW,
23-
UNASSIGN_ISSUE_FROM_USER,
24-
SET_TASK_DEADLINE,
25-
} from 'server/queries/issueQueries'
18+
import { GET_MODULE_ISSUE_VIEW } from 'server/queries/issueQueries'
2619
import ActionButton from 'components/ActionButton'
2720
import AnchorTitle from 'components/AnchorTitle'
2821
import LoadingSpinner from 'components/LoadingSpinner'
@@ -74,128 +67,23 @@ const ModuleIssueDetailsPage = () => {
7467
nextFetchPolicy: 'cache-and-network',
7568
})
7669

77-
const [assignIssue, { loading: assigning }] = useMutation(ASSIGN_ISSUE_TO_USER, {
78-
refetchQueries: [
79-
{
80-
query: GET_MODULE_ISSUE_VIEW,
81-
variables: { programKey, moduleKey, number: Number(issueId) },
82-
},
83-
],
84-
awaitRefetchQueries: true,
85-
onCompleted: () => {
86-
addToast({
87-
title: 'Issue assigned successfully',
88-
variant: 'solid',
89-
color: 'success',
90-
timeout: 3000,
91-
shouldShowTimeoutProgress: true,
92-
})
93-
},
94-
onError: (error) => {
95-
addToast({
96-
title: 'Failed to assign issue: ' + error.message,
97-
variant: 'solid',
98-
color: 'danger',
99-
timeout: 3000,
100-
shouldShowTimeoutProgress: true,
101-
})
102-
},
103-
})
104-
const [unassignIssue, { loading: unassigning }] = useMutation(UNASSIGN_ISSUE_FROM_USER, {
105-
refetchQueries: [
106-
{
107-
query: GET_MODULE_ISSUE_VIEW,
108-
variables: { programKey, moduleKey, number: Number(issueId) },
109-
},
110-
],
111-
awaitRefetchQueries: true,
112-
onCompleted: () => {
113-
addToast({
114-
title: 'Issue unassigned successfully',
115-
variant: 'solid',
116-
color: 'success',
117-
timeout: 3000,
118-
shouldShowTimeoutProgress: true,
119-
})
120-
},
121-
onError: (error) => {
122-
addToast({
123-
title: 'Failed to unassign issue: ' + error.message,
124-
variant: 'solid',
125-
color: 'danger',
126-
timeout: 3000,
127-
shouldShowTimeoutProgress: true,
128-
})
129-
},
130-
})
131-
132-
const [setTaskDeadlineMutation, { loading: settingDeadline }] = useMutation(SET_TASK_DEADLINE, {
133-
refetchQueries: [
134-
{
135-
query: GET_MODULE_ISSUE_VIEW,
136-
variables: { programKey, moduleKey, number: Number(issueId) },
137-
},
138-
],
139-
awaitRefetchQueries: true,
140-
onCompleted: () => {
141-
addToast({
142-
title: 'Deadline updated',
143-
variant: 'solid',
144-
color: 'success',
145-
timeout: 2500,
146-
shouldShowTimeoutProgress: true,
147-
})
148-
setIsEditingDeadline(false)
149-
},
150-
onError: (err) => {
151-
addToast({
152-
title: 'Failed to update deadline: ' + err.message,
153-
variant: 'solid',
154-
color: 'danger',
155-
timeout: 3500,
156-
shouldShowTimeoutProgress: true,
157-
})
158-
},
159-
})
160-
161-
const [clearTaskDeadlineMutation, { loading: clearingDeadline }] = useMutation(
162-
CLEAR_TASK_DEADLINE,
163-
{
164-
refetchQueries: [
165-
{
166-
query: GET_MODULE_ISSUE_VIEW,
167-
variables: { programKey, moduleKey, number: Number(issueId) },
168-
},
169-
],
170-
awaitRefetchQueries: true,
171-
onCompleted: () => {
172-
addToast({
173-
title: 'Deadline cleared',
174-
variant: 'solid',
175-
color: 'success',
176-
timeout: 2500,
177-
shouldShowTimeoutProgress: true,
178-
})
179-
setIsEditingDeadline(false)
180-
},
181-
onError: (err) => {
182-
addToast({
183-
title: 'Failed to clear deadline: ' + err.message,
184-
variant: 'solid',
185-
color: 'danger',
186-
timeout: 3500,
187-
shouldShowTimeoutProgress: true,
188-
})
189-
},
190-
}
191-
)
70+
const {
71+
assignIssue,
72+
unassignIssue,
73+
setTaskDeadlineMutation,
74+
clearTaskDeadlineMutation,
75+
assigning,
76+
unassigning,
77+
settingDeadline,
78+
clearingDeadline,
79+
isEditingDeadline,
80+
setIsEditingDeadline,
81+
deadlineInput,
82+
setDeadlineInput,
83+
} = useIssueMutations({ programKey, moduleKey, issueId })
19284

19385
const issue = data?.getModule?.issueByNumber
19486
const taskDeadline = data?.getModule?.taskDeadline as string | undefined
195-
const [isEditingDeadline, setIsEditingDeadline] = useState(false)
196-
const [deadlineInput, setDeadlineInput] = useState<string>(
197-
taskDeadline ? new Date(taskDeadline).toISOString().slice(0, 10) : ''
198-
)
19987

20088
const getButtonClassName = (disabled: boolean) =>
20189
`inline-flex items-center justify-center rounded-md border p-1.5 text-sm ${
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
import { useMutation } from '@apollo/client'
2+
import { addToast } from '@heroui/toast'
3+
import { useState } from 'react'
4+
import {
5+
ASSIGN_ISSUE_TO_USER,
6+
CLEAR_TASK_DEADLINE,
7+
GET_MODULE_ISSUE_VIEW,
8+
SET_TASK_DEADLINE,
9+
UNASSIGN_ISSUE_FROM_USER,
10+
} from 'server/queries/issueQueries'
11+
12+
interface UseIssueMutationsProps {
13+
programKey: string
14+
moduleKey: string
15+
issueId: string
16+
}
17+
18+
export const useIssueMutations = ({ programKey, moduleKey, issueId }: UseIssueMutationsProps) => {
19+
const [isEditingDeadline, setIsEditingDeadline] = useState(false)
20+
const [deadlineInput, setDeadlineInput] = useState<string>('')
21+
22+
const commonMutationConfig = {
23+
refetchQueries: [
24+
{
25+
query: GET_MODULE_ISSUE_VIEW,
26+
variables: { programKey, moduleKey, number: Number(issueId) },
27+
},
28+
],
29+
awaitRefetchQueries: true,
30+
}
31+
32+
const [assignIssue, { loading: assigning }] = useMutation(ASSIGN_ISSUE_TO_USER, {
33+
...commonMutationConfig,
34+
onCompleted: () => {
35+
addToast({
36+
title: 'Issue assigned successfully',
37+
variant: 'solid',
38+
color: 'success',
39+
timeout: 3000,
40+
shouldShowTimeoutProgress: true,
41+
})
42+
},
43+
onError: (error) => {
44+
addToast({
45+
title: 'Failed to assign issue: ' + error.message,
46+
variant: 'solid',
47+
color: 'danger',
48+
timeout: 3000,
49+
shouldShowTimeoutProgress: true,
50+
})
51+
},
52+
})
53+
54+
const [unassignIssue, { loading: unassigning }] = useMutation(UNASSIGN_ISSUE_FROM_USER, {
55+
...commonMutationConfig,
56+
onCompleted: () => {
57+
addToast({
58+
title: 'Issue unassigned successfully',
59+
variant: 'solid',
60+
color: 'success',
61+
timeout: 3000,
62+
shouldShowTimeoutProgress: true,
63+
})
64+
},
65+
onError: (error) => {
66+
addToast({
67+
title: 'Failed to unassign issue: ' + error.message,
68+
variant: 'solid',
69+
color: 'danger',
70+
timeout: 3000,
71+
shouldShowTimeoutProgress: true,
72+
})
73+
},
74+
})
75+
76+
const [setTaskDeadlineMutation, { loading: settingDeadline }] = useMutation(SET_TASK_DEADLINE, {
77+
...commonMutationConfig,
78+
onCompleted: () => {
79+
addToast({
80+
title: 'Deadline updated',
81+
variant: 'solid',
82+
color: 'success',
83+
timeout: 2500,
84+
shouldShowTimeoutProgress: true,
85+
})
86+
setIsEditingDeadline(false)
87+
},
88+
onError: (err) => {
89+
addToast({
90+
title: 'Failed to update deadline: ' + err.message,
91+
variant: 'solid',
92+
color: 'danger',
93+
timeout: 3500,
94+
shouldShowTimeoutProgress: true,
95+
})
96+
},
97+
})
98+
99+
const [clearTaskDeadlineMutation, { loading: clearingDeadline }] = useMutation(
100+
CLEAR_TASK_DEADLINE,
101+
{
102+
...commonMutationConfig,
103+
onCompleted: () => {
104+
addToast({
105+
title: 'Deadline cleared',
106+
variant: 'solid',
107+
color: 'success',
108+
timeout: 2500,
109+
shouldShowTimeoutProgress: true,
110+
})
111+
setIsEditingDeadline(false)
112+
},
113+
onError: (err) => {
114+
addToast({
115+
title: 'Failed to clear deadline: ' + err.message,
116+
variant: 'solid',
117+
color: 'danger',
118+
timeout: 3500,
119+
shouldShowTimeoutProgress: true,
120+
})
121+
},
122+
}
123+
)
124+
125+
return {
126+
// Mutations
127+
assignIssue,
128+
unassignIssue,
129+
setTaskDeadlineMutation,
130+
clearTaskDeadlineMutation,
131+
132+
// Loading states
133+
assigning,
134+
unassigning,
135+
settingDeadline,
136+
clearingDeadline,
137+
138+
// Deadline state
139+
isEditingDeadline,
140+
setIsEditingDeadline,
141+
deadlineInput,
142+
setDeadlineInput,
143+
}
144+
}

0 commit comments

Comments
 (0)