Skip to content

Commit 4b647d7

Browse files
vikaivVictoria Ivanova
andauthored
Refactoring (#18)
* fix typings, fix error when updating report * Upgrade vite to ^6.2.5 to fix 2 Dependabot alerts in frontend/package-lock.json --------- Co-authored-by: Victoria Ivanova <victoria.i@ati.su>
1 parent 648abf9 commit 4b647d7

File tree

6 files changed

+76
-74
lines changed

6 files changed

+76
-74
lines changed

frontend/package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
"tailwindcss": "^4.0.16",
4343
"typescript": "~5.7.2",
4444
"typescript-eslint": "^8.22.0",
45-
"vite": "^6.1.0"
45+
"vite": "^6.2.5"
4646
},
4747
"simple-git-hooks": {
4848
"pre-commit": "npx lint-staged"

frontend/src/api/reports/models.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ export type CreateReportRequest = {
7777
export type UpdateReportRequest = {
7878
title: string | null;
7979
status: ReportStatuses | null;
80-
responsibleUserId: string | null;
8180
};
8281

8382
export type SearchResponse = {

frontend/src/pages/Report/components/ReportHeader/ReportHeader.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,7 @@ const ReportHeader = () => {
125125
{!isNewReport && isReportChanged && reportForm.responsible?.id && (
126126
<div className="flex gap-2 justify-end">
127127
<CancelButton isChanged={isReportChanged} onReset={reset} />
128-
<SaveButton
129-
isChanged={isReportChanged}
130-
onSave={() => updateReport()}
131-
/>
128+
<SaveButton isChanged={isReportChanged} onSave={updateReport} />
132129
</div>
133130
)}
134131
</div>

frontend/src/store/report.ts

Lines changed: 58 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,24 @@ import {
66
sample,
77
} from "effector";
88
import { fetchReport, createReport, updateReport } from "@/api/reports";
9-
import { NewReport, Report } from "@/types/report";
10-
import { User } from "@/types/user";
119
import { ReportStatuses } from "@/const";
10+
import { User } from "@/types/user";
11+
import { NewReport, ReportFormUIData, Report } from "@/types/report";
1212
import { ReportResponse } from "@/api/reports/models";
1313

14+
const defaultFormData = {
15+
id: null,
16+
title: "",
17+
status: ReportStatuses.IN_PROGRESS,
18+
responsible: null,
19+
participants: [],
20+
responsibleId: "",
21+
creator: null,
22+
createdAt: null,
23+
updatedAt: null,
24+
bugs: [],
25+
};
26+
1427
const convertBackResponseToStoreModel = (reportResponse: ReportResponse) => ({
1528
id: reportResponse.id,
1629
title: reportResponse.title || "",
@@ -47,15 +60,22 @@ export const createReportFx = createEffect(async (newReport: NewReport) => {
4760
return data;
4861
});
4962

50-
export const updateReportFx = createEffect(async (currentReport: Report) => {
51-
if (!currentReport.responsible || !currentReport.id) return;
52-
const payload = {
53-
title: currentReport.title,
54-
status: currentReport.status,
55-
responsibleUserId: currentReport.responsible.id,
56-
};
57-
return await updateReport(payload, currentReport.id);
58-
});
63+
export const updateReportFx = createEffect(
64+
async (report: {
65+
id: number | null;
66+
title: string | null;
67+
status: ReportStatuses | null;
68+
responsibleId: string | null;
69+
}) => {
70+
if (!report.id) return;
71+
const payload = {
72+
title: report.title,
73+
status: report.status,
74+
responsible: report.responsibleId,
75+
};
76+
return await updateReport(payload, report.id);
77+
}
78+
);
5979

6080
export const updateReportEvent = createEvent();
6181
export const clearReport = createEvent();
@@ -65,47 +85,31 @@ export const updateTitle = createEvent<string>();
6585
export const updateStatus = createEvent<number>();
6686
export const updateResponsible = createEvent<User | null>();
6787

68-
export const setIsNewReport = createEvent<boolean>();
88+
export const setIsNewReport = createEvent();
6989

70-
export const $isNewReport = createStore<boolean>(true)
90+
export const $isNewReport = createStore(true)
7191
.on(setIsNewReport, (_, isNew) => isNew)
7292
.reset(clearReport);
7393

7494
export const $isReportChanged = createStore(false).reset(clearReport);
7595

76-
export const $initialReportForm = createStore<Report>({
77-
id: null,
78-
title: "",
79-
status: ReportStatuses.IN_PROGRESS,
80-
responsible: null,
81-
responsibleId: "",
82-
creator: null,
83-
createdAt: null,
84-
updatedAt: null,
85-
participants: [],
86-
bugs: [],
87-
})
96+
export const $initialReportForm = createStore<Report>(defaultFormData)
8897
.on(fetchReportFx.doneData, (_, report) =>
8998
convertBackResponseToStoreModel(report)
9099
)
91100
.reset(clearReport);
92101

93-
// Текущее состояние репорта (изменяемые данные, вводимые в форму)
94-
export const $reportForm = createStore<Report>({
95-
id: null,
96-
title: "",
97-
status: ReportStatuses.IN_PROGRESS,
98-
responsible: null,
99-
participants: [],
100-
responsibleId: "",
101-
creator: null,
102-
createdAt: null,
103-
updatedAt: null,
104-
bugs: [],
105-
})
106-
.on(fetchReportFx.doneData, (_, report) =>
107-
convertBackResponseToStoreModel(report)
108-
)
102+
// Текущее состояние репорта (изменяемые данные)
103+
export const $reportForm = createStore<ReportFormUIData>(defaultFormData)
104+
.on(fetchReportFx.doneData, (_, report) => {
105+
return {
106+
id: report.id,
107+
title: report.title || "",
108+
status: report.status || 0,
109+
responsible: report.responsible || {},
110+
participants: report.participants || [],
111+
};
112+
})
109113
.on(updateTitle, (state, title) => ({ ...state, title }))
110114
.on(updateResponsible, (state, responsible) => ({ ...state, responsible }))
111115
.on(updateStatus, (state, status) => ({ ...state, status }))
@@ -152,32 +156,26 @@ sample({
152156
});
153157

154158
sample({
155-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
156-
// @ts-ignore
157-
// todo fix ts-ignore
158-
source: $combinedForm, // Здесь объект { reportForm, initialForm }
159+
source: $combinedForm, // { reportForm, initialForm }
159160
clock: updateReportEvent,
160161
fn: ({ reportForm, initialForm }) => {
161-
// Используем правильные имена
162-
if (!initialForm) return null;
162+
const responsibleId = reportForm.responsible?.id || null;
163+
const initialResponsibleId = initialForm.responsible?.id || null;
163164

164-
const updatedReport: Partial<typeof reportForm> = {
165+
const diff = {
165166
id: reportForm.id,
166-
title:
167-
reportForm.title !== initialForm.title ? reportForm.title : undefined,
167+
title: reportForm.title !== initialForm.title ? reportForm.title : null,
168168
status:
169-
reportForm.status !== initialForm.status
170-
? reportForm.status
171-
: undefined,
172-
responsible:
173-
reportForm.responsible?.id !== initialForm.responsible?.id
174-
? reportForm.responsible
175-
: undefined,
169+
reportForm.status !== initialForm.status ? reportForm.status : null,
170+
responsibleId:
171+
responsibleId &&
172+
initialResponsibleId &&
173+
initialResponsibleId !== responsibleId
174+
? responsibleId
175+
: null,
176176
};
177177

178-
return Object.values(updatedReport).some((value) => value !== undefined)
179-
? updatedReport
180-
: null;
178+
return diff;
181179
},
182180
target: updateReportFx,
183181
});

frontend/src/types/report.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Bug, NewBug } from "./bug";
22
import { User } from "./user";
33
import { ReportStatuses } from "../const/index";
44

5+
// модель стора со всеми данными по репорту
56
export type Report = {
67
id: number | null;
78
title: string;
@@ -15,13 +16,20 @@ export type Report = {
1516
bugs: Bug[];
1617
};
1718

19+
// модель только с параметрами, необходимыми для создания нового репорта
1820
export type NewReport = {
1921
title: string;
2022
status: ReportStatuses;
2123
responsibleId: string;
22-
// todo: нужно убрать опциональность у след. параметров и назначать их при создании стора
23-
responsible?: User;
24-
creator?: User;
25-
participants?: User[] | never[];
2624
bugs: NewBug[];
2725
};
26+
27+
// модель для редактирования полей самого репорта с параметрами, вводимыми с фронта
28+
// багов в этой модели нет, потому что интерфейс бага описан в bug.ts
29+
export type ReportFormUIData = {
30+
id: number | null;
31+
title: string;
32+
status: ReportStatuses;
33+
responsible: User | null;
34+
participants: User[] | null;
35+
};

0 commit comments

Comments
 (0)