summaryrefslogtreecommitdiff
path: root/apps/web/src/actions/guards.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/src/actions/guards.ts')
-rw-r--r--apps/web/src/actions/guards.ts29
1 files changed, 29 insertions, 0 deletions
diff --git a/apps/web/src/actions/guards.ts b/apps/web/src/actions/guards.ts
new file mode 100644
index 00000000..c4fbe8a7
--- /dev/null
+++ b/apps/web/src/actions/guards.ts
@@ -0,0 +1,29 @@
+import { ACTIONS } from "./definitions";
+import type { TActionArgsMap, TActionWithOptionalArgs } from "./types";
+
+type TActionWithRequiredArgs = {
+ [K in keyof TActionArgsMap]: undefined extends TActionArgsMap[K]
+ ? never
+ : K;
+}[keyof TActionArgsMap];
+
+/**
+ * Actions that require arguments cannot be bound to a shortcut key — a key
+ * press has no way to supply them. Keep in sync with the required (non-
+ * optional) members of `TActionArgsMap`; the type annotation rejects keys
+ * that are not actually required-args actions.
+ */
+const ACTIONS_WITH_REQUIRED_ARGS: readonly TActionWithRequiredArgs[] = [
+ "remove-media-asset",
+ "remove-media-assets",
+];
+
+export function isActionWithOptionalArgs(
+ action: unknown,
+): action is TActionWithOptionalArgs {
+ return (
+ typeof action === "string" &&
+ action in ACTIONS &&
+ !(ACTIONS_WITH_REQUIRED_ARGS as readonly string[]).includes(action)
+ );
+}