diff options
| author | bndw <ben@bdw.to> | 2026-02-28 21:35:39 -0800 |
|---|---|---|
| committer | bndw <ben@bdw.to> | 2026-02-28 21:35:39 -0800 |
| commit | 0484d97dfbc3b8a2e7878d3ab35a9895decdf467 (patch) | |
| tree | cdc6fffe8b169c83058e8d64ca42723f6ccb6dcf /renderer/src/components/settings/GitSettings.tsx | |
| parent | 04c63d4ef601876186e5d7fab980d76575c494ec (diff) | |
feat: **1 — `git.ts`:** Add exported `getCurrentBranch` helpe… (+8 more)
- ✅ **1 — `git.ts`:** Add exported `getCurrentBranch` helper after `ensureGitRepo`
- ✅ **2a — `ipc/handlers.ts`:** Update git import to include `ensureGitRepo` and `getCurrentBranch`
- ✅ **2b — `ipc/handlers.ts`:** Replace `workflow:advance` implement-phase block with branching-toggle logic
- ✅ **3 — `GitSettings.tsx`:** Create new settings component with pill toggle
- ✅ **4 — `SettingsPage.tsx`:** Add `"git"` section type, import, nav item, content render; fix both unicode glyphs
- ✅ **5 — `globals.css`:** Append toggle-row + pill toggle + maximize-btn CSS
- ✅ **6 — `index.ts`:** Add `ipcMain` to import; add `window:toggleMaximize` handler + maximize/unmaximize events inside `createWindow()`
- ✅ **7 — `preload.ts`:** Add `toggleMaximize` + `onWindowMaximized` to interface and `api` object
- ✅ **8 — `Header.tsx`:** Add `isMaximized` state + effect + maximize button in JSX
Diffstat (limited to 'renderer/src/components/settings/GitSettings.tsx')
| -rw-r--r-- | renderer/src/components/settings/GitSettings.tsx | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/renderer/src/components/settings/GitSettings.tsx b/renderer/src/components/settings/GitSettings.tsx new file mode 100644 index 0000000..0ec9875 --- /dev/null +++ b/renderer/src/components/settings/GitSettings.tsx | |||
| @@ -0,0 +1,78 @@ | |||
| 1 | import React, { useState, useEffect } from "react"; | ||
| 2 | |||
| 3 | const api = window.api; | ||
| 4 | |||
| 5 | export function GitSettings() { | ||
| 6 | // null = setting not yet loaded; true/false = loaded value | ||
| 7 | const [branchingEnabled, setBranchingEnabled] = useState<boolean | null>(null); | ||
| 8 | const [saveStatus, setSaveStatus] = useState<"idle" | "saved">("idle"); | ||
| 9 | |||
| 10 | useEffect(() => { | ||
| 11 | api.getSettings(["git.branchingEnabled"]).then((settings) => { | ||
| 12 | // Key absent or any value other than "true" → false (opt-in default) | ||
| 13 | setBranchingEnabled(settings["git.branchingEnabled"] === "true"); | ||
| 14 | }); | ||
| 15 | }, []); | ||
| 16 | |||
| 17 | const handleToggle = async (enabled: boolean) => { | ||
| 18 | setBranchingEnabled(enabled); | ||
| 19 | if (enabled) { | ||
| 20 | await api.setSetting("git.branchingEnabled", "true"); | ||
| 21 | } else { | ||
| 22 | await api.deleteSetting("git.branchingEnabled"); | ||
| 23 | } | ||
| 24 | setSaveStatus("saved"); | ||
| 25 | setTimeout(() => setSaveStatus("idle"), 1500); | ||
| 26 | }; | ||
| 27 | |||
| 28 | if (branchingEnabled === null) { | ||
| 29 | return ( | ||
| 30 | <div style={{ color: "var(--text-secondary)", fontSize: 12 }}> | ||
| 31 | Loading... | ||
| 32 | </div> | ||
| 33 | ); | ||
| 34 | } | ||
| 35 | |||
| 36 | return ( | ||
| 37 | <div> | ||
| 38 | <div className="settings-section-title">Git</div> | ||
| 39 | <div className="settings-section-desc"> | ||
| 40 | Configure how Claude Flow interacts with your project's git repository | ||
| 41 | during the implement phase. | ||
| 42 | </div> | ||
| 43 | |||
| 44 | <div className="settings-toggle-row"> | ||
| 45 | <label className="settings-toggle-label" htmlFor="git-branching-toggle"> | ||
| 46 | <span className="settings-toggle-text"> | ||
| 47 | <strong>Create a branch per session</strong> | ||
| 48 | <span className="settings-toggle-hint"> | ||
| 49 | When enabled, Claude Flow checks out a new{" "} | ||
| 50 | <code>claude-flow/<name>-<id></code> branch when | ||
| 51 | entering the implement phase. When disabled, commits land on | ||
| 52 | your current branch. | ||
| 53 | </span> | ||
| 54 | </span> | ||
| 55 | <span | ||
| 56 | className={`settings-toggle${branchingEnabled ? " on" : ""}`} | ||
| 57 | role="switch" | ||
| 58 | aria-checked={branchingEnabled} | ||
| 59 | id="git-branching-toggle" | ||
| 60 | tabIndex={0} | ||
| 61 | onClick={() => handleToggle(!branchingEnabled)} | ||
| 62 | onKeyDown={(e) => { | ||
| 63 | if (e.key === " " || e.key === "Enter") { | ||
| 64 | e.preventDefault(); | ||
| 65 | handleToggle(!branchingEnabled); | ||
| 66 | } | ||
| 67 | }} | ||
| 68 | /> | ||
| 69 | </label> | ||
| 70 | {saveStatus === "saved" && ( | ||
| 71 | <span className="settings-custom-badge" style={{ color: "var(--accent)" }}> | ||
| 72 | saved ✓ | ||
| 73 | </span> | ||
| 74 | )} | ||
| 75 | </div> | ||
| 76 | </div> | ||
| 77 | ); | ||
| 78 | } | ||
