Skip to content

Commit 26d229b

Browse files
committed
feat: engineer stat
1 parent 5052661 commit 26d229b

File tree

13 files changed

+271
-4
lines changed

13 files changed

+271
-4
lines changed

public/locales/en/translation.json

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1132,5 +1132,16 @@
11321132
"No data": "No data",
11331133
"DME per Ejection": "DME per Ejection",
11341134
"Active mines": "Active mines",
1135-
"Mining events": "Mining events"
1135+
"Mining events": "Mining events",
1136+
"My info": "My info",
1137+
"Engineers info": "Engineers info",
1138+
"Certificate": "Certificate",
1139+
"Skills learned": "Skills learned",
1140+
"Average start time of the contract after the offer": "Average start time of the contract after the offer",
1141+
"Date": "Date",
1142+
"Upgrades": "Upgrades",
1143+
"DME earned": "DME earned",
1144+
"Total upgrades": "Total upgrades",
1145+
"Total fails": "Total fails",
1146+
"Total DME earned": "Total DME earned"
11361147
}

src/app/router/paths.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { EngineerStatPage } from '../../pages/engineer/stat';
2+
13
export const root = '/';
24
export const intro = '/intro';
35
export const contractorCabin = '/contractor-cabin';
@@ -31,3 +33,4 @@ export const engineer = '/engineer';
3133
export const engineerEquipmentHall = '/engineer/equipment-hall';
3234
export const unidentifiedActivity = '/unidentified-activity';
3335
export const engineerTraining = '/engineer/training';
36+
export const engineerStatAndInfo = '/engineer/stat-and-info';

