Refactor project structure and integrate Redux for state management. Update configuration files for new project name and add Webpack plugins for environment variables. Implement user authentication with Keycloak and create a context for challenge management. Add various components for user interaction, including dashboards and task workspaces. Enhance API integration and add error handling utilities. Introduce analytics and polling mechanisms for improved user experience.
Some checks failed
platform/bro-js/challenge-pl/pipeline/head There was a failure building this commit

This commit is contained in:
Primakov Alexandr Alexandrovich
2025-11-03 12:55:34 +03:00
parent 3a65307fd0
commit 624280ab5e
47 changed files with 3465 additions and 67 deletions

4
stubs/api/data/auth.json Normal file
View File

@@ -0,0 +1,4 @@
{
"ok": true,
"userId": "user-frontend-001"
}

View File

@@ -0,0 +1,27 @@
[
{
"id": "chain-frontend",
"_id": "chain-frontend",
"name": "Frontend Basics",
"createdAt": "2024-09-01T08:00:00.000Z",
"updatedAt": "2024-10-12T10:15:00.000Z",
"tasks": [
{
"id": "task-html-intro",
"_id": "task-html-intro",
"title": "HTML старт",
"description": "# HTML старт\n\nСоздайте базовую HTML-страницу с заголовком и абзацем.",
"createdAt": "2024-09-01T08:05:00.000Z",
"updatedAt": "2024-09-10T12:00:00.000Z"
},
{
"id": "task-react-component",
"_id": "task-react-component",
"title": "React компонент",
"description": "# React компонент\n\nСоздайте компонент `StatCard` с пропсами `title` и `value`.",
"createdAt": "2024-09-05T11:30:00.000Z",
"updatedAt": "2024-10-01T09:45:00.000Z"
}
]
}
]

View File

@@ -0,0 +1,57 @@
{
"queue-frontend-001": {
"status": "completed",
"position": 0,
"submission": {
"_id": "submission-001",
"id": "submission-001",
"user": "user-frontend-001",
"task": "task-html-intro",
"result": "<html><head></head><body><h1>Hello</h1></body></html>",
"status": "needs_revision",
"queueId": "queue-frontend-001",
"feedback": "Добавьте тег <title>",
"submittedAt": "2024-10-18T07:10:00.000Z",
"checkedAt": "2024-10-18T07:10:15.000Z",
"attemptNumber": 1
}
},
"queue-frontend-002": {
"status": "completed",
"position": 0,
"submission": {
"_id": "submission-002",
"id": "submission-002",
"user": "user-frontend-001",
"task": "task-html-intro",
"result": "<html><head><title>Home</title></head><body><h1>Hello</h1></body></html>",
"status": "accepted",
"queueId": "queue-frontend-002",
"feedback": "Отличная работа!",
"submittedAt": "2024-10-18T07:20:00.000Z",
"checkedAt": "2024-10-18T07:20:05.000Z",
"attemptNumber": 2
}
},
"queue-frontend-003": {
"status": "waiting",
"position": 3
},
"queue-react-001": {
"status": "completed",
"position": 0,
"submission": {
"_id": "submission-004",
"id": "submission-004",
"user": "user-react-777",
"task": "task-react-component",
"result": "export const StatCard = () => <div>Stat</div>;",
"status": "accepted",
"queueId": "queue-react-001",
"feedback": "Добавьте prop-types.",
"submittedAt": "2024-10-17T11:30:00.000Z",
"checkedAt": "2024-10-17T11:30:07.000Z",
"attemptNumber": 1
}
}
}

View File

@@ -0,0 +1,59 @@
[
{
"_id": "submission-001",
"id": "submission-001",
"user": {
"id": "user-frontend-001",
"nickname": "frontend_ninja"
},
"task": {
"id": "task-html-intro",
"title": "HTML старт"
},
"result": "<html><head></head><body><h1>Hello</h1></body></html>",
"status": "needs_revision",
"queueId": "queue-frontend-001",
"feedback": "Добавьте тег <title>",
"submittedAt": "2024-10-18T07:10:00.000Z",
"checkedAt": "2024-10-18T07:10:15.000Z",
"attemptNumber": 1
},
{
"_id": "submission-002",
"id": "submission-002",
"user": {
"id": "user-frontend-001",
"nickname": "frontend_ninja"
},
"task": {
"id": "task-html-intro",
"title": "HTML старт"
},
"result": "<html><head><title>Home</title></head><body><h1>Hello</h1></body></html>",
"status": "accepted",
"queueId": "queue-frontend-002",
"feedback": "Отличная работа!",
"submittedAt": "2024-10-18T07:20:00.000Z",
"checkedAt": "2024-10-18T07:20:05.000Z",
"attemptNumber": 2
},
{
"_id": "submission-004",
"id": "submission-004",
"user": {
"id": "user-react-777",
"nickname": "react_master"
},
"task": {
"id": "task-react-component",
"title": "React компонент"
},
"result": "export const StatCard = () => <div>Stat</div>;",
"status": "accepted",
"queueId": "queue-react-001",
"feedback": "Добавьте prop-types.",
"submittedAt": "2024-10-17T11:30:00.000Z",
"checkedAt": "2024-10-17T11:30:07.000Z",
"attemptNumber": 1
}
]

