user management

This commit is contained in:
nBiqoz
2025-10-08 10:14:38 +02:00
parent 80f075d04d
commit 6e4dda0ecd
15 changed files with 1513 additions and 93 deletions

View File

@@ -2,7 +2,13 @@
import { useState } from "react";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import { Plus, DollarSign, Users, TrendingUp } from "lucide-react";
@@ -33,7 +39,7 @@ export default function AddCredits() {
try {
const response = await fetch("/api/add-credits");
const data = await response.json();
if (data.statistics) {
setStats(data.statistics);
}
@@ -45,18 +51,22 @@ export default function AddCredits() {
};
const addCreditsToAllUsers = async () => {
if (!confirm("Êtes-vous sûr de vouloir ajouter 5 millions de crédits à TOUS les utilisateurs ? Cette action est irréversible.")) {
if (
!confirm(
"Êtes-vous sûr de vouloir ajouter 5 millions de crédits à TOUS les utilisateurs ? Cette action est irréversible."
)
) {
return;
}
setLoading(true);
try {
const response = await fetch("/api/add-credits", {
method: "POST"
method: "POST",
});
const data = await response.json();
if (data.success) {
setResult(data.statistics);
// Rafraîchir les stats
@@ -86,7 +96,7 @@ export default function AddCredits() {
<CardContent className="space-y-4">
{/* Bouton d'analyse */}
<div className="flex gap-2">
<Button
<Button
onClick={analyzeCurrentCredits}
disabled={analyzing}
variant="outline"
@@ -103,9 +113,11 @@ export default function AddCredits() {
<Users className="h-4 w-4 text-blue-600" />
<span className="text-sm font-medium">Utilisateurs</span>
</div>
<p className="text-2xl font-bold text-blue-600">{stats.totalUsers}</p>
<p className="text-2xl font-bold text-blue-600">
{stats.totalUsers}
</p>
</div>
<div className="bg-green-50 p-3 rounded-lg">
<div className="flex items-center gap-2">
<DollarSign className="h-4 w-4 text-green-600" />
@@ -115,7 +127,7 @@ export default function AddCredits() {
{stats.totalCredits.toLocaleString()}
</p>
</div>
<div className="bg-purple-50 p-3 rounded-lg">
<div className="flex items-center gap-2">
<TrendingUp className="h-4 w-4 text-purple-600" />
@@ -125,13 +137,15 @@ export default function AddCredits() {
{stats.averageCredits.toLocaleString()}
</p>
</div>
<div className="bg-orange-50 p-3 rounded-lg">
<div className="flex items-center gap-2">
<Users className="h-4 w-4 text-orange-600" />
<span className="text-sm font-medium">Sans Balance</span>
</div>
<p className="text-2xl font-bold text-orange-600">{stats.usersWithoutBalance}</p>
<p className="text-2xl font-bold text-orange-600">
{stats.usersWithoutBalance}
</p>
</div>
</div>
)}
@@ -140,20 +154,26 @@ export default function AddCredits() {
{stats && (
<div className="border-t pt-4">
<div className="bg-yellow-50 border border-yellow-200 rounded-lg p-4 mb-4">
<h4 className="font-semibold text-yellow-800 mb-2"> Action Importante</h4>
<h4 className="font-semibold text-yellow-800 mb-2">
Action Importante
</h4>
<p className="text-yellow-700 text-sm">
Cette action va ajouter <strong>5,000,000 crédits</strong> à chacun des {stats.totalUsers} utilisateurs.
Cette action va ajouter <strong>5,000,000 crédits</strong> à
chacun des {stats.totalUsers} utilisateurs.
<br />
Total de crédits qui seront ajoutés: <strong>{(stats.totalUsers * 5000000).toLocaleString()}</strong>
Total de crédits qui seront ajoutés:{" "}
<strong>{(stats.totalUsers * 3000000).toLocaleString()}</strong>
</p>
</div>
<Button
<Button
onClick={addCreditsToAllUsers}
disabled={loading}
className="w-full bg-green-600 hover:bg-green-700"
>
{loading ? "Ajout en cours..." : `Ajouter 5M crédits à ${stats.totalUsers} utilisateurs`}
{loading
? "Ajout en cours..."
: `Ajouter 5M crédits à ${stats.totalUsers} utilisateurs`}
</Button>
</div>
)}
@@ -161,23 +181,33 @@ export default function AddCredits() {
{/* Résultats */}
{result && (
<div className="border-t pt-4">
<h4 className="font-semibold text-green-600 mb-3"> Crédits ajoutés avec succès !</h4>
<h4 className="font-semibold text-green-600 mb-3">
Crédits ajoutés avec succès !
</h4>
<div className="grid grid-cols-2 gap-4 text-sm">
<div>
<span className="text-gray-600">Balances mises à jour:</span>
<Badge variant="secondary" className="ml-2">{result.updatedBalances}</Badge>
<Badge variant="secondary" className="ml-2">
{result.updatedBalances}
</Badge>
</div>
<div>
<span className="text-gray-600">Nouvelles balances:</span>
<Badge variant="secondary" className="ml-2">{result.createdBalances}</Badge>
<Badge variant="secondary" className="ml-2">
{result.createdBalances}
</Badge>
</div>
<div>
<span className="text-gray-600">Crédits par utilisateur:</span>
<Badge variant="secondary" className="ml-2">{result.creditsPerUser.toLocaleString()}</Badge>
<Badge variant="secondary" className="ml-2">
{result.creditsPerUser.toLocaleString()}
</Badge>
</div>
<div>
<span className="text-gray-600">Total ajouté:</span>
<Badge variant="secondary" className="ml-2">{result.totalCreditsAdded.toLocaleString()}</Badge>
<Badge variant="secondary" className="ml-2">
{result.totalCreditsAdded.toLocaleString()}
</Badge>
</div>
</div>
</div>
@@ -185,4 +215,4 @@ export default function AddCredits() {
</CardContent>
</Card>
);
}
}