src/app/router/routes.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {
3434

3535
import { OperationPageType } from 'entities/contract';
3636
import * as paths from './paths';
37+
import { EngineerStatPage } from '../../pages/engineer/stat';
3738

3839
export type AppRoute = {
3940
titleTag: string;
@@ -285,6 +286,14 @@ export const routes: AppRoute[] = [
285286
forBetaUser: false,
286287
titleTag: 'Engineers Training — DeepMine',
287288
},
289+
{
290+
path: paths.engineerStatAndInfo,
291+
Component: EngineerStatPage,
292+
forLoggedIn: true,
293+
forAdmin: false,
294+
forBetaUser: false,
295+
titleTag: 'Engineers Stat — DeepMine',
296+
},
288297
];
289298

290299
export const fallbackRoute: AppRoute = {

src/entities/engineer/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@ export * from './constants';
33
export * from './models';
44
export * from './lib';
55
export * from './api';
6+
export * from './info';
7+
export * from './stat';

src/entities/engineer/info.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export type EngineerInfo = {
2+
certificate_asset_id: number;
3+
level: number;
4+
skills_count: number;
5+
start_time_gap: string;
6+
};

src/entities/engineer/stat.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
export type EngineerStatDto = {
2+
date: string;
3+
upgrades_count: number;
4+
upgrades_status: string;
5+
upgrade_total_count: number;
6+
upgrades_fails_count: number;
7+
upgrades_cost_of_execution: string;
8+
upgrades: {
9+
date: string;
10+
type: string;
11+
rarity: string;
12+
status: string;
13+
total_count: number;
14+
fails_count: number;
15+
cost_of_execution: string;
16+
}[];
17+
};

src/features/engineer/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@ export * from './equipment-upgrade/model';
77
export * from './equipment-upgrade/model/upgrade-kit';
88
export * from './equipment-upgrade/lib';
99
export * from './engineer-training';
10+
11+
export * from './stat';

src/features/engineer/main-cabin/ui/menu/index.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ import {
66
ToolOutlined,
77
ProjectOutlined,
88
} from '@ant-design/icons';
9-
import { engineerEquipmentHall, engineerTraining } from 'app/router/paths';
9+
import {
10+
engineerEquipmentHall,
11+
engineerStatAndInfo,
12+
engineerTraining,
13+
} from 'app/router/paths';
1014
import { CabinStatus } from 'entities/engineer';
1115
import { Menu, MenuItem } from 'shared/ui';
1216
import styles from './styles.module.scss';
@@ -24,8 +28,8 @@ const menuItems = [
2428
},
2529
{
2630
icon: <ProjectOutlined />,
27-
path: '',
28-
unlockedAt: CabinStatus.CanSeeStats,
31+
path: engineerStatAndInfo,
32+
unlockedAt: true,
2933
},
3034
];
3135

src/features/engineer/stat/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './models/info';
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { createEffect, createStore } from 'effector';
2+
import { createGate } from 'effector-react';
3+
import { forward } from 'effector/compat';
4+
import axios from 'axios';
5+
import { ENDPOINT } from 'app/constants';
6+
import { EngineerInfo, EngineerStatDto } from 'entities/engineer';
7+
8+
const getEngineerInfo = createEffect(async ({ user }: { user: string }) => {
9+
const { data = null } = await axios.get<EngineerInfo | null>(
10+
`${ENDPOINT}/game-api/statistic/engineer/my_info`,
11+
{
12+
params: {
13+
user,
14+
},
15+
}
16+
);
17+
18+
return data;
19+
});
20+
const getEngineerStat = createEffect(async ({ user }: { user: string }) => {
21+
const { data = null } = await axios.get<EngineerStatDto[] | null>(
22+
`${ENDPOINT}/game-api/statistic/engineer/my_stats`,
23+
{
24+
params: {
25+
user,
26+
},
27+
}
28+
);
29+
30+
return data;
31+
});
32+
33+
export const $engineerInfo = createStore<EngineerInfo | null>(null).on(
34+
getEngineerInfo.doneData,
35+
(_, data) => data
36+
);
37+
export const $engineerStat = createStore<EngineerStatDto[] | null>(null).on(
38+
getEngineerStat.doneData,
39+
(_, data) => data
40+
);
41+
42+
export const EngineerStatInfo = createGate<{ user: string }>(
43+
'EngineerStatInfo'
44+
);
45+
46+
forward({
47+
from: EngineerStatInfo.open,
48+
to: [getEngineerInfo, getEngineerStat],
49+
});

src/pages/engineer/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@ const EngineerPage = () => {
2020
};
2121

2222
export { EngineerPage };
23+
export * from './stat';

src/pages/engineer/stat/index.tsx

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { FC } from 'react';
2+
3+
import { PageWithTabs, useAccountName } from 'shared';
4+
import { TableWithTitle } from 'features';
5+
import { useTranslation } from 'react-i18next';
6+
import { useGate, useStore } from 'effector-react';
7+
import {
8+
$engineerInfo,
9+
$engineerStat,
10+
EngineerStatInfo,
11+
} from 'features/engineer';
12+
import { EngineerStat } from './ui';
13+
14+
enum Tabs {
15+
info,
16+
stat,
17+
}
18+
19+
export const EngineerStatPage: FC = () => {
20+
const { t } = useTranslation();
21+
const accountName = useAccountName();
22+
useGate(EngineerStatInfo, { user: accountName });
23+
const engineerStatInfo = useStore($engineerInfo);
24+
const engineerStat = useStore($engineerStat);
25+
26+
return (
27+
<PageWithTabs
28+
tabs={[
29+
{
30+
key: String(Tabs.info),
31+
children: (
32+
<TableWithTitle
33+
title={t('Engineers info')}
34+
data={{
35+
[t('Certificate')]:
36+
engineerStatInfo?.certificate_asset_id,
37+
[t('Level')]: engineerStatInfo?.level,
38+
[t('Skills learned')]:
39+
engineerStatInfo?.skills_count,
40+
[t(
41+
'Average start time of the contract after the offer'
42+
)]: engineerStatInfo?.start_time_gap,
43+
}}
44+
/>
45+
),
46+
label: t(`My info`),
47+
},
48+
{
49+
key: String(Tabs.stat),
50+
children: <EngineerStat data={engineerStat} />,
51+
label: t(`pages.contractorStatsAndInfo.mineAreaInfo`),
52+
},
53+
]}
54+
documentTitleScope="Engineer stat and info"
55+
/>
56+
);
57+
};

src/pages/engineer/stat/ui/index.tsx

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import React, { FC } from 'react';
2+
import { useTranslation } from 'react-i18next';
3+
import type { ColumnsType } from 'antd/lib/table';
4+
import { Table, toLocaleDate } from 'shared';
5+
import { ContractorStats } from 'entities/game-stat';
6+
import { EngineerStatDto } from 'entities/engineer';
7+
8+
export const EngineerStat: FC<{
9+
data: EngineerStatDto[] | null | undefined;
10+
}> = ({ data }) => {
11+
const { t } = useTranslation();
12+
13+
const expandedColumns = [
14+
{
15+
title: t('pages.contractorMiningStats.date'),
16+
dataIndex: 'date',
17+
key: 'date',
18+
render: () => <div />,
19+
},
20+
{
21+
dataIndex: 'type',
22+
key: 'type',
23+
},
24+
{
25+
dataIndex: 'status',
26+
key: 'status',
27+
},
28+
{
29+
dataIndex: 'cost_of_execution',
30+
key: 'cost_of_execution',
31+
},
32+
{
33+
dataIndex: 'total_count',
34+
key: 'total_count',
35+
},
36+
{
37+
dataIndex: 'fails_count',
38+
key: 'fails_count',
39+
},
40+
{
41+
dataIndex: 'cost_of_execution',
42+
key: 'cost_of_execution',
43+
},
44+
];
45+
const columns: ColumnsType<ContractorStats> = [
46+
{
47+
title: t('Date'),
48+
dataIndex: 'date',
49+
key: 'date',
50+
render: (date: number) => toLocaleDate(date),
51+
},
52+
{
53+
title: t('Upgrades'),
54+
dataIndex: 'upgrades_count',
55+
key: 'upgrades_count',
56+
},
57+
{
58+
title: t('Status'),
59+
dataIndex: 'upgrades_status',
60+
key: 'upgrades_status',
61+
},
62+
{
63+
title: t('DME earned'),
64+
dataIndex: 'upgrades_cost_of_execution',
65+
key: 'upgrades_cost_of_execution',
66+
},
67+
{
68+
title: t('Total upgrades'),
69+
dataIndex: 'upgrade_total_count',
70+
key: 'upgrade_total_count',
71+
},
72+
{
73+
title: t('Total fails'),
74+
dataIndex: 'upgrades_fails_count',
75+
key: 'upgrades_fails_count',
76+
},
77+
{
78+
title: t('Total DME earned'),
79+
dataIndex: 'upgrades_fails_count',
80+
key: 'upgrades_fails_count',
81+
},
82+
];
83+
84+
const expandedRowRender = (value: EngineerStatDto) => {
85+
return (
86+
<Table
87+
dataSource={value.upgrades}
88+
columns={expandedColumns}
89+
showHeader={false}
90+
bordered={false}
91+
tableLayout="fixed"
92+
/>
93+
);
94+
};
95+
return (
96+
<Table
97+
dataSource={data?.map((stat) => ({ ...stat, key: stat.date }))}
98+
columns={columns}
99+
tableLayout="fixed"
100+
expandable={{
101+
expandedRowRender,
102+
}}
103+
/>
104+
);
105+
};

0 commit comments

Comments
 (0)