mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-05-07 13:15:46 +00:00
* refactor(ui): replace in-repo Command primitive with cmdk wrapper * feat(command-palette): add global Cmd+K palette with v1 actions * feat(command-palette): add session, file, and commit search sources * refactor: add provider names to model constants * feat(command-palette): add settings, navigation, message search, and ⌘K hints * feat(command-palette): add git fetch/pull/push and branch switch actions * refactor(command-palette): consolidate fetch source hooks behind useApiSource * refactor(command-palette): extract useCommandKey and SETTINGS_MAIN_TABS metadata * refactor(command-palette): extract groups into declarative registry * refactor(command-palette): wire openFile through PaletteOpsContext * refactor: migrate openSettings and refreshProjects from window.* to PaletteOpsContext * refactor(command-palette): inline groups and delete registry indirection * refactor(command-palette): return items array directly from source hooks * refactor(palette-ops): flatten Handle wrapper into ref-based registry * refactor: inline useCommandKey as MOD_KEY constant in two call sites * feat: introduce pages and fix bug on branch switching * fix: small labels * fix: coderabbit issues * fix: coderabbit comments * Update src/components/chat/view/subcomponents/ProviderSelectionEmptyState.tsx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
54 lines
2.0 KiB
TypeScript
54 lines
2.0 KiB
TypeScript
import { createContext, useContext, useEffect, useMemo, useRef } from 'react';
|
|
import type { MutableRefObject, ReactNode } from 'react';
|
|
|
|
export type PaletteOps = {
|
|
openFile: (path: string) => void;
|
|
openSettings: (tab?: string) => void;
|
|
refreshProjects: () => Promise<void> | void;
|
|
};
|
|
|
|
type Registry = MutableRefObject<Partial<PaletteOps>>;
|
|
|
|
const PaletteOpsContext = createContext<Registry | null>(null);
|
|
|
|
const defaultOps: PaletteOps = {
|
|
openFile: () => undefined,
|
|
openSettings: () => undefined,
|
|
refreshProjects: () => undefined,
|
|
};
|
|
|
|
export function PaletteOpsProvider({ children }: { children: ReactNode }) {
|
|
const ref = useRef<Partial<PaletteOps>>({});
|
|
return <PaletteOpsContext.Provider value={ref}>{children}</PaletteOpsContext.Provider>;
|
|
}
|
|
|
|
export function usePaletteOps(): PaletteOps {
|
|
const ref = useContext(PaletteOpsContext);
|
|
return useMemo<PaletteOps>(
|
|
() => ({
|
|
openFile: (path) => (ref?.current.openFile ?? defaultOps.openFile)(path),
|
|
openSettings: (tab) => (ref?.current.openSettings ?? defaultOps.openSettings)(tab),
|
|
refreshProjects: () => (ref?.current.refreshProjects ?? defaultOps.refreshProjects)(),
|
|
}),
|
|
[ref],
|
|
);
|
|
}
|
|
|
|
export function usePaletteOpsRegister(partial: Partial<PaletteOps>) {
|
|
const ref = useContext(PaletteOpsContext);
|
|
const { openFile, openSettings, refreshProjects } = partial;
|
|
|
|
useEffect(() => {
|
|
if (!ref) return undefined;
|
|
const prev = { ...ref.current };
|
|
if (openFile) ref.current.openFile = openFile;
|
|
if (openSettings) ref.current.openSettings = openSettings;
|
|
if (refreshProjects) ref.current.refreshProjects = refreshProjects;
|
|
return () => {
|
|
if (openFile && ref.current.openFile === openFile) ref.current.openFile = prev.openFile;
|
|
if (openSettings && ref.current.openSettings === openSettings) ref.current.openSettings = prev.openSettings;
|
|
if (refreshProjects && ref.current.refreshProjects === refreshProjects) ref.current.refreshProjects = prev.refreshProjects;
|
|
};
|
|
}, [ref, openFile, openSettings, refreshProjects]);
|
|
}
|