feat: add mode filtering to ModCodes component

This commit is contained in:
2026-04-02 15:06:47 +08:00
parent 3573a23acf
commit 335de44487
+26 -21
View File
@@ -48,9 +48,9 @@ const MOD_CODES: ModCode[] = (rawModCodes as ModCodeSource[]).map((item, index)
})) }))
export default function ModCodes() { export default function ModCodes() {
const [keyword, setKeyword] = useState("")
const [activeTag, setActiveTag] = useState<string>("全部") const [activeTag, setActiveTag] = useState<string>("全部")
const [activeWeapon, setActiveWeapon] = useState<string>("全部") const [activeWeapon, setActiveWeapon] = useState<string>("全部")
const [activeMode, setActiveMode] = useState<string>("全部")
const [copiedId, setCopiedId] = useState<string | null>(null) const [copiedId, setCopiedId] = useState<string | null>(null)
const [copyErrorId, setCopyErrorId] = useState<string | null>(null) const [copyErrorId, setCopyErrorId] = useState<string | null>(null)
@@ -77,6 +77,16 @@ export default function ModCodes() {
return ["全部", ...Array.from(weapons)] return ["全部", ...Array.from(weapons)]
}, []) }, [])
const allModes = useMemo(() => {
const modes = new Set<string>()
MOD_CODES.forEach((item) => {
if (item.mode) {
modes.add(item.mode)
}
})
return ["全部", ...Array.from(modes)]
}, [])
const allTags = useMemo(() => { const allTags = useMemo(() => {
const tags = new Set<string>() const tags = new Set<string>()
MOD_CODES.forEach((item) => { MOD_CODES.forEach((item) => {
@@ -86,19 +96,13 @@ export default function ModCodes() {
}, []) }, [])
const filtered = useMemo(() => { const filtered = useMemo(() => {
const q = keyword.trim().toLowerCase()
return MOD_CODES.filter((item) => { return MOD_CODES.filter((item) => {
const matchWeapon = activeWeapon === "全部" || item.weapon === activeWeapon const matchWeapon = activeWeapon === "全部" || item.weapon === activeWeapon
const matchMode = activeMode === "全部" || item.mode === activeMode
const matchTag = activeTag === "全部" || item.tags.includes(activeTag) const matchTag = activeTag === "全部" || item.tags.includes(activeTag)
const matchKeyword = return matchWeapon && matchMode && matchTag
q.length === 0 ||
item.weapon.toLowerCase().includes(q) ||
item.code.toLowerCase().includes(q) ||
(item.mode?.toLowerCase().includes(q) ?? false) ||
item.tags.some((tag) => tag.toLowerCase().includes(q))
return matchWeapon && matchTag && matchKeyword
}) })
}, [activeWeapon, activeTag, keyword]) }, [activeMode, activeWeapon, activeTag])
const colCount = useColumnCount() const colCount = useColumnCount()
@@ -126,9 +130,7 @@ export default function ModCodes() {
return ( return (
<section className="space-y-6"> <section className="space-y-6">
<div className="space-y-4 px-1"> <div className="space-y-4 px-1">
<p className="text-sm text-gray-600"> <p className="text-sm text-gray-600"> tag </p>
tag tag
</p>
<div className="grid gap-3 sm:grid-cols-2 lg:grid-cols-3"> <div className="grid gap-3 sm:grid-cols-2 lg:grid-cols-3">
<label className="block"> <label className="block">
@@ -144,21 +146,24 @@ export default function ModCodes() {
</select> </select>
</label> </label>
<label className="block"> <label className="block">
<span className="block text-sm font-medium text-gray-700 mb-1"></span> <span className="block text-sm font-medium text-gray-700 mb-1"></span>
<input <select
value={keyword} value={activeMode}
onChange={(event) => setKeyword(event.target.value)} onChange={(event) => setActiveMode(event.target.value)}
placeholder="例如:M4、近战、DF-" className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-100 bg-white"
className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-100" >
/> {allModes.map((mode) => (
<option key={mode} value={mode}>{mode}</option>
))}
</select>
</label> </label>
<div className="flex items-end"> <div className="flex items-end">
<button <button
type="button" type="button"
onClick={() => { onClick={() => {
setKeyword("")
setActiveTag("全部") setActiveTag("全部")
setActiveWeapon("全部") setActiveWeapon("全部")
setActiveMode("全部")
}} }}
className="rounded-lg border border-gray-300 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50" className="rounded-lg border border-gray-300 px-4 py-2 text-sm text-gray-700 hover:bg-gray-50"
> >