|
27 | 27 | onclose: () => void; |
28 | 28 | } = $props(); |
29 | 29 |
|
30 | | - const initialAutoCreate = linearAutoCreate; |
31 | 30 | let sshHost = $state(localStorage.getItem(SSH_STORAGE_KEY) ?? ""); |
32 | | - let autoCreate = $state(initialAutoCreate); |
| 31 | + let pendingAutoCreate = $state<boolean | null>(null); |
| 32 | + let autoCreate = $derived(pendingAutoCreate ?? linearAutoCreate); |
33 | 33 | let autoCreateSaving = $state(false); |
34 | | - let lastSyncedAutoCreate = initialAutoCreate; |
35 | 34 |
|
36 | | - const initialAutoRemove = autoRemoveOnMerge; |
37 | | - let autoRemove = $state(initialAutoRemove); |
| 35 | + let pendingAutoRemove = $state<boolean | null>(null); |
| 36 | + let autoRemove = $derived(pendingAutoRemove ?? autoRemoveOnMerge); |
38 | 37 | let autoRemoveSaving = $state(false); |
39 | | - let lastSyncedAutoRemove = initialAutoRemove; |
40 | 38 |
|
41 | | - $effect(() => { |
42 | | - if (autoCreate === lastSyncedAutoCreate) return; |
43 | | - const desired = autoCreate; |
44 | | - lastSyncedAutoCreate = desired; |
| 39 | + function handleAutoCreateToggle(enabled: boolean) { |
| 40 | + pendingAutoCreate = enabled; |
45 | 41 | autoCreateSaving = true; |
46 | | - api.setLinearAutoCreate(desired) |
| 42 | + api.setLinearAutoCreate(enabled) |
47 | 43 | .then((result) => { |
48 | | - autoCreate = result.enabled; |
49 | | - lastSyncedAutoCreate = result.enabled; |
50 | 44 | onlinearautocreatechange(result.enabled); |
51 | 45 | }) |
52 | | - .catch(() => { |
53 | | - autoCreate = !desired; |
54 | | - lastSyncedAutoCreate = !desired; |
55 | | - }) |
56 | 46 | .finally(() => { |
| 47 | + pendingAutoCreate = null; |
57 | 48 | autoCreateSaving = false; |
58 | 49 | }); |
59 | | - }); |
| 50 | + } |
60 | 51 |
|
61 | | - $effect(() => { |
62 | | - if (autoRemove === lastSyncedAutoRemove) return; |
63 | | - const desired = autoRemove; |
64 | | - lastSyncedAutoRemove = desired; |
| 52 | + function handleAutoRemoveToggle(enabled: boolean) { |
| 53 | + pendingAutoRemove = enabled; |
65 | 54 | autoRemoveSaving = true; |
66 | | - api.setAutoRemoveOnMerge(desired) |
| 55 | + api.setAutoRemoveOnMerge(enabled) |
67 | 56 | .then((result) => { |
68 | | - autoRemove = result.enabled; |
69 | | - lastSyncedAutoRemove = result.enabled; |
70 | 57 | onautoremovechange(result.enabled); |
71 | 58 | }) |
72 | | - .catch(() => { |
73 | | - autoRemove = !desired; |
74 | | - lastSyncedAutoRemove = !desired; |
75 | | - }) |
76 | 59 | .finally(() => { |
| 60 | + pendingAutoRemove = null; |
77 | 61 | autoRemoveSaving = false; |
78 | 62 | }); |
79 | | - }); |
| 63 | + } |
80 | 64 |
|
81 | 65 | function handleSave() { |
82 | 66 | const trimmed = sshHost.trim(); |
|
130 | 114 | </p> |
131 | 115 | </div> |
132 | 116 |
|
133 | | - <Toggle bind:checked={autoCreate} disabled={autoCreateSaving} aria-label="Auto-create worktrees for Linear tickets" /> |
| 117 | + <Toggle |
| 118 | + checked={autoCreate} |
| 119 | + disabled={autoCreateSaving} |
| 120 | + ontoggle={handleAutoCreateToggle} |
| 121 | + aria-label="Auto-create worktrees for Linear tickets" |
| 122 | + /> |
134 | 123 | </div> |
135 | 124 | </div> |
136 | 125 |
|
|
144 | 133 | </p> |
145 | 134 | </div> |
146 | 135 |
|
147 | | - <Toggle bind:checked={autoRemove} disabled={autoRemoveSaving} aria-label="Auto-remove worktrees on PR merge" /> |
| 136 | + <Toggle |
| 137 | + checked={autoRemove} |
| 138 | + disabled={autoRemoveSaving} |
| 139 | + ontoggle={handleAutoRemoveToggle} |
| 140 | + aria-label="Auto-remove worktrees on PR merge" |
| 141 | + /> |
148 | 142 | </div> |
149 | 143 | </div> |
150 | 144 |
|
|
0 commit comments