Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
112 changes: 112 additions & 0 deletions src/api/hacker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
APIRoute,
CACHE_HACKER_KEY,
CACHE_STATS_KEY,
HackerReviewerStatus,
HackerStatus,
IHacker,
IResumeResponse,
Expand All @@ -22,6 +23,12 @@ class HackerAPI {
API.createEntity(APIRoute.HACKER_CHECKIN);
API.createEntity(APIRoute.HACKER);
API.createEntity(APIRoute.HACKER_STATUS);
API.createEntity(APIRoute.HACKER_REVIEWER_STATUS);
API.createEntity(APIRoute.HACKER_REVIEWER_STATUS2);
API.createEntity(APIRoute.HACKER_REVIEWER_NAME);
API.createEntity(APIRoute.HACKER_REVIEWER_NAME2);
API.createEntity(APIRoute.HACKER_REVIEWER_COMMENTS);
API.createEntity(APIRoute.HACKER_REVIEWER_COMMENTS2);
}
/**
* Create an account.
Expand Down Expand Up @@ -114,6 +121,111 @@ class HackerAPI {
return value;
}

/**
* Assign reviewers to hackers
*/
public assignReviewers(): AxiosPromise {
const value = API.getEndpoint(APIRoute.HACKER).create({},{subURL: 'assignReviewers'});
LocalCache.remove(CACHE_HACKER_KEY);
return value;
}

/**
* Update's a hacker's reviewer status any status to any status of type HackerReviewerStatus
* @param {String} id The id of the hacker to be updated
* @param {HackerReviewerStatus} reviewerStatus The new status of the hacker
*/
public updateReviewerStatus(id: string, reviewerStatus: HackerReviewerStatus): AxiosPromise {
const key = CACHE_HACKER_KEY + '-' + id;
const value = API.getEndpoint(APIRoute.HACKER_REVIEWER_STATUS).patch(
{ id },
{ reviewerStatus }
);
LocalCache.remove(CACHE_HACKER_KEY);
LocalCache.remove(key);
return value;
}

/**
* Update's a hacker's reviewer status (2nd) any status to any status of type HackerReviewerStatus
* @param {String} id The id of the hacker to be updated
* @param {HackerReviewerStatus} reviewerStatus2 The new status of the hacker
*/
public updateReviewerStatus2(id: string, reviewerStatus2: HackerReviewerStatus): AxiosPromise {
const key = CACHE_HACKER_KEY + '-' + id;
const value = API.getEndpoint(APIRoute.HACKER_REVIEWER_STATUS2).patch(
{ id },
{ reviewerStatus2 }
);
LocalCache.remove(CACHE_HACKER_KEY);
LocalCache.remove(key);
return value;
}

/**
* Update's a hacker's reviewer name to any name of type string
* @param {String} id The id of the hacker to be updated
* @param {String} reviewerName The new status of the hacker
*/
public updateReviewerName(id: string, reviewerName: string): AxiosPromise {
const key = CACHE_HACKER_KEY + '-' + id;
const value = API.getEndpoint(APIRoute.HACKER_REVIEWER_NAME).patch(
{ id },
{ reviewerName }
);
LocalCache.remove(CACHE_HACKER_KEY);
LocalCache.remove(key);
return value;
}

/**
* Update's a hacker's reviewer name 2 to any name of type string
* @param {String} id The id of the hacker to be updated
* @param {String} reviewerName2 The new status of the hacker
*/
public updateReviewerName2(id: string, reviewerName2: string): AxiosPromise {
const key = CACHE_HACKER_KEY + '-' + id;
const value = API.getEndpoint(APIRoute.HACKER_REVIEWER_NAME2).patch(
{ id },
{ reviewerName2 }
);
LocalCache.remove(CACHE_HACKER_KEY);
LocalCache.remove(key);
return value;
}

/**
* Update's a hacker's reviewer comments to any name of type string
* @param {String} id The id of the hacker to be updated
* @param {String} reviewerComments The new status of the hacker
*/
public updateReviewerComments(id: string, reviewerComments: string): AxiosPromise {
const key = CACHE_HACKER_KEY + '-' + id;
const value = API.getEndpoint(APIRoute.HACKER_REVIEWER_COMMENTS).patch(
{ id },
{ reviewerComments }
);
LocalCache.remove(CACHE_HACKER_KEY);
LocalCache.remove(key);
return value;
}

/**
* Update's a hacker's reviewer comments to any name of type string
* @param {String} id The id of the hacker to be updated
* @param {String} reviewerComments2 The new status of the hacker
*/
public updateReviewerComments2(id: string, reviewerComments2: string): AxiosPromise {
const key = CACHE_HACKER_KEY + '-' + id;
const value = API.getEndpoint(APIRoute.HACKER_REVIEWER_COMMENTS2).patch(
{ id },
{ reviewerComments2 }
);
LocalCache.remove(CACHE_HACKER_KEY);
LocalCache.remove(key);
return value;
}

