Skip to content

[INTW26] Implement Interview Scheduling Feature#263

Open
chene0 wants to merge 13 commits intostagingfrom
INTW26-interview-scheduling-feature
Open

[INTW26] Implement Interview Scheduling Feature#263
chene0 wants to merge 13 commits intostagingfrom
INTW26-interview-scheduling-feature

Conversation

@chene0
Copy link
Copy Markdown
Member

@chene0 chene0 commented Apr 11, 2026

Notion ticket link

Implement Interview Scheduling Feature

Implementation description

  • Implement the interview scheduling page at route /interview-groups?interviewGroupId=<interviewGroupId> using the existing SplitPageLayout.tsx component
  • Hook the submit button to call backend graphql mutator updateInterviewGroup setting input scheduling link and status to "Ready for Invite"
  • Hook page to load information for the interview partner using backend graphql query getInterviewersByGroupId
  • Hook page to load information for the interviewed applicants using the backend graphql query getInterviewedApplicantsByGroupId

Steps to test

  1. On website-bp-be, pull and checkout branch INTW26-interview-scheduling-feature and start the backend with docker compose up then run migrations with docker exec recruitment_tools_backend node migrate up
  2. In pgAdmin run the following queries
CREATE EXTENSION IF NOT EXISTS pgcrypto;
INSERT INTO public.interviewed_applicant_records (id, "applicantRecordId", status, "createdAt", "updatedAt")
SELECT
	gen_random_uuid(),
	id,
	'NeedsReview',
	NOW(),
	NOW()
FROM public.applicant_records
ON CONFLICT ("applicantRecordId") DO NOTHING;
  1. On localhost:5000/graphql call the following mutator and copy one of the returns groupIds
mutation DelegateInterviewers {
    delegateInterviewers(positions: ["VP Engineering"]) {
        interviewedApplicantRecordId
        interviewerId
        interviewHasConflict
        groupId
    }
}
  1. Note the column values of the groupId with the following query
query GetInterviewGroup {
    getInterviewGroup(id: "<copied_group_id>") {
        id
        schedulingLink
        status
    }
}
  1. Start the frontend with npm run dev
  2. Login through localhost:3000/admin, then navigate to localhost:3000/interview-groups?interviewGroupId=<copied_group_id>
  3. Type something in the "Paste link here" text input and press submit
  4. Call the same query in step 3, confirm the schedulingLink field updated to what you input and the status is now "Ready to Interview"

What should reviewers focus on?

  • Page loads with correct applicant and interview partner info (rn theres no check if currently authed user is one of the interview partners, so frontend takes one of the found interview partners for functionality testing for now)
  • Page loads with existing schedulingLink after submission, resubmission updates successfully
  • Unable to submit empty link

Checklist

  • My PR name is descriptive and in imperative tense
  • My commit messages are descriptive and in imperative tense. My commits are atomic and trivial commits are squashed or fixup'd into non-trivial commits
  • I have run the appropriate linter(s)
  • I have requested a review from the PL, as well as other devs who have background knowledge on this PR or who will be building on top of this PR

gridTemplateColumns: `${leftWidth ? `${leftWidth}px` : "1fr"} ${
rightWidth ? `${rightWidth}px` : "1fr"
gridTemplateColumns: `${leftWidth ? `${leftWidth}fr` : "1fr"} ${
rightWidth ? `${rightWidth}fr` : "1fr"
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

replaced px with fr such that component scales horizontally to parent

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@mxc-maggiechen what we thinking about this one, seems interesting

@chene0 chene0 changed the title Intw26 interview scheduling feature [INTW26] Interview Scheduling Feature Apr 19, 2026
@chene0 chene0 changed the title [INTW26] Interview Scheduling Feature [INTW26] Implement Interview Scheduling Feature Apr 19, 2026
@chene0 chene0 marked this pull request as ready for review April 19, 2026 19:23
Comment thread APIClients/InterviewGroupAPIClient.ts Outdated
import { fetchGraphql } from "@utils/makegqlrequest";
import { queries, mutations } from "graphql/queries";

const InterviewGroupStatusEnum = {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Rename as this is not an enum (please don't use an enum either it's a typescript anti pattern)

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

changed to InterviewGroupStatus

gridTemplateColumns: `${leftWidth ? `${leftWidth}px` : "1fr"} ${
rightWidth ? `${rightWidth}px` : "1fr"
gridTemplateColumns: `${leftWidth ? `${leftWidth}fr` : "1fr"} ${
rightWidth ? `${rightWidth}fr` : "1fr"
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

@mxc-maggiechen what we thinking about this one, seems interesting

Comment thread components/icons/edit.icon.tsx Outdated
@@ -0,0 +1,19 @@
import { ReactElement } from "react";
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

please name files in accordance with current codebase patterns (EditIcon.tsx)

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

i think the icon files all follow the .icon.tsx naming pattern at least under components/icons/

Comment thread components/icons/edit.icon.tsx Outdated
@@ -0,0 +1,19 @@
import { ReactElement } from "react";

export const EditIcon = (): ReactElement => (
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

you don't need to type the return type we can just have export const EditIcon = () => {}

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

fixed

Comment thread pages/interview-groups/index.tsx Outdated
const [isEditing, setIsEditing] = useState(false);

const interviewGroupId = router.isReady
? (router.query.interviewGroupId as string)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

why we using type assertions?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

i think nextjs types router.query.interviewGroupId as string | string[] | undefined

moved type narrowing logic to ternary


// TODO: handle error state (e.g. show inline error message if a fetch fails)
// // once the codebase has an error handler
useEffect(() => {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

lets see if we can figure out a way to not use a use effect here ....

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

are you suggesting getServerSideProps

@SaqAsh SaqAsh self-assigned this May 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants