|
@@ -49,6 +49,8 @@ import { jotaiStore } from "../../jotai";
|
|
|
import { activeConfirmDialogAtom } from "../ActiveConfirmDialog";
|
|
|
import { CommandPaletteItem } from "./types";
|
|
|
import * as defaultItems from "./defaultCommandPaletteItems";
|
|
|
+import { trackEvent } from "../../analytics";
|
|
|
+import { useStable } from "../../hooks/useStable";
|
|
|
|
|
|
import "./CommandPalette.scss";
|
|
|
|
|
@@ -130,12 +132,20 @@ export const CommandPalette = Object.assign(
|
|
|
if (isCommandPaletteToggleShortcut(event)) {
|
|
|
event.preventDefault();
|
|
|
event.stopPropagation();
|
|
|
- setAppState((appState) => ({
|
|
|
- openDialog:
|
|
|
+ setAppState((appState) => {
|
|
|
+ const nextState =
|
|
|
appState.openDialog?.name === "commandPalette"
|
|
|
? null
|
|
|
- : { name: "commandPalette" },
|
|
|
- }));
|
|
|
+ : ({ name: "commandPalette" } as const);
|
|
|
+
|
|
|
+ if (nextState) {
|
|
|
+ trackEvent("command_palette", "open", "shortcut");
|
|
|
+ }
|
|
|
+
|
|
|
+ return {
|
|
|
+ openDialog: nextState,
|
|
|
+ };
|
|
|
+ });
|
|
|
}
|
|
|
};
|
|
|
window.addEventListener(EVENT.KEYDOWN, commandPaletteShortcut, {
|
|
@@ -174,10 +184,20 @@ function CommandPaletteInner({
|
|
|
|
|
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
|
|
|
|
+ const stableDeps = useStable({
|
|
|
+ uiAppState,
|
|
|
+ customCommandPaletteItems,
|
|
|
+ appProps,
|
|
|
+ });
|
|
|
+
|
|
|
useEffect(() => {
|
|
|
- if (!uiAppState || !app.scene || !actionManager) {
|
|
|
- return;
|
|
|
- }
|
|
|
+ // these props change often and we don't want them to re-run the effect
|
|
|
+ // which would renew `allCommands`, cascading down and resetting state.
|
|
|
+ //
|
|
|
+ // This means that the commands won't update on appState/appProps changes
|
|
|
+ // while the command palette is open
|
|
|
+ const { uiAppState, customCommandPaletteItems, appProps } = stableDeps;
|
|
|
+
|
|
|
const getActionLabel = (action: Action) => {
|
|
|
let label = "";
|
|
|
if (action.label) {
|
|
@@ -533,15 +553,13 @@ function CommandPaletteInner({
|
|
|
);
|
|
|
}
|
|
|
}, [
|
|
|
+ stableDeps,
|
|
|
app,
|
|
|
- appProps,
|
|
|
- uiAppState,
|
|
|
actionManager,
|
|
|
setAllCommands,
|
|
|
lastUsed?.label,
|
|
|
setLastUsed,
|
|
|
setAppState,
|
|
|
- customCommandPaletteItems,
|
|
|
]);
|
|
|
|
|
|
const [commandSearch, setCommandSearch] = useState("");
|