This repository has been archived by the owner on Jun 22, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
206 additions
and
170 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,40 +1,43 @@ | ||
import * as React from 'react'; | ||
import Service from '../service/Facade'; | ||
import asyncRender from './utils/asyncRender'; | ||
import connect from './utils/connect'; | ||
import AsyncConnect from './utils/AsyncConnect'; | ||
|
||
export interface Props { | ||
readonly service: Service; | ||
} | ||
|
||
export default connect(asyncRender(async ({ service }: Props) => { | ||
const route = service.getRoute(); | ||
const completeCount = await service.getCompleteCount(); | ||
const incompleteCount = await service.getIncompleteCount(); | ||
export default ({ service }: Props) => { | ||
return ( | ||
<AsyncConnect service={service} render={async () => { | ||
const route = service.getRoute(); | ||
const completeCount = await service.getCompleteCount(); | ||
const incompleteCount = await service.getIncompleteCount(); | ||
|
||
const renderLink = (text: string, link: string) => { | ||
const className = route === link ? 'selected' : ''; | ||
const href = `#${link}`; | ||
return <li><a href={href} className={className}>{text}</a></li>; | ||
}; | ||
const renderLink = (text: string, link: string) => { | ||
const className = route === link ? 'selected' : ''; | ||
const href = `#${link}`; | ||
return <li><a href={href} className={className}>{text}</a></li>; | ||
}; | ||
|
||
return ( | ||
<footer className="footer"> | ||
<span className="todo-count"> | ||
<strong>{incompleteCount}</strong> items left | ||
</span> | ||
<ul className="filters"> | ||
{renderLink('All', '')} | ||
{renderLink('Active', 'active')} | ||
{renderLink('Completed', 'completed')} | ||
</ul> | ||
{completeCount > 0 ? ( | ||
<button | ||
className="clear-completed" | ||
onClick={async () => { await service.deleteCompleted(); }}> | ||
Clear completed | ||
</button> | ||
) : <noscript />} | ||
</footer> | ||
return ( | ||
<footer className="footer"> | ||
<span className="todo-count"> | ||
<strong>{incompleteCount}</strong> items left | ||
</span> | ||
<ul className="filters"> | ||
{renderLink('All', '')} | ||
{renderLink('Active', 'active')} | ||
{renderLink('Completed', 'completed')} | ||
</ul> | ||
{completeCount > 0 ? ( | ||
<button | ||
className="clear-completed" | ||
onClick={async () => { await service.deleteCompleted(); }}> | ||
Clear completed | ||
</button> | ||
) : <noscript />} | ||
</footer> | ||
); | ||
}} /> | ||
); | ||
})); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,30 +1,34 @@ | ||
import * as React from 'react'; | ||
import Service from '../service/Facade'; | ||
import connect from './utils/connect'; | ||
import SyncConnect from './utils/SyncConnect'; | ||
|
||
const enterKey = 13; | ||
|
||
export interface Props { | ||
readonly service: Service; | ||
} | ||
|
||
export default connect(({ service }: Props) => { | ||
const newTodoTitle = service.getNewTodoTitle(); | ||
|
||
export default ({ service }: Props) => { | ||
return ( | ||
<input | ||
className="new-todo" | ||
placeholder="What needs to be done?" | ||
value={newTodoTitle} | ||
onChange={(event) => { | ||
service.changeNewTodoTitle((event.target as any).value); | ||
}} | ||
onKeyDown={async (event) => { | ||
if (event.keyCode === enterKey) { | ||
await service.createNewTodo(); | ||
service.changeNewTodoTitle(''); | ||
} | ||
}} | ||
/> | ||
<SyncConnect service={service} render={() => { | ||
const newTodoTitle = service.getNewTodoTitle(); | ||
|
||
return ( | ||
<input | ||
className="new-todo" | ||
placeholder="What needs to be done?" | ||
value={newTodoTitle} | ||
onChange={(event) => { | ||
service.changeNewTodoTitle((event.target as any).value); | ||
}} | ||
onKeyDown={async (event) => { | ||
if (event.keyCode === enterKey) { | ||
await service.createNewTodo(); | ||
service.changeNewTodoTitle(''); | ||
} | ||
}} | ||
/> | ||
); | ||
}} /> | ||
); | ||
}); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,23 +1,26 @@ | ||
import * as React from 'react'; | ||
import Service from '../service/Facade'; | ||
import TodoItem from './TodoItem'; | ||
import asyncRender from './utils/asyncRender'; | ||
import connect from './utils/connect'; | ||
import AsyncConnect from './utils/AsyncConnect'; | ||
|
||
export interface Props { | ||
readonly service: Service; | ||
} | ||
|
||
export default connect(asyncRender(async ({ service }: Props) => { | ||
const todos = await service.getRouteTodos(); | ||
|
||
export default ({ service }: Props) => { | ||
return ( | ||
<div> | ||
<ul className="todo-list"> | ||
{todos.map((todo) => { | ||
return <TodoItem key={todo.id} todo={todo} service={service} />; | ||
})} | ||
</ul> | ||
</div> | ||
<AsyncConnect service={service} render={async () => { | ||
const todos = await service.getRouteTodos(); | ||
|
||
return ( | ||
<div> | ||
<ul className="todo-list"> | ||
{todos.map((todo) => { | ||
return <TodoItem key={todo.id} todo={todo} service={service} />; | ||
})} | ||
</ul> | ||
</div> | ||
); | ||
}} /> | ||
); | ||
})); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
import * as React from 'react'; | ||
import Service from '../../service/Facade'; | ||
import observer from '../../utils/observer'; | ||
|
||
const loader = () => { | ||
return <span>Loading</span>; | ||
}; | ||
|
||
export interface Props { | ||
readonly service: Service; | ||
readonly render: () => Promise<JSX.Element>; | ||
} | ||
|
||
export interface State { | ||
readonly renderedComponent: JSX.Element; | ||
} | ||
|
||
// tslint:disable:no-class no-this | ||
export default class AsyncConnect extends React.Component<Props, State> { | ||
constructor(p: Props, s: State) { | ||
super(p, s); | ||
const renderedComponent = loader(); | ||
this.state = { renderedComponent }; | ||
} | ||
|
||
public componentDidMount() { | ||
observer.addListener('change', this.update.bind(this)); | ||
this.update().catch((err) => { | ||
// tslint:disable-next-line:no-console | ||
console.error(err); | ||
}); | ||
} | ||
|
||
public componentWillUnmount() { | ||
observer.removeListener('change', this.update.bind(this)); | ||
} | ||
|
||
private async update() { | ||
const renderedComponent = await this.props.render(); | ||
this.setState({ renderedComponent }); | ||
} | ||
|
||
public render() { | ||
return this.state.renderedComponent; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
import * as React from 'react'; | ||
import Service from '../../service/Facade'; | ||
import observer from '../../utils/observer'; | ||
|
||
export interface Props { | ||
readonly service: Service; | ||
readonly render: () => JSX.Element; | ||
} | ||
|
||
export interface State { | ||
readonly change: Date; | ||
} | ||
|
||
// tslint:disable:no-class no-this | ||
export default class Connect extends React.Component<Props, State> { | ||
public componentDidMount() { | ||
observer.addListener('change', this.update.bind(this)); | ||
} | ||
|
||
public componentWillUnmount() { | ||
observer.removeListener('change', this.update.bind(this)); | ||
} | ||
|
||
private async update() { | ||
this.setState({ change: new Date() }); | ||
} | ||
|
||
public render() { | ||
return this.props.render(); | ||
} | ||
} |
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.