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.
*