Skip to content
Source
Sign inSign up

ComposerContextPermissions.tsx

67 lines2.4 KB

1import type { EnvironmentId, RuntimeMode } from "@t3tools/contracts";
2import { useAtomValue } from "@effect/atom-react";
3​
4import { shortcutLabelForCommand } from "../keybindings";
5import { useManagedPolicy } from "../state/managedPolicy";
6import { primaryServerKeybindingsAtom } from "../state/server";
7import { ComposerControl } from "./chat/ComposerControl";
8import { ComposerPermissionsSection } from "./chat/ComposerFooterControls";
9import { useComposerMenuProps } from "./chat/composerEventScope";
10import {
11 resolveCompatibleRuntimeMode,
12 resolveRuntimeModeOptions,
13 runtimeModeConfig,
14} from "./chat/runtimeModeConfig";
15import { ComposerContextLabel } from "./ComposerContextLabel";
16import { Menu, MenuPopup, MenuTrigger } from "./ui/menu";
17import { Tooltip, TooltipPopup, TooltipTrigger } from "./ui/tooltip";
18​
19export function ComposerContextPermissions(props: {
20 environmentId: EnvironmentId | null;
21 runtimeMode: RuntimeMode;
22 supportedRuntimeModes: ReadonlyArray<RuntimeMode> | undefined;
23 onRuntimeModeChange: (mode: RuntimeMode) => void;
24}) {
25 const shortcutLabel = shortcutLabelForCommand(
26 useAtomValue(primaryServerKeybindingsAtom),
27 "composer.mode",
28 );
29 const { mode, modes } = resolveCompatibleRuntimeMode(
30 props.runtimeMode,
31 props.supportedRuntimeModes,
32 );
33 const options = resolveRuntimeModeOptions(modes, useManagedPolicy(props.environmentId));
34 const composerMenuProps = useComposerMenuProps();
35 const { icon: Icon, label } = runtimeModeConfig[mode];
36 return (
37 <Menu>
38 <Tooltip>
39 <TooltipTrigger
40 render={
41 <MenuTrigger
42 render={
43 <ComposerControl
44 size="xs"
45 className="ms-auto min-w-0 shrink-0"
46 aria-label={`Permissions: ${label}`}
47 data-composer-context-control
48 />
49 }
50 />
51 }
52 >
53 <Icon aria-hidden="true" className="size-3" />
54 <ComposerContextLabel>{label}</ComposerContextLabel>
55 </TooltipTrigger>
56 <TooltipPopup>Permissions{shortcutLabel ? ` · ${shortcutLabel}` : null}</TooltipPopup>
57 </Tooltip>
58 <MenuPopup side="top" align="end" {...composerMenuProps}>
59 <ComposerPermissionsSection
60 runtimeMode={mode}
61 runtimeModeOptions={options}
62 onRuntimeModeChange={props.onRuntimeModeChange}
63 />
64 </MenuPopup>
65 </Menu>
66 );