返回 DeepSeek-Reasonix
WriteAccessApproval.tsx
根目录 / desktop / frontend / src / components / WriteAccessApproval.tsx
1 import type { Translator } from "../lib/i18n";
2 import type { WireApproval } from "../lib/types";
3
4 export type DecisionAction = {
5 key: string;
6 label: string;
7 desc: string;
8 tone?: "default" | "danger";
9 primary?: boolean;
10 // Plan revision and plan guidance open inline editors instead of submitting.
11 // Other recovery actions use direct-click submit (no select-then-confirm).
12 kind: "submit" | "toggle-revision" | "toggle-guidance" | "direct";
13 run?: () => void;
14 };
15
16 export function writeAccessDecisionActions(
17 t: Translator,
18 onAnswer: (allow: boolean, session: boolean, persist: boolean) => void,
19 ): DecisionAction[] {
20 return [
21 {
22 key: "1",
23 label: t("approval.writeAccessOnce"),
24 desc: t("approval.writeAccessOnceDesc"),
25 kind: "submit",
26 run: () => onAnswer(true, false, false),
27 },
28 {
29 key: "2",
30 label: t("approval.writeAccessSession"),
31 desc: t("approval.writeAccessSessionDesc"),
32 kind: "submit",
33 run: () => onAnswer(true, true, false),
34 },
35 {
36 key: "3",
37 label: t("approval.deny"),
38 desc: t("approval.denyDesc"),
39 tone: "danger",
40 kind: "submit",
41 run: () => onAnswer(false, false, false),
42 },
43 ];
44 }
45
46 export function WriteAccessApprovalDetails({
47 approval,
48 subject,
49 reason,
50 reasonOpen,
51 t,
52 }: {
53 approval: WireApproval;
54 subject: string;
55 reason: string;
56 reasonOpen: boolean;
57 t: Translator;
58 }) {
59 const writeAccess = approval.write_access;
60 const directories = writeAccess?.display_directories?.length
61 ? writeAccess.display_directories
62 : writeAccess?.directories ?? [];
63 return (
64 <div className="approval-details">
65 {subject && <pre className="approval-subject">{subject}</pre>}
66 {directories.length > 0 && (
67 <div className="approval-reason">
68 <strong>{t("approval.writeAccessDirsLabel")}: </strong>
69 {directories.join(", ")}
70 </div>
71 )}
72 {writeAccess?.justification && (
73 <div className="approval-reason">
74 <strong>{t("approval.writeAccessJustificationLabel")}: </strong>
75 {writeAccess.justification}
76 </div>
77 )}
78 {writeAccess?.broad_home_access && (
79 <div className="approval-reason" role="alert" style={{ color: "var(--danger, #c0392b)", fontWeight: 600 }}>
80 {t("approval.writeAccessHomeWarning")}
81 </div>
82 )}
83 {writeAccess?.ordinary_permission_needed && (
84 <div className="approval-reason">{t("approval.writeAccessMergedHint")}</div>
85 )}
86 {reasonOpen && reason && <div className="approval-reason">{reason}</div>}
87 </div>
88 );
89 }
90
90 lines Plain Text