diff --git a/components/CategoryFilterWidget.tsx b/components/CategoryFilterWidget.tsx index 992f1bc..3d14cfd 100644 --- a/components/CategoryFilterWidget.tsx +++ b/components/CategoryFilterWidget.tsx @@ -6,12 +6,26 @@ import { UsersIcon } from '@heroicons/react/24/outline'; export const CategoryFilterWidget: React.FC = () => { const { shortcuts, filterCategory, setFilterCategory, filterProfile, setFilterProfile } = useGTab(); - const activeCategories = useMemo(() => { - return ['All', ...new Set(shortcuts.map(s => s.category))]; - }, [shortcuts]); + const { activeCategories, uniqueProfiles } = useMemo(() => { + // ⚡ Bolt Optimization: Consolidate category and profile extraction into a single loop + // Replaces multiple mapping/flatMapping operations with a fast single pass + const categorySet = new Set(); + const profileSet = new Set(); + + for (let i = 0; i < shortcuts.length; i++) { + const s = shortcuts[i]; + categorySet.add(s.category); + if (s.profiles) { + for (let j = 0; j < s.profiles.length; j++) { + profileSet.add(s.profiles[j].name); + } + } + } - const uniqueProfiles = useMemo(() => { - return Array.from(new Set(shortcuts.flatMap(s => s.profiles?.map(p => p.name) || []))).sort(); + return { + activeCategories: ['All', ...categorySet], + uniqueProfiles: Array.from(profileSet).sort() + }; }, [shortcuts]); return ( diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +///