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' ;
103import { 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' ;
149import { useDashboardStore } from '@/config/store' ;
1510import { GraphQL } from '@/lib/api' ;
11+ import { Icons } from '@/components/icons' ;
12+ import { Loading } from '@/components/loading' ;
13+ import { useEditStatus } from '../../context' ;
1614import CustomCombobox from './CustomCombobox' ;
1715
1816const 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+
2874const 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