Files
sase.tr/apps/web/src/components/vehicles/vin-input.tsx
Sase Dev 3184e4c619 style: apply biome safe auto-fixes
Run 'biome check --fix' on apps/api/src and apps/web/src to clear
the safe-fixable lint backlog (151 files: parseInt → Number.parseInt,
isNaN → Number.isNaN, organize imports, etc.). 769 errors remain
that require manual changes (mostly noExplicitAny).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 16:13:56 +00:00

55 lines
1.6 KiB
TypeScript

import { Button } from "@sase/ui";
import { Input } from "@sase/ui";
import { Search } from "lucide-react";
import { useState } from "react";
const VIN_REGEX = /^[A-HJ-NPR-Z0-9]{17}$/;
function isValidVin(vin: string): boolean {
if (!vin || vin.length !== 17) return false;
return VIN_REGEX.test(vin.toUpperCase());
}
interface VinInputProps {
onSubmit: (vin: string) => void;
loading?: boolean;
error?: string | null;
}
export function VinInput({ onSubmit, loading, error }: VinInputProps) {
const [vin, setVin] = useState("");
function handleSubmit(e: React.FormEvent) {
e.preventDefault();
const cleanVin = vin.toUpperCase().trim();
if (!isValidVin(cleanVin)) return;
onSubmit(cleanVin);
}
const vinUpper = vin.toUpperCase().trim();
const isInvalid = vinUpper.length === 17 && !isValidVin(vinUpper);
return (
<div>
<form onSubmit={handleSubmit} className="flex gap-3">
<Input
placeholder="VIN numarasini girin (17 karakter)"
value={vin}
onChange={(e) => setVin(e.target.value.toUpperCase())}
maxLength={17}
className="font-mono text-lg tracking-wider"
/>
<Button type="submit" disabled={loading || vin.length !== 17 || isInvalid}>
{loading ? <span className="animate-spin">...</span> : <Search className="h-4 w-4" />}
Ara
</Button>
</form>
{isInvalid && (
<p className="mt-2 text-sm text-destructive">
Gecersiz VIN. 17 karakter olmali, I, O, Q harfleri kullanilamaz.
</p>
)}
{error && <p className="mt-2 text-sm text-destructive">{error}</p>}
</div>
);
}