"use client"; import { useEffect, useState } from "react"; import { useAppDispatch, useAppSelector } from "@/lib/hooks"; import { fetchUsers, fetchDeletedUsers, createUser, updateUser, deleteUser, restoreUser, CreateUserRequest, UpdateUserRequest } from "@/lib/features/users/usersSlice"; import { UserTable } from "@/components/users/user-table"; import { DeletedUserTable } from "@/components/users/deleted-user-table"; import { UserDialog } from "@/components/users/user-dialog"; import { Button } from "@/components/ui/button"; import { Plus, Trash, Trash2 } from "lucide-react"; import Swal from "sweetalert2"; import { User } from "@/lib/features/auth/authSlice"; export default function UsersPage() { const dispatch = useAppDispatch(); const { users, deletedUsers, isLoading, error } = useAppSelector((state) => state.users); const [dialogOpen, setDialogOpen] = useState(false); const [selectedUser, setSelectedUser] = useState(null); useEffect(() => { dispatch(fetchUsers()); dispatch(fetchDeletedUsers()); }, [dispatch]); const handleCreate = () => { setSelectedUser(null); setDialogOpen(true); }; const handleEdit = (user: User) => { setSelectedUser(user); setDialogOpen(true); }; const handleDelete = (id: string) => { Swal.fire({ title: "Soft Delete", text: "Bu kullanıcı 'silindi' olarak işaretlenecek (Soft Delete). Geri alınabilir.", icon: "warning", showCancelButton: true, confirmButtonColor: "#f97316", // Orange cancelButtonColor: "#3085d6", confirmButtonText: "Evet, Sil", cancelButtonText: "İptal", }).then((result) => { if (result.isConfirmed) { dispatch(deleteUser(id)) .unwrap() .then(() => { Swal.fire("Silindi!", "Kullanıcı başarıyla silindi (Soft).", "success"); // Refresh both lists because a user moved from active to deleted dispatch(fetchUsers()); dispatch(fetchDeletedUsers()); }) .catch((err) => { Swal.fire("Hata!", err || "Silme işlemi başarısız.", "error"); }); } }); }; const handleHardDelete = (id: string) => { Swal.fire({ title: "KALICI OLARAK SİL?", text: "Bu işlem GERİ ALINAMAZ! Kullanıcı ve tüm verileri veritabanından tamamen silinecek (Hard Delete).", icon: "error", // Red showCancelButton: true, confirmButtonColor: "#d33", // Red cancelButtonColor: "#3085d6", confirmButtonText: "Evet, KALICI SİL!", cancelButtonText: "İptal", }).then((result) => { if (result.isConfirmed) { const isSoftDeleted = deletedUsers.some(u => u.id === id); if (isSoftDeleted) { // WORKAROUND: Backend soft-deleted kullanıcıları bulamıyor olabilir. // Önce restore et, sonra hard delete yap. dispatch(restoreUser(id)) .unwrap() .then(() => { return dispatch(deleteUser({ id, hard: true })).unwrap(); }) .then(() => { Swal.fire("Silindi!", "Kullanıcı kalıcı olarak silindi.", "success"); }) .catch((err) => { Swal.fire("Hata!", err || "Silme işlemi başarısız.", "error"); }); } else { // Normal Hard Delete (Aktif kullanıcı) dispatch(deleteUser({ id, hard: true })) .unwrap() .then(() => { Swal.fire("Silindi!", "Kullanıcı kalıcı olarak silindi.", "success"); }) .catch((err) => { Swal.fire("Hata!", err || "Silme işlemi başarısız.", "error"); }); } } }); }; const handleRestore = (id: string) => { Swal.fire({ title: "Geri Yükle?", text: "Kullanıcı tekrar aktif edilecek.", icon: "question", showCancelButton: true, confirmButtonColor: "#16a34a", // Green cancelButtonColor: "#d33", confirmButtonText: "Evet, Geri Yükle", cancelButtonText: "İptal", }).then((result) => { if (result.isConfirmed) { dispatch(restoreUser(id)) .unwrap() .then(() => { Swal.fire("Başarılı!", "Kullanıcı geri yüklendi.", "success"); dispatch(fetchUsers()); dispatch(fetchDeletedUsers()); }) .catch((err) => { Swal.fire("Hata!", err || "Geri yükleme başarısız.", "error"); }); } }); }; const handleSubmit = (data: CreateUserRequest | UpdateUserRequest) => { if ("id" in data) { dispatch(updateUser(data as UpdateUserRequest)) .unwrap() .then(() => { setDialogOpen(false); Swal.fire("Başarılı", "Kullanıcı güncellendi.", "success"); dispatch(fetchUsers()); }) .catch((err) => { Swal.fire("Hata", err || "Güncelleme başarısız.", "error"); }); } else { dispatch(createUser(data as CreateUserRequest)) .unwrap() .then(() => { setDialogOpen(false); Swal.fire("Başarılı", "Kullanıcı oluşturuldu.", "success"); dispatch(fetchUsers()); }) .catch((err) => { Swal.fire("Hata", err || "Oluşturma başarısız.", "error"); }); } }; return (
{/* Active Users Section */}

Kullanıcılar

Sistemdeki aktif kullanıcıları yönetin.

{error && (
{error}
)} { setSelectedUser(u); setDialogOpen(true); }} onDelete={handleDelete} onHardDelete={handleHardDelete} />
{/* Deleted Users Section */}

Çöp Kutusu

Silinmiş kullanıcıları geri yükleyin veya kalıcı olarak silin.

{ // Re-implementing handleSubmit logic inline or keep it separate as before if preferred, // but for brevity I'll assume the previous handleSubmit function is available in scope // or I should include it in replacement if I am replacing the whole return block. // Ideally, I should keep the existing handleSubmit and just pass it. // Since I am replacing the whole return, I must ensure handleSubmit is defined above or passed correctly. // Wait, I am replacing a range that includes imports and component setup? No, just the function body? // Let's modify the instruction to be safer. handleSubmit(data); }} isLoading={isLoading} />
); }