import * as React from 'react'; import { Spinner, SpinnerType } from 'office-ui-fabric-react/lib/Spinner'; import { ITodoProps, ITodoState } from '../types/index'; import TodoForm from './TodoForm'; import TodoTabs from './TodoTabs'; import * as stylesImport from './Todo.scss'; const styles: any = stylesImport; import strings from '../strings'; /** * Todo component is the top level react component of this web part. * It uses fabric-react component * * Link of Spinner: https://fabricreact.azurewebsites.net/fabric-react/master/#/examples/spinner */ export default class Todo extends React.Component { constructor(props: ITodoProps) { super(props); this._onProviderChange = this._onProviderChange.bind(this); this.state = { items: this.props.dataProvider.items, }; } public componentDidMount(): void { this.props.dataProvider.addListener(this._onProviderChange); } public componentWillUnmount(): void { this.props.dataProvider.removeListener(this._onProviderChange); } public render(): React.ReactElement { return (

{strings.todoListTitle}

{this._renderWorkingOnItSpinner()}
{this._renderFetchingTasksSpinner()}
); } private _renderWorkingOnItSpinner(): React.ReactElement> | false { return ( this.props.dataProvider.isLoading && this.state.items.length > 0 && (
) ); } private _renderFetchingTasksSpinner(): React.ReactElement> | false { return ( this.props.dataProvider.isLoading && this.state.items.length === 0 && (
) ); } private _onProviderChange(): void { this.setState({ items: this.props.dataProvider.items, }); } }