Skip to content

Commit b950371

Browse files
committed
integrate add and remove contributor mutations
1 parent 766c960 commit b950371

File tree

1 file changed

+147
-22
lines changed
  • app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/contributors

1 file changed

+147
-22
lines changed

app/[locale]/dashboard/[entityType]/[entitySlug]/usecases/edit/[id]/contributors/page.tsx

Lines changed: 147 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
'use client';
22

3-
import { graphql } from '@/gql';
4-
import { useQuery } from '@tanstack/react-query';
5-
import {
6-
Button,
7-
Icon,
8-
Text
9-
} from 'opub-ui';
103
import { useEffect, useState } from 'react';
4+
import { useParams } from 'next/navigation';
5+
import { graphql } from '@/gql';
6+
import { useMutation, useQuery } from '@tanstack/react-query';
7+
import { Button, Icon, Text, toast } from 'opub-ui';
118

12-
import { Icons } from '@/components/icons';
13-
import { Loading } from '@/components/loading';
149
import { useDashboardStore } from '@/config/store';
1510
import { GraphQL } from '@/lib/api';
11+
import { Icons } from '@/components/icons';
12+
import { Loading } from '@/components/loading';
13+
import { useEditStatus } from '../../context';
1614
import CustomCombobox from './CustomCombobox';
1715

