Add 'load more comments' links to the thread's end

This commit is contained in:
Christopher Gurnee 2022-02-20 14:12:10 -05:00
parent 07c72a2e41
commit 59df221ff9
5 changed files with 35 additions and 10 deletions

2
dist/main.css vendored

File diff suppressed because one or more lines are too long

View file

@ -1,6 +1,6 @@
import React from 'react' import React from 'react'
import Comment from './Comment' import Comment from './Comment'
import {connect, sort, filter} from '../../state' import {connect, sort, filter, maxCommentsDefault} from '../../state'
import { import {
topSort, bottomSort, newSort, oldSort, topSort, bottomSort, newSort, oldSort,
showRemovedAndDeleted, showRemoved, showDeleted showRemovedAndDeleted, showRemoved, showDeleted
@ -72,6 +72,7 @@ const commentSection = (props) => {
console.time('render comment section') console.time('render comment section')
const commentTree = unflatten(props.comments, props.root, props.removed, props.deleted) const commentTree = unflatten(props.comments, props.root, props.removed, props.deleted)
const {commentFilter, commentSort} = props.global.state const {commentFilter, commentSort} = props.global.state
const maxCommentsPreferred = props.global.getMaxComments()
if (commentFilter === filter.removedDeleted) { if (commentFilter === filter.removedDeleted) {
filterCommentTree(commentTree, showRemovedAndDeleted) filterCommentTree(commentTree, showRemovedAndDeleted)
@ -94,14 +95,24 @@ const commentSection = (props) => {
return ( return (
commentTree.length !== 0 commentTree.length !== 0
? commentTree.map(comment => ( ? <> {commentTree.map(comment => (
<Comment <Comment
key={comment.id} key={comment.id}
{...comment} {...comment}
depth={0} depth={0}
postAuthor={props.postAuthor} postAuthor={props.postAuthor}
/> />
)) ))}
<p className='load-more'>
{maxCommentsPreferred <= maxCommentsDefault / 2 &&
<a onClick={() => props.global.loadMoreComments(maxCommentsPreferred)}>load {maxCommentsPreferred} more comments</a>
}
<a onClick={() => props.global.loadMoreComments(maxCommentsDefault)}>load {maxCommentsDefault} more comments</a>
{maxCommentsPreferred >= maxCommentsDefault * 2 &&
<a onClick={() => props.global.loadMoreComments(maxCommentsPreferred)}>load {maxCommentsPreferred} more comments</a>
}
</p>
</>
: <p>No comments found</p> : <p>No comments found</p>
) )
} }

View file

@ -2,7 +2,7 @@ import React, { useState } from 'react'
import {connect, sort, filter, maxCommentsLimit} from '../../state' import {connect, sort, filter, maxCommentsLimit} from '../../state'
const sortBy = props => { const sortBy = props => {
const [reloadVisible, setReloadVisible] = useState(false) const [maxCommentsField, setMaxCommentsField] = useState(props.global.state.maxComments)
const isFirefox = typeof InstallTrigger !== 'undefined' const isFirefox = typeof InstallTrigger !== 'undefined'
let usedMouse; let usedMouse;
@ -36,13 +36,12 @@ const sortBy = props => {
<span className='space' /> <span className='space' />
<input id='maxComments' <input id='maxComments'
onKeyDown={e => e.key == "Enter" && e.target.blur()} onKeyDown={e => e.key == "Enter" && e.target.blur()}
onChange= {e => onChange= {e => setMaxCommentsField(parseInt(e.target.value))}
setReloadVisible(parseInt(e.target.value) > props.global.state.maxComments && props.global.state.maxComments < maxCommentsLimit)}
onBlur= {e => e.target.value = props.global.saveMaxComments(e.target.value)} onBlur= {e => e.target.value = props.global.saveMaxComments(e.target.value)}
{ ...(isFirefox ? { { ...(isFirefox ? {
onClick: e => e.target.focus() } : {}) } onClick: e => e.target.focus() } : {}) }
defaultValue={props.global.state.maxComments} type='number' maxLength='5' required min='100' max={maxCommentsLimit} step='100' /> defaultValue={props.global.state.maxComments} type='number' maxLength='5' required min='100' max={maxCommentsLimit} step='100' />
{reloadVisible && !props.reloadingComments && <> {maxCommentsField > props.global.state.maxComments && props.global.state.maxComments < maxCommentsLimit && !props.reloadingComments && <>
<span className='space' /> <span className='space' />
<input onClick={() => {props.global.loadMaxComments(); setReloadVisible(false)}} type='button' value='Reload' /> <input onClick={() => {props.global.loadMaxComments(); setReloadVisible(false)}} type='button' value='Reload' />
</>} </>}

View file

@ -141,3 +141,10 @@
color: rgb(204, 204, 204) color: rgb(204, 204, 204)
margin-bottom: 10px margin-bottom: 10px
.load-more a
color: $author
font-weight: bold
font-size: 10px
margin-left: 16px
cursor: pointer

View file

@ -46,6 +46,7 @@ class GlobalState extends Container {
this.setState({commentFilter: filterType}) this.setState({commentFilter: filterType})
} }
// Contrains, saves, and returns it, but does not change the state (does not load more comments)
saveMaxComments (maxComments) { saveMaxComments (maxComments) {
maxComments = Math.min(Math.round(maxComments), maxCommentsLimit) maxComments = Math.min(Math.round(maxComments), maxCommentsLimit)
if (!(maxComments >= 100)) // also true when maxComments isn't a number if (!(maxComments >= 100)) // also true when maxComments isn't a number
@ -54,7 +55,14 @@ class GlobalState extends Container {
return maxComments return maxComments
} }
loadMaxComments = () => this.setState({maxComments: get(maxCommentsKey, maxCommentsDefault)}) // Gets the saved setting, regardless of the current state
getMaxComments = () => get(maxCommentsKey, maxCommentsDefault)
// Sets the current state based on the saved setting (loads more comments)
loadMaxComments = () => this.setState({maxComments: this.getMaxComments()})
// Sets the current state loading moreComments, ignoring the saved setting
loadMoreComments = moreComments => this.setState({maxComments: this.state.maxComments + moreComments})
setSuccess = () => { setSuccess = () => {
this.setState({statusText: '', statusHelpUrl: undefined, statusImage: '/images/success.png'}) this.setState({statusText: '', statusHelpUrl: undefined, statusImage: '/images/success.png'})