Skip to content

Commit a9de091

Browse files
author
Volodymyr Kopytin
committed
Code refactoring to improve code readability
1 parent 831d50c commit a9de091

File tree

14 files changed

+9736
-44
lines changed

14 files changed

+9736
-44
lines changed

src/examples/editor/css/custom.css

Lines changed: 9638 additions & 0 deletions
Large diffs are not rendered by default.

src/examples/editor/css/index.css

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,37 @@
11
@import './custom.css';
22

33
.html-editor {
4-
width: 100%;
4+
width: 96%;
55
height: 100vh;
66
}
77
.save {
88
position: fixed;
99
}
1010

11+
.region {
12+
height: 100vh;
13+
white-space: initial;
14+
}
15+
16+
.editor-placeholder {
17+
overflow: auto;
18+
}
19+
1120
.wysiwyg-editor {
12-
padding: 10px;
13-
}
21+
margin: 10px;
22+
width: 96%;
23+
}
24+
25+
.row {
26+
display: flex;
27+
flex-direction: row;
28+
flex-wrap: wrap;
29+
width: 100%;
30+
}
31+
32+
.column {
33+
display: flex;
34+
flex-direction: column;
35+
flex-basis: 100%;
36+
flex: 1;
37+
}

src/examples/editor/templates/main.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
export const template = data => `
2-
<div class="editor-placeholder">
3-
<div class="toolbar">
4-
<button class="save">Save</button>
5-
</div>
6-
<div class="editor wysiwyg-editor article cke_editable cke_editable_themed cke_contents_ltr cke_show_borders" contenteditable="true">
2+
<div class="row">
3+
<div class="column editor-placeholder">
4+
<div class="region">
5+
<div class="toolbar">
6+
<button class="save">Save</button>
7+
</div>
8+
<div class="editor wysiwyg-editor article cke_editable cke_editable_themed cke_contents_ltr cke_show_borders" contenteditable="true">
9+
</div>
710
</div>
811
</div>
9-
<div class="html-editor-placeholder">
12+
<div class="column html-editor-placeholder region">
1013
<textarea class="html-editor">
1114
</textarea>
1215
</div>
16+
</div>
1317
`;

src/examples/reflux-ts/components/main/index.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { declareActions } from '../../declareActions';
22
import { map, ofType, pipe, merge, filter, withArg, onAction, onState, onDispatch } from '../../itrx';
3-
import { ToDoActions, changeItems, queryItems, queryTodos, deleteItem, createItem, ToDoActionTypes } from '../../models/todos';
3+
import { ToDoActions, whenChangeItems, queryItems, queryTodos, whenDeleteItem, whenCreateItem, whenCreateTodoResult } from '../../models/todos';
44
import { pick } from '../../utils';
55

66

@@ -70,6 +70,8 @@ const queryCompleteItems = map(selectCompleteItems);
7070
const whenUpdateNewTitle = ofType(MainActionTypes.UI_UPDATE_NEW_TITLE);
7171
const whenCreateTodo = ofType(MainActionTypes.UI_CREATE_TODO);
7272
const whenToggleAllComplete = ofType(MainActionTypes.UI_TOGGLE_ALL_COMPLETE);
73+
const whenSetActiveFilter = ofType(MainActionTypes.UI_SET_ACTIVE_FILTER);
74+
const whenClearCompleted = ofType(MainActionTypes.UI_CLEAR_COMPLETED);
7375

