feat: filtr jednostek multisplit, ostatnio oglądane, sklep pompy ciepła, czyszczenie komentarzy, checkbox zgody

- Filtr 'Ilość jednostek wewn.' w sklepie (1–9 jednostek, checkboxy, liczniki)
- Komponent RecentlyViewedProducts + Zustand store (recently-viewed-store.ts)
- Pompy ciepła dodane do sklepu i nawigacji (Header + MobileMenu)
- Logotypy marek zaktualizowane (Daikin, Panasonic + odświeżone istniejące)
- Checkbox zgody RODO w /zamowienie powiększony (w-5 h-5)
- Usunięcie ~65 zbędnych komentarzy WHAT z 12 plików (build: 0 errors)
- Plik analyze_products.ts (pomocniczy skrypt diagnostyczny)
This commit is contained in:
MichalC
2026-08-02 20:31:55 +02:00
parent 092cff1899
commit c9e4283789
37 changed files with 331 additions and 123 deletions
+48 -1
View File
@@ -15,6 +15,8 @@ const contactFormSchema = z.object({
city: z.string().min(1, "Wybierz miasto"),
subject: z.string().optional(),
message: z.string().optional(),
brand: z.string().optional(),
age: z.string().optional(),
});
type ContactFormValues = z.infer<typeof contactFormSchema>;
@@ -28,7 +30,8 @@ export function ContactForm() {
register,
handleSubmit: hookFormSubmit,
formState: { errors, isSubmitting },
reset
reset,
watch
} = useForm<ContactFormValues>({
resolver: zodResolver(contactFormSchema),
defaultValues: {
@@ -38,6 +41,8 @@ export function ContactForm() {
city: '',
subject: '',
message: '',
brand: '',
age: '',
}
});
@@ -185,11 +190,53 @@ export function ContactForm() {
<option value="">Wybierz temat...</option>
<option value="klimatyzacja">Klimatyzacja</option>
<option value="pompy-ciepla">Pompy ciepła</option>
<option value="serwis">Serwis</option>
<option value="inne">Inne zapytanie</option>
</select>
{errors.subject && <p className="text-red-500 text-xs font-medium">{errors.subject.message}</p>}
</div>
{/* Warunkowe pola dla serwisu */}
{watch('subject') === 'serwis' && (
<div className="grid grid-cols-1 sm:grid-cols-2 gap-6">
<div className="space-y-2">
<label htmlFor="brand" className="text-sm font-semibold text-primary">Marka klimatyzatora</label>
<select
{...register("brand")}
id="brand"
className={`w-full px-4 py-3 rounded-xl border ${errors.brand ? 'border-red-500 focus:ring-red-500' : 'border-border focus:border-primary focus:ring-primary/20'} outline-none focus:ring-2 transition-all bg-slate-50 appearance-none`}
>
<option value="">Wybierz markę...</option>
<option value="Daikin">Daikin</option>
<option value="Mitsubishi">Mitsubishi</option>
<option value="LG">LG</option>
<option value="Samsung">Samsung</option>
<option value="Gree">Gree</option>
<option value="Rotenso">Rotenso</option>
<option value="Haier">Haier</option>
<option value="Aux">Aux</option>
<option value="Fuji Electric">Fuji Electric</option>
<option value="Toshiba">Toshiba</option>
<option value="Inna">Inna / Nie wiem</option>
</select>
</div>
<div className="space-y-2">
<label htmlFor="age" className="text-sm font-semibold text-primary">Wiek urządzenia</label>
<select
{...register("age")}
id="age"
className={`w-full px-4 py-3 rounded-xl border ${errors.age ? 'border-red-500 focus:ring-red-500' : 'border-border focus:border-primary focus:ring-primary/20'} outline-none focus:ring-2 transition-all bg-slate-50 appearance-none`}
>
<option value="">Jak długo masz klimatyzator?</option>
<option value="Mniej niż rok">Mniej niż rok (na gwarancji)</option>
<option value="1-3 lata">1 - 3 lata</option>
<option value="Ponad 3 lata">Ponad 3 lata</option>
<option value="Nie wiem">Nie wiem</option>
</select>
</div>
</div>
)}
{/* Wiadomość */}
<div className="space-y-2">
<label htmlFor="message" className="text-sm font-semibold text-primary">Wiadomość</label>