From e1f13b3872aa0527a8ae7afc65675a9723b68875 Mon Sep 17 00:00:00 2001 From: Maulana Sodiqin Date: Fri, 28 Nov 2025 18:15:34 +0700 Subject: [PATCH] feat(hackathon): improve team member count display and submission verification MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix browse teams page to use member_count from API response - Add member_count field to TTeamItem type - Add minimum team members requirement (2) for project submission - Add type-to-confirm verification before final submission 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../src/app/teams/[teamId]/submit/page.tsx | 53 +++++++++++++++++-- apps/hackathon/src/app/teams/browse/page.tsx | 4 +- libs/service/src/types/teams/index.ts | 2 +- 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/apps/hackathon/src/app/teams/[teamId]/submit/page.tsx b/apps/hackathon/src/app/teams/[teamId]/submit/page.tsx index c4be8fc..a72227a 100644 --- a/apps/hackathon/src/app/teams/[teamId]/submit/page.tsx +++ b/apps/hackathon/src/app/teams/[teamId]/submit/page.tsx @@ -14,11 +14,14 @@ import { } from '@imphnen-frontend-service/service'; import { zodResolver } from '@hookform/resolvers/zod'; +const MIN_TEAM_MEMBERS = 2; // Minimum members required to submit (including leader) + const SubmitProjectPage: FC = (): ReactElement => { const { teamId } = useParams<{ teamId: string }>(); const navigate = useNavigate(); const { session } = useAuthStore(); const [showConfirmModal, setShowConfirmModal] = useState(false); + const [confirmText, setConfirmText] = useState(''); const [screenshots, setScreenshots] = useState([]); const { data: teamData } = useTeamById(teamId || ''); @@ -31,6 +34,8 @@ const SubmitProjectPage: FC = (): ReactElement => { const currentUserId = session?.user?.id; const isLeader = currentUserId === team?.leader_id; const hasSubmission = !!submissionData?.data; + const memberCount = team?.members?.length || 0; + const hasEnoughMembers = memberCount >= MIN_TEAM_MEMBERS; const form = useForm({ resolver: zodResolver(projectSubmissionSchema), @@ -122,6 +127,25 @@ const SubmitProjectPage: FC = (): ReactElement => {
+ {/* Minimum Members Warning */} + {!hasEnoughMembers && ( +
+
+ 👥 +
+

+ Team Members Required +

+

+ Your team needs at least {MIN_TEAM_MEMBERS} members to submit a project. + Currently you have {memberCount} member{memberCount !== 1 ? 's' : ''}. + Please invite more members to your team before submitting. +

+
+
+
+ )} + {/* Warning Banner */}
@@ -274,11 +298,16 @@ const SubmitProjectPage: FC = (): ReactElement => {
+ {!hasEnoughMembers && ( +

+ You need at least {MIN_TEAM_MEMBERS} team members to submit +

+ )}
@@ -298,7 +327,7 @@ const SubmitProjectPage: FC = (): ReactElement => {

- By clicking "Submit Project", you confirm that: + By submitting, you confirm that:

  • ✓ All information is correct and complete
  • @@ -307,19 +336,35 @@ const SubmitProjectPage: FC = (): ReactElement => {
  • ✓ Your team agrees with this submission
+
+ + setConfirmText(e.target.value)} + placeholder="Type SUBMIT here" + className="w-full px-4 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-red-500 focus:border-transparent bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder:text-gray-400 dark:placeholder:text-gray-500" + autoComplete="off" + /> +
diff --git a/apps/hackathon/src/app/teams/browse/page.tsx b/apps/hackathon/src/app/teams/browse/page.tsx index 4266946..604bdc4 100644 --- a/apps/hackathon/src/app/teams/browse/page.tsx +++ b/apps/hackathon/src/app/teams/browse/page.tsx @@ -209,7 +209,7 @@ const BrowseTeamsPage: FC = (): ReactElement => {

{' '} - {team.members?.length || 0} members + {team.member_count || 0} members

@@ -229,7 +229,7 @@ const BrowseTeamsPage: FC = (): ReactElement => { ) : ( <> {myTeams.length === 0 && - (team.members?.length || 0) < 5 && ( + (team.member_count || 0) < 5 && (