import { useMemo } from 'react' import { fuzzySearch } from '../utils/fuzzy' import { MOCK_NAMESPACES, MOCK_PODS, MOCK_DEPLOYMENTS, MOCK_SERVICES } from '../data/mockResources' export interface SpotlightResource { id: string type: string name: string namespace?: string status?: string color: string } export const useSpotlight = () => { const executeSearch = (query: string, filterType: string | null): SpotlightResource[] => { if (!query || query.trim() === '') { return [] } const resources: SpotlightResource[] = [] const addIfExists = (items: any[], type: string) => { items.forEach((item, index) => { const name = item.name || item.metadata?.name const ns = item.namespace || item.metadata?.namespace || 'default' const color = getNamespaceColor(ns) const score = fuzzySearch(query, name) if (score > 0.3) { if (!filterType || filterType === 'all' || filterType === type) { resources.push({ id: `${type}-${index}-${name}`, type, name, namespace: ns, color: color, }) } } }) } if (!filterType || filterType === 'all' || filterType === 'namespace') { MOCK_NAMESPACES.forEach((ns, index) => { if (fuzzySearch(query, ns.name) > 0.3) { resources.push({ id: `namespace-${index}-${ns.name}`, type: 'namespace', name: ns.name, color: getNamespaceColor(ns.name), }) } }) } if (!filterType || filterType === 'all' || filterType === 'pod') { addIfExists(MOCK_PODS, 'pod') } if (!filterType || filterType === 'all' || filterType === 'deployment') { addIfExists(MOCK_DEPLOYMENTS, 'deployment') } if (!filterType || filterType === 'all' || filterType === 'service') { addIfExists(MOCK_SERVICES, 'service') } return resources.sort((a, b) => fuzzySearch(query, b.name) - fuzzySearch(query, a.name)) } const getQuickActions = (query: string): SpotlightResource[] => { const actions: SpotlightResource[] = [] const namespaces = Array.from(new Set([...MOCK_NAMESPACES.map((ns) => ns.name)])) namespaces.forEach((ns, index) => { actions.push({ id: `quick-${index}-${ns}`, type: 'quick_create', name: `Create krate for ns/${ns}`, namespace: ns, color: getNamespaceColor(ns), }) }) actions.push({ id: 'quick-pods', type: 'quick_create', name: 'All pods', color: '#6fb1ff', }) actions.push({ id: 'quick-svcs', type: 'quick_create', name: 'All services', color: '#6fb1ff', }) actions.push({ id: 'quick-deployments', type: 'quick_create', name: 'All deployments', color: '#6fb1ff', }) if (query.trim()) { actions.push({ id: 'quick-search', type: 'quick_create', name: `Search again for "${query}"`, color: '#4dd6e8', }) } return actions } const getNamespaceColor = (namespace: string): string => { if (namespace === 'default') return '#6fb1ff' if (namespace === 'kube-system') return '#9c88ff' if (namespace === 'kube-public') return '#4dd6e8' if (namespace === 'production') return '#6fb1ff' if (namespace === 'staging') return '#4dd6e8' return '#6fb1ff' } return useMemo( () => ({ executeSearch, getQuickActions, getNamespaceColor, }), [] ) }