1- import { Component , computed , effect , inject } from '@angular/core' ;
1+ import { Component , computed } from '@angular/core' ;
22import { CommonModule } from '@angular/common' ;
33import { FormsModule } from '@angular/forms' ;
4- import { ConfigStoreService } from '../../../services/config-store.service' ;
54import { KittyBellConfig } from '../../../models/kitty-types' ;
65import { 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} )
158149export 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}
0 commit comments