chore: add new features for cabine
This commit is contained in:
@@ -3,13 +3,11 @@ import { View, Text, StyleSheet, FlatList, RefreshControl } from "react-native";
|
||||
import { spacing, fontSize } from "../../theme";
|
||||
import { useTheme } from "../../context/ThemeContext";
|
||||
import { getAllClients } from "../../api/api_admin";
|
||||
import { applyClientPenalty, resetClientPenalties } from "../../api/api_cabine";
|
||||
import { applyClientPenalty, resetClientPenalties, resetClientPoints } from "../../api/api_cabine";
|
||||
import type { ClientResponse } from "../../api/types";
|
||||
import LoadingSpinner from "../../components/ui/LoadingSpinner";
|
||||
import Card from "../../components/ui/Card";
|
||||
import Button from "../../components/ui/Button";
|
||||
import Modal from "../../components/ui/Modal";
|
||||
import TextInput from "../../components/ui/TextInput";
|
||||
import AlertModal from "../../components/ui/AlertModal";
|
||||
import { useAlert } from "../../hooks/useAlert";
|
||||
|
||||
@@ -22,8 +20,6 @@ export default function UsersScreen() {
|
||||
visible: boolean;
|
||||
username: string;
|
||||
}>({ visible: false, username: "" });
|
||||
const [reason, setReason] = useState("");
|
||||
const [penaltyAmount, setPenaltyAmount] = useState("");
|
||||
const { alert, showError, showSuccess, showConfirm, hideAlert } =
|
||||
useAlert();
|
||||
|
||||
@@ -45,31 +41,9 @@ export default function UsersScreen() {
|
||||
setRefreshing(false);
|
||||
};
|
||||
|
||||
const handleApplyPenalty = async () => {
|
||||
if (!reason.trim()) {
|
||||
showError("Erreur", "Raison requise");
|
||||
return;
|
||||
}
|
||||
const amount = parseInt(penaltyAmount, 10);
|
||||
if (!penaltyAmount.trim() || isNaN(amount) || amount <= 0) {
|
||||
showError("Erreur", "Nombre de points invalide");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
await applyClientPenalty(penaltyModal.username, reason, amount);
|
||||
setPenaltyModal({ visible: false, username: "" });
|
||||
setReason("");
|
||||
setPenaltyAmount("");
|
||||
await loadData();
|
||||
showSuccess("Succès", "Pénalité appliquée");
|
||||
} catch (e: any) {
|
||||
showError("Erreur", e.message);
|
||||
}
|
||||
};
|
||||
|
||||
const handleReset = (username: string) => {
|
||||
showConfirm(
|
||||
"Reset",
|
||||
"Reset pénalités",
|
||||
`Réinitialiser les pénalités de ${username} ?`,
|
||||
async () => {
|
||||
try {
|
||||
@@ -83,6 +57,22 @@ export default function UsersScreen() {
|
||||
);
|
||||
};
|
||||
|
||||
const handleResetPoints = (username: string) => {
|
||||
showConfirm(
|
||||
"Reset points",
|
||||
`Réinitialiser les points de ${username} ?`,
|
||||
async () => {
|
||||
try {
|
||||
await resetClientPoints(username);
|
||||
await loadData();
|
||||
} catch (e: any) {
|
||||
showError("Erreur", e.message);
|
||||
}
|
||||
},
|
||||
"Reset",
|
||||
);
|
||||
};
|
||||
|
||||
const styles = useMemo(
|
||||
() =>
|
||||
StyleSheet.create({
|
||||
@@ -153,21 +143,14 @@ export default function UsersScreen() {
|
||||
</View>
|
||||
<View style={styles.actions}>
|
||||
<Button
|
||||
title="Pénalité"
|
||||
onPress={() => {
|
||||
setPenaltyModal({
|
||||
visible: true,
|
||||
username: item.username,
|
||||
});
|
||||
setReason("");
|
||||
setPenaltyAmount("");
|
||||
}}
|
||||
title="Reset pénalités"
|
||||
onPress={() => handleReset(item.username)}
|
||||
size="sm"
|
||||
variant="danger"
|
||||
variant="outline"
|
||||
/>
|
||||
<Button
|
||||
title="Reset"
|
||||
onPress={() => handleReset(item.username)}
|
||||
title="Reset points"
|
||||
onPress={() => handleResetPoints(item.username)}
|
||||
size="sm"
|
||||
variant="outline"
|
||||
/>
|
||||
@@ -195,35 +178,7 @@ export default function UsersScreen() {
|
||||
<Text style={styles.empty}>Aucun client</Text>
|
||||
}
|
||||
/>
|
||||
<Modal
|
||||
visible={penaltyModal.visible}
|
||||
onClose={() =>
|
||||
setPenaltyModal({ visible: false, username: "" })
|
||||
}
|
||||
title={`Pénalité - ${penaltyModal.username}`}
|
||||
icon="warning-outline"
|
||||
iconColor={colors.danger}
|
||||
>
|
||||
<TextInput
|
||||
label="Nombre de points"
|
||||
value={penaltyAmount}
|
||||
onChangeText={setPenaltyAmount}
|
||||
placeholder="Ex: 5"
|
||||
keyboardType="numeric"
|
||||
/>
|
||||
<TextInput
|
||||
label="Raison"
|
||||
value={reason}
|
||||
onChangeText={setReason}
|
||||
placeholder="Raison de la pénalité"
|
||||
/>
|
||||
<Button
|
||||
title="Appliquer"
|
||||
onPress={handleApplyPenalty}
|
||||
variant="danger"
|
||||
fullWidth
|
||||
/>
|
||||
</Modal>
|
||||
|
||||
<AlertModal
|
||||
visible={alert.visible}
|
||||
type={alert.type}
|
||||
|
||||
Reference in New Issue
Block a user