|
|
|
import { useContext, useState } from 'preact/hooks'
|
|
|
|
import { Problem as ProblemModel } from '../../shared/model'
|
|
|
|
import { sortByNumericKey, sortByStringKey } from '../../shared/utils'
|
|
|
|
import { Header } from '../components/Header'
|
|
|
|
|
|
|
|
import { Problem } from '../components/Problem'
|
|
|
|
import { Select } from '../components/Select'
|
|
|
|
import { useResource, MetadataContext } from '../hooks'
|
|
|
|
|
|
|
|
function byTime(p: ProblemModel): string {
|
|
|
|
return p.createdAt
|
|
|
|
}
|
|
|
|
|
|
|
|
function bySolvedProblems(p: ProblemModel & { solutionsCount: number }): number {
|
|
|
|
return p.solutionsCount
|
|
|
|
}
|
|
|
|
|
|
|
|
type SortOrder = 'latest' | 'oldest' | 'top-solved' | 'least-solved'
|
|
|
|
|
|
|
|
const SORT_ORDER: Record<SortOrder, boolean> = {
|
|
|
|
'latest': false,
|
|
|
|
'oldest': true,
|
|
|
|
'top-solved': false,
|
|
|
|
'least-solved': true,
|
|
|
|
}
|
|
|
|
|
|
|
|
export const HomePage = () => {
|
|
|
|
const metadata = useContext(MetadataContext)
|
|
|
|
metadata.title = `PHC Problemi`
|
|
|
|
metadata.description = 'Bacheca di problemi di matematica creato dal PHC'
|
|
|
|
|
|
|
|
const [problems] = useResource<(ProblemModel & { solutionsCount: number })[]>('/api/problems', [])
|
|
|
|
|
|
|
|
const [sortOrder, setSortOrder] = useState<SortOrder>('oldest')
|
|
|
|
|
|
|
|
const sortedProblems =
|
|
|
|
sortOrder === 'latest' || sortOrder === 'oldest'
|
|
|
|
? sortByStringKey(problems, byTime, SORT_ORDER[sortOrder])
|
|
|
|
: sortByNumericKey(problems, bySolvedProblems, SORT_ORDER[sortOrder])
|
|
|
|
|
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<Header />
|
|
|
|
<main class="page-home">
|
|
|
|
<div class="board">
|
|
|
|
<div class="fill-row board-controls">
|
|
|
|
<div class="sort-order">
|
|
|
|
<Select
|
|
|
|
value={sortOrder}
|
|
|
|
setValue={setSortOrder}
|
|
|
|
options={{
|
|
|
|
'latest': 'Prima più recenti',
|
|
|
|
'oldest': 'Prima più antichi',
|
|
|
|
'top-solved': 'Prima più risolti',
|
|
|
|
'least-solved': 'Prima meno risolti',
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
{sortedProblems.map(p => (
|
|
|
|
<Problem {...p} />
|
|
|
|
))}
|
|
|
|
</div>
|
|
|
|
</main>
|
|
|
|
</>
|
|
|
|
)
|
|
|
|
}
|