diff --git a/backend/apps/mentorship/admin/__init__.py b/backend/apps/mentorship/admin/__init__.py index 9a3c365805..2f71cd194d 100644 --- a/backend/apps/mentorship/admin/__init__.py +++ b/backend/apps/mentorship/admin/__init__.py @@ -2,6 +2,7 @@ from .issue_user_interest import IssueUserInterest from .mentee import MenteeAdmin +from .mentee_module import MenteeModuleAdmin from .mentee_program import MenteeProgramAdmin from .mentor import MentorAdmin from .module import ModuleAdmin diff --git a/backend/apps/mentorship/admin/mentee_module.py b/backend/apps/mentorship/admin/mentee_module.py new file mode 100644 index 0000000000..5c90381024 --- /dev/null +++ b/backend/apps/mentorship/admin/mentee_module.py @@ -0,0 +1,32 @@ +"""Mentorship app MenteeModule model admin.""" + +from django.contrib import admin + +from apps.mentorship.models.mentee_module import MenteeModule + + +@admin.register(MenteeModule) +class MenteeModuleAdmin(admin.ModelAdmin): + """Admin view for MenteeModule model.""" + + list_display = ( + "mentee", + "module", + "started_at", + "ended_at", + ) + + list_filter = ( + "module__program", + "started_at", + "ended_at", + ) + + search_fields = ( + "mentee__github_user__login", + "mentee__github_user__name", + "module__name", + "module__program__name", + ) + + ordering = ["mentee__github_user__login", "module__name"] diff --git a/backend/apps/mentorship/api/internal/nodes/mentee.py b/backend/apps/mentorship/api/internal/nodes/mentee.py new file mode 100644 index 0000000000..660eb07f98 --- /dev/null +++ b/backend/apps/mentorship/api/internal/nodes/mentee.py @@ -0,0 +1,29 @@ +"""GraphQL node for Mentee model.""" + +import strawberry + +from apps.mentorship.api.internal.nodes.enum import ExperienceLevelEnum + + +@strawberry.type +class MenteeNode: + """A GraphQL node representing a mentorship mentee.""" + + id: str + login: str + name: str + avatar_url: str + bio: str | None = None + experience_level: ExperienceLevelEnum + domains: list[str] | None = None + tags: list[str] | None = None + + @strawberry.field(name="avatarUrl") + def resolve_avatar_url(self) -> str: + """Get the GitHub avatar URL of the mentee.""" + return self.avatar_url + + @strawberry.field(name="experienceLevel") + def resolve_experience_level(self) -> str: + """Get the experience level of the mentee.""" + return self.experience_level if self.experience_level else "beginner" diff --git a/backend/apps/mentorship/api/internal/nodes/module.py b/backend/apps/mentorship/api/internal/nodes/module.py index 1531e074c0..b24eac2fff 100644 --- a/backend/apps/mentorship/api/internal/nodes/module.py +++ b/backend/apps/mentorship/api/internal/nodes/module.py @@ -7,6 +7,7 @@ from apps.github.api.internal.nodes.issue import IssueNode from apps.github.api.internal.nodes.user import UserNode from apps.github.models import Label +from apps.github.models.user import User from apps.mentorship.api.internal.nodes.enum import ExperienceLevelEnum from apps.mentorship.api.internal.nodes.mentor import MentorNode from apps.mentorship.api.internal.nodes.program import ProgramNode @@ -36,6 +37,34 @@ def mentors(self) -> list[MentorNode]: """Get the list of mentors for this module.""" return self.mentors.all() + @strawberry.field + def mentees(self) -> list[UserNode]: + """Get the list of mentees for this module.""" + mentee_users = ( + self.menteemodule_set.select_related("mentee__github_user") + .filter(mentee__github_user__isnull=False) + .values_list("mentee__github_user", flat=True) + ) + + return list(User.objects.filter(id__in=mentee_users).order_by("login")) + + @strawberry.field + def issue_mentees(self, issue_number: int) -> list[UserNode]: + """Return mentees assigned to this module's issue identified by its number.""" + issue_ids = list(self.issues.filter(number=issue_number).values_list("id", flat=True)) + if not issue_ids: + return [] + + # Get mentees assigned to tasks for this issue + mentee_users = ( + Task.objects.filter(module=self, issue_id__in=issue_ids, assignee__isnull=False) + .select_related("assignee") + .values_list("assignee", flat=True) + .distinct() + ) + + return list(User.objects.filter(id__in=mentee_users).order_by("login")) + @strawberry.field def project_name(self) -> str | None: """Get the project name for this module.""" diff --git a/backend/apps/mentorship/api/internal/queries/mentorship.py b/backend/apps/mentorship/api/internal/queries/mentorship.py index 90bd1f7a8b..5f96abb035 100644 --- a/backend/apps/mentorship/api/internal/queries/mentorship.py +++ b/backend/apps/mentorship/api/internal/queries/mentorship.py @@ -1,10 +1,25 @@ """GraphQL queries for mentorship role management.""" +from __future__ import annotations + +from typing import TYPE_CHECKING, cast + import strawberry +from django.core.exceptions import ObjectDoesNotExist +from django.db.models import Prefetch +from apps.github.api.internal.nodes.issue import IssueNode +from apps.github.models import Label from apps.github.models.user import User as GithubUser +from apps.mentorship.api.internal.nodes.mentee import MenteeNode +from apps.mentorship.models import Module +from apps.mentorship.models.mentee import Mentee +from apps.mentorship.models.mentee_module import MenteeModule from apps.mentorship.models.mentor import Mentor +if TYPE_CHECKING: + from apps.github.api.internal.nodes.issue import IssueNode + @strawberry.type class UserRolesResult: @@ -31,3 +46,81 @@ def is_mentor(self, login: str) -> bool: return False return Mentor.objects.filter(github_user=github_user).exists() + + @strawberry.field + def get_mentee_details( + self, program_key: str, module_key: str, mentee_handle: str + ) -> MenteeNode: + """Get detailed information about a mentee in a specific module.""" + try: + module = Module.objects.only("id").get(key=module_key, program__key=program_key) + + github_user = GithubUser.objects.only("login", "name", "avatar_url", "bio").get( + login=mentee_handle + ) + + mentee = Mentee.objects.only("id", "experience_level", "domains", "tags").get( + github_user=github_user + ) + is_enrolled = MenteeModule.objects.filter(mentee=mentee, module=module).exists() + + if not is_enrolled: + message = f"Mentee {mentee_handle} is not enrolled in module {module_key}" + raise ObjectDoesNotExist(message) + + return MenteeNode( + id=cast("strawberry.ID", str(mentee.id)), + login=github_user.login, + name=github_user.name or github_user.login, + avatar_url=github_user.avatar_url, + bio=github_user.bio, + experience_level=mentee.experience_level, + domains=mentee.domains, + tags=mentee.tags, + ) + + except (Module.DoesNotExist, GithubUser.DoesNotExist, Mentee.DoesNotExist) as e: + message = f"Mentee details not found: {e}" + raise ObjectDoesNotExist(message) from e + + @strawberry.field + def get_mentee_module_issues( + self, + program_key: str, + module_key: str, + mentee_handle: str, + limit: int = 20, + offset: int = 0, + ) -> list[IssueNode]: + """Get issues assigned to a mentee in a specific module.""" + try: + module = Module.objects.only("id").get(key=module_key, program__key=program_key) + + github_user = GithubUser.objects.only("id").get(login=mentee_handle) + + mentee = Mentee.objects.only("id").get(github_user=github_user) + is_enrolled = MenteeModule.objects.filter(mentee=mentee, module=module).exists() + + if not is_enrolled: + message = f"Mentee {mentee_handle} is not enrolled in module {module_key}" + raise ObjectDoesNotExist(message) + + issues_qs = ( + module.issues.filter(assignees=github_user) + .only("id", "number", "title", "state", "created_at", "url") + .prefetch_related( + Prefetch("labels", queryset=Label.objects.only("id", "name")), + Prefetch( + "assignees", + queryset=GithubUser.objects.only("id", "login", "name", "avatar_url"), + ), + ) + .order_by("-created_at") + ) + issues = issues_qs[offset : offset + limit] + + return list(issues) + + except (Module.DoesNotExist, GithubUser.DoesNotExist, Mentee.DoesNotExist) as e: + message = f"Mentee issues not found: {e}" + raise ObjectDoesNotExist(message) from e diff --git a/cspell/custom-dict.txt b/cspell/custom-dict.txt index 1ac205c684..68255f2ac9 100644 --- a/cspell/custom-dict.txt +++ b/cspell/custom-dict.txt @@ -83,6 +83,7 @@ mastg mcr mdfile mentee +menteemodule_set mentees mern millify diff --git a/frontend/src/app/mentorship/programs/[programKey]/modules/[moduleKey]/page.tsx b/frontend/src/app/mentorship/programs/[programKey]/modules/[moduleKey]/page.tsx index b5740f14dc..952d650348 100644 --- a/frontend/src/app/mentorship/programs/[programKey]/modules/[moduleKey]/page.tsx +++ b/frontend/src/app/mentorship/programs/[programKey]/modules/[moduleKey]/page.tsx @@ -1,12 +1,12 @@ 'use client' import { useQuery } from '@apollo/client' +import upperFirst from 'lodash/upperFirst' import { useParams } from 'next/navigation' import { useEffect, useState } from 'react' import { ErrorDisplay, handleAppError } from 'app/global-error' import { GET_PROGRAM_ADMINS_AND_MODULES } from 'server/queries/moduleQueries' import type { Module } from 'types/mentorship' -import { titleCaseWord } from 'utils/capitalize' import { formatDate } from 'utils/dateFormatter' import DetailsCard from 'components/CardDetailsPage' import LoadingSpinner from 'components/LoadingSpinner' @@ -49,7 +49,7 @@ const ModuleDetailsPage = () => { } const moduleDetails = [ - { label: 'Experience Level', value: titleCaseWord(module.experienceLevel) }, + { label: 'Experience Level', value: upperFirst(module.experienceLevel) }, { label: 'Start Date', value: formatDate(module.startedAt) }, { label: 'End Date', value: formatDate(module.endedAt) }, { diff --git a/frontend/src/app/my/mentorship/programs/[programKey]/modules/[moduleKey]/mentees/[menteeHandle]/page.tsx b/frontend/src/app/my/mentorship/programs/[programKey]/modules/[moduleKey]/mentees/[menteeHandle]/page.tsx new file mode 100644 index 0000000000..cd5d4fcb7e --- /dev/null +++ b/frontend/src/app/my/mentorship/programs/[programKey]/modules/[moduleKey]/mentees/[menteeHandle]/page.tsx @@ -0,0 +1,207 @@ +'use client' + +import { useQuery } from '@apollo/client' +import Image from 'next/image' +import { useParams } from 'next/navigation' +import { useEffect, useState } from 'react' +import { ErrorDisplay, handleAppError } from 'app/global-error' +import { GET_MODULE_MENTEE_DETAILS } from 'server/queries/menteeQueries' +import { Issue } from 'types/issue' +import { MenteeDetails } from 'types/mentorship' +import { LabelList } from 'components/LabelList' +import LoadingSpinner from 'components/LoadingSpinner' +import SecondaryCard from 'components/SecondaryCard' + +const MenteeProfilePage = () => { + const { programKey, moduleKey, menteeHandle } = useParams() as { + programKey: string + moduleKey: string + menteeHandle: string + } + + const [menteeDetails, setMenteeDetails] = useState(null) + const [menteeIssues, setMenteeIssues] = useState([]) + + const [isLoading, setIsLoading] = useState(true) + const [statusFilter, setStatusFilter] = useState('all') + + const { data, error } = useQuery(GET_MODULE_MENTEE_DETAILS, { + variables: { + programKey, + moduleKey, + menteeHandle, + }, + skip: !programKey || !moduleKey || !menteeHandle, + fetchPolicy: 'cache-and-network', + }) + + useEffect(() => { + if (data) { + setMenteeDetails(data.getMenteeDetails ?? null) + setMenteeIssues(data.getMenteeModuleIssues ?? []) + } + if (error) { + handleAppError(error) + } + if (data || error) { + setIsLoading(false) + } + }, [data, error]) + + if (isLoading) return + + if (!menteeDetails) { + return ( + + ) + } + + const openIssues = menteeIssues.filter((issue) => issue.state.toLowerCase() === 'open') + const closedIssues = menteeIssues.filter((issue) => issue.state.toLowerCase() === 'closed') + + const filteredIssues = + statusFilter === 'all' ? menteeIssues : statusFilter === 'open' ? openIssues : closedIssues + + return ( +
+
+ {/* Header */} + +
+ {`${menteeDetails.name +
+

+ {menteeDetails.name || menteeDetails.login} +

+

@{menteeDetails.login}

+ {menteeDetails.bio && ( +

{menteeDetails.bio}

+ )} +
+
+
+ + {/* Stats */} +
+ +
+
+ {menteeIssues.length} +
+
+
+ + +
+
+ {openIssues.length} +
+
+
+ + +
+
+ {closedIssues.length} +
+
+
+
+ + {/* Mentee Information */} +
+ +

+ No completed levels data available yet +

+
+ + +

+ No penalties data available yet +

+
+
+ + {/* Domains and Skills */} + {(menteeDetails.domains?.length > 0 || menteeDetails.tags?.length > 0) && ( +
+ {menteeDetails.domains && menteeDetails.domains.length > 0 && ( + + + + )} + + {menteeDetails.tags && menteeDetails.tags.length > 0 && ( + + + + )} +
+ )} + + {/* Issues - moved to the end */} + + {menteeIssues.length === 0 ? ( +

+ No issues assigned to this mentee in this module +

+ ) : ( +
+ {/* Filter Dropdown */} +
+ +
+ +
+ {filteredIssues.map((issue) => ( +
+ + + {issue.labels && issue.labels.length > 0 && ( +
+ +
+ )} +
+ ))} +
+
+ )} +
+
+
+ ) +} + +export default MenteeProfilePage diff --git a/frontend/src/app/my/mentorship/programs/[programKey]/modules/[moduleKey]/page.tsx b/frontend/src/app/my/mentorship/programs/[programKey]/modules/[moduleKey]/page.tsx index 7ac149c976..f348b63e15 100644 --- a/frontend/src/app/my/mentorship/programs/[programKey]/modules/[moduleKey]/page.tsx +++ b/frontend/src/app/my/mentorship/programs/[programKey]/modules/[moduleKey]/page.tsx @@ -13,7 +13,7 @@ import LoadingSpinner from 'components/LoadingSpinner' import { getSimpleDuration } from 'components/ModuleCard' const ModuleDetailsPage = () => { - const { programKey, moduleKey } = useParams() + const { programKey, moduleKey } = useParams() as { programKey: string; moduleKey: string } const [module, setModule] = useState(null) const [admins, setAdmins] = useState(null) const [isLoading, setIsLoading] = useState(true) @@ -68,8 +68,11 @@ const ModuleDetailsPage = () => { labels={module.labels} summary={module.description} mentors={module.mentors} + mentees={module.mentees} type="module" accessLevel="admin" + programKey={programKey} + entityKey={moduleKey} /> ) } diff --git a/frontend/src/components/CardDetailsPage.tsx b/frontend/src/components/CardDetailsPage.tsx index c80a667fa4..02e8e58d16 100644 --- a/frontend/src/components/CardDetailsPage.tsx +++ b/frontend/src/components/CardDetailsPage.tsx @@ -21,6 +21,7 @@ import ChapterMapWrapper from 'components/ChapterMapWrapper' import HealthMetrics from 'components/HealthMetrics' import InfoBlock from 'components/InfoBlock' import LeadersList from 'components/LeadersList' +import MenteeContributorsList from 'components/MenteeContributorsList' import MetricsScoreCircle from 'components/MetricsScoreCircle' import Milestones from 'components/Milestones' import ModuleCard from 'components/ModuleCard' @@ -46,6 +47,7 @@ const DetailsCard = ({ labels, modules, mentors, + mentees, admins, entityKey, geolocationData = null, @@ -268,6 +270,16 @@ const DetailsCard = ({ label="Mentors" /> )} + {mentees && mentees.length > 0 && ( + + )} {(type === 'project' || type === 'repository' || type === 'user' || diff --git a/frontend/src/components/MenteeContributorsList.tsx b/frontend/src/components/MenteeContributorsList.tsx new file mode 100644 index 0000000000..9517cd38d0 --- /dev/null +++ b/frontend/src/components/MenteeContributorsList.tsx @@ -0,0 +1,80 @@ +import type { IconProp } from '@fortawesome/fontawesome-svg-core' +import upperFirst from 'lodash/upperFirst' +import Image from 'next/image' +import Link from 'next/link' +import { useState } from 'react' +import type { Contributor } from 'types/contributor' +import AnchorTitle from 'components/AnchorTitle' +import SecondaryCard from 'components/SecondaryCard' +import ShowMoreButton from 'components/ShowMoreButton' + +interface MenteeContributorsListProps { + contributors: Contributor[] + label?: string + maxInitialDisplay?: number + icon?: IconProp + programKey: string + moduleKey: string +} + +const MenteeContributorsList = ({ + contributors, + label = 'Mentees', + maxInitialDisplay = 12, + icon, + programKey, + moduleKey, +}: MenteeContributorsListProps) => { + const [showAllContributors, setShowAllContributors] = useState(false) + + const toggleContributors = () => setShowAllContributors(!showAllContributors) + + const displayContributors = showAllContributors + ? contributors + : contributors.slice(0, maxInitialDisplay) + + if (contributors.length === 0) { + return null + } + + const getMenteeUrl = (login: string) => + `/my/mentorship/programs/${programKey}/modules/${moduleKey}/mentees/${login}` + + return ( + + + + } + > +
+ {displayContributors.map((item, index) => ( +
+
+ {item?.name + + {upperFirst(item.name) || upperFirst(item.login)} + +
+
+ ))} +
+ {contributors.length > maxInitialDisplay && } +
+ ) +} + +export default MenteeContributorsList diff --git a/frontend/src/components/MenteeIssues.tsx b/frontend/src/components/MenteeIssues.tsx new file mode 100644 index 0000000000..721256ece2 --- /dev/null +++ b/frontend/src/components/MenteeIssues.tsx @@ -0,0 +1,151 @@ +import { faBug, faCheckCircle, faClock } from '@fortawesome/free-solid-svg-icons' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import type React from 'react' +import { useState } from 'react' +import type { Issue } from 'types/issue' +import { formatDate } from 'utils/dateFormatter' +import SecondaryCard from 'components/SecondaryCard' + +interface MenteeIssuesProps { + openIssues: Issue[] + closedIssues: Issue[] + menteeHandle: string +} + +const MenteeIssues: React.FC = ({ openIssues, closedIssues, menteeHandle }) => { + const [activeTab, setActiveTab] = useState<'open' | 'closed'>('open') + + const getStateColor = (state: string) => { + switch (state.toLowerCase()) { + case 'open': + return 'text-green-600 bg-green-100' + case 'closed': + return 'text-red-600 bg-red-100' + case 'merged': + return 'text-purple-600 bg-purple-100' + default: + return 'text-gray-600 bg-gray-100' + } + } + + const getStateIcon = (state: string) => { + switch (state.toLowerCase()) { + case 'open': + return faBug + case 'closed': + return faCheckCircle + default: + return faClock + } + } + + const renderIssueList = (issues: Issue[], title: string) => ( +
+ {issues.length === 0 ? ( +
+ +

No {title.toLowerCase()} issues

+
+ ) : ( + issues.map((issue) => ( +
+
+
+
+ +

{issue.title}

+ + {issue.state || 'open'} + +
+ + {issue.labels && issue.labels.length > 0 && ( +
+ {issue.labels.slice(0, 3).map((label, index) => ( + + {label} + + ))} + {issue.labels.length > 3 && ( + + +{issue.labels.length - 3} more + + )} +
+ )} + +
+ #{issue.number} + Created: {formatDate(issue.createdAt)} + {issue.updatedAt && Updated: {formatDate(issue.updatedAt)}} +
+
+ + +
+
+ )) + )} +
+ ) + + return ( + + {/* Tab Navigation */} +
+ + +
+ + {/* Issue Content */} + {activeTab === 'open' + ? renderIssueList(openIssues, 'Open') + : renderIssueList(closedIssues, 'Closed')} +
+ ) +} + +export default MenteeIssues diff --git a/frontend/src/server/queries/issueQueries.ts b/frontend/src/server/queries/issueQueries.ts index b5f283c97c..873c6c06e6 100644 --- a/frontend/src/server/queries/issueQueries.ts +++ b/frontend/src/server/queries/issueQueries.ts @@ -44,6 +44,12 @@ export const GET_MODULE_ISSUE_VIEW = gql` name avatarUrl } + issueMentees(issueNumber: $number) { + id + login + name + avatarUrl + } } } ` diff --git a/frontend/src/server/queries/menteeQueries.ts b/frontend/src/server/queries/menteeQueries.ts new file mode 100644 index 0000000000..e87c81db31 --- /dev/null +++ b/frontend/src/server/queries/menteeQueries.ts @@ -0,0 +1,35 @@ +import { gql } from '@apollo/client' + +export const GET_MODULE_MENTEE_DETAILS = gql` + query GetModuleMenteeDetails($programKey: String!, $moduleKey: String!, $menteeHandle: String!) { + getMenteeDetails(programKey: $programKey, moduleKey: $moduleKey, menteeHandle: $menteeHandle) { + id + login + name + avatarUrl + bio + experienceLevel + domains + tags + } + getMenteeModuleIssues( + programKey: $programKey + moduleKey: $moduleKey + menteeHandle: $menteeHandle + limit: 50 + ) { + id + number + title + state + labels + assignees { + login + name + avatarUrl + } + createdAt + url + } + } +` diff --git a/frontend/src/server/queries/moduleQueries.ts b/frontend/src/server/queries/moduleQueries.ts index 5d4e8727e2..408178bab9 100644 --- a/frontend/src/server/queries/moduleQueries.ts +++ b/frontend/src/server/queries/moduleQueries.ts @@ -17,6 +17,12 @@ export const GET_MODULES_BY_PROGRAM = gql` login avatarUrl } + mentees { + id + login + name + avatarUrl + } } } ` @@ -39,6 +45,12 @@ export const GET_MODULE_BY_ID = gql` name avatarUrl } + mentees { + id + login + name + avatarUrl + } } } ` @@ -73,6 +85,12 @@ export const GET_PROGRAM_ADMINS_AND_MODULES = gql` name avatarUrl } + mentees { + id + login + name + avatarUrl + } } } ` diff --git a/frontend/src/types/__generated__/graphql.ts b/frontend/src/types/__generated__/graphql.ts index 08198e60fe..7285f888e9 100644 --- a/frontend/src/types/__generated__/graphql.ts +++ b/frontend/src/types/__generated__/graphql.ts @@ -208,6 +208,18 @@ export type LogoutResult = { ok: Scalars['Boolean']['output']; }; +export type MenteeNode = { + __typename?: 'MenteeNode'; + avatarUrl: Scalars['String']['output']; + bio?: Maybe; + domains?: Maybe>; + experienceLevel: Scalars['String']['output']; + id: Scalars['String']['output']; + login: Scalars['String']['output']; + name: Scalars['String']['output']; + tags?: Maybe>; +}; + export type MentorNode = { __typename?: 'MentorNode'; avatarUrl: Scalars['String']['output']; @@ -243,10 +255,12 @@ export type ModuleNode = { id: Scalars['ID']['output']; interestedUsers: Array; issueByNumber?: Maybe; + issueMentees: Array; issues: Array; issuesCount: Scalars['Int']['output']; key: Scalars['String']['output']; labels?: Maybe>; + mentees: Array; mentors: Array; name: Scalars['String']['output']; program?: Maybe; @@ -269,6 +283,11 @@ export type ModuleNodeIssueByNumberArgs = { }; +export type ModuleNodeIssueMenteesArgs = { + issueNumber: Scalars['Int']['input']; +}; + + export type ModuleNodeIssuesArgs = { label?: InputMaybe; limit?: Scalars['Int']['input']; @@ -592,6 +611,8 @@ export type Query = { apiKeys: Array; chapter?: Maybe; committee?: Maybe; + getMenteeDetails: MenteeNode; + getMenteeModuleIssues: Array; getModule: ModuleNode; getProgram: ProgramNode; getProgramModules: Array; @@ -636,6 +657,22 @@ export type QueryCommitteeArgs = { }; +export type QueryGetMenteeDetailsArgs = { + menteeHandle: Scalars['String']['input']; + moduleKey: Scalars['String']['input']; + programKey: Scalars['String']['input']; +}; + + +export type QueryGetMenteeModuleIssuesArgs = { + limit?: Scalars['Int']['input']; + menteeHandle: Scalars['String']['input']; + moduleKey: Scalars['String']['input']; + offset?: Scalars['Int']['input']; + programKey: Scalars['String']['input']; +}; + + export type QueryGetModuleArgs = { moduleKey: Scalars['String']['input']; programKey: Scalars['String']['input']; diff --git a/frontend/src/types/__generated__/issueQueries.generated.ts b/frontend/src/types/__generated__/issueQueries.generated.ts index 16fb25322d..269f0087cf 100644 --- a/frontend/src/types/__generated__/issueQueries.generated.ts +++ b/frontend/src/types/__generated__/issueQueries.generated.ts @@ -8,7 +8,7 @@ export type GetModuleIssueViewQueryVariables = Types.Exact<{ }>; -export type GetModuleIssueViewQuery = { getModule: { __typename: 'ModuleNode', id: string, taskDeadline: unknown | null, taskAssignedAt: unknown | null, issueByNumber: { __typename: 'IssueNode', id: string, number: number, title: string, body: string, url: string, state: string, isMerged: boolean, organizationName: string | null, repositoryName: string | null, labels: Array, assignees: Array<{ __typename: 'UserNode', id: string, login: string, name: string, avatarUrl: string }>, pullRequests: Array<{ __typename: 'PullRequestNode', id: string, title: string, url: string, state: string, createdAt: unknown, mergedAt: unknown | null, author: { __typename: 'UserNode', id: string, login: string, name: string, avatarUrl: string } | null }> } | null, interestedUsers: Array<{ __typename: 'UserNode', id: string, login: string, name: string, avatarUrl: string }> } }; +export type GetModuleIssueViewQuery = { getModule: { __typename: 'ModuleNode', id: string, taskDeadline: unknown | null, taskAssignedAt: unknown | null, issueByNumber: { __typename: 'IssueNode', id: string, number: number, title: string, body: string, url: string, state: string, isMerged: boolean, organizationName: string | null, repositoryName: string | null, labels: Array, assignees: Array<{ __typename: 'UserNode', id: string, login: string, name: string, avatarUrl: string }>, pullRequests: Array<{ __typename: 'PullRequestNode', id: string, title: string, url: string, state: string, createdAt: unknown, mergedAt: unknown | null, author: { __typename: 'UserNode', id: string, login: string, name: string, avatarUrl: string } | null }> } | null, interestedUsers: Array<{ __typename: 'UserNode', id: string, login: string, name: string, avatarUrl: string }>, issueMentees: Array<{ __typename: 'UserNode', id: string, login: string, name: string, avatarUrl: string }> } }; export type AssignIssueToUserMutationVariables = Types.Exact<{ programKey: Types.Scalars['String']['input']; @@ -50,7 +50,7 @@ export type ClearTaskDeadlineMutationVariables = Types.Exact<{ export type ClearTaskDeadlineMutation = { clearTaskDeadline: { __typename: 'ModuleNode', id: string } }; -export const GetModuleIssueViewDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetModuleIssueView"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"number"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getModule"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"moduleKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"taskDeadline"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueNumber"},"value":{"kind":"Variable","name":{"kind":"Name","value":"number"}}}]},{"kind":"Field","name":{"kind":"Name","value":"taskAssignedAt"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueNumber"},"value":{"kind":"Variable","name":{"kind":"Name","value":"number"}}}]},{"kind":"Field","name":{"kind":"Name","value":"issueByNumber"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"number"},"value":{"kind":"Variable","name":{"kind":"Name","value":"number"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"number"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"body"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"state"}},{"kind":"Field","name":{"kind":"Name","value":"isMerged"}},{"kind":"Field","name":{"kind":"Name","value":"organizationName"}},{"kind":"Field","name":{"kind":"Name","value":"repositoryName"}},{"kind":"Field","name":{"kind":"Name","value":"assignees"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"pullRequests"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"state"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"mergedAt"}},{"kind":"Field","name":{"kind":"Name","value":"author"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"interestedUsers"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueNumber"},"value":{"kind":"Variable","name":{"kind":"Name","value":"number"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}}]}}]}}]} as unknown as DocumentNode; +export const GetModuleIssueViewDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetModuleIssueView"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"number"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getModule"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"moduleKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"taskDeadline"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueNumber"},"value":{"kind":"Variable","name":{"kind":"Name","value":"number"}}}]},{"kind":"Field","name":{"kind":"Name","value":"taskAssignedAt"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueNumber"},"value":{"kind":"Variable","name":{"kind":"Name","value":"number"}}}]},{"kind":"Field","name":{"kind":"Name","value":"issueByNumber"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"number"},"value":{"kind":"Variable","name":{"kind":"Name","value":"number"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"number"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"body"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"state"}},{"kind":"Field","name":{"kind":"Name","value":"isMerged"}},{"kind":"Field","name":{"kind":"Name","value":"organizationName"}},{"kind":"Field","name":{"kind":"Name","value":"repositoryName"}},{"kind":"Field","name":{"kind":"Name","value":"assignees"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"pullRequests"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"url"}},{"kind":"Field","name":{"kind":"Name","value":"state"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"mergedAt"}},{"kind":"Field","name":{"kind":"Name","value":"author"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"interestedUsers"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueNumber"},"value":{"kind":"Variable","name":{"kind":"Name","value":"number"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"issueMentees"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"issueNumber"},"value":{"kind":"Variable","name":{"kind":"Name","value":"number"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}}]}}]}}]} as unknown as DocumentNode; export const AssignIssueToUserDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"AssignIssueToUser"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueNumber"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"userLogin"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"assignIssueToUser"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"moduleKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"issueNumber"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueNumber"}}},{"kind":"Argument","name":{"kind":"Name","value":"userLogin"},"value":{"kind":"Variable","name":{"kind":"Name","value":"userLogin"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; export const UnassignIssueFromUserDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UnassignIssueFromUser"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueNumber"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"userLogin"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"unassignIssueFromUser"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"moduleKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"issueNumber"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueNumber"}}},{"kind":"Argument","name":{"kind":"Name","value":"userLogin"},"value":{"kind":"Variable","name":{"kind":"Name","value":"userLogin"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; export const SetTaskDeadlineDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"SetTaskDeadline"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"issueNumber"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"deadlineAt"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"DateTime"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"setTaskDeadline"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"moduleKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"issueNumber"},"value":{"kind":"Variable","name":{"kind":"Name","value":"issueNumber"}}},{"kind":"Argument","name":{"kind":"Name","value":"deadlineAt"},"value":{"kind":"Variable","name":{"kind":"Name","value":"deadlineAt"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; diff --git a/frontend/src/types/__generated__/menteeQueries.generated.ts b/frontend/src/types/__generated__/menteeQueries.generated.ts new file mode 100644 index 0000000000..8f89004e70 --- /dev/null +++ b/frontend/src/types/__generated__/menteeQueries.generated.ts @@ -0,0 +1,14 @@ +import * as Types from './graphql'; + +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; +export type GetModuleMenteeDetailsQueryVariables = Types.Exact<{ + programKey: Types.Scalars['String']['input']; + moduleKey: Types.Scalars['String']['input']; + menteeHandle: Types.Scalars['String']['input']; +}>; + + +export type GetModuleMenteeDetailsQuery = { getMenteeDetails: { __typename: 'MenteeNode', id: string, login: string, name: string, avatarUrl: string, bio: string | null, experienceLevel: string, domains: Array | null, tags: Array | null }, getMenteeModuleIssues: Array<{ __typename: 'IssueNode', id: string, number: number, title: string, state: string, labels: Array, createdAt: unknown, url: string, assignees: Array<{ __typename: 'UserNode', login: string, name: string, avatarUrl: string }> }> }; + + +export const GetModuleMenteeDetailsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetModuleMenteeDetails"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"menteeHandle"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getMenteeDetails"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"moduleKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"menteeHandle"},"value":{"kind":"Variable","name":{"kind":"Name","value":"menteeHandle"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"bio"}},{"kind":"Field","name":{"kind":"Name","value":"experienceLevel"}},{"kind":"Field","name":{"kind":"Name","value":"domains"}},{"kind":"Field","name":{"kind":"Name","value":"tags"}}]}},{"kind":"Field","name":{"kind":"Name","value":"getMenteeModuleIssues"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"moduleKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"menteeHandle"},"value":{"kind":"Variable","name":{"kind":"Name","value":"menteeHandle"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"50"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"number"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"state"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"assignees"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"url"}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file diff --git a/frontend/src/types/__generated__/moduleQueries.generated.ts b/frontend/src/types/__generated__/moduleQueries.generated.ts index e3f3476a56..b19a656778 100644 --- a/frontend/src/types/__generated__/moduleQueries.generated.ts +++ b/frontend/src/types/__generated__/moduleQueries.generated.ts @@ -6,7 +6,7 @@ export type GetModulesByProgramQueryVariables = Types.Exact<{ }>; -export type GetModulesByProgramQuery = { getProgramModules: Array<{ __typename: 'ModuleNode', id: string, key: string, name: string, description: string, experienceLevel: Types.ExperienceLevelEnum, startedAt: unknown, endedAt: unknown, projectId: string | null, projectName: string | null, mentors: Array<{ __typename: 'MentorNode', id: string, login: string, avatarUrl: string }> }> }; +export type GetModulesByProgramQuery = { getProgramModules: Array<{ __typename: 'ModuleNode', id: string, key: string, name: string, description: string, experienceLevel: Types.ExperienceLevelEnum, startedAt: unknown, endedAt: unknown, projectId: string | null, projectName: string | null, mentors: Array<{ __typename: 'MentorNode', id: string, login: string, avatarUrl: string }>, mentees: Array<{ __typename: 'UserNode', id: string, login: string, name: string, avatarUrl: string }> }> }; export type GetModuleByIdQueryVariables = Types.Exact<{ moduleKey: Types.Scalars['String']['input']; @@ -14,7 +14,7 @@ export type GetModuleByIdQueryVariables = Types.Exact<{ }>; -export type GetModuleByIdQuery = { getModule: { __typename: 'ModuleNode', id: string, key: string, name: string, description: string, tags: Array | null, domains: Array | null, experienceLevel: Types.ExperienceLevelEnum, startedAt: unknown, endedAt: unknown, mentors: Array<{ __typename: 'MentorNode', id: string, login: string, name: string, avatarUrl: string }> } }; +export type GetModuleByIdQuery = { getModule: { __typename: 'ModuleNode', id: string, key: string, name: string, description: string, tags: Array | null, domains: Array | null, experienceLevel: Types.ExperienceLevelEnum, startedAt: unknown, endedAt: unknown, mentors: Array<{ __typename: 'MentorNode', id: string, login: string, name: string, avatarUrl: string }>, mentees: Array<{ __typename: 'UserNode', id: string, login: string, name: string, avatarUrl: string }> } }; export type GetProgramAdminsAndModulesQueryVariables = Types.Exact<{ programKey: Types.Scalars['String']['input']; @@ -22,7 +22,7 @@ export type GetProgramAdminsAndModulesQueryVariables = Types.Exact<{ }>; -export type GetProgramAdminsAndModulesQuery = { getProgram: { __typename: 'ProgramNode', id: string, admins: Array<{ __typename: 'MentorNode', id: string, login: string, name: string, avatarUrl: string }> | null }, getModule: { __typename: 'ModuleNode', id: string, key: string, name: string, description: string, tags: Array | null, labels: Array | null, projectId: string | null, projectName: string | null, domains: Array | null, experienceLevel: Types.ExperienceLevelEnum, startedAt: unknown, endedAt: unknown, mentors: Array<{ __typename: 'MentorNode', id: string, login: string, name: string, avatarUrl: string }> } }; +export type GetProgramAdminsAndModulesQuery = { getProgram: { __typename: 'ProgramNode', id: string, admins: Array<{ __typename: 'MentorNode', id: string, login: string, name: string, avatarUrl: string }> | null }, getModule: { __typename: 'ModuleNode', id: string, key: string, name: string, description: string, tags: Array | null, labels: Array | null, projectId: string | null, projectName: string | null, domains: Array | null, experienceLevel: Types.ExperienceLevelEnum, startedAt: unknown, endedAt: unknown, mentors: Array<{ __typename: 'MentorNode', id: string, login: string, name: string, avatarUrl: string }>, mentees: Array<{ __typename: 'UserNode', id: string, login: string, name: string, avatarUrl: string }> } }; export type GetModuleIssuesQueryVariables = Types.Exact<{ programKey: Types.Scalars['String']['input']; @@ -36,7 +36,7 @@ export type GetModuleIssuesQueryVariables = Types.Exact<{ export type GetModuleIssuesQuery = { getModule: { __typename: 'ModuleNode', name: string, issuesCount: number, availableLabels: Array, issues: Array<{ __typename: 'IssueNode', id: string, number: number, title: string, state: string, isMerged: boolean, labels: Array, assignees: Array<{ __typename: 'UserNode', avatarUrl: string, login: string, name: string }> }> } }; -export const GetModulesByProgramDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetModulesByProgram"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getProgramModules"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"experienceLevel"}},{"kind":"Field","name":{"kind":"Name","value":"startedAt"}},{"kind":"Field","name":{"kind":"Name","value":"endedAt"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"projectName"}},{"kind":"Field","name":{"kind":"Name","value":"mentors"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}}]}}]}}]} as unknown as DocumentNode; -export const GetModuleByIdDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetModuleByID"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getModule"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"moduleKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"tags"}},{"kind":"Field","name":{"kind":"Name","value":"domains"}},{"kind":"Field","name":{"kind":"Name","value":"experienceLevel"}},{"kind":"Field","name":{"kind":"Name","value":"startedAt"}},{"kind":"Field","name":{"kind":"Name","value":"endedAt"}},{"kind":"Field","name":{"kind":"Name","value":"mentors"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}}]}}]}}]} as unknown as DocumentNode; -export const GetProgramAdminsAndModulesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetProgramAdminsAndModules"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getProgram"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"admins"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"getModule"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"moduleKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"tags"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"projectName"}},{"kind":"Field","name":{"kind":"Name","value":"domains"}},{"kind":"Field","name":{"kind":"Name","value":"experienceLevel"}},{"kind":"Field","name":{"kind":"Name","value":"startedAt"}},{"kind":"Field","name":{"kind":"Name","value":"endedAt"}},{"kind":"Field","name":{"kind":"Name","value":"mentors"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}}]}}]}}]} as unknown as DocumentNode; +export const GetModulesByProgramDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetModulesByProgram"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getProgramModules"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"experienceLevel"}},{"kind":"Field","name":{"kind":"Name","value":"startedAt"}},{"kind":"Field","name":{"kind":"Name","value":"endedAt"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"projectName"}},{"kind":"Field","name":{"kind":"Name","value":"mentors"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mentees"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}}]}}]}}]} as unknown as DocumentNode; +export const GetModuleByIdDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetModuleByID"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getModule"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"moduleKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"tags"}},{"kind":"Field","name":{"kind":"Name","value":"domains"}},{"kind":"Field","name":{"kind":"Name","value":"experienceLevel"}},{"kind":"Field","name":{"kind":"Name","value":"startedAt"}},{"kind":"Field","name":{"kind":"Name","value":"endedAt"}},{"kind":"Field","name":{"kind":"Name","value":"mentors"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mentees"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}}]}}]}}]} as unknown as DocumentNode; +export const GetProgramAdminsAndModulesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetProgramAdminsAndModules"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getProgram"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"admins"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"getModule"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"moduleKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"key"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"tags"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"projectId"}},{"kind":"Field","name":{"kind":"Name","value":"projectName"}},{"kind":"Field","name":{"kind":"Name","value":"domains"}},{"kind":"Field","name":{"kind":"Name","value":"experienceLevel"}},{"kind":"Field","name":{"kind":"Name","value":"startedAt"}},{"kind":"Field","name":{"kind":"Name","value":"endedAt"}},{"kind":"Field","name":{"kind":"Name","value":"mentors"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"mentees"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}}]}}]}}]}}]} as unknown as DocumentNode; export const GetModuleIssuesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetModuleIssues"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"20"}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"0"}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"label"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"getModule"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"moduleKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"moduleKey"}}},{"kind":"Argument","name":{"kind":"Name","value":"programKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"programKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"issuesCount"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"label"},"value":{"kind":"Variable","name":{"kind":"Name","value":"label"}}}]},{"kind":"Field","name":{"kind":"Name","value":"availableLabels"}},{"kind":"Field","name":{"kind":"Name","value":"issues"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}},{"kind":"Argument","name":{"kind":"Name","value":"label"},"value":{"kind":"Variable","name":{"kind":"Name","value":"label"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"number"}},{"kind":"Field","name":{"kind":"Name","value":"title"}},{"kind":"Field","name":{"kind":"Name","value":"state"}},{"kind":"Field","name":{"kind":"Name","value":"isMerged"}},{"kind":"Field","name":{"kind":"Name","value":"labels"}},{"kind":"Field","name":{"kind":"Name","value":"assignees"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"avatarUrl"}},{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file diff --git a/frontend/src/types/card.ts b/frontend/src/types/card.ts index d0fd51b200..02986741fd 100644 --- a/frontend/src/types/card.ts +++ b/frontend/src/types/card.ts @@ -55,6 +55,7 @@ export interface DetailsCardProps { setStatus?: (newStatus: string) => void canUpdateStatus?: boolean mentors?: Contributor[] + mentees?: Contributor[] admins?: Contributor[] projectName?: string programKey?: string diff --git a/frontend/src/types/mentorship.ts b/frontend/src/types/mentorship.ts index 842dca207b..4449347d45 100644 --- a/frontend/src/types/mentorship.ts +++ b/frontend/src/types/mentorship.ts @@ -57,6 +57,7 @@ export type Module = { status: ProgramStatusEnum experienceLevel: ExperienceLevelEnum mentors: Contributor[] + mentees?: Contributor[] startedAt: string endedAt: string domains: string[] @@ -77,3 +78,48 @@ export type ModuleFormData = { projectId: string mentorLogins: string } + +import type { Issue } from 'types/issue' + +export type CompletedLevel = { + id: string + name: string + level: number + completedAt: string + stack: string + description: string +} + +export type Achievement = { + id: string + name: string + description: string + earnedAt: string + type: string + points: number +} + +export type Penalty = { + id: string + reason: string + points: number + createdAt: string + status: string + description: string +} + +export type MenteeDetails = { + id: string + login: string + name: string + avatarUrl: string + email?: string + bio?: string + domains?: string[] + tags?: string[] + completedLevels: CompletedLevel[] + achievements: Achievement[] + penalties: Penalty[] + openIssues: Issue[] + closedIssues: Issue[] +}