import { h, Rx, Html } from 'lib/rx' import * as Book from 'book' import * as I18n from 'lib/i18n' // Model export interface Model { read?: Book.ReadStatus } const init: Model = {} // View interface ViewFiltersParams { filteredBooks: Rx> filters: Rx updateFilters: (f: (filters: Model) => Model) => void } export function view({ filteredBooks, filters, updateFilters }: ViewFiltersParams): Html { return h('ul', h('li', [ h('div', { className: 'g-FilterTitle' }, 'Lecture'), readFilter({ filteredBooks, readStatus: filters.map(fs => fs.read), update: (status?: Book.ReadStatus) => updateFilters(fs => { fs.read = status return fs }) }) ]) ) } interface ReadFilterParams { filteredBooks: Rx> readStatus: Rx update: (status?: Book.ReadStatus) => void } function readFilter({ filteredBooks, readStatus, update }: ReadFilterParams): Html { return h('ul', { className: 'g-Filters' }, readStatus.map(currentStatus => { if (currentStatus !== undefined) { return h('li', { className: 'g-Filter g-Filter--Selected' }, h('button', { onclick: () => update(undefined) }, filteredBooks.map(xs => unit(xs.length, readStatusLabels(currentStatus))) ) ) } else { return Book.readStatuses.map(status => filteredBooks.map(xs => { const count = xs.filter(b => b.read === status).length return count !== 0 ? h('li', { className: 'g-Filter g-Filter--Unselected' }, h('button', { onclick: () => update(status) }, unit(count, readStatusLabels(status)) ) ) : undefined }) ) } }) ) } function unit(n: number, labels: Array): string { return I18n.unit(n, labels[0], labels[1], (n, str) => `${str} (${n})`) } function readStatusLabels(status: Book.ReadStatus): Array { if (status === 'Read') { return ['lu', 'lus'] } else if (status === 'Unread') { return ['non lu', 'non lus'] } else if (status === 'Reading') { return ['en cours', 'en cours'] } else { return ['arrêté', 'arrêtés'] } }