Skip to content

[PROD] - Copilot Portal Fixes & Updates #1158

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 85 commits into from
Aug 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
57a6076
Update build script: remove "build" dir before creating a new build
vas3a Jul 15, 2025
bc1f9b4
Merge pull request #1138 from topcoder-platform/PM-732_build-update
vas3a Jul 15, 2025
4326b8d
Add status message for no Applications
himaniraghav3 Jul 16, 2025
f9328c1
linting fixes
himaniraghav3 Jul 16, 2025
f8efdd2
fix: layout issues in mobile resolution
hentrymartin Jul 16, 2025
cc980c6
fix: layout issues in mobile resolution
hentrymartin Jul 16, 2025
8d519f4
fix: layout issues in mobile resolution
hentrymartin Jul 16, 2025
8968136
PM-1315 Fix issues on Copilot request form
himaniraghav3 Jul 17, 2025
42fc635
fix: UI issues in opportunities and requests list
hentrymartin Jul 17, 2025
530a90a
Merge pull request #1139 from topcoder-platform/PM-1269
kkartunov Jul 21, 2025
077ba3b
Merge pull request #1141 from topcoder-platform/PM-1315
kkartunov Jul 21, 2025
281e47d
Merge pull request #1140 from topcoder-platform/pm-1320
kkartunov Jul 21, 2025
7d06d63
Merge pull request #1142 from topcoder-platform/pm-1323
kkartunov Jul 21, 2025
2b67683
PM-1321 Fix alignment issues on copilot form
himaniraghav3 Jul 21, 2025
d505fbb
Merge pull request #1143 from topcoder-platform/PM-1321
himaniraghav3 Jul 21, 2025
9eb0db8
PM-1384 Fix date picker in copilot form
himaniraghav3 Jul 21, 2025
472569b
fix: show apply as copilot button for user who is both copilot and admin
hentrymartin Jul 21, 2025
b9353f0
fix: lint
hentrymartin Jul 21, 2025
e6bb39b
fix: notes column
hentrymartin Jul 21, 2025
e7deb62
PM-1498 - support for opportunity title
vas3a Jul 21, 2025
596ca36
typo
vas3a Jul 21, 2025
8184aab
fix linting error
himaniraghav3 Jul 22, 2025
b784334
PM-1499 - allow pms and admins to edit copilot requests
vas3a Jul 22, 2025
4519c74
Merge pull request #1147 from topcoder-platform/PM-1498_copilot-oppor…
vas3a Jul 22, 2025
2ead2c1
Merge pull request #1145 from topcoder-platform/pm-1395
hentrymartin Jul 22, 2025
cfc2d1e
Merge pull request #1146 from topcoder-platform/pm-1397
hentrymartin Jul 22, 2025
8bb8aba
Merge pull request #1144 from topcoder-platform/PM-1384
kkartunov Jul 23, 2025
ea3a141
Merge pull request #1148 from topcoder-platform/PM-1499_edit-copilot-…
kkartunov Jul 23, 2025
11dc023
Update validation for copilot opportunity title
vas3a Jul 23, 2025
c781613
length
vas3a Jul 23, 2025
d9a1937
Merge pull request #1149 from topcoder-platform/validation-for-opport…
vas3a Jul 23, 2025
8d7cb57
PM-1498 - qa fixes
vas3a Jul 23, 2025
bab6dc0
use pre-wrap
vas3a Jul 23, 2025
e22f459
Merge pull request #1150 from topcoder-platform/validation-for-opport…
vas3a Jul 23, 2025
7d2b011
PM-1496 Show payment type in opportunity details
himaniraghav3 Jul 23, 2025
4018c11
Merge pull request #1151 from topcoder-platform/PM-1496
himaniraghav3 Jul 23, 2025
699f786
PM-1495 Fix global font color for inputs
himaniraghav3 Jul 23, 2025
35bb492
Merge pull request #1152 from topcoder-platform/PM-1495
himaniraghav3 Jul 23, 2025
c26a666
PM-1499 - update copilot form request
vas3a Jul 24, 2025
e1b02ab
Merge pull request #1153 from topcoder-platform/PM-1499_fix-request-f…
vas3a Jul 24, 2025
6a38cb6
Merge branch 'dev' into PM-1496
himaniraghav3 Jul 24, 2025
02e5b80
PM-1496 Show other payment type in list
himaniraghav3 Jul 24, 2025
0e27236
Merge pull request #1154 from topcoder-platform/PM-1496
himaniraghav3 Jul 24, 2025
d5d3e08
PM-1499 - make sure canceled & fulfilled requests are not editable
vas3a Jul 25, 2025
dbf2f69
lint
vas3a Jul 25, 2025
571a3e7
Merge pull request #1155 from topcoder-platform/PM-1499_fix-request-f…
vas3a Jul 25, 2025
8c44464
PM-1381 - past projects for copilot applicant
vas3a Jul 25, 2025
5deb954
lint
vas3a Jul 25, 2025
d684c86
Merge pull request #1156 from topcoder-platform/PM-1381_copilot-past-…
vas3a Jul 25, 2025
fa3371c
Fix the edit button in the copilot request modal
vas3a Jul 25, 2025
5d50793
Merge pull request #1157 from topcoder-platform/fix-edit-btn-in-copil…
vas3a Jul 25, 2025
86ad5b6
PM-1526 Fix copilot requests sorting on title
himaniraghav3 Jul 29, 2025
3311700
fix: enable apply as copilot button for user who is already a member
hentrymartin Jul 29, 2025
10dc17d
fix: lint
hentrymartin Jul 29, 2025
72145a5
PM-1512 Add spinner to copilot opporunity details
himaniraghav3 Jul 30, 2025
dbaf5aa
PM-1489 Re-add missing css for Opportunity details page
himaniraghav3 Jul 30, 2025
63215ce
Merge pull request #1160 from topcoder-platform/pm-1506
kkartunov Jul 30, 2025
395bf68
Fix toast message for Edit copilot requests on
himaniraghav3 Jul 30, 2025
2639b6b
Merge pull request #1159 from topcoder-platform/PM-1526
kkartunov Jul 30, 2025
f6011b2
Merge pull request #1161 from topcoder-platform/PM-1512
kkartunov Jul 30, 2025
8ac36ce
Merge pull request #1162 from topcoder-platform/PM-1489
kkartunov Jul 30, 2025
39685e5
Merge pull request #1163 from topcoder-platform/PM-1527
himaniraghav3 Jul 30, 2025
748c5a2
PM-1531 Fix: Trim form values before submit
himaniraghav3 Jul 30, 2025
fcb1d21
fix: show already member modal
hentrymartin Jul 30, 2025
4282776
fix: show already member modal
hentrymartin Jul 30, 2025
82920dc
Merge pull request #1165 from topcoder-platform/pm-1506_1
hentrymartin Jul 30, 2025
94afdd5
Merge pull request #1164 from topcoder-platform/PM-1531
kkartunov Jul 31, 2025
fbe6eff
fix: qa feedbacks
hentrymartin Jul 31, 2025
82c5f6a
fix: lint
hentrymartin Jul 31, 2025
4c33ab2
Merge pull request #1166 from topcoder-platform/pm-1510
hentrymartin Jul 31, 2025
ba2fa07
PM-1532 Fix sorting on title
himaniraghav3 Jul 31, 2025
61e08d4
Merge pull request #1167 from topcoder-platform/PM-1532
himaniraghav3 Jul 31, 2025
c999669
fix: lint
hentrymartin Jul 31, 2025
dc4d07c
Merge pull request #1168 from topcoder-platform/pm-1506_2
hentrymartin Jul 31, 2025
536bbdc
fix: revert back to old code
hentrymartin Jul 31, 2025
75c5608
Merge pull request #1169 from topcoder-platform/pm-1506_2
hentrymartin Jul 31, 2025
2383f98
PM-1518 Fix 429 too many requests error
himaniraghav3 Aug 1, 2025
b62d5c7
Merge pull request #1170 from topcoder-platform/PM-1518
himaniraghav3 Aug 1, 2025
f26509e
PM-1555 Remove sorting from Payment column
himaniraghav3 Aug 1, 2025
984aada
Merge pull request #1171 from topcoder-platform/PM-1555
himaniraghav3 Aug 1, 2025
3a9b115
Remove dropdown icon if not more than one in list
himaniraghav3 Aug 1, 2025
c58c4e9
Merge pull request #1172 from topcoder-platform/PM-1529
himaniraghav3 Aug 1, 2025
5b0abec
feat
hentrymartin Aug 1, 2025
4da8cb0
fix: circle ci config updates
hentrymartin Aug 1, 2025
ef6d0cd
Merge pull request #1173 from topcoder-platform/pm-1365_1
hentrymartin Aug 1, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ workflows:
- LVT-256
- CORE-635
- feat/system-admin
- pm-1448_1
- pm-1365_1