View File

@@ -0,0 +1,4 @@
{
"queueId": "queue-frontend-003",
"submissionId": "submission-003"
}

View File

@@ -0,0 +1,20 @@
{
"users": 128,
"tasks": 34,
"chains": 5,
"submissions": {
"total": 540,
"accepted": 312,
"rejected": 144,
"pending": 62,
"inProgress": 22
},
"averageCheckTimeMs": 5600,
"queue": {
"queueLength": 18,
"waiting": 12,
"inProgress": 6,
"maxConcurrency": 8,
"currentlyProcessing": 6
}
}

View File

@@ -0,0 +1,59 @@
{
"user-frontend-001": {
"totalTasksAttempted": 2,
"completedTasks": 1,
"inProgressTasks": 1,
"needsRevisionTasks": 0,
"totalSubmissions": 3,
"averageCheckTimeMs": 4200,
"taskStats": [
{
"taskId": "task-html-intro",
"taskTitle": "HTML старт",
"attempts": [
{
"attemptNumber": 1,
"status": "needs_revision",
"submittedAt": "2024-10-18T07:10:00.000Z",
"checkedAt": "2024-10-18T07:10:15.000Z",
"feedback": "Добавьте тег <title>."
},
{
"attemptNumber": 2,
"status": "accepted",
"submittedAt": "2024-10-18T07:20:00.000Z",
"checkedAt": "2024-10-18T07:20:05.000Z",
"feedback": "Отличная работа!"
}
],
"totalAttempts": 2,
"status": "completed",
"lastAttemptAt": "2024-10-18T07:20:00.000Z"
},
{
"taskId": "task-react-component",
"taskTitle": "React компонент",
"attempts": [
{
"attemptNumber": 1,
"status": "pending",
"submittedAt": "2024-10-19T09:05:00.000Z",
"feedback": null
}
],
"totalAttempts": 1,
"status": "pending",
"lastAttemptAt": "2024-10-19T09:05:00.000Z"
}
],
"chainStats": [
{
"chainId": "chain-frontend",
"chainName": "Frontend Basics",
"totalTasks": 2,
"completedTasks": 1,
"progress": 50
}
]
}
}

View File

@@ -0,0 +1,43 @@
{
"user-frontend-001": [
{
"_id": "submission-001",
"id": "submission-001",
"user": "user-frontend-001",
"task": "task-html-intro",
"result": "<html><head></head><body><h1>Hello</h1></body></html>",
"status": "needs_revision",
"queueId": "queue-frontend-001",
"feedback": "Добавьте тег <title>",
"submittedAt": "2024-10-18T07:10:00.000Z",
"checkedAt": "2024-10-18T07:10:15.000Z",
"attemptNumber": 1
},
{
"_id": "submission-002",
"id": "submission-002",
"user": "user-frontend-001",
"task": "task-html-intro",
"result": "<html><head><title>Home</title></head><body><h1>Hello</h1></body></html>",
"status": "accepted",
"queueId": "queue-frontend-002",
"feedback": "Отличная работа!",
"submittedAt": "2024-10-18T07:20:00.000Z",
"checkedAt": "2024-10-18T07:20:05.000Z",
"attemptNumber": 2
},
{
"_id": "submission-003",
"id": "submission-003",
"user": "user-frontend-001",
"task": "task-react-component",
"result": "export const StatCard = () => null;",
"status": "pending",
"queueId": "queue-frontend-003",
"feedback": null,
"submittedAt": "2024-10-19T09:05:00.000Z",
"checkedAt": null,
"attemptNumber": 1
}
]
}