project setup
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
import { useState } from "react";
|
||||
import { View, Text, FlatList } from "react-native";
|
||||
import { Dialog, IconButton } from "react-native-paper";
|
||||
|
||||
import { DialogContainer } from "@/components/ui/DialogContainer";
|
||||
import { Button } from "@/components/ui/Button";
|
||||
import { LoadingSpinner } from "@/components/ui/LoadingSpinner";
|
||||
import { User } from "@/store/models/User.model";
|
||||
|
||||
interface BulkDeleteUserModalProps {
|
||||
visible: boolean;
|
||||
users: User[];
|
||||
onDismiss: () => void;
|
||||
onDelete: (userIds: string[]) => void;
|
||||
isLoading?: boolean;
|
||||
}
|
||||
|
||||
export const BulkDeleteUserModal = ({
|
||||
visible,
|
||||
users,
|
||||
onDismiss,
|
||||
onDelete,
|
||||
isLoading = false,
|
||||
}: BulkDeleteUserModalProps) => {
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
|
||||
if (!users || users.length === 0) return null;
|
||||
|
||||
const handleDelete = () => {
|
||||
try {
|
||||
setError(null);
|
||||
const userIds = users.map((user) => user.id);
|
||||
onDelete(userIds);
|
||||
} catch (err) {
|
||||
setError("Failed to delete users. Please try again.");
|
||||
console.error("Error in BulkDeleteModal:", err);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<DialogContainer visible={visible} onDismiss={onDismiss}>
|
||||
<Dialog.Title>
|
||||
<View className="w-full flex-row items-center justify-between">
|
||||
<View className="flex-1">
|
||||
<Text className="pr-3">
|
||||
{users.length === 1 ? "Delete User" : "Bulk Delete Users"}
|
||||
</Text>
|
||||
</View>
|
||||
|
||||
<View style={{ alignSelf: "flex-start" }}>
|
||||
<IconButton
|
||||
icon="close"
|
||||
size={20}
|
||||
onPress={onDismiss}
|
||||
disabled={isLoading}
|
||||
accessibilityLabel="Close dialog"
|
||||
style={{ margin: 0 }}
|
||||
/>
|
||||
</View>
|
||||
</View>
|
||||
</Dialog.Title>
|
||||
<Dialog.Content>
|
||||
<Text className="mb-2">
|
||||
{users.length === 1
|
||||
? `Are you sure you want to delete ${users[0].firstName} ${users[0].lastName}?`
|
||||
: `Are you sure you want to delete ${users.length} users?`}
|
||||
</Text>
|
||||
|
||||
{users.length > 1 && (
|
||||
<View className="max-h-40 mb-2">
|
||||
<FlatList
|
||||
data={users}
|
||||
keyExtractor={(item) => item.id}
|
||||
renderItem={({ item }) => (
|
||||
<Text className="text-sm py-1">
|
||||
{item.firstName} {item.lastName}
|
||||
</Text>
|
||||
)}
|
||||
/>
|
||||
</View>
|
||||
)}
|
||||
|
||||
{error && <Text className="text-highRisk mt-2">{error}</Text>}
|
||||
</Dialog.Content>
|
||||
<Dialog.Actions>
|
||||
<Button className="!ml-2" onPress={handleDelete} disabled={isLoading}>
|
||||
{users.length === 1 ? "Delete" : "Delete All"}
|
||||
</Button>
|
||||
</Dialog.Actions>
|
||||
{isLoading && (
|
||||
<View
|
||||
className="absolute inset-0 bg-gray-500/30 flex items-center justify-center"
|
||||
pointerEvents="auto"
|
||||
style={{ zIndex: 1000, top: 0, right: 0, bottom: 0, left: 0 }}
|
||||
>
|
||||
<LoadingSpinner size={16} />
|
||||
</View>
|
||||
)}
|
||||
</DialogContainer>
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user