hata düzeltme 1

This commit is contained in:
2026-01-13 22:37:50 +03:00
parent 32009b4886
commit dc1b6f1359
11 changed files with 658 additions and 30 deletions

View File

@@ -0,0 +1,198 @@
"use client"
import { useState } from "react"
import { useForm } from "react-hook-form"
import { zodResolver } from "@hookform/resolvers/zod"
import * as z from "zod"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import {
Form,
FormControl,
FormDescription,
FormField,
FormItem,
FormLabel,
FormMessage,
} from "@/components/ui/form"
import { Card, CardContent, CardDescription, CardHeader, CardTitle, CardFooter } from "@/components/ui/card"
import { toast } from "sonner"
import { Loader2, Smartphone, Send } from "lucide-react"
import { updateSmsSettings, sendTestSms } from "@/lib/sms/actions"
const smsSettingsSchema = z.object({
username: z.string().min(1, "Kullanıcı adı gereklidir."),
password: z.string().optional(),
header: z.string().min(1, "Başlık (Gönderici Adı) gereklidir."),
})
type SmsSettingsValues = z.infer<typeof smsSettingsSchema>
interface SmsSettingsFormProps {
initialData: {
username: string
header: string
} | null
}
export function SmsSettingsForm({ initialData }: SmsSettingsFormProps) {
const [loading, setLoading] = useState(false)
const [testLoading, setTestLoading] = useState(false)
const [testPhone, setTestPhone] = useState("")
const form = useForm<SmsSettingsValues>({
resolver: zodResolver(smsSettingsSchema),
defaultValues: {
username: initialData?.username || "",
header: initialData?.header || "",
password: "",
},
})
const onSubmit = async (data: SmsSettingsValues) => {
setLoading(true)
try {
const result = await updateSmsSettings({
username: data.username,
password: data.password,
header: data.header,
})
if (result.error) {
toast.error(result.error)
return
}
toast.success("SMS ayarları güncellendi.")
// Don't reset form fully, keeps values visible except password
form.setValue("password", "")
} catch {
toast.error("Bir sorun oluştu.")
} finally {
setLoading(false)
}
}
const onTestSms = async () => {
if (!testPhone) {
toast.error("Lütfen bir test numarası girin.")
return
}
setTestLoading(true)
try {
const result = await sendTestSms(testPhone)
if (result.error) {
toast.error("Test başarısız: " + result.error)
} else {
toast.success("Test SMS başarıyla gönderildi!")
}
} catch {
toast.error("Test sırasında bir hata oluştu.")
} finally {
setTestLoading(false)
}
}
return (
<div className="grid gap-6">
<Card>
<CardHeader>
<CardTitle>NetGSM Konfigürasyonu</CardTitle>
<CardDescription>
NetGSM API bilgilerinizi buradan yönetebilirsiniz. Şifre alanı sadece değiştirmek istediğinizde gereklidir.
</CardDescription>
</CardHeader>
<CardContent>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
<FormField
control={form.control}
name="username"
render={({ field }) => (
<FormItem>
<FormLabel>NetGSM Kullanıcı Adı (850...)</FormLabel>
<FormControl>
<Input placeholder="850xxxxxxx" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="password"
render={({ field }) => (
<FormItem>
<FormLabel>Şifre</FormLabel>
<FormControl>
<Input type="password" placeholder="••••••••" {...field} />
</FormControl>
<FormDescription>
Mevcut şifreyi korumak için boş bırakın.
</FormDescription>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="header"
render={({ field }) => (
<FormItem>
<FormLabel>Mesaj Başlığı (Gönderici Adı)</FormLabel>
<FormControl>
<Input placeholder="PARAKASA" {...field} />
</FormControl>
<FormDescription>
NetGSM panelinde tanımlı gönderici adınız.
</FormDescription>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit" disabled={loading}>
{loading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
Ayarları Kaydet
</Button>
</form>
</Form>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Bağlantı Testi</CardTitle>
<CardDescription>
Ayarların doğru çalıştığını doğrulamak için test SMS gönderin.
</CardDescription>
</CardHeader>
<CardContent>
<div className="flex gap-4">
<div className="grid gap-2 flex-1">
<Input
placeholder="5551234567"
value={testPhone}
onChange={(e) => setTestPhone(e.target.value)}
/>
<p className="text-[0.8rem] text-muted-foreground">
Başında 0 olmadan 10 hane giriniz.
</p>
</div>
<Button variant="secondary" onClick={onTestSms} disabled={testLoading || !testPhone}>
{testLoading ? (
<Loader2 className="mr-2 h-4 w-4 animate-spin" />
) : (
<Send className="mr-2 h-4 w-4" />
)}
Test Gönder
</Button>
</div>
</CardContent>
</Card>
</div>
)
}