/**
* Update's a hacker's status to checked-in if the hacker is accepted or confirmed.
* @param {String} id The id of the hacker to be updated
Expand Down
6 changes: 6 additions & 0 deletions src/config/APIRoute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ export enum APIRoute {
HACKER_SELF = 'hacker/self',
HACKER_STATS = 'hacker/stats',
HACKER_STATUS = 'hacker/status',
HACKER_REVIEWER_STATUS = 'hacker/reviewerStatus',
HACKER_REVIEWER_STATUS2 = 'hacker/reviewerStatus2',
HACKER_REVIEWER_NAME = 'hacker/reviewerName',
HACKER_REVIEWER_NAME2 = 'hacker/reviewerName2',
HACKER_REVIEWER_COMMENTS = 'hacker/reviewerComments',
HACKER_REVIEWER_COMMENTS2 = 'hacker/reviewerComments2',
// Travel routes
TRAVEL = 'travel',
TRAVEL_EMAIL = 'travel/email',
Expand Down
10 changes: 10 additions & 0 deletions src/config/hackerReviewerStatus.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
export enum HackerReviewerStatus {
HACKER_REVIEWER_STATUS_NONE = 'None',
HACKER_REVIEWER_STATUS_POOR = 'Poor',
HACKER_REVIEWER_STATUS_WEAK = 'Weak',
HACKER_REVIEWER_STATUS_AVERAGE = 'Average',
HACKER_REVIEWER_STATUS_STRONG = 'Strong',
HACKER_REVIEWER_STATUS_OUTSTANDING = 'Outstanding',
HACKER_REVIEWER_STATUS_WHITELIST = 'Whitelist',
}
export default HackerReviewerStatus;
2 changes: 2 additions & 0 deletions src/config/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export * from './frontendRoutes';
export * from './genders';
export * from './gradYears';
export * from './hackerStatus';
export * from './hackerReviewerStatus';
export * from './inviteInfo';
export * from './jobInterests';
export * from './majors';
Expand All @@ -29,3 +30,4 @@ export * from './travel';
export * from './userTypes';
export * from './validationError';
export * from './pageType';
export * from './reviewers'
48 changes: 48 additions & 0 deletions src/config/reviewers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
export const reviewers = [
'',
'Amy',
'Carolyn',
'Clara',
'Debo',
'Deon',
'Doaa',
'Emily',
'Emma',
'Ethan',
'Evan',
'Finnley',
'Gabriel',
'Ian',
'Inaya',
'Jake',
'Jamie',
'Jane J.',
'Jane K.',
'Jeffrey',
'Joshua',
'Jyothsna',
'Khyati',
'Michael',
'Mika',
'Mubeen',
'Mira',
'Oishika',
'Olivia',
'Qi',
'Rémi',
'Sebastian',
'Shirley',
'Sihan',
'Siva',
'Snigdha',
'Stephanie',
'Tavi',
'Tina',
'Vipul',
'Yue Qian',
];

export const reviewerOptions = reviewers.map((reviewer) => ({
label: reviewer,
value: reviewer,
}));
7 changes: 7 additions & 0 deletions src/config/statsResponse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
AttendenceOptions,
DietaryRestriction,
HackerStatus,
HackerReviewerStatus,
JobInterest,
ShirtSize,
} from '.';
Expand All @@ -10,6 +11,12 @@ export interface IStatsResponse {
stats: {
total: number;
status: { [key in HackerStatus]: number };
reviewerStatus: { [key in HackerReviewerStatus]: number };
reviewerStatus2: { [key in HackerReviewerStatus]: number };
reviewerName: { [key: string]: number };
reviewerName2: { [key: string]: number };
reviewerComments: { [key: string]: number };
reviewerComments2: { [key: string]: number };
school: { [key: string]: number };
degree: { [key: string]: number };
gender: { [key: string]: number };
Expand Down
7 changes: 7 additions & 0 deletions src/config/userTypes.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import HackerStatus from './hackerStatus';
import HackerReviewerStatus from './hackerReviewerStatus';
import { ITeam } from './team';

export interface IAccount {
Expand Down Expand Up @@ -34,6 +35,12 @@ export interface IHacker {
id: string;
accountId: string | IAccount; // for querying account as well
status: HackerStatus;
reviewerStatus: HackerReviewerStatus;
reviewerStatus2: HackerReviewerStatus;
reviewerName: string;
reviewerName2: string;
reviewerComments: string;
reviewerComments2: string;
application: {
general: {
school: string;
Expand Down
13 changes: 13 additions & 0 deletions src/features/Application/ManageApplicationForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import {
Degrees,
FrontendRoute,
HackerStatus,
HackerReviewerStatus,
IEthnicity,
IHacker,
ISetting,
Expand Down Expand Up @@ -86,6 +87,12 @@ const ManageApplicationForm: React.FunctionComponent<
id: '',
accountId: '',
status: HackerStatus.HACKER_STATUS_NONE,
reviewerStatus: HackerReviewerStatus.HACKER_REVIEWER_STATUS_NONE,
reviewerStatus2: HackerReviewerStatus.HACKER_REVIEWER_STATUS_NONE,
reviewerName: '',
reviewerName2: '',
reviewerComments: '',
reviewerComments2: '',
application: {
general: {
school: '',
Expand Down Expand Up @@ -1314,6 +1321,12 @@ const ManageApplicationForm: React.FunctionComponent<
id: hackerId,
accountId,
status: HackerStatus.HACKER_STATUS_NONE,
reviewerStatus: HackerReviewerStatus.HACKER_REVIEWER_STATUS_NONE,
reviewerStatus2: HackerReviewerStatus.HACKER_REVIEWER_STATUS_NONE,
reviewerName: '',
reviewerName2: '',
reviewerComments: '',
reviewerComments2: '',
application: values.hacker.application,
};

Expand Down
65 changes: 63 additions & 2 deletions src/features/Dashboard/HackerDashboard.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { useEffect, useState } from 'react';
import { Account } from '../../api';
import Hacker from '../../api/hacker';
import { HackerStatus, IAccount } from '../../config';
import { HackerStatus, HackerReviewerStatus, IAccount } from '../../config';
import WithToasterContainer from '../../shared/HOC/withToaster';
import { isConfirmed } from '../../util';
import StatusCTAContainer from '../Status/StatusCTAContainer';
Expand All @@ -15,6 +15,19 @@ const HackerDashboard: React.FC = () => {
HackerStatus.HACKER_STATUS_NONE
);

const [reviewerStatus, setReviewerStatus] = useState<HackerReviewerStatus>(
HackerReviewerStatus.HACKER_REVIEWER_STATUS_NONE
);
const [reviewerStatus2, setReviewerStatus2] = useState<HackerReviewerStatus>(
HackerReviewerStatus.HACKER_REVIEWER_STATUS_NONE
);

const [reviewerName, setReviewerName] = useState<string>('');
const [reviewerName2, setReviewerName2] = useState<string>('');

const [reviewerComments, setReviewerComments] = useState<string>('');
const [reviewerComments2, setReviewerComments2] = useState<string>('');

// Is the currently logged in hacker confirmed as attending event?
const [confirmed, setConfirmed] = useState<boolean>(false);

Expand All @@ -41,6 +54,54 @@ const HackerDashboard: React.FC = () => {
}
}

// Set hacker reviewer status
try {
const response = await Hacker.getSelf();
setReviewerStatus(response.data.data.reviewerStatus);
} catch (e: any) {
setReviewerStatus(HackerReviewerStatus.HACKER_REVIEWER_STATUS_NONE);
}

// Set hacker reviewer status 2
try {
const response = await Hacker.getSelf();
setReviewerStatus2(response.data.data.reviewerStatus2);
} catch (e: any) {
setReviewerStatus2(HackerReviewerStatus.HACKER_REVIEWER_STATUS_NONE);
}

// Set hacker reviewer name
try {
const response = await Hacker.getSelf();
setReviewerName(response.data.data.reviewerName);
} catch (e: any) {
setReviewerName('');
}

// Set hacker reviewer name 2
try {
const response = await Hacker.getSelf();
setReviewerName2(response.data.data.reviewerName2);
} catch (e: any) {
setReviewerName2('');
}

// Set hacker reviewer comments
try {
const response = await Hacker.getSelf();
setReviewerComments(response.data.data.reviewerComments);
} catch (e: any) {
setReviewerComments('');
}

// Set hacker reviewer comments 2
try {
const response = await Hacker.getSelf();
setReviewerComments2(response.data.data.reviewerComments2);
} catch (e: any) {
setReviewerComments2('');
}

// Check if hacker is confirmed
try {
setConfirmed(await isConfirmed());
Expand All @@ -55,7 +116,7 @@ const HackerDashboard: React.FC = () => {

// this will prevent loading the default confirm email component page if the componentDidMount has not finished it's async methods
return isLoaded ? (
<StatusCTAContainer {...{ account, status, confirmed }} />
<StatusCTAContainer {...{ account, status, confirmed }} /> // reviewerStatus
) : null;
};

Expand Down
Loading