Skip to content

Commit 0527e82

Browse files
committed
refactor bell-form to use form helper utility
1 parent 988b8bb commit 0527e82

2 files changed

Lines changed: 44 additions & 70 deletions

File tree

Lines changed: 28 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
import { Component, computed, effect, inject } from '@angular/core';
1+
import { Component, computed } from '@angular/core';
22
import { CommonModule } from '@angular/common';
33
import { FormsModule } from '@angular/forms';
4-
import { ConfigStoreService } from '../../../services/config-store.service';
54
import { KittyBellConfig } from '../../../models/kitty-types';
65
import { NumberInputComponent } from '../../shared/number-input/number-input.component';
6+
import { ColorInputComponent } from '../../shared/color-input/color-input.component';
7+
import { createFormHelper } from '../../../utils/form-helpers';
78

89
@Component({
910
selector: 'app-bell-form',
10-
imports: [CommonModule, FormsModule, NumberInputComponent],
11+
imports: [CommonModule, FormsModule, NumberInputComponent, ColorInputComponent],
1112
template: `
1213
<div class="space-y-6">
1314
<div>
@@ -21,8 +22,8 @@ import { NumberInputComponent } from '../../shared/number-input/number-input.com
2122
<label class="flex items-center gap-3 cursor-pointer">
2223
<input
2324
type="checkbox"
24-
[(ngModel)]="bell.enable_audio_bell"
25-
(ngModelChange)="updateBell()"
25+
[(ngModel)]="bell().enable_audio_bell"
26+
(ngModelChange)="helper.updateField('enable_audio_bell', $event)"
2627
class="w-5 h-5 rounded flex-shrink-0"
2728
/>
2829
<div>
@@ -36,8 +37,8 @@ import { NumberInputComponent } from '../../shared/number-input/number-input.com
3637
<label class="flex items-center gap-3 cursor-pointer">
3738
<input
3839
type="checkbox"
39-
[(ngModel)]="bell.window_alert_on_bell"
40-
(ngModelChange)="updateBell()"
40+
[(ngModel)]="bell().window_alert_on_bell"
41+
(ngModelChange)="helper.updateField('window_alert_on_bell', $event)"
4142
class="w-5 h-5 rounded flex-shrink-0"
4243
/>
4344
<div>
@@ -52,12 +53,12 @@ import { NumberInputComponent } from '../../shared/number-input/number-input.com
5253
<div class="form-group">
5354
<label class="block text-sm font-medium text-kitty-text mb-2">
5455
Visual Bell Duration
55-
<span class="text-kitty-accent font-bold ml-2">{{ bell.visual_bell_duration }}s</span>
56+
<span class="text-kitty-accent font-bold ml-2">{{ bell().visual_bell_duration }}s</span>
5657
<span class="text-kitty-text-dim text-xs ml-1">(0 = disabled)</span>
5758
</label>
5859
<app-number-input
59-
[(ngModel)]="bell.visual_bell_duration"
60-
(ngModelChange)="updateBell()"
60+
[(ngModel)]="bell().visual_bell_duration"
61+
(ngModelChange)="helper.updateField('visual_bell_duration', $event)"
6162
[min]="0"
6263
[step]="0.05"
6364
/>
@@ -70,16 +71,16 @@ import { NumberInputComponent } from '../../shared/number-input/number-input.com
7071
</label>
7172
<input
7273
type="text"
73-
[(ngModel)]="bell.bell_on_tab"
74-
(ngModelChange)="updateBell()"
74+
[(ngModel)]="bell().bell_on_tab"
75+
(ngModelChange)="helper.updateField('bell_on_tab', $event)"
7576
class="w-full px-4 py-2 bg-kitty-bg border border-kitty-border rounded-lg text-kitty-text focus:outline-none focus:ring-2 focus:ring-kitty-primary font-mono"
76-
placeholder="🔔 "
77+
placeholder=" "
7778
/>
7879
</div>
7980
</div>
8081
</div>
8182
82-
@if (advancedMode()) {
83+
@if (helper.advancedMode()) {
8384
<div class="bg-kitty-surface rounded-lg p-6 border border-kitty-border">
8485
<h3 class="text-lg font-semibold text-kitty-text mb-1">Bell Commands & Sounds</h3>
8586
<p class="text-kitty-text-dim text-sm mb-4">Execute a program or play a custom sound file when the bell fires</p>
@@ -91,19 +92,9 @@ import { NumberInputComponent } from '../../shared/number-input/number-input.com
9192
<span class="text-kitty-text-dim text-xs ml-2">'none' uses current background</span>
9293
</label>
9394
<div class="flex gap-2 items-center">
94-
<input
95-
type="color"
96-
[value]="visualBellColorForPicker"
97-
(change)="setVisualBellColor($event)"
98-
class="w-12 h-10 rounded-lg cursor-pointer bg-kitty-bg border border-kitty-border flex-shrink-0"
99-
/>
100-
<input
101-
type="text"
102-
[(ngModel)]="bell.visual_bell_color"
103-
(ngModelChange)="updateBell()"
104-
class="flex-1 px-4 py-2 bg-kitty-bg border border-kitty-border rounded-lg text-kitty-text focus:outline-none focus:ring-2 focus:ring-kitty-primary font-mono"
105-
placeholder="none or #ff0000"
106-
/>
95+
<app-color-input
96+
[value]="visualBellColorForPicker()"
97+
(valueChange)="helper.updateField('visual_bell_color', $event)" />
10798
</div>
10899
</div>
109100
@@ -114,8 +105,8 @@ import { NumberInputComponent } from '../../shared/number-input/number-input.com
114105
</label>
115106
<input
116107
type="text"
117-
[(ngModel)]="bell.command_on_bell"
118-
(ngModelChange)="updateBell()"
108+
[(ngModel)]="bell().command_on_bell"
109+
(ngModelChange)="helper.updateField('command_on_bell', $event)"
119110
class="w-full px-4 py-2 bg-kitty-bg border border-kitty-border rounded-lg text-kitty-text focus:outline-none focus:ring-2 focus:ring-kitty-primary font-mono text-sm"
120111
placeholder="none"
121112
/>
@@ -128,8 +119,8 @@ import { NumberInputComponent } from '../../shared/number-input/number-input.com
128119
</label>
129120
<input
130121
type="text"
131-
[(ngModel)]="bell.bell_path"
132-
(ngModelChange)="updateBell()"
122+
[(ngModel)]="bell().bell_path"
123+
(ngModelChange)="helper.updateField('bell_path', $event)"
133124
class="w-full px-4 py-2 bg-kitty-bg border border-kitty-border rounded-lg text-kitty-text focus:outline-none focus:ring-2 focus:ring-kitty-primary font-mono text-sm"
134125
placeholder="none or /path/to/bell.wav"
135126
/>
@@ -142,8 +133,8 @@ import { NumberInputComponent } from '../../shared/number-input/number-input.com
142133
</label>
143134
<input
144135
type="text"
145-
[(ngModel)]="bell.linux_bell_theme"
146-
(ngModelChange)="updateBell()"
136+
[(ngModel)]="bell().linux_bell_theme"
137+
(ngModelChange)="helper.updateField('linux_bell_theme', $event)"
147138
class="w-full px-4 py-2 bg-kitty-bg border border-kitty-border rounded-lg text-kitty-text focus:outline-none focus:ring-2 focus:ring-kitty-primary font-mono text-sm"
148139
placeholder="__custom or freedesktop"
149140
/>
@@ -156,27 +147,10 @@ import { NumberInputComponent } from '../../shared/number-input/number-input.com
156147
styles: []
157148
})
158149
export class BellFormComponent {
159-
private readonly configStore = inject(ConfigStoreService);
150+
readonly helper = createFormHelper('bell');
151+
readonly bell = this.helper.state.asReadonly();
160152

161-
readonly advancedMode = computed(() => this.configStore.advancedMode());
162-
bell: KittyBellConfig = { ...this.configStore.configState().bell };
163-
164-
get visualBellColorForPicker(): string {
165-
return this.bell.visual_bell_color.startsWith('#') ? this.bell.visual_bell_color : '#ff0000';
166-
}
167-
168-
constructor() {
169-
effect(() => {
170-
this.bell = { ...this.configStore.configState().bell };
171-
});
172-
}
173-
174-
setVisualBellColor(event: Event): void {
175-
this.bell = { ...this.bell, visual_bell_color: (event.target as HTMLInputElement).value };
176-
this.updateBell();
177-
}
178-
179-
updateBell(): void {
180-
this.configStore.updateSection('bell', { ...this.bell });
153+
visualBellColorForPicker(): string {
154+
return this.bell().visual_bell_color?.startsWith('#') ? this.bell().visual_bell_color : '#ff0000';
181155
}
182156
}

src/components/forms/mouse-form/mouse-form.component.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,8 @@ import { createFormHelper } from '../../../utils/form-helpers';
119119
</label>
120120
<input
121121
type="text"
122-
[(ngModel)]="mouse.open_url_with"
123-
(ngModelChange)="updateMouse()"
122+
[(ngModel)]="mouse().open_url_with"
123+
(ngModelChange)="helper.updateField('open_url_with', $event)"
124124
class="w-full px-4 py-2 bg-kitty-bg border border-kitty-border rounded-lg text-kitty-text focus:outline-none focus:ring-2 focus:ring-kitty-primary font-mono text-sm"
125125
placeholder="default"
126126
/>
@@ -146,8 +146,8 @@ import { createFormHelper } from '../../../utils/form-helpers';
146146
<label class="flex items-center gap-3 cursor-pointer">
147147
<input
148148
type="checkbox"
149-
[(ngModel)]="mouse.show_hyperlink_targets"
150-
(ngModelChange)="updateMouse()"
149+
[(ngModel)]="mouse().show_hyperlink_targets"
150+
(ngModelChange)="helper.updateField('show_hyperlink_targets', $event)"
151151
class="w-5 h-5 rounded flex-shrink-0"
152152
/>
153153
<div>
@@ -163,8 +163,8 @@ import { createFormHelper } from '../../../utils/form-helpers';
163163
<span class="text-kitty-text-dim text-xs ml-2">When to underline OSC 8 hyperlinks</span>
164164
</label>
165165
<select
166-
[(ngModel)]="mouse.underline_hyperlinks"
167-
(ngModelChange)="updateMouse()"
166+
[(ngModel)]="mouse().underline_hyperlinks"
167+
(ngModelChange)="helper.updateField('underline_hyperlinks', $event)"
168168
class="w-full px-4 py-2 bg-kitty-bg border border-kitty-border rounded-lg text-kitty-text focus:outline-none focus:ring-2 focus:ring-kitty-primary"
169169
>
170170
<option value="always">Always</option>
@@ -217,8 +217,8 @@ import { createFormHelper } from '../../../utils/form-helpers';
217217
</label>
218218
<input
219219
type="text"
220-
[(ngModel)]="mouse.select_by_word_characters_forward"
221-
(ngModelChange)="updateMouse()"
220+
[(ngModel)]="mouse().select_by_word_characters_forward"
221+
(ngModelChange)="helper.updateField('select_by_word_characters_forward', $event)"
222222
class="w-full px-4 py-2 bg-kitty-bg border border-kitty-border rounded-lg text-kitty-text focus:outline-none focus:ring-2 focus:ring-kitty-primary font-mono text-sm"
223223
placeholder=""
224224
/>
@@ -227,8 +227,8 @@ import { createFormHelper } from '../../../utils/form-helpers';
227227
<div class="form-group">
228228
<label class="block text-sm font-medium text-kitty-text mb-2">Pointer Shape When Grabbed</label>
229229
<select
230-
[(ngModel)]="mouse.pointer_shape_when_grabbed"
231-
(ngModelChange)="updateMouse()"
230+
[(ngModel)]="mouse().pointer_shape_when_grabbed"
231+
(ngModelChange)="helper.updateField('pointer_shape_when_grabbed', $event)"
232232
class="w-full px-4 py-2 bg-kitty-bg border border-kitty-border rounded-lg text-kitty-text focus:outline-none focus:ring-2 focus:ring-kitty-primary"
233233
>
234234
<option value="arrow">arrow</option>
@@ -242,8 +242,8 @@ import { createFormHelper } from '../../../utils/form-helpers';
242242
<div class="form-group">
243243
<label class="block text-sm font-medium text-kitty-text mb-2">Default Pointer Shape</label>
244244
<select
245-
[(ngModel)]="mouse.default_pointer_shape"
246-
(ngModelChange)="updateMouse()"
245+
[(ngModel)]="mouse().default_pointer_shape"
246+
(ngModelChange)="helper.updateField('default_pointer_shape', $event)"
247247
class="w-full px-4 py-2 bg-kitty-bg border border-kitty-border rounded-lg text-kitty-text focus:outline-none focus:ring-2 focus:ring-kitty-primary"
248248
>
249249
<option value="arrow">arrow</option>
@@ -255,8 +255,8 @@ import { createFormHelper } from '../../../utils/form-helpers';
255255
<div class="form-group">
256256
<label class="block text-sm font-medium text-kitty-text mb-2">Pointer Shape When Dragging</label>
257257
<select
258-
[(ngModel)]="mouse.pointer_shape_when_dragging"
259-
(ngModelChange)="updateMouse()"
258+
[(ngModel)]="mouse().pointer_shape_when_dragging"
259+
(ngModelChange)="helper.updateField('pointer_shape_when_dragging', $event)"
260260
class="w-full px-4 py-2 bg-kitty-bg border border-kitty-border rounded-lg text-kitty-text focus:outline-none focus:ring-2 focus:ring-kitty-primary"
261261
>
262262
<option value="arrow">arrow</option>
@@ -295,8 +295,8 @@ import { createFormHelper } from '../../../utils/form-helpers';
295295
</label>
296296
<input
297297
type="text"
298-
[(ngModel)]="mouse.select_by_word_characters"
299-
(ngModelChange)="updateMouse()"
298+
[(ngModel)]="mouse().select_by_word_characters"
299+
(ngModelChange)="helper.updateField('select_by_word_characters', $event)"
300300
class="w-full px-4 py-2 bg-kitty-bg border border-kitty-border rounded-lg text-kitty-text focus:outline-none focus:ring-2 focus:ring-kitty-primary font-mono text-sm"
301301
placeholder="@-./_~?&=%+#"
302302
/>

0 commit comments

Comments
 (0)