File Extension Image for Filter.jsx Filter.jsx
2465 Chars | 92 Lines | 2.47 kb | Text File Parent Directory
import React, { useContext, useState } from 'react'

import { usePack } from '@/stores/pack'
import { useShallow } from 'zustand/react/shallow'

import Form from 'react-bootstrap/Form'
import Button from 'react-bootstrap/Button'
import { ThemeContext } from '@/lib/context'

export function Filter({ disabled = false }) {
	const [pack, filterPackCategory, filterPackStarred, shufflePack] = usePack(
		useShallow((state) => [
			state.defaultPack,
			state.filterPackCategory,
			state.filterPackStarred,
			state.shufflePack,
		])
	)
	const theme = useContext(ThemeContext)

	const [categoryFilter, setCategoryFilter] = useState(0)
	const [starredFilter, setStarredFilter] = useState(0)
	const [shuffling, setShuffling] = useState(false)

	return (
		<div
			className="d-flex justify-content-between align-items-baseline"
			style={{ marginTop: '-0.75rem' }}
		>
			<div>
				<Button
					variant={theme.color}
					size="sm"
					className="me-3"
					inline="true"
					onClick={() => {
						setStarredFilter(0)
						setCategoryFilter(0)
						filterPackStarred(0)
						filterPackCategory(0)
					}}
					disabled={disabled}
				>
					🔄
				</Button>
				<Form.Check
					className="mt-3"
					label={starredFilter === 0 ? 'Starred Filter (Disabled)' : 'Starred Filter'}
					type="checkbox"
					inline="true"
					onChange={(e) => {
						filterPackStarred(e.target.checked)
						// TODO: very very very complicated
						// allow editing in filtered packs
						// will require us to add uuids for each card
						setStarredFilter(e.target.checked)
					}}
					checked={starredFilter}
					disabled={disabled}
				/>
				<Form.Check
					className="mt-3"
					label="Shuffle"
					type="checkbox"
					inline="true"
					onChange={(e) => {
						setShuffling(e.target.checked)
						shufflePack(e.target.checked)
					}}
					checked={shuffling}
					disabled={disabled}
				/>
			</div>
			<Form.Select
				className="w-25"
				onChange={(e) => {
					filterPackCategory(categoryFilter)
					setCategoryFilter(e.target.value)
				}}
				value={categoryFilter}
				disabled={disabled}
			>
				<option value="0">All Categories</option>
				{Object.entries(pack.categories).map(([uuid, content]) => (
					<option key={uuid} value={uuid} style={{ backgroundColor: content.colors[1] }}>
						{content.name}
					</option>
				))}
			</Form.Select>
		</div>
	)
}