- deployQa:
context: org-global
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"scripts": {
"dev": "craco start --mode ${LOGICAL_ENV:-dev}",
"start": "bash start.sh",
"build": "export CI=false && craco build --mode ${LOGICAL_ENV:-prod}",
"build": "rimraf ./build && export CI=false && craco build --mode ${LOGICAL_ENV:-prod}",
"build:dev": "craco build --mode ${LOGICAL_ENV:-dev}",
"demo": "npx http-server --port 443 -a 0.0.0.0 -S -C ./ssl/rootCA.crt -K ./ssl/rootCA.key -P https://local.topcoder-dev.com? --proxy-options.secure false ./build",
"lint": "eslint -c ./src/.eslintrc.js 'src/**/*.{ts,tsx,js,jsx}'",
Expand Down Expand Up @@ -189,6 +189,7 @@
"react-docgen-typescript": "^2.2.2",
"react-hot-loader": "^4.3.3",
"resolve-url-loader": "^5.0.0",
"rimraf": "^6.0.1",
"sass-loader": "^13.3.3",
"serve": "^14.0.1",
"start-server-and-test": "^1.14.0",
Expand Down
7 changes: 7 additions & 0 deletions src/apps/copilots/src/copilots.routes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@ export const childRoutes = [
rolesRequired: [UserRole.administrator, UserRole.projectManager] as UserRole[],
route: '/requests/new',
},
{
authRequired: true,
element: <CopilotsRequestForm />,
id: 'CopilotRequestEditForm',
rolesRequired: [UserRole.administrator, UserRole.projectManager] as UserRole[],
route: '/requests/edit/:requestId',
},
{
authRequired: true,
element: <CopilotsRequests />,
Expand Down
7 changes: 7 additions & 0 deletions src/apps/copilots/src/models/CopilotApplication.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ export enum CopilotApplicationStatus {
PENDING = 'pending',
}

export interface ExistingMembership {
role: string,
id: number,
}

export interface CopilotApplication {
id: number,
notes?: string,
Expand All @@ -13,4 +18,6 @@ export interface CopilotApplication {
userId: number,
status: CopilotApplicationStatus,
opportunityStatus: string,
existingMembership?: ExistingMembership,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider providing a default value for existingMembership to ensure consistent behavior when this property is not explicitly set.

projectName: string,
}
2 changes: 1 addition & 1 deletion src/apps/copilots/src/models/CopilotOpportunity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ export interface CopilotOpportunity {
numHoursPerWeek: number,
numWeeks: number,
overview: string,
opportunityTitle: string,
paymentType: string,
otherPaymentType: string,
requiresCommunication: 'yes' | 'no',
skills: UserSkill[],
startDate: Date,
tzRestrictions: 'yes' | 'no',
createdAt: Date,
canApplyAsCopilot: boolean,
}
1 change: 1 addition & 0 deletions src/apps/copilots/src/models/CopilotRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export interface CopilotRequest {
numHoursPerWeek: number,
numWeeks: number,
overview: string,
opportunityTitle: string,
paymentType: string,
otherPaymentType: string,
requiresCommunication: 'yes' | 'no',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,13 @@
.info {
margin-bottom: 12px;
}

&:global(.react-responsive-modal-modal) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider using a more descriptive class name instead of react-responsive-modal-modal to improve readability and maintainability.


:global(.modal-body) {
@include ltemd {
height: 100%;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ensure that the ltemd mixin is defined and imported correctly to avoid potential compilation errors.

}
}
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add a newline at the end of the file to adhere to best practices and avoid potential issues with some tools.

47 changes: 36 additions & 11 deletions src/apps/copilots/src/pages/copilot-opportunity-details/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@ const CopilotOpportunityDetails: FC<{}> = () => {
[profile],
)
const { data: copilotApplications }: { data?: CopilotApplication[] } = useCopilotApplications(opportunityId)
const appliedCopilotApplications = useMemo(

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider adding a type annotation for appliedCopilotApplications to ensure type safety and improve code readability.

() => copilotApplications?.filter(item => item.userId === profile?.userId),
[copilotApplications, profile],
)
const { data: members }: { data?: FormattedMembers[]} = useMembers(
copilotApplications ? copilotApplications?.map(item => item.userId) : [],
)
Expand Down Expand Up @@ -95,13 +99,16 @@ const CopilotOpportunityDetails: FC<{}> = () => {
}, [getHashFromTabId, setActiveTab])

useEffect(() => {
if (opportunity) {
setShowNotFound(false)
return undefined
}

const timer = setTimeout(() => {
if (!opportunity) {
setShowNotFound(true)
}
}, 2000)
setShowNotFound(true)
}, 1000)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The timeout duration has been reduced from 2000ms to 1000ms. Ensure that this change does not negatively impact the user experience, as it may cause the 'not found' message to appear too quickly if there is a delay in fetching the opportunity data.


return () => clearTimeout(timer) // Cleanup on unmount
return () => clearTimeout(timer)
}, [opportunity])

const onApplied: () => void = useCallback(() => {
Expand All @@ -113,6 +120,14 @@ const CopilotOpportunityDetails: FC<{}> = () => {
setShowApplyOpportunityModal(false)
}, [setShowApplyOpportunityModal])

if (isValidating && !opportunity) {
return (
<ContentLayout title='Copilot Opportunity Details'>
<LoadingSpinner />
</ContentLayout>
)
}

if (!opportunity && showNotFound) {
return (
<ContentLayout title='Copilot Opportunity Details'>
Expand Down Expand Up @@ -164,17 +179,17 @@ const CopilotOpportunityDetails: FC<{}> = () => {
title='Copilot Opportunity'
buttonConfig={
isCopilot
&& copilotApplications
&& copilotApplications.length === 0
&& appliedCopilotApplications

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The variable appliedCopilotApplications is used here, but it is not clear if it has been defined or initialized elsewhere in the code. Ensure that appliedCopilotApplications is properly defined and initialized before this point to avoid potential runtime errors.

&& appliedCopilotApplications.length === 0
&& opportunity?.status === 'active'
&& opportunity?.canApplyAsCopilot ? applyCopilotOpportunityButton : undefined
? applyCopilotOpportunityButton : undefined
}
secondaryButtonConfig={
opportunity?.status === 'active'
&& isAdminOrPM ? cancelCopilotOpportunityButton : undefined
}
infoComponent={(isCopilot && !(copilotApplications
&& copilotApplications.length === 0
infoComponent={(isCopilot && !(appliedCopilotApplications

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The variable appliedCopilotApplications is used here, but it's not clear if it has been defined or imported correctly. Please ensure that appliedCopilotApplications is defined and initialized properly in the scope of this component.

&& appliedCopilotApplications.length === 0
) && opportunity?.status === 'active' && !!application) && (
<div className={styles.applied}>
<IconSolid.CheckCircleIcon className={styles.appliedIcon} />
Expand All @@ -194,7 +209,7 @@ const CopilotOpportunityDetails: FC<{}> = () => {
) }
<div className={styles.wrapper}>
<h1 className={styles.header}>
{opportunity?.projectName}
{opportunity?.opportunityTitle ?? opportunity?.projectName}
</h1>
<div className={styles.infoRow}>
<div className={styles.infoColumn}>
Expand Down Expand Up @@ -255,6 +270,16 @@ const CopilotOpportunityDetails: FC<{}> = () => {
<span className={styles.infoValue}>{opportunity?.tzRestrictions}</span>
</div>
</div>
<div className={styles.infoColumn}>
<IconOutline.CashIcon className={styles.icon} />
<div className={styles.infoText}>
<span className={styles.infoHeading}>Payment</span>
<span className={styles.infoValue}>
{opportunity?.paymentType === 'standard'

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider adding a fallback value or handling the case where opportunity?.paymentType is undefined to prevent potential rendering issues.

? opportunity.paymentType : opportunity?.otherPaymentType}
</span>
</div>
</div>
</div>
{
initialized && (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@
color: $teal-100;
}

@media (max-width: 767px) {
.header {
line-height: 48px;
}
}


.infoRow {
display: flex;
Expand All @@ -27,6 +33,13 @@
padding: 12px 0;
}

@media (max-width: 767px) {
.infoRow {
flex-wrap: wrap;
margin: 0;
}
}

.infoText {
display: flex;
flex-direction: column;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/* eslint-disable react/jsx-no-bind */
import { FC } from 'react'

import { BaseModal, Button } from '~/libs/ui'
import { CopilotApplication } from '~/apps/copilots/src/models/CopilotApplication'

import styles from './styles.module.scss'

interface AlreadyMemberModalProps {
onClose: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void
copilotApplication: CopilotApplication
handle?: string
onApply: () => void
projectName: string
}

const AlreadyMemberModal: FC<AlreadyMemberModalProps> = props => (
<BaseModal
onClose={props.onClose as () => void}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The onClose prop is being cast to () => void, but it is defined as (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void in the AlreadyMemberModalProps interface. Consider ensuring the types are consistent or handling the event parameter appropriately.

open
size='lg'
title='User already member of the project'
buttons={(
<>
<Button primary onClick={props.onApply} label='Confirm' />
<Button secondary onClick={props.onClose} label='Cancel' />
</>
)}
>
<div className={styles.applyCopilotModal}>
<div className={styles.info}>
{`The copilot ${props.handle} is part of ${props.projectName}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider using a template literal for the entire string to avoid unnecessary line breaks and improve readability. The current formatting may lead to unexpected spaces in the rendered text.

project with ${props.copilotApplication.existingMembership?.role} role.`}

{
props.copilotApplication.existingMembership

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider using a more descriptive variable name for props.copilotApplication.existingMembership to improve readability.

&& ['copilot', 'manager'].includes(props.copilotApplication.existingMembership.role)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The logic here checks for specific roles. Ensure that the roles are correctly defined and consistent with the application's role management system.

&& <div>Click &apos;Confirm&apos; to accept and complete this opportunity.</div>
}

{
props.copilotApplication.existingMembership

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The logic here checks for specific roles. Ensure that the roles are correctly defined and consistent with the application's role management system.

&& ['observer', 'customer'].includes(props.copilotApplication.existingMembership.role)
&& (
<div>
Click &apos;Confirm&apos; to accept by updating project role to &apos;Copilot&apos;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider rephrasing the message for clarity. For example, 'Click 'Confirm' to update the project role to 'Copilot' and complete this opportunity.'

and complete this opportunity
</div>
)
}
</div>
</div>
</BaseModal>
)

export default AlreadyMemberModal
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
import { useParams } from 'react-router-dom'
import { toast } from 'react-toastify'
import { mutate } from 'swr'
import { useCallback, useMemo } from 'react'
import { useCallback, useMemo, useState } from 'react'

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The useState hook has been added, but there is no indication in the provided diff that it is being used. Ensure that useState is necessary for the functionality you are implementing. If it is not used, consider removing it to keep the code clean and efficient.


import { assignCopilotOpportunity, copilotBaseUrl } from '~/apps/copilots/src/services/copilot-opportunities'
import { CopilotApplication, CopilotApplicationStatus } from '~/apps/copilots/src/models/CopilotApplication'
import { IconSolid, Tooltip } from '~/libs/ui'

import AlreadyMemberModal from './AlreadyMemberModal'
import styles from './styles.module.scss'

const CopilotApplicationAction = (
copilotApplication: CopilotApplication,
allCopilotApplications: CopilotApplication[],
): JSX.Element => {
const { opportunityId }: {opportunityId?: string} = useParams<{ opportunityId?: string }>()
const [showAlreadyMemberModal, setShowAlreadyMemberModal] = useState(false)
const isInvited = useMemo(
() => allCopilotApplications
&& allCopilotApplications.findIndex(item => item.status === CopilotApplicationStatus.INVITED) > -1,
Expand All @@ -28,6 +30,11 @@ const CopilotApplicationAction = (
return
}

if (copilotApplication.existingMembership) {
setShowAlreadyMemberModal(true)
return
}

if (opportunityId) {
try {
await assignCopilotOpportunity(opportunityId, copilotApplication.id)
Expand All @@ -40,6 +47,29 @@ const CopilotApplicationAction = (

}
}, [opportunityId, copilotApplication])

const onApply = useCallback(async () => {
try {
if (!opportunityId) {
return
}

await assignCopilotOpportunity(opportunityId, copilotApplication.id)
toast.success('Accepted as copilot')
mutate(`${copilotBaseUrl}/copilots/opportunity/${opportunityId}/applications`)
setShowAlreadyMemberModal(false)
} catch (e) {
const error = e as Error
toast.error(error.message)
}
}, [opportunityId, copilotApplication])

const onCloseModal = useCallback((e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The dependency array for useCallback should not include showAlreadyMemberModal as it is not used within the function. Consider removing it to prevent unnecessary re-creations of the callback.

e.preventDefault()
e.stopPropagation()
setShowAlreadyMemberModal(false)
}, [showAlreadyMemberModal])

return (
<div onClick={onClick} className={styles.actionWrapper}>
{
Expand Down Expand Up @@ -67,6 +97,16 @@ const CopilotApplicationAction = (
</Tooltip>
)
}

{showAlreadyMemberModal && (
<AlreadyMemberModal
projectName={copilotApplication.projectName}
handle={copilotApplication.handle}
onClose={onCloseModal}
onApply={onApply}
copilotApplication={copilotApplication}
/>
)}
</div>
)
}
Expand Down
Loading