7476
const API = {
7577
markAllItemsCompleted(items: Array<{ id; }>, complete = true) {
@@ -89,40 +91,43 @@ export const main = () => {
8991
)
9092
);
9193
const fromView = merge(
92-
pipe(whenCreateTodo,
94+
pipe(
95+
whenCreateTodo,
9396
withArg(pipe(onState, queryMain, queryNewTodoTitle)),
9497
map(([a, newTodoTitle]) => ToDoActions.createTodo(newTodoTitle))
9598
),
96-
pipe(whenUpdateNewTitle,
99+
pipe(
100+
whenUpdateNewTitle,
97101
map(({ payload }) => MainActions.updateNewTodoTitle(payload))
98102
),
99-
pipe(whenToggleAllComplete,
103+
pipe(
104+
whenToggleAllComplete,
100105
withArg(pipe(onState, queryTodos, queryItems), pipe(onState, queryMain, queryToggleAllComplete)),
101106
map(([, items, isCompleted]) => API.markAllItemsCompleted(items, isCompleted)),
102107
map(completedItems => completedItems.map(item => ToDoActions.updateTodo(item.id, item)))
103108
),
104109
pipe(
105-
ofType(MainActionTypes.UI_SET_ACTIVE_FILTER),
110+
whenSetActiveFilter,
106111
withArg(pipe(onState, queryTodos, queryItems)),
107112
map(([a, todos]) => MainActions.updateItems(todos))
108113
),
109114
pipe(
110-
ofType(MainActionTypes.UI_CLEAR_COMPLETED),
115+
whenClearCompleted,
111116
withArg(pipe(onState, queryTodos, queryItems, queryCompleteItems)),
112117
map(([a, completeItems = []]) => completeItems.map(item => ToDoActions.deleteTodo(item.id)))
113118
)
114119
);
115120
const fromService = merge(
116121
pipe(
117-
ofType(ToDoActionTypes.CREATE_TODO_RESULT),
122+
whenCreateTodoResult,
118123
map(() => MainActions.updateNewTodoTitle(''))
119124
),
120125
pipe(
121-
merge(createItem, deleteItem),
126+
merge(whenCreateItem, whenDeleteItem),
122127
map(() => ToDoActions.fetchItems())
123128
),
124129
pipe(
125-
merge(changeItems, createItem, deleteItem),
130+
merge(whenChangeItems, whenCreateItem, whenDeleteItem),
126131
withArg(pipe(onState, queryTodos, queryItems)),
127132
map(([action, todos]) => {
128133
return MainActions.updateItems(todos);

src/examples/reflux-ts/components/main/template.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,19 +63,23 @@ export const MainView = connect(mapStateToProps, mapDispatchToProps)(({ dispatch
6363
</button>
6464
<button className={cn('clear-completed btn pull-right ?hidden', props.showClearCompleted)}
6565
onClick={e => props.uiClearCompleted()}
66-
>Clear completed</button>
66+
>Clear completed</button>
67+
<hr/>
6768
<div className="filters segmented-control">
6869
<a className={cn("control-item ?active", !props.activeFilter)} href="#/"
6970
onClick={evnt => props.uiSetActiveFilter('all')}
70-
>All</a>
71+
>All</a>
72+
&nbsp;•&nbsp;
7173
<a className={cn("control-item ?active", props.activeFilter === 'active')} href="#/active"
7274
onClick={evnt => props.uiSetActiveFilter('active')}
73-
>Active</a>
75+
>Active</a>
76+
&nbsp;•&nbsp;
7477
<a className={cn("control-item ?active", props.activeFilter === 'completed')} href="#/completed"
7578
onClick={evnt => props.uiSetActiveFilter('complete')}
76-
>Completed</a>
79+
>Completed</a>
7780
</div>
7881
</header>
82+
<hr/>
7983
<section className="bar bar-standard bar-header-secondary">
8084
<form onSubmit={e => e.preventDefault()}>
8185
<input className="new-todo" type="search" placeholder="What needs to be done?"
@@ -85,6 +89,7 @@ export const MainView = connect(mapStateToProps, mapDispatchToProps)(({ dispatch
8589
/>
8690
</form>
8791
</section>
92+
<hr/>
8893
<footer className={cn('footer bar bar-standard bar-footer ?hidden', props.hasTodos)}>
8994
<span className="todo-count title">
9095
<strong>{props.activeItems ? props.activeItems.length : 0}</strong>&nbsp;

src/examples/reflux-ts/components/todoItem/index.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { declareActions } from '../../declareActions';
22
import { map, ofType, pipe, merge, filter, withArg, onAction, onState, onDispatch } from '../../itrx';
3-
import { ToDoActions, queryItems, queryTodos, ToDoActionTypes } from '../../models/todos';
3+
import { ToDoActions, queryItems, queryTodos, whenUpdateTodoResult } from '../../models/todos';
44

55

66
export const selectCurrent = ({ current = {} }) => current;
@@ -52,34 +52,39 @@ export const queryTitle = map(selectTitle);
5252
export const queryComplete = map(selectComplete);
5353
export const queryId = map(selectId);
5454

55+
const whenSetCurrentItem = ofType(ItemActionTypes.UI_SET_CURRENT_ITEM);
56+
const whenUpdateTodoTitle = ofType(ItemActionTypes.UI_UPDATE_TODO_TITLE);
57+
const whenSetComplete = ofType(ItemActionTypes.UI_SET_COMPLETE);
58+
const whenRemoveItem = ofType(ItemActionTypes.UI_REMOVE_ITEM);
59+
5560
export const currentItem = () => {
5661

5762
const fromView = merge(
5863
pipe(
59-
ofType(ItemActionTypes.UI_SET_CURRENT_ITEM),
64+
whenSetCurrentItem,
6065
withArg(pipe(onState, queryTodos, queryItems)),
6166
map(([{ payload: id }, items]: [any, any[]]) => {
6267
const currentItem = items.find(item => item.id === id);
6368
return ItemActions.setCurrent(currentItem);
6469
})
6570
),
6671
pipe(
67-
ofType(ItemActionTypes.UI_UPDATE_TODO_TITLE),
72+
whenUpdateTodoTitle,
6873
withArg(pipe(onState, queryCurrent, queryId), pipe(onState, queryCurrent, queryTitle)),
6974
map(([a, itemId, editTitle]) => ToDoActions.updateTodo(itemId, { title: editTitle }))
7075
),
7176
pipe(
72-
ofType(ItemActionTypes.UI_SET_COMPLETE),
77+
whenSetComplete,
7378
map(({ payload: { id, complete } }) => ToDoActions.updateTodo(id, { complete }))
7479
),
7580
pipe(
76-
ofType(ItemActionTypes.UI_REMOVE_ITEM),
81+
whenRemoveItem,
7782
map(({ payload: id }) => ToDoActions.deleteTodo(id))
7883
)
7984
);
8085
const fromService = merge(
8186
pipe(
82-
ofType(ToDoActionTypes.UPDATE_TODO_RESULT),
87+
whenUpdateTodoResult,
8388
map(() => ToDoActions.fetchItems())
8489
)
8590
);

src/examples/reflux-ts/components/todoItem/template.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ function mapDispatchToProps(dispatch, props) {
4444
};
4545
}
4646

47+
// this part should be extracted into the separate file
48+
// It has kept here just to make easy understand the implementation
4749
function setCaretAtStartEnd(node, atEnd) {
4850
const sel = document.getSelection();
4951
node = node.firstChild;

src/examples/reflux-ts/declareActions.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export function createReducer (initialState) {
66
}
77
};
88

9+
// UnionToIntersection was borrowed from https://stackoverflow.com/questions/50374908/transform-union-type-to-intersection-type
910
type UnionToIntersection<U> = (U extends any
1011
? (k: U) => void
1112
: any) extends ((k: infer I) => void)

src/examples/reflux-ts/itrx.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ export const onAction = (...abc) => [abc[0]];
22
export const onState = (...abc) => [abc[1]];
33
export const onDispatch = (...abc) => [abc[2]];
44

5-
export const pipe = (...args) => (...abc) => args.reduce((res, fn) => res.length ? fn(...res) : [], abc);
6-
export const merge = (...args) => (...abc) => args.reduce((res, fn) => [...res, ...fn(...abc)], []);
5+
export const pipe = (...fn) => (...abc) => fn.reduce((res, curr) => res.length ? curr(...res) : [], abc);
6+
export const merge = (...fn) => (...abc) => fn.reduce((res, curr) => [...res, ...curr(...abc)], []);
77

88
export const map = (fn) => (...abc) => [fn(...abc)];
99
export const withArg = (...fn) => (a, ...abc) => [[a, ...merge(...fn)(a, ...abc)], ...abc];

src/examples/reflux-ts/models/todos.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,9 @@ export const selectItems = ({ items = {}, order = [] }) => order.map(id => items
194194
export const queryTodos = map(selectTodos);
195195
export const queryItems = map(selectItems);
196196

197-
export const changeItems = ofType(ToDoActionTypes.FETCH_TODOS_RESULT);
198-
export const createItem = ofType(ToDoActionTypes.CREATE_TODO_RESULT);
199-
export const deleteItem = ofType(ToDoActionTypes.DELETE_TODO_RESULT);
197+
export const whenChangeItems = ofType(ToDoActionTypes.FETCH_TODOS_RESULT);
198+
export const whenCreateItem = ofType(ToDoActionTypes.CREATE_TODO_RESULT);
199+
export const whenDeleteItem = ofType(ToDoActionTypes.DELETE_TODO_RESULT);
200+
201+
export const whenCreateTodoResult = ofType(ToDoActionTypes.CREATE_TODO_RESULT);
202+
export const whenUpdateTodoResult = ofType(ToDoActionTypes.UPDATE_TODO_RESULT);

0 commit comments

Comments
 (0)