Skip to content

Commit 13d67fe

Browse files
committed
Reorganize code
1 parent 44a1a63 commit 13d67fe

File tree

2 files changed

+66
-74
lines changed

2 files changed

+66
-74
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { createEvent, sample, StoreWritable } from 'effector';
2+
3+
function subtypeOperation<
4+
T,
5+
TypeKey extends keyof T,
6+
const Cases extends ReadonlyArray<T[TypeKey]>,
7+
Upd,
8+
>({
9+
store,
10+
typeKey,
11+
on,
12+
fn,
13+
}: {
14+
store: StoreWritable<T>;
15+
typeKey: TypeKey;
16+
on: Cases;
17+
fn: (
18+
upd: Upd,
19+
value: Extract<T, Record<TypeKey, Cases[keyof Cases]>>,
20+
) => Partial<T>;
21+
}) {
22+
const trigger = createEvent<Upd>();
23+
sample({
24+
clock: trigger,
25+
source: store,
26+
fn(value, upd) {
27+
const caseName = value[typeKey];
28+
if (on.includes(caseName)) {
29+
const partialResult = fn(upd, value as any);
30+
return {
31+
...value,
32+
...partialResult,
33+
};
34+
}
35+
return value;
36+
},
37+
target: store,
38+
});
39+
return trigger;
40+
}
41+
42+
export function createSubtypeOperation<T, TypeKey extends keyof T>(
43+
store: StoreWritable<T>,
44+
typeKey: TypeKey,
45+
) {
46+
return function op<const Cases extends ReadonlyArray<T[TypeKey]>, Upd>(
47+
on: Cases,
48+
fn: (
49+
upd: Upd,
50+
value: Extract<T, Record<TypeKey, Cases[keyof Cases]>>,
51+
) => Partial<T>,
52+
) {
53+
return subtypeOperation({
54+
store,
55+
typeKey,
56+
on,
57+
fn,
58+
});
59+
};
60+
}

apps/tickets-order/src/model/passengers.model.ts

Lines changed: 6 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
combine,
66
sample,
77
EventCallable,
8-
StoreWritable,
98
} from 'effector';
109

1110
import type {
@@ -16,65 +15,7 @@ import type {
1615
ServicemanId,
1716
} from '../types';
1817
import { createPassenger, getDefaultDocument } from './calculateUtils';
19-
20-
function subtypeOperation<
21-
T,
22-
TypeKey extends keyof T,
23-
const Cases extends ReadonlyArray<T[TypeKey]>,
24-
Upd,
25-
>({
26-
store,
27-
typeKey,
28-
on,
29-
fn,
30-
}: {
31-
store: StoreWritable<T>;
32-
typeKey: TypeKey;
33-
on: Cases;
34-
fn: (
35-
upd: Upd,
36-
value: Extract<T, Record<TypeKey, Cases[keyof Cases]>>,
37-
) => Partial<T>;
38-
}) {
39-
const trigger = createEvent<Upd>();
40-
sample({
41-
clock: trigger,
42-
source: store,
43-
fn(value, upd) {
44-
const caseName = value[typeKey];
45-
if (on.includes(caseName)) {
46-
const partialResult = fn(upd, value as any);
47-
return {
48-
...value,
49-
...partialResult,
50-
};
51-
}
52-
return value;
53-
},
54-
target: store,
55-
});
56-
return trigger;
57-
}
58-
59-
function createSubtypeOp<T, TypeKey extends keyof T>(
60-
store: StoreWritable<T>,
61-
typeKey: TypeKey,
62-
) {
63-
return function op<const Cases extends ReadonlyArray<T[TypeKey]>, Upd>(
64-
on: Cases,
65-
fn: (
66-
upd: Upd,
67-
value: Extract<T, Record<TypeKey, Cases[keyof Cases]>>,
68-
) => Partial<T>,
69-
) {
70-
return subtypeOperation({
71-
store,
72-
typeKey,
73-
on,
74-
fn,
75-
});
76-
};
77-
}
18+
import { createSubtypeOperation } from './createSubtypeOperation';
7819

7920
export const passengersList = keyval(() => {
8021
const $index = createStore(-1);
@@ -107,28 +48,28 @@ export const passengersList = keyval(() => {
10748
target: $document,
10849
});
10950

110-
const documentOp = createSubtypeOp($document, 'type');
51+
const createDocumentEditor = createSubtypeOperation($document, 'type');
11152

112-
const editCitizenship = documentOp(
53+
const editCitizenship = createDocumentEditor(
11354
['foreign-id'],
11455
(value: ForeignId['citizenship']) => ({ citizenship: value }),
11556
);
11657

117-
const editCategory = documentOp(
58+
const editCategory = createDocumentEditor(
11859
['military-ticket', 'serviceman-ticket'],
11960
(value: MilitaryTicket['category'] | ServicemanId['category']) => ({
12061
category: value,
12162
}),
12263
);
12364

124-
const editStartDate = documentOp(
65+
const editStartDate = createDocumentEditor(
12566
['military-ticket', 'serviceman-ticket'],
12667
(value: Date | null) => ({
12768
startDate: value,
12869
}),
12970
);
13071

131-
const editIsNotServed = documentOp(
72+
const editIsNotServed = createDocumentEditor(
13273
['military-ticket', 'serviceman-ticket'],
13374
(value: boolean, { startDate }) => ({
13475
startDate: value ? null : startDate,
@@ -177,12 +118,3 @@ export const setPassengersAmount = passengersList.edit.add.prepend(
177118

178119
export const removePassenger = passengersList.edit
179120
.remove as EventCallable<number>;
180-
export const editPassenger = passengersList.edit.update;
181-
182-
export const {
183-
changeDocumentType,
184-
changeDocumentNumber,
185-
editCitizenship,
186-
editCategory,
187-
editStartDate,
188-
} = passengersList.api;

0 commit comments

Comments
 (0)