import React, { Component } from 'react'; import { connect } from 'react-redux'; import Router from 'next/router'; import Paginate from 'react-paginate'; import Page from '../comps/Page'; import PaddedRow from '../comps/PaddedRow'; import Spinner from '../comps/Spinner'; import DocItem from '../comps/DocItem'; import { $limit, getDocs, buildQ } from '../util/getDocs'; import getJwt from '../util/getJwt'; import mapUser from '../util/mapUser'; class Index extends Component { state = { $sort: 'updated:-1', $search: '', page: 1, pending: false, error: null, total: 0, docs: [] } static async getInitialProps({ req, query }) { let page = 1, $search = ''; if(query) { page = query.page || page; $search = query.search || $search; } const jwt = getJwt(req); if(!jwt) return { total: 0, docs: [] }; const q = buildQ({ $search, $skip: page }); const data = await getDocs(q, req ? jwt : false); return { ...data, page, $search }; } updDocs = (time, doSearch) => { clearTimeout(this.docsTime); this.docsTime = setTimeout(async () => { let { $sort, $search, page } = this.state; if(doSearch) { const query = { search: $search }; if(!$search) delete query.search; Router.push({ pathname: '/', query }); } this.setState({ error: null }); this.docsTime = setTimeout(() => { this.setState({ pending: true }); }, 125); const q = buildQ({ $search, $sort, $skip: page }); const data = await getDocs(q); clearTimeout(this.docsTime); this.setState({ ...data, pending: false }); }, time || 275); } updQuery = e => { this.setState({ [e.target.id]: e.target.value }); this.updDocs(0, e.target.id === '$search'); } handlePage = ({ selected }) => { const { $search } = this.state; const page = selected + 1; const query = {}; this.setState({ page }); if(page > 1) query.page = page; if($search) query.search = $search; Router.push({ pathname: '/', query }); this.updDocs(1); } static getDerivedStateFromProps(nextProps, prevState) { let { docs, total, page, $search } = nextProps; if(docs.length !== prevState.docs.length || page !== prevState.page || $search !== prevState.$search) { return { total, docs, page, $search, pending: false }; } return null; } componentDidUpdate(prevProps) { const { user, docs } = this.props; if(prevProps.user.email === user.email) return; if(user.email && docs.length === 0) this.updDocs(1); } render() { const { $sort, $search, pending, error, docs, total, page } = this.state; const pages = Math.ceil(total / $limit); return (

Docs

{docs.length > 0 || error || pending ? null :

No docs found...

} {!error ? null :

{error}

} {!pending || error ? null : } {docs.length < 1 || pending || error ? null :
{docs.map(doc => )}
Doc Modified
{pages < 2 ? null : }
}
); } } export default connect(mapUser)(Index);