Skip to content

Commit d5eaad3

Browse files
committed
feat(getcloser): implement team member info
1 parent 3a54fce commit d5eaad3

File tree

4 files changed

+42
-28
lines changed

4 files changed

+42
-28
lines changed

โ€Žgetcloser/frontend/src/app/pages/Page3.tsxโ€Ž

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import React, { useEffect, useState } from 'react';
55
import { useFormStore } from '../../store/formStore';
66
import { authenticatedFetch } from '../../lib/api';
77
import { useNavigationStore } from '../../store/navigationStore';
8+
import { questions } from '@/lib/constants';
89

910
interface TeamMember {
1011
id: number;
@@ -15,17 +16,11 @@ interface TeamMember {
1516
linkedin_url?: string;
1617
}
1718

18-
const questions = [
19-
{ category: '1', keyword: '๊ด€์‹ฌ์‚ฌ', problem: '๋‹˜์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋งž์ถฐ์ฃผ์„ธ์š”.', options: [ 'Agentic AI', 'AI Ethics', 'AI Security', 'Causal Inference', 'Computer Graphics', 'Computer Vision', 'Efficient AI', 'LLM/Multimodal', 'Physical AI', 'XAI' ] },
20-
{ category: '2', keyword: '๊ณ„์ ˆ', problem: '๋‹˜์ด ์ข‹์•„ํ•˜๋Š” ๊ณ„์ ˆ์„ ๋งž์ถฐ์ฃผ์„ธ์š”.', options: ['๋ด„', '์—ฌ๋ฆ„', '๊ฐ€์„', '๊ฒจ์šธ'] },
21-
{ category: '3', keyword: 'MBTI', problem: '๋‹˜์˜ MBTI ์œ ํ˜•์„ ๋งž์ถฐ์ฃผ์„ธ์š”.', options: ['INFP', 'ENFP', 'INFJ', 'ENFJ', 'INTJ', 'ENTJ', 'INTP', 'ENTP', 'ISFP', 'ESFP', 'ISTP', 'ESTP', 'ISFJ', 'ESFJ', 'ISTJ', 'ESTJ'] },
22-
];
23-
2419
interface QuestionInfo {
25-
category: string;
26-
keyword: string;
27-
problem: string;
28-
options: string[];
20+
category: string;
21+
keyword: string;
22+
problem: string;
23+
options: string[];
2924
}
3025

3126
const getJsonFromResponse = async (response: Response) => {
@@ -52,7 +47,7 @@ export default function Page3() {
5247
// Still need to set the question info for rendering options
5348
if (!currentQuestionInfo) {
5449
const loadedQuestionCategory = questions.find(q => question.includes(q.problem));
55-
if(loadedQuestionCategory) {
50+
if (loadedQuestionCategory) {
5651
setCurrentQuestionInfo(loadedQuestionCategory as QuestionInfo); // Cast to QuestionInfo
5752
}
5853
}

โ€Žgetcloser/frontend/src/app/pages/Page4.tsxโ€Ž

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { authenticatedFetch } from '../../lib/api';
77
import { useFormStore } from '../../store/formStore';
88
import { useNavigationStore } from '../../store/navigationStore';
99
import Modal from '@/components/Modal';
10+
import { questions } from '@/lib/constants';
1011

1112
// Assuming a TeamMember interface for better typing
1213
interface TeamMember {
@@ -19,16 +20,16 @@ interface TeamMember {
1920
}
2021

2122
interface TeamData {
22-
id: number;
23-
team_id: number;
24-
name: string;
25-
members: TeamMember[];
23+
id: number;
24+
team_id: number;
25+
name: string;
26+
members: TeamMember[];
2627
}
2728

2829
interface ChallengeResult {
2930
user_id: number;
3031
question: string;
31-
user_answer: string;
32+
user_answer?: string;
3233
correct_answer: string;
3334
is_correct: boolean;
3435
}
@@ -229,12 +230,12 @@ export default function Page4() {
229230
<p className="text-lg font-semibold">{member.name}</p>
230231
{member.github_url && (
231232
<p className="text-sm text-gray-600">
232-
GitHub: <a href={member.github_url} target="_blank" rel="noopener noreferrer" className="text-blue-500 hover:underline">{member.github_url}</a>
233+
GitHub: <a href={member.github_url} target="_blank" rel="noopener noreferrer" className="text-blue-500 hover:underline" onClick={(e) => e.stopPropagation()}>{member.github_url}</a>
233234
</p>
234235
)}
235236
{member.linkedin_url && (
236237
<p className="text-sm text-gray-600">
237-
LinkedIn: <a href={member.linkedin_url} target="_blank" rel="noopener noreferrer" className="text-blue-500 hover:underline">{member.linkedin_url}</a>
238+
LinkedIn: <a href={member.linkedin_url} target="_blank" rel="noopener noreferrer" className="text-blue-500 hover:underline" onClick={(e) => e.stopPropagation()}>{member.linkedin_url}</a>
238239
</p>
239240
)}
240241
</div>
@@ -253,18 +254,28 @@ export default function Page4() {
253254
</div>
254255
<Modal
255256
isOpen={isModalOpen}
256-
title="Challenge Result"
257+
title={selectedMemberChallenge && teamData ? teamData.members.find(m => m.user_id === selectedMemberChallenge.user_id)?.name || 'Challenge Result' : 'Challenge Result'}
257258
content={
258259
selectedMemberChallenge
259260
? `
260-
<p class="mb-2"><strong>Question:</strong> ${selectedMemberChallenge.question}</p>
261-
<p class="mb-1"><strong>Your Answer:</strong> <span class="${selectedMemberChallenge.is_correct ? 'text-green-400' : 'text-red-400'}">${selectedMemberChallenge.user_answer}</span></p>
261+
<p class="mb-2"><strong>Question:</strong> ${(() => {
262+
const memberName = teamData?.members.find(m => m.user_id === selectedMemberChallenge.user_id)?.name || '';
263+
const questionInfo = questions.find(q => q.category === selectedMemberChallenge.question);
264+
const questionText = questionInfo ? questionInfo.problem : selectedMemberChallenge.question;
265+
return `${memberName} ${questionText}`;
266+
})()}</p>
267+
<p class="mb-2"><strong>Keyword:</strong> ${(() => {
268+
const questionInfo = questions.find(q => q.category === selectedMemberChallenge.question);
269+
return questionInfo ? questionInfo.keyword : 'Unknown';
270+
})()}</p>
271+
<p class="mb-1"><strong>Your Answer:</strong> <span class="${selectedMemberChallenge.is_correct ? 'text-green-400' : 'text-red-400'}">${selectedMemberChallenge.user_answer || (selectedMemberChallenge.is_correct ? selectedMemberChallenge.correct_answer : 'Unknown')}</span></p>
262272
${!selectedMemberChallenge.is_correct ? `<p class="mb-2"><strong>Correct Answer:</strong> <span class="text-green-400">${selectedMemberChallenge.correct_answer}</span></p>` : ''}
263273
`
264274
: ''
265275
}
266276
onConfirm={() => setIsModalOpen(false)}
267277
onDoNotShowAgain={() => setIsModalOpen(false)}
278+
showDoNotShowAgain={false}
268279
/>
269280
</div>
270281
);

โ€Žgetcloser/frontend/src/components/Modal.tsxโ€Ž

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ interface ModalProps {
88
onConfirm: () => void;
99
onDoNotShowAgain: () => void;
1010
isOpen: boolean;
11+
showDoNotShowAgain?: boolean;
1112
}
1213

13-
const Modal: React.FC<ModalProps> = ({ title, content, onConfirm, onDoNotShowAgain, isOpen }) => {
14+
const Modal: React.FC<ModalProps> = ({ title, content, onConfirm, onDoNotShowAgain, isOpen, showDoNotShowAgain = true }) => {
1415
if (!isOpen) return null;
1516

1617
return (
@@ -19,12 +20,14 @@ const Modal: React.FC<ModalProps> = ({ title, content, onConfirm, onDoNotShowAga
1920
<h2 className="text-xl font-bold mb-4">{title}</h2>
2021
<p className="mb-6" dangerouslySetInnerHTML={{ __html: content }}></p>
2122
<div className="flex justify-end space-x-4">
22-
<button
23-
onClick={onDoNotShowAgain}
24-
className="px-4 py-2 rounded hover:bg-secondary/80"
25-
>
26-
๋‹ค์‹œ ๋ณด์ง€ ์•Š๊ธฐ
27-
</button>
23+
{showDoNotShowAgain && (
24+
<button
25+
onClick={onDoNotShowAgain}
26+
className="px-4 py-2 rounded hover:bg-secondary/80"
27+
>
28+
๋‹ค์‹œ ๋ณด์ง€ ์•Š๊ธฐ
29+
</button>
30+
)}
2831
<button
2932
onClick={onConfirm}
3033
className="px-4 py-2 rounded hover:bg-primary/80"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export const questions = [
2+
{ category: '1', keyword: '๊ด€์‹ฌ์‚ฌ', problem: '๋‹˜์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋งž์ถฐ์ฃผ์„ธ์š”.', options: ['Agentic AI', 'AI Ethics', 'AI Security', 'Causal Inference', 'Computer Graphics', 'Computer Vision', 'Efficient AI', 'LLM/Multimodal', 'Physical AI', 'XAI'] },
3+
{ category: '2', keyword: '๊ณ„์ ˆ', problem: '๋‹˜์ด ์ข‹์•„ํ•˜๋Š” ๊ณ„์ ˆ์„ ๋งž์ถฐ์ฃผ์„ธ์š”.', options: ['๋ด„', '์—ฌ๋ฆ„', '๊ฐ€์„', '๊ฒจ์šธ'] },
4+
{ category: '3', keyword: 'MBTI', problem: '๋‹˜์˜ MBTI ์œ ํ˜•์„ ๋งž์ถฐ์ฃผ์„ธ์š”.', options: ['INFP', 'ENFP', 'INFJ', 'ENFJ', 'INTJ', 'ENTJ', 'INTP', 'ENTP', 'ISFP', 'ESFP', 'ISTP', 'ESTP', 'ISFJ', 'ESFJ', 'ISTJ', 'ESTJ'] },
5+
];

0 commit comments

Comments
ย (0)