diff --git a/src/apps/copilots/src/models/CopilotApplication.ts b/src/apps/copilots/src/models/CopilotApplication.ts index 0c2c18aab..eccb95729 100644 --- a/src/apps/copilots/src/models/CopilotApplication.ts +++ b/src/apps/copilots/src/models/CopilotApplication.ts @@ -1,3 +1,9 @@ +export enum CopilotApplicationStatus { + INVITED = 'invited', + ACCEPTED = 'accepted', + PENDING = 'pending', +} + export interface CopilotApplication { id: number, notes?: string, @@ -5,4 +11,5 @@ export interface CopilotApplication { opportunityId: string, handle?: string, userId: number, + status: CopilotApplicationStatus, } diff --git a/src/apps/copilots/src/pages/copilot-opportunity-details/index.tsx b/src/apps/copilots/src/pages/copilot-opportunity-details/index.tsx index dae460eed..d623398de 100644 --- a/src/apps/copilots/src/pages/copilot-opportunity-details/index.tsx +++ b/src/apps/copilots/src/pages/copilot-opportunity-details/index.tsx @@ -137,8 +137,7 @@ const CopilotOpportunityDetails: FC<{}> = () => { } infoComponent={(isCopilot && !(copilotApplications && copilotApplications.length === 0 - && opportunity?.status === 'active' - ) && !!application) && ( + ) && opportunity?.status === 'active' && !!application) && (
{ + const { opportunityId }: {opportunityId?: string} = useParams<{ opportunityId?: string }>() + const onClick = useCallback(async () => { + if (copilotApplication.status !== CopilotApplicationStatus.PENDING) { + return + } + + if (opportunityId) { + try { + await assignCopilotOpportunity(opportunityId, copilotApplication.id) + toast.success('Invited a copilot') + mutate(`${copilotBaseUrl}/copilots/opportunity/${opportunityId}/applications`) + } catch (e) { + const error = e as Error + toast.error(error.message) + } + + } + }, [opportunityId, copilotApplication]) + return ( +
+ { + copilotApplication.status === CopilotApplicationStatus.INVITED && ( + + + + ) + } + + { + copilotApplication.status === CopilotApplicationStatus.PENDING && ( + + ) + } + + { + copilotApplication.status === CopilotApplicationStatus.ACCEPTED && ( + + ) + } +
+ ) +} + +export default CopilotApplicationAction diff --git a/src/apps/copilots/src/pages/copilot-opportunity-details/tabs/copilot-applications/CopilotApplications.tsx b/src/apps/copilots/src/pages/copilot-opportunity-details/tabs/copilot-applications/CopilotApplications.tsx index 283debb48..bdb8690b3 100644 --- a/src/apps/copilots/src/pages/copilot-opportunity-details/tabs/copilot-applications/CopilotApplications.tsx +++ b/src/apps/copilots/src/pages/copilot-opportunity-details/tabs/copilot-applications/CopilotApplications.tsx @@ -6,6 +6,7 @@ import { USER_PROFILE_URL } from '~/config/environments/default.env' import { CopilotApplication } from '../../../../models/CopilotApplication' import { FormattedMembers } from '../../../../services/members' +import CopilotApplicationAction from './CopilotApplicationAction' import styles from './styles.module.scss' const tableColumns: TableColumn[] = [ @@ -33,6 +34,16 @@ const tableColumns: TableColumn[] = [ propertyName: 'activeProjects', type: 'text', }, + { + label: 'Status', + propertyName: 'status', + renderer: (copilotApplication: CopilotApplication) => ( +
+ {copilotApplication.status} +
+ ), + type: 'element', + }, { label: 'Applied Date', propertyName: 'createdAt', @@ -48,6 +59,12 @@ const tableColumns: TableColumn[] = [ ), type: 'element', }, + { + label: 'Actions', + propertyName: '', + renderer: CopilotApplicationAction, + type: 'element', + }, ] const CopilotApplications: FC<{ diff --git a/src/apps/copilots/src/pages/copilot-opportunity-details/tabs/copilot-applications/styles.module.scss b/src/apps/copilots/src/pages/copilot-opportunity-details/tabs/copilot-applications/styles.module.scss index e69de29bb..d31ba3f75 100644 --- a/src/apps/copilots/src/pages/copilot-opportunity-details/tabs/copilot-applications/styles.module.scss +++ b/src/apps/copilots/src/pages/copilot-opportunity-details/tabs/copilot-applications/styles.module.scss @@ -0,0 +1,14 @@ +@import '@libs/ui/styles/includes'; + +.status { + text-transform: capitalize; +} + +.actionWrapper { + width: 24px; + height: 24px; + cursor: pointer; + svg { + color: $teal-100; + } +} diff --git a/src/apps/copilots/src/services/copilot-opportunities.ts b/src/apps/copilots/src/services/copilot-opportunities.ts index d5e8f7f19..771a16cb6 100644 --- a/src/apps/copilots/src/services/copilot-opportunities.ts +++ b/src/apps/copilots/src/services/copilot-opportunities.ts @@ -105,6 +105,21 @@ export const applyCopilotOpportunity = async (opportunityId: number, request?: { return xhrPostAsync(url, request, {}) } +/** + * apply copilot opportunity + * @param opportunityId + * @param applicationId + * @returns + */ +export const assignCopilotOpportunity = async ( + opportunityId: string, + applicationId: number, +): Promise<{applicationId: number}> => { + const url = `${copilotBaseUrl}/copilots/opportunity/${opportunityId}/assign` + + return xhrPostAsync(url, { applicationId: applicationId.toString() }, {}) +} + /** * Custom hook to fetch copilot applications by opportunity id. *