This commit is contained in:
Constantin
2025-09-12 23:04:52 +03:00
commit 2277b11563
127 changed files with 23640 additions and 0 deletions
+94
View File
@@ -0,0 +1,94 @@
import { useState, useEffect } from 'react';
import { Shield, Key, Users } from 'lucide-react';
import { wireguardAPI } from '../services/api';
function WireGuard() {
const [status, setStatus] = useState(null);
const [peers, setPeers] = useState([]);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
fetchWireGuardData();
}, []);
const fetchWireGuardData = async () => {
try {
const [statusResponse, peersResponse] = await Promise.all([
wireguardAPI.getStatus(),
wireguardAPI.getPeers()
]);
setStatus(statusResponse.data);
setPeers(peersResponse.data);
} catch (error) {
console.error('Failed to fetch WireGuard data:', error);
} finally {
setIsLoading(false);
}
};
if (isLoading) {
return (
<div className="flex items-center justify-center h-64">
<div className="animate-spin rounded-full h-8 w-8 border-b-2 border-primary-600"></div>
</div>
);
}
return (
<div>
<div className="mb-8">
<h1 className="text-2xl font-bold text-gray-900">WireGuard</h1>
<p className="mt-2 text-gray-600">
Manage WireGuard VPN configuration and peers
</p>
</div>
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
{/* Status */}
<div className="card">
<div className="flex items-center mb-4">
<Shield className="h-6 w-6 text-primary-500 mr-2" />
<h3 className="text-lg font-medium text-gray-900">Status</h3>
</div>
{status ? (
<div className="space-y-2">
<div className="flex justify-between">
<span className="text-sm text-gray-500">Interface:</span>
<span className="text-sm font-medium">{status.interface || 'wg0'}</span>
</div>
<div className="flex justify-between">
<span className="text-sm text-gray-500">Status:</span>
<span className="text-sm font-medium text-success-600">Active</span>
</div>
</div>
) : (
<p className="text-gray-500 text-sm">Status unavailable</p>
)}
</div>
{/* Peers */}
<div className="card">
<div className="flex items-center mb-4">
<Users className="h-6 w-6 text-primary-500 mr-2" />
<h3 className="text-lg font-medium text-gray-900">Peers</h3>
</div>
<div className="space-y-2">
{peers.length > 0 ? (
peers.map((peer, index) => (
<div key={index} className="flex justify-between items-center p-2 bg-gray-50 rounded">
<span className="text-sm font-medium">{peer.name}</span>
<span className="text-sm text-gray-500">{peer.ip}</span>
</div>
))
) : (
<p className="text-gray-500 text-sm">No peers configured</p>
)}
</div>
</div>
</div>
</div>
);
}
export default WireGuard;