"use client" import { useEffect, useState, useCallback } from "react" import { useSession } from "next-auth/react" import { DataTable } from "@/components/ui/data-table" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Plus, Edit, Trash, RotateCcw } from "lucide-react" import { settingService } from "@/services/settingService" import { Setting } from "@/types/setting" import { SettingDialog } from "./_components/setting-dialog" import { toast } from "sonner" import Swal from "sweetalert2" import withReactContent from "sweetalert2-react-content" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" const MySwal = withReactContent(Swal) export default function SettingsPage() { const { data: session } = useSession() const [settings, setSettings] = useState([]) const [total, setTotal] = useState(0) const [page, setPage] = useState(1) const [perPage] = useState(10) const [search, setSearch] = useState("") const [statusFilter, setStatusFilter] = useState("with") // "with" | "active" | "only" const [dialogOpen, setDialogOpen] = useState(false) const [selectedSetting, setSelectedSetting] = useState(null) const fetchSettings = useCallback(async () => { try { // "active" -> "" (backend default?), "with" -> "with", "only" -> "only" const apiSoftFilter = statusFilter === "active" ? "" : statusFilter const res = await settingService.getSettings(page, perPage, search, apiSoftFilter) setSettings(res.items || []) setTotal(res.total) } catch (error) { toast.error("Ayarlar yüklenirken hata oluştu") console.error(error) } }, [page, perPage, search, statusFilter]) useEffect(() => { if (session) { // eslint-disable-next-line react-hooks/set-state-in-effect fetchSettings() } }, [session, fetchSettings]) const handleDelete = async (id: number) => { const result = await MySwal.fire({ title: "Emin misiniz?", text: "Bu ayarı silmek istediğinize emin misiniz?", icon: "warning", showCancelButton: true, confirmButtonText: "Evet, Sil", cancelButtonText: "İptal", customClass: { popup: "dark:bg-gray-800 dark:text-white", title: "dark:text-white", }, }) if (result.isConfirmed) { try { await settingService.deleteSetting(id) toast.success("Ayar başarıyla silindi") fetchSettings() } catch (error) { toast.error("Silme işlemi başarısız oldu") console.error(error) } } } const handleRestore = async (id: number) => { const result = await MySwal.fire({ title: "Geri Yükle?", text: "Bu ayarı geri yüklemek istediğinize emin misiniz?", icon: "question", showCancelButton: true, confirmButtonText: "Evet, Geri Yükle", cancelButtonText: "İptal", customClass: { popup: "dark:bg-gray-800 dark:text-white", title: "dark:text-white", }, }) if (result.isConfirmed) { try { await settingService.restoreSetting(id) toast.success("Ayar başarıyla geri yüklendi") fetchSettings() } catch (error) { toast.error("Geri yükleme başarısız oldu") console.error(error) } } } const columns = [ { accessorKey: "title", header: "Başlık", }, { accessorKey: "is_active", header: "Durum", cell: ({ row }: { row: { original: Setting } }) => ( {row.original.is_active ? "Aktif" : "Pasif"} ), }, { accessorKey: "UpdatedAt", header: "Son Güncelleme", cell: ({ row }: { row: { original: Setting } }) => { return new Date(row.original.UpdatedAt).toLocaleDateString("tr-TR") }, }, { id: "actions", cell: ({ row }: { row: { original: Setting } }) => { const isDeleted = !!row.original.DeletedAt return (
{isDeleted ? ( ) : ( <> )}
) }, }, ] return (

Site Ayarları

Genel site ayarlarını ve SEO yapılandırmalarını yönetin.

setSearch(e.target.value)} className="max-w-sm" />
) }