(true);
- return
-
{count}/{totalCount}
-
{title}
-
-};
-
-const MissionsBlock = () => {
- const dispatch = useAppDispatch();
-
- useEffect(() => {
- dispatch(setMenuActiveProfilePage("missions"));
- }, []);
-
- return (
-
-
-
-
Решенные задачи
-
-
Компетенции
-
-
-
-
-
-
+ return (
+
+
{
+ setActive(!active);
+ }}
+ >
+
{title}
+

+
+
+
+
+ {missions.map((v, i) => (
+
+ ))}
+
+
+
-
Недавиние задачи
-
Мои задачи
-
-
- );
+ );
};
export default MissionsBlock;
diff --git a/src/views/home/account/missions/MyMissionItem.tsx b/src/views/home/account/missions/MyMissionItem.tsx
new file mode 100644
index 0000000..18b1ef3
--- /dev/null
+++ b/src/views/home/account/missions/MyMissionItem.tsx
@@ -0,0 +1,90 @@
+import { cn } from '../../../../lib/cn';
+import { IconError, IconSuccess } from '../../../../assets/icons/missions';
+import { useNavigate } from 'react-router-dom';
+import { Edit } from '../../../../assets/icons/input';
+
+export interface MissionItemProps {
+ id: number;
+ authorId?: number;
+ name: string;
+ difficulty: number;
+ tags?: string[];
+ timeLimit?: number;
+ memoryLimit?: number;
+ createdAt?: string;
+ updatedAt?: string;
+ type?: 'first' | 'second';
+ status?: 'empty' | 'success' | 'error';
+}
+
+export function formatMilliseconds(ms: number): string {
+ const rounded = Math.round(ms) / 1000;
+ const formatted = rounded.toString().replace(/\.?0+$/, '');
+ return `${formatted} c`;
+}
+
+export function formatBytesToMB(bytes: number): string {
+ const megabytes = Math.floor(bytes / (1024 * 1024));
+ return `${megabytes} МБ`;
+}
+
+const MissionItem: React.FC
= ({
+ id,
+ name,
+ difficulty,
+ timeLimit = 1000,
+ memoryLimit = 256 * 1024 * 1024,
+ type,
+ status,
+}) => {
+ const navigate = useNavigate();
+ const difficultyItems = ['Easy', 'Medium', 'Hard'];
+ const difficultyString =
+ difficultyItems[Math.min(Math.max(0, difficulty - 1), 2)];
+
+ return (
+ {
+ navigate(`/mission/${id}?back=/home/account/missions`);
+ }}
+ >
+
#{id}
+
{name}
+
+ стандартный ввод/вывод {formatMilliseconds(timeLimit)},{' '}
+ {formatBytesToMB(memoryLimit)}
+
+
+ {difficultyString}
+
+
+

{
+ e.stopPropagation();
+ }}
+ />
+
+
+ );
+};
+
+export default MissionItem;
diff --git a/src/views/home/contest/Contest.tsx b/src/views/home/contest/Contest.tsx
index b30de29..5a026bc 100644
--- a/src/views/home/contest/Contest.tsx
+++ b/src/views/home/contest/Contest.tsx
@@ -1,10 +1,9 @@
import { useEffect } from 'react';
import { useAppDispatch, useAppSelector } from '../../../redux/hooks';
import { setMenuActivePage } from '../../../redux/slices/store';
-import { Navigate, Route, Routes, useNavigate, useParams } from 'react-router-dom';
+import { Navigate, Route, Routes, useParams } from 'react-router-dom';
import { fetchContestById } from '../../../redux/slices/contests';
import ContestMissions from './Missions';
-import { PrimaryButton } from '../../../components/button/PrimaryButton';
import Submissions from './Submissions';
export interface Article {
@@ -14,7 +13,6 @@ export interface Article {
}
const Contest = () => {
- const navigate = useNavigate();
const { contestId } = useParams<{ contestId: string }>();
const contestIdNumber =
contestId && /^\d+$/.test(contestId) ? parseInt(contestId, 10) : null;
@@ -22,8 +20,9 @@ const Contest = () => {
return ;
}
const dispatch = useAppDispatch();
- const contest = useAppSelector((state) => state.contests.fetchContestById.contest);
-
+ const contest = useAppSelector(
+ (state) => state.contests.fetchContestById.contest,
+ );
useEffect(() => {
dispatch(setMenuActivePage('contest'));
@@ -34,19 +33,17 @@ const Contest = () => {
}, [contestIdNumber]);
return (
-
+
-
}
+ element={}
/>
}
+ element={}
/>
-
);
};
diff --git a/src/views/home/contests/ContestItem.tsx b/src/views/home/contests/ContestItem.tsx
index c2fc6fd..edf948e 100644
--- a/src/views/home/contests/ContestItem.tsx
+++ b/src/views/home/contests/ContestItem.tsx
@@ -73,6 +73,7 @@ const ContestItem: React.FC
= ({
: ' bg-liquid-background',
)}
onClick={() => {
+ console.log(456);
navigate(`/contest/${id}`);
}}
>
@@ -99,8 +100,8 @@ const ContestItem: React.FC = ({
<>
{' '}
{
- e.stopPropagation();
+ onClick={() => {
+ console.log(123);
}}
text="Регистрация"
/>
@@ -108,12 +109,7 @@ const ContestItem: React.FC = ({
) : (
<>
{' '}
- {
- e.stopPropagation();
- }}
- text="Вы записаны"
- />
+ {}} text="Вы записаны" />
>
)}
diff --git a/src/views/home/missions/Filter.tsx b/src/views/home/missions/Filter.tsx
new file mode 100644
index 0000000..e698815
--- /dev/null
+++ b/src/views/home/missions/Filter.tsx
@@ -0,0 +1,48 @@
+import { Filter, FilterItem } from '../../../components/drop-down-list/Filter';
+import { Sorter } from '../../../components/drop-down-list/Sorter';
+
+const Filters = () => {
+ const items: FilterItem[] = [
+ { text: 'React', value: 'react' },
+ { text: 'Vue', value: 'vue' },
+ { text: 'Angular', value: 'angular' },
+ { text: 'Svelte', value: 'svelte' },
+ { text: 'Next.js', value: 'next' },
+ { text: 'Nuxt', value: 'nuxt' },
+ { text: 'Solid', value: 'solid' },
+ { text: 'Qwik', value: 'qwik' },
+ ];
+
+ return (
+
+
+
+
console.log(v)}
+ />
+
+ {/* console.log(values)} // обработчик изменения
+ className="w-[240px]"
+ /> */}
+
+ );
+};
+
+export default Filters;
diff --git a/src/views/home/missions/Missions.tsx b/src/views/home/missions/Missions.tsx
index 3b5203e..28d71b0 100644
--- a/src/views/home/missions/Missions.tsx
+++ b/src/views/home/missions/Missions.tsx
@@ -5,6 +5,7 @@ import { useEffect, useState } from 'react';
import { setMenuActivePage } from '../../../redux/slices/store';
import { fetchMissions } from '../../../redux/slices/missions';
import ModalCreate from './ModalCreate';
+import Filters from './Filter';
export interface Mission {
id: number;
@@ -45,7 +46,7 @@ const Missions = () => {
/>
-
+
{missions.map((v, i) => (
diff --git a/tsconfig.app.tsbuildinfo b/tsconfig.app.tsbuildinfo
index dc32943..88b15bb 100644
--- a/tsconfig.app.tsbuildinfo
+++ b/tsconfig.app.tsbuildinfo
@@ -1 +1 @@
-{"root":["./src/app.tsx","./src/axios.ts","./src/main.tsx","./src/vite-env.d.ts","./src/assets/icons/account/index.ts","./src/assets/icons/auth/index.ts","./src/assets/icons/groups/index.ts","./src/assets/icons/header/index.ts","./src/assets/icons/input/index.ts","./src/assets/icons/menu/index.ts","./src/assets/icons/missions/index.ts","./src/assets/logos/index.ts","./src/components/button/primarybutton.tsx","./src/components/button/reversebutton.tsx","./src/components/button/secondarybutton.tsx","./src/components/checkbox/checkbox.tsx","./src/components/drop-down-list/dropdownlist.tsx","./src/components/input/daterangeinput.tsx","./src/components/input/input.tsx","./src/components/modal/modal.tsx","./src/components/router/protectedroute.tsx","./src/components/switch/switch.tsx","./src/config/colors.ts","./src/hooks/useclickoutside.ts","./src/hooks/usequery.ts","./src/lib/cn.ts","./src/pages/article.tsx","./src/pages/articleeditor.tsx","./src/pages/home.tsx","./src/pages/mission.tsx","./src/redux/hooks.ts","./src/redux/store.ts","./src/redux/slices/account.ts","./src/redux/slices/articles.ts","./src/redux/slices/auth.ts","./src/redux/slices/contests.ts","./src/redux/slices/groups.ts","./src/redux/slices/missions.ts","./src/redux/slices/store.ts","./src/redux/slices/submit.ts","./src/views/article/header.tsx","./src/views/articleeditor/editor.tsx","./src/views/articleeditor/header.tsx","./src/views/articleeditor/marckdownpreview.tsx","./src/views/home/account/account.tsx","./src/views/home/account/accoutmenu.tsx","./src/views/home/account/articlesblock.tsx","./src/views/home/account/contestsblock.tsx","./src/views/home/account/missionsblock.tsx","./src/views/home/account/rightpanel.tsx","./src/views/home/articles/articleitem.tsx","./src/views/home/articles/articles.tsx","./src/views/home/auth/login.tsx","./src/views/home/auth/register.tsx","./src/views/home/contest/contest.tsx","./src/views/home/contest/missionitem.tsx","./src/views/home/contest/missions.tsx","./src/views/home/contest/submissions.tsx","./src/views/home/contests/contestitem.tsx","./src/views/home/contests/contests.tsx","./src/views/home/contests/contestsblock.tsx","./src/views/home/contests/modalcreate.tsx","./src/views/home/groups/group.tsx","./src/views/home/groups/groupitem.tsx","./src/views/home/groups/groups.tsx","./src/views/home/groups/groupsblock.tsx","./src/views/home/groups/modalcreate.tsx","./src/views/home/groups/modalupdate.tsx","./src/views/home/menu/menu.tsx","./src/views/home/menu/menuitem.tsx","./src/views/home/missions/missionitem.tsx","./src/views/home/missions/missions.tsx","./src/views/home/missions/modalcreate.tsx","./src/views/mission/codeeditor/codeeditor.tsx","./src/views/mission/statement/header.tsx","./src/views/mission/statement/latextcontainer.tsx","./src/views/mission/statement/missionsubmissions.tsx","./src/views/mission/statement/statement.tsx","./src/views/mission/statement/submissionitem.tsx","./src/views/mission/submission/submission.tsx"],"version":"5.6.2"}
\ No newline at end of file
+{"root":["./src/app.tsx","./src/axios.ts","./src/main.tsx","./src/vite-env.d.ts","./src/assets/icons/account/index.ts","./src/assets/icons/auth/index.ts","./src/assets/icons/groups/index.ts","./src/assets/icons/header/index.ts","./src/assets/icons/input/index.ts","./src/assets/icons/menu/index.ts","./src/assets/icons/missions/index.ts","./src/assets/logos/index.ts","./src/components/button/primarybutton.tsx","./src/components/button/reversebutton.tsx","./src/components/button/secondarybutton.tsx","./src/components/checkbox/checkbox.tsx","./src/components/drop-down-list/dropdownlist.tsx","./src/components/input/daterangeinput.tsx","./src/components/input/input.tsx","./src/components/modal/modal.tsx","./src/components/router/protectedroute.tsx","./src/components/switch/switch.tsx","./src/config/colors.ts","./src/hooks/useclickoutside.ts","./src/hooks/usequery.ts","./src/lib/cn.ts","./src/pages/article.tsx","./src/pages/articleeditor.tsx","./src/pages/contesteditor.tsx","./src/pages/home.tsx","./src/pages/mission.tsx","./src/redux/hooks.ts","./src/redux/store.ts","./src/redux/slices/account.ts","./src/redux/slices/articles.ts","./src/redux/slices/auth.ts","./src/redux/slices/contests.ts","./src/redux/slices/groups.ts","./src/redux/slices/missions.ts","./src/redux/slices/store.ts","./src/redux/slices/submit.ts","./src/views/article/header.tsx","./src/views/articleeditor/editor.tsx","./src/views/articleeditor/header.tsx","./src/views/articleeditor/marckdownpreview.tsx","./src/views/home/account/account.tsx","./src/views/home/account/accoutmenu.tsx","./src/views/home/account/rightpanel.tsx","./src/views/home/account/articles/articlesblock.tsx","./src/views/home/account/contests/contests.tsx","./src/views/home/account/contests/contestsblock.tsx","./src/views/home/account/contests/mycontestitem.tsx","./src/views/home/account/contests/registercontestitem.tsx","./src/views/home/account/missions/missionsblock.tsx","./src/views/home/articles/articleitem.tsx","./src/views/home/articles/articles.tsx","./src/views/home/auth/login.tsx","./src/views/home/auth/register.tsx","./src/views/home/contest/contest.tsx","./src/views/home/contest/missionitem.tsx","./src/views/home/contest/missions.tsx","./src/views/home/contest/submissionitem.tsx","./src/views/home/contest/submissions.tsx","./src/views/home/contests/contestitem.tsx","./src/views/home/contests/contests.tsx","./src/views/home/contests/contestsblock.tsx","./src/views/home/contests/modalcreate.tsx","./src/views/home/groups/group.tsx","./src/views/home/groups/groupitem.tsx","./src/views/home/groups/groups.tsx","./src/views/home/groups/groupsblock.tsx","./src/views/home/groups/modalcreate.tsx","./src/views/home/groups/modalupdate.tsx","./src/views/home/menu/menu.tsx","./src/views/home/menu/menuitem.tsx","./src/views/home/missions/missionitem.tsx","./src/views/home/missions/missions.tsx","./src/views/home/missions/modalcreate.tsx","./src/views/mission/codeeditor/codeeditor.tsx","./src/views/mission/statement/header.tsx","./src/views/mission/statement/latextcontainer.tsx","./src/views/mission/statement/missionsubmissions.tsx","./src/views/mission/statement/statement.tsx","./src/views/mission/statement/submissionitem.tsx","./src/views/mission/submission/submission.tsx"],"version":"5.6.2"}
\ No newline at end of file