From b3febaeea15c4322934d330bbb78234e78dffa7f Mon Sep 17 00:00:00 2001 From: Primakov Alexandr Date: Tue, 9 Dec 2025 23:53:42 +0300 Subject: [PATCH] Refactor submission filtering and details display to handle various user and task data types; improve search functionality and localization for better user experience. --- src/pages/submissions/SubmissionsPage.tsx | 71 ++++++++++++++++++----- 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/src/pages/submissions/SubmissionsPage.tsx b/src/pages/submissions/SubmissionsPage.tsx index 136182a..58149fd 100644 --- a/src/pages/submissions/SubmissionsPage.tsx +++ b/src/pages/submissions/SubmissionsPage.tsx @@ -76,13 +76,25 @@ export const SubmissionsPage: React.FC = () => { const participants: ActiveParticipant[] = stats.activeParticipants || [] const submissionsList: ChallengeSubmission[] = submissions || [] + const normalizedSearchQuery = (searchQuery ?? '').toLowerCase() + const filteredSubmissions = submissionsList.filter((submission) => { - const user = submission.user as ChallengeUser - const task = submission.task as ChallengeTask + const rawUser = submission.user as ChallengeUser | string | undefined + const rawTask = submission.task as ChallengeTask | string | undefined + + const nickname = + rawUser && typeof rawUser === 'object' && 'nickname' in rawUser + ? (rawUser.nickname ?? '') + : '' + + const title = + rawTask && typeof rawTask === 'object' && 'title' in rawTask + ? (rawTask.title ?? '') + : '' const matchesSearch = - user.nickname.toLowerCase().includes(searchQuery.toLowerCase()) || - task.title.toLowerCase().includes(searchQuery.toLowerCase()) + nickname.toLowerCase().includes(normalizedSearchQuery) || + title.toLowerCase().includes(normalizedSearchQuery) const matchesStatus = statusFilter === 'all' || submission.status === statusFilter @@ -337,13 +349,27 @@ export const SubmissionsPage: React.FC = () => { {filteredSubmissions.map((submission) => { - const user = submission.user as ChallengeUser - const task = submission.task as ChallengeTask + const rawUser = submission.user as ChallengeUser | string | undefined + const rawTask = submission.task as ChallengeTask | string | undefined + + const nickname = + rawUser && typeof rawUser === 'object' && 'nickname' in rawUser + ? (rawUser.nickname ?? '') + : typeof rawUser === 'string' + ? rawUser + : '' + + const title = + rawTask && typeof rawTask === 'object' && 'title' in rawTask + ? (rawTask.title ?? '') + : typeof rawTask === 'string' + ? rawTask + : '' return ( - {user.nickname} - {task.title} + {nickname} + {title} @@ -405,8 +431,27 @@ const SubmissionDetailsModal: React.FC = ({ if (!submission) return null - const user = submission.user as ChallengeUser - const task = submission.task as ChallengeTask + const rawUser = submission.user as ChallengeUser | string | undefined + const rawTask = submission.task as ChallengeTask | string | undefined + + const userNickname = + rawUser && typeof rawUser === 'object' && 'nickname' in rawUser + ? (rawUser.nickname ?? '') + : typeof rawUser === 'string' + ? rawUser + : '' + + const taskTitle = + rawTask && typeof rawTask === 'object' && 'title' in rawTask + ? (rawTask.title ?? '') + : typeof rawTask === 'string' + ? rawTask + : '' + + const taskDescription = + rawTask && typeof rawTask === 'object' && 'description' in rawTask + ? (rawTask.description ?? '') + : '' const formatDate = (dateStr: string) => { return new Date(dateStr).toLocaleString('ru-RU', { @@ -441,7 +486,7 @@ const SubmissionDetailsModal: React.FC = ({ {t('challenge.admin.submissions.details.user')} - {user.nickname} + {userNickname} @@ -471,7 +516,7 @@ const SubmissionDetailsModal: React.FC = ({ {/* Task */} - {t('challenge.admin.submissions.details.task')} {task.title} + {t('challenge.admin.submissions.details.task')} {taskTitle} = ({ maxH="200px" overflowY="auto" > - {task.description} + {taskDescription}