1816
const FetchUsers: any = graphql(`
@@ -25,9 +23,64 @@ const FetchUsers: any = graphql(`
2523
}
2624
`);
2725

26+
const FetchUsecaseInfo: any = graphql(`
27+
query useCaseinfo($filters: UseCaseFilter) {
28+
useCases(filters: $filters) {
29+
id
30+
title
31+
contributors {
32+
id
33+
fullName
34+
username
35+
}
36+
}
37+
}
38+
`);
39+
40+
const AddContributors: any = graphql(`
41+
mutation addContributorToUseCase($useCaseId: String!, $userId: ID!) {
42+
addContributorToUseCase(useCaseId: $useCaseId, userId: $userId) {
43+
__typename
44+
... on TypeUseCase {
45+
id
46+
title
47+
contributors {
48+
id
49+
fullName
50+
username
51+
}
52+
}
53+
}
54+
}
55+
`);
56+
57+
const RemoveContributor: any = graphql(`
58+
mutation removeContributorFromUseCase($useCaseId: String!, $userId: ID!) {
59+
removeContributorFromUseCase(useCaseId: $useCaseId, userId: $userId) {
60+
__typename
61+
... on TypeUseCase {
62+
id
63+
title
64+
contributors {
65+
id
66+
fullName
67+
username
68+
}
69+
}
70+
}
71+
}
72+
`);
73+
2874
const Details = () => {
75+
const params = useParams<{ id: string }>();
2976
const { allEntityDetails } = useDashboardStore();
3077
const [searchValue, setSearchValue] = useState('');
78+
const [formData, setFormData] = useState({
79+
contributors: [] as { label: string; value: string }[],
80+
supporters: [] as { label: string; value: string }[],
81+
partners: [] as { label: string; value: string }[],
82+
});
83+
3184
const Users: { data: any; isLoading: boolean; refetch: any } = useQuery(
3285
[`fetch_users`],
3386
() =>
@@ -45,24 +98,89 @@ const Details = () => {
4598
}
4699
);
47100

101+
const UseCaseData: { data: any; isLoading: boolean; refetch: any } = useQuery(
102+
[`fetch_usecase_${params.id}`],
103+
() =>
104+
GraphQL(
105+
FetchUsecaseInfo,
106+
{},
107+
{
108+
filters: {
109+
id: params.id,
110+
},
111+
}
112+
),
113+
{
114+
refetchOnMount: true,
115+
refetchOnReconnect: true,
116+
}
117+
);
118+
119+
useEffect(() => {
120+
setFormData((prev) => ({
121+
...prev,
122+
contributors:
123+
UseCaseData?.data?.useCases?.[0]?.contributors?.map((user: any) => ({
124+
label: user.fullName,
125+
value: user.id,
126+
})) || [],
127+
}));
128+
}, [UseCaseData?.data]);
129+
130+
const {
131+
mutate: addContributor,
132+
isLoading: addContributorLoading,
133+
} = useMutation(
134+
(input: { useCaseId: string; userId: string }) =>
135+
GraphQL(AddContributors, {}, input),
136+
{
137+
onSuccess: (res: any) => {
138+
toast('Contributor added successfully');
139+
},
140+
onError: (error: any) => {
141+
toast(`Error: ${error.message}`);
142+
},
143+
}
144+
);
145+
146+
const {
147+
mutate: removeContributor,
148+
isLoading: removeContributorLoading,
149+
} = useMutation(
150+
(input: { useCaseId: string; userId: string }) =>
151+
GraphQL(RemoveContributor, {}, input),
152+
{
153+
onSuccess: (res: any) => {
154+
toast('Contributor removed successfully');
155+
},
156+
onError: (error: any) => {
157+
toast(`Error: ${error.message}`);
158+
},
159+
}
160+
);
161+
48162
useEffect(() => {
49163
Users.refetch();
50164
}, [searchValue]);
51165

52-
const [formData, setFormData] = useState({
53-
contributors: [] as { label: string; value: string }[],
54-
supporters: [] as { label: string; value: string }[],
55-
partners: [] as { label: string; value: string }[],
56-
});
57-
58166
const selectedContributors = formData.contributors;
59167

60168
const options =
61169
Users?.data?.searchUsers?.map((user: any) => ({
62170
label: user.fullName,
63-
value: user.fullName,
171+
value: user.id,
64172
})) || [];
65173

174+
const { setStatus } = useEditStatus();
175+
176+
useEffect(() => {
177+
setStatus(
178+
addContributorLoading || removeContributorLoading
179+
? 'loading'
180+
: 'success'
181+
); // update based on mutation state
182+
}, [addContributorLoading, removeContributorLoading]);
183+
66184
return (
67185
<div>
68186
{Users?.isLoading || allEntityDetails?.organizations?.length === 0 ? (
@@ -72,7 +190,7 @@ const Details = () => {
72190
<div>
73191
<Text variant="headingMd">CONTRIBUTORS</Text>
74192
<div className="mt-5 flex flex-wrap items-start gap-5 lg:flex-nowrap">
75-
<div className="flex w-full items-end flex-wrap gap-5 lg:flex-nowrap">
193+
<div className="flex w-full flex-wrap items-end gap-5 lg:flex-nowrap">
76194
<div className="w-full lg:w-2/6">
77195
<Text>Add Contributors</Text>
78196
<CustomCombobox
@@ -91,7 +209,10 @@ const Details = () => {
91209
),
92210
],
93211
}));
94-
212+
addContributor({
213+
useCaseId: params.id,
214+
userId: value[0].value,
215+
});
95216
setSearchValue(''); // clear input
96217
}}
97218
placeholder="Add Contributors"
@@ -104,14 +225,18 @@ const Details = () => {
104225
{formData.contributors.map((item) => (
105226
<div key={item.value}>
106227
<Button
107-
onClick={() =>
228+
onClick={() => {
108229
setFormData((prev) => ({
109230
...prev,
110231
contributors: prev.contributors.filter(
111232
(contributor) => contributor.value !== item.value
112233
),
113-
}))
114-
}
234+
}));
235+
removeContributor({
236+
useCaseId: params.id,
237+
userId: item.value,
238+
});
239+
}}
115240
kind="tertiary"
116241
>
117242
<div className="flex items-center gap-2 rounded-2 p-2 ">
@@ -128,7 +253,7 @@ const Details = () => {
128253
<div>
129254
<Text variant="headingMd">SUPPORTED BY</Text>
130255
<div className="mt-5 flex flex-wrap items-start gap-5 lg:flex-nowrap">
131-
<div className="flex w-full items-end flex-wrap gap-5 lg:flex-nowrap">
256+
<div className="flex w-full flex-wrap items-end gap-5 lg:flex-nowrap">
132257
<div className="w-full lg:w-2/6">
133258
<Text>Add Supporters</Text>
134259
<CustomCombobox

0 commit comments

Comments
 (0)