Skip to content
This repository was archived by the owner on Jun 22, 2021. It is now read-only.

Commit 58dcad1

Browse files
committed
refactor: Adds App and AppConfig.
1 parent 33d04ff commit 58dcad1

File tree

6 files changed

+69
-62
lines changed

6 files changed

+69
-62
lines changed

src/presenter/App.tsx

+14-20
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
import * as React from 'react';
2-
import Service from '../service/Facade';
3-
import Footer from './Footer';
4-
import NewTodo from './NewTodo';
5-
import TodoItems from './TodoItems';
2+
import repoFactory from '../repo/factory';
3+
import serviceFactory from '../service/factory';
4+
import AppConfig from './AppConfig';
5+
import Todos from './Todos';
66

7-
export interface Props {
8-
readonly service: Service;
9-
}
7+
export default ({ repo }: AppConfig) => {
8+
const repo = repoFactory(repo);
9+
const service = serviceFactory({ repo });
10+
const presenter = <Todos service={service} />;
1011

11-
export default ({ service }: Props) => {
12-
return (
13-
<div>
14-
<header className="header">
15-
<h1>todos</h1>
16-
<NewTodo service={service} />
17-
</header>
18-
<section className="main">
19-
<TodoItems service={service} />
20-
</section>
21-
<Footer service={service} />
22-
</div>
23-
);
12+
window.addEventListener('hashchange', () => {
13+
const route = location.hash.split('#').slice(1).join('#');
14+
service.setRoute(route);
15+
}, false);
16+
17+
return presenter;
2418
};

src/presenter/AppConfig.ts

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import RepoFactoryConfig from '../repo/FactoryConfig';
2+
3+
export default interface AppConfig {
4+
readonly repo: RepoFactoryConfig;
5+
}

src/presenter/Todos.tsx

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import * as React from 'react';
2+
import Service from '../service/Facade';
3+
import Footer from './Footer';
4+
import NewTodo from './NewTodo';
5+
import TodoItems from './TodoItems';
6+
7+
export interface Props {
8+
readonly service: Service;
9+
}
10+
11+
export default ({ service }: Props) => {
12+
return (
13+
<div>
14+
<header className="header">
15+
<h1>todos</h1>
16+
<NewTodo service={service} />
17+
</header>
18+
<section className="main">
19+
<TodoItems service={service} />
20+
</section>
21+
<Footer service={service} />
22+
</div>
23+
);
24+
};

src/presenter/index.tsx

+26-6
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,34 @@
11
import * as React from 'react';
22
import * as dom from 'react-dom';
3-
import service from '../service/index';
3+
import observer from '../utils/observer';
44
import App from './App';
55

6-
window.addEventListener('hashchange', () => {
7-
const route = location.hash.split('#').slice(1).join('#');
8-
service.setRoute(route);
9-
}, false);
6+
const initialState: State = {
7+
editedTitles: {},
8+
isEditing: {},
9+
newTodoTitle: '',
10+
route: '',
11+
todos: [],
12+
};
13+
14+
const getState = (): State => {
15+
const localStorageState = window.localStorage.getItem('state');
16+
if (localStorageState === null) {
17+
return initialState;
18+
}
19+
return JSON.parse(localStorageState);
20+
};
21+
22+
const patchState = (patch: Partial<State>) => {
23+
const prevState = getState();
24+
const nextState = { ...prevState, ...patch };
25+
// tslint:disable-next-line:no-console
26+
console.log('PATCH STATE', patch);
27+
window.localStorage.setItem('state', JSON.stringify(nextState));
28+
observer.emit('change', patch);
29+
};
1030

1131
dom.render(
12-
<App service={service} />,
32+
<App repo={{ getState, patchState }} />,
1333
document.getElementsByClassName('todoapp')[0],
1434
);

src/repo/index.ts

-31
This file was deleted.

src/service/index.ts

-5
This file was deleted.

0 commit comments

Comments
 (0)