Make photo chooser searchable

This commit is contained in:
Sam Becker 2026-02-28 14:42:25 -06:00
parent 7baedd0700
commit 3694fd061d

View File

@ -8,6 +8,8 @@ import { GRID_SPACE_CLASSNAME } from '@/components';
import useDynamicPhoto from '../useDynamicPhoto'; import useDynamicPhoto from '../useDynamicPhoto';
import { IoSearch } from 'react-icons/io5'; import { IoSearch } from 'react-icons/io5';
import { useState } from 'react'; import { useState } from 'react';
import usePhotoQuery from '../usePhotoQuery';
import Spinner from '@/components/Spinner';
export default function FieldsetPhotoChooser({ export default function FieldsetPhotoChooser({
label, label,
@ -25,6 +27,10 @@ export default function FieldsetPhotoChooser({
photosHidden?: Photo[] photosHidden?: Photo[]
}) { }) {
const [query, setQuery] = useState(''); const [query, setQuery] = useState('');
const {
photos: photosQuery,
isLoading,
} = usePhotoQuery(query);
const { const {
photo: photoAvatar, photo: photoAvatar,
@ -76,17 +82,19 @@ export default function FieldsetPhotoChooser({
<div className="grow"> <div className="grow">
Choose photo Choose photo
</div> </div>
<IoSearch size={16} /> {isLoading ? <Spinner /> : <IoSearch size={16} />}
</div> </div>
<input <FieldsetWithStatus
label="Search for a photo"
type="text" type="text"
placeholder="Search for a photo" placeholder="Search for a photo"
className="w-full mb-2" className="w-full mb-2"
value={query} value={query}
onChange={e => setQuery(e.target.value)} onChange={setQuery}
hideLabel
/> />
<div className="grid grid-cols-3 gap-0.5"> <div className="grid grid-cols-3 gap-0.5">
{photos.map(photo => ( {(photosQuery.length > 0 ? photosQuery : photos).map(photo => (
<span <span
key={photo.id} key={photo.id}
className={clsx( className={clsx(
@ -99,8 +107,8 @@ export default function FieldsetPhotoChooser({
alt={altTextForPhoto(photo)} alt={altTextForPhoto(photo)}
aspectRatio={photo.aspectRatio} aspectRatio={photo.aspectRatio}
blurDataURL={photo.blurData} blurDataURL={photo.blurData}
// eslint-disable-next-line max-len blurCompatibilityMode={
blurCompatibilityMode={doesPhotoNeedBlurCompatibility(photo)} doesPhotoNeedBlurCompatibility(photo)}
onClick={() => onChange(photo.id)} onClick={() => onChange(photo.id)}
/> />
</span> </span>