From d97ffc9837182aa1267d164796c91a01da2d718a Mon Sep 17 00:00:00 2001 From: Joey Yakimowich-Payne Date: Mon, 13 Oct 2025 11:40:17 -0600 Subject: [PATCH] Separate into components --- .../[id]/components/attempt-composer.tsx | 64 +++++ .../[id]/components/attempt-history-item.tsx | 49 ++++ .../[id]/components/attempt-history.tsx | 30 +++ .../[id]/components/challenge-header.tsx | 18 ++ .../[id]/components/challenge-not-found.tsx | 13 + .../challenges/[id]/components/goal-card.tsx | 19 ++ .../[id]/components/leaderboard-section.tsx | 21 ++ .../[id]/components/live-output-card.tsx | 46 ++++ .../[id]/components/loading-state.tsx | 13 + .../[id]/components/session-summary-card.tsx | 47 ++++ web/app/challenges/[id]/components/types.ts | 32 +++ web/app/challenges/[id]/page.tsx | 224 +++++++----------- web/i18n/en-US/challenges.ts | 8 + 13 files changed, 441 insertions(+), 143 deletions(-) create mode 100644 web/app/challenges/[id]/components/attempt-composer.tsx create mode 100644 web/app/challenges/[id]/components/attempt-history-item.tsx create mode 100644 web/app/challenges/[id]/components/attempt-history.tsx create mode 100644 web/app/challenges/[id]/components/challenge-header.tsx create mode 100644 web/app/challenges/[id]/components/challenge-not-found.tsx create mode 100644 web/app/challenges/[id]/components/goal-card.tsx create mode 100644 web/app/challenges/[id]/components/leaderboard-section.tsx create mode 100644 web/app/challenges/[id]/components/live-output-card.tsx create mode 100644 web/app/challenges/[id]/components/loading-state.tsx create mode 100644 web/app/challenges/[id]/components/session-summary-card.tsx create mode 100644 web/app/challenges/[id]/components/types.ts diff --git a/web/app/challenges/[id]/components/attempt-composer.tsx b/web/app/challenges/[id]/components/attempt-composer.tsx new file mode 100644 index 000000000..753c04a67 --- /dev/null +++ b/web/app/challenges/[id]/components/attempt-composer.tsx @@ -0,0 +1,64 @@ +'use client' + +import Button from '@/app/components/base/button' +import Textarea from '@/app/components/base/textarea' +import { RiLoader4Line } from '@remixicon/react' +import type { AttemptResult, LiveOutputState, Translate } from './types' +import LiveOutputCard from './live-output-card' +import AttemptHistory from './attempt-history' + +type AttemptComposerProps = { + userInput: string + onUserInputChange: (value: string) => void + onSubmit: () => Promise | void + submitting: boolean + t: Translate + liveOutput: LiveOutputState + attempts: AttemptResult[] +} + +export default function AttemptComposer({ + userInput, + onUserInputChange, + onSubmit, + submitting, + t, + liveOutput, + attempts, +}: AttemptComposerProps) { + return ( +
+

+ {t('challenges.player.yourAttempt')} +

+ +