2026-01-15 14:13:34 -06:00
|
|
|
import { MagnifyingGlassIcon } from "@radix-ui/react-icons";
|
2026-01-16 20:13:56 -06:00
|
|
|
import { useCallback, useEffect, useRef } from "react";
|
2026-01-15 14:13:34 -06:00
|
|
|
import { useStrings } from "../../hooks/useStrings";
|
2026-01-15 14:30:40 -06:00
|
|
|
import { Avatars } from "../../stores/avatars";
|
2026-01-15 14:13:34 -06:00
|
|
|
import { TextField } from "../TextField";
|
|
|
|
|
import "./index.css";
|
|
|
|
|
|
|
|
|
|
export function AvatarControls() {
|
|
|
|
|
const strings = useStrings();
|
2026-01-15 14:30:40 -06:00
|
|
|
const search = useRef<HTMLInputElement>(null);
|
2026-01-15 14:13:34 -06:00
|
|
|
|
2026-01-16 20:13:56 -06:00
|
|
|
const onChange = useCallback(() => {
|
|
|
|
|
if (!search.current) return;
|
|
|
|
|
|
|
|
|
|
const trimmed = search.current.value.trim();
|
|
|
|
|
|
|
|
|
|
Avatars.mutate((draft) => {
|
|
|
|
|
if (trimmed.length === 0) {
|
|
|
|
|
draft.search = null;
|
|
|
|
|
} else {
|
|
|
|
|
draft.search = trimmed;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
useEffect(onChange, []);
|
|
|
|
|
|
2026-01-15 14:13:34 -06:00
|
|
|
return (
|
2026-01-15 14:30:40 -06:00
|
|
|
<div className="avatar-controls">
|
|
|
|
|
<TextField
|
|
|
|
|
ref={search}
|
|
|
|
|
className="search"
|
|
|
|
|
placeholder={strings.avatars.search}
|
2026-01-16 20:13:56 -06:00
|
|
|
onLoad={onChange}
|
2026-01-15 14:30:40 -06:00
|
|
|
>
|
2026-01-15 14:13:34 -06:00
|
|
|
<MagnifyingGlassIcon />
|
|
|
|
|
</TextField>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|