require('./archivePage.less'); const React = require('react'); const createClass = require('create-react-class'); const _ = require('lodash'); const cx = require('classnames'); const Nav = require('naturalcrit/nav/nav.jsx'); const Navbar = require('../../navbar/navbar.jsx'); const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; const Account = require('../../navbar/account.navitem.jsx'); const NewBrew = require('../../navbar/newbrew.navitem.jsx'); const HelpNavItem = require('../../navbar/help.navitem.jsx'); const BrewItem = require('../basePages/listPage/brewItem/brewItem.jsx'); //const StringArrayEditor = require('../stringArrayEditor/stringArrayEditor.jsx'); const request = require('../../utils/request-middleware.js'); const ArchivePage = createClass({ displayName : 'ArchivePage', getDefaultProps : function () { return {}; }, getInitialState : function () { return { //request title : this.props.query.title || '', //tags : {}, legacy : `${this.props.query.legacy === 'false' ? false : true }`, v3 : `${this.props.query.v3 === 'false' ? false : true }`, pageSize : this.props.query.size || 10, page : parseInt(this.props.query.page) || 1, //response brewCollection : null, totalPages : null, totalBrews : null, searching : false, error : null, }; }, componentDidMount : function() { if (this.state.title !== '') { this.loadPage(this.state.page, false); } }, updateStateWithBrews : function (brews, page, totalPages, totalBrews) { this.setState({ brewCollection : brews || null, page : parseInt(page) || 1, totalPages : totalPages || 1, totalBrews : totalBrews, searching : false }); }, updateStateWithForm : function() { const title = document.getElementById( 'title' ).value || ""; const size = document.getElementById( 'size' ).value || 10; const page = 1; const v3 = document.getElementById('v3').checked; const legacy = document.getElementById('legacy').checked; this.setState({ title: title, pageSize: size, v3: v3, legacy: legacy }); this.updateUrl(title, page, size, v3, legacy); }, updateUrl : function(title, page, size, v3, legacy) { const url = new URL(window.location.href); const urlParams = new URLSearchParams(url.search); //clean all params urlParams.delete('title'); urlParams.delete('page'); urlParams.delete('size'); urlParams.delete('v3'); urlParams.delete('legacy'); urlParams.set('title', title); urlParams.set('page', page); urlParams.set('size', size); urlParams.set('v3', v3); urlParams.set('legacy', legacy); url.search = urlParams.toString(); // Convert URLSearchParams to string window.history.replaceState(null, null, url); }, loadPage : async function(page, update) { if(update === true) { this.updateStateWithForm(); }; if (title !== '') { try { this.setState({ searching: true, error: null }); const title = encodeURIComponent(this.state.title); const size = parseInt(this.state.pageSize); const {legacy, v3} = this.state; await request.get(`/api/archive?title=${title}&page=${page}&size=${size}&v3=${v3}&legacy=${legacy}`) .then((response)=>{ if(response.ok) { this.updateStateWithBrews(response.body.brews, page, response.body.totalPages, response.body.totalBrews); } }); } catch (error) { this.setState({ error: `${error.response.status}` }) this.updateStateWithBrews([], 1, 1, 0); } console.log(!this.state.brewCollection || brewCollection.length === 0); if(!this.state.brewCollection) { this.setState({ error: '404'}); } } }, renderNavItems : function () { return ( Archive: Search for brews ); }, renderForm : function () { return (

Brew Lookup

{/* In the future, we should be able to filter the results by adding tags. <this.handleChange('tags', e)}/> check metadataEditor.jsx L65 */}
); }, renderPaginationControls() { const title = encodeURIComponent(this.state.title); const size = parseInt(this.state.pageSize); const {page, totalPages, legacy, v3} = this.state; const pages = new Array(totalPages).fill().map((_, index) => ( {index + 1} )); if(totalPages === null) {return;} return (
{page > 1 && ( )}
    {pages}
{page < totalPages && ( )}
); }, renderFoundBrews() { console.table(this.state); const { title, brewCollection, page, totalPages, error, searching } = this.state; if(searching) { return (

Searching

); }; if(title === '') {return (

Whenever you want, just start typing...

);} if (error) { console.log('render Error: ', error); let errorMessage; switch (error.errorCode) { case '404': errorMessage = "404 - We didn't find any brew"; break; case '503': errorMessage = ' 503 - Your search is not specific enough. Too many brews meet this criteria for us to display them.'; break; case '500': errorMessage = "500 - We don't know what happened." default: errorMessage = 'An unexpected error occurred'; } return (

Error: {errorMessage}

); }; if (!brewCollection || brewCollection.length === 0) { return (

No brews found

); }; return (
Brews found: {this.state.totalBrews} {brewCollection.map((brew, index)=>( ))} {this.renderPaginationControls()}
); }, render : function () { return (
{this.renderNavItems()}

Welcome to the Archive

{this.renderForm()}

Your results, my lordship

{this.renderFoundBrews()}
); }, }); module.exports = ArchivePage;