require('./archivePage.less');
const React = require('react');
const createClass = require('create-react-class');
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',
v3: this.props.query.v3 !== 'false',
count: this.props.query.count || 10,
page: parseInt(this.props.query.page) || 1,
//# response
brewCollection: null,
totalBrews: null,
searching: false,
error: null,
};
},
componentDidMount: function () {
console.log(this.props.query);
console.log(this.state);
this.validateInput();
if (this.state.title) {
this.loadPage(this.state.page, false);
}
this.state.totalBrews || this.loadTotal(); // Load total if not already loaded
},
updateStateWithBrews: function (brews, page) {
this.setState({
brewCollection: brews || null,
page: parseInt(page) || 1,
searching: false,
});
},
updateUrl: function (title, page, count, v3, legacy) {
const url = new URL(window.location.href);
const urlParams = new URLSearchParams();
Object.entries({ title, page, count, v3, legacy }).forEach(([key, value]) => urlParams.set(key, value));
url.search = urlParams.toString();
window.history.replaceState(null, null, url);
},
loadPage: async function (page, update) {
this.setState({ searching: true, error: null });
const performSearch = async ({ title, count, v3, legacy }) => {
this.updateUrl(title, page, count, v3, legacy);
if (title !== '') {
try {
const response = await request.get(
`/api/archive?title=${title}&page=${page}&count=${count}&v3=${v3}&legacy=${legacy}`
);
if (response.ok) {
this.updateStateWithBrews(response.body.brews, page);
} else {
throw new Error(`Error: ${response.status}`);
}
} catch (error) {
console.log('error at loadPage: ', error);
this.setState({ error: `${error.response ? error.response.status : error.message}` });
this.updateStateWithBrews([], 1);
}
} else {
this.setState({ error: '404' });
}
};
if (update === true) {
const title = document.getElementById('title').value || '';
const count = document.getElementById('count').value || 10;
const v3 = document.getElementById('v3').checked;
const legacy = document.getElementById('legacy').checked;
this.setState(
{
title: title,
count: count,
v3: v3,
legacy: legacy,
},
() => {
// State is updated, now perform the search
performSearch({ title, count, v3, legacy });
}
);
} else {
const { title, count, v3, legacy } = this.state;
performSearch({ title, count, v3, legacy });
}
},
loadTotal: async function () {
const {title, v3, legacy} = this.state;
this.setState({
totalBrews: null,
error: null
});
if (title) {
try {
const response = await request.get(
`/api/archive/total?title=${title}&v3=${v3}&legacy=${legacy}`
);
if (response.ok) {
this.setState({
totalBrews: response.body.totalBrews,
});
} else {
throw new Error(`Failed to load total brews: ${response.statusText}`);
}
} catch (error) {
console.log('error at loadTotal: ', error);
this.setState({ error: `${error.response.status}` });
this.updateStateWithBrews([], 1);
}
}
},
renderNavItems: function () {
return (
- to negate words, and{' '}
"word" to specify an exact string.
{/* In the future, we should be able to filter the results by adding tags.
<