--- /dev/null
+import React, { createContext, useState, useContext, useEffect } from 'react';
+import { VPNService } from '../../services';
+
+const VPNContext = createContext( undefined );
+
+export const useVPN = () => useContext( VPNContext );
+
+export const VPNProvider = ( { children } ) => {
+ const [revokeOpen, setRevokeOpen] = useState( false );
+ const [revokeClientName, setRevokeClientName] = useState( '' );
+ const [clients, setClients] = useState( [] );
+ const [availableClients, setAvailableClients] = useState( [] );
+ const [message, setMessage] = useState( '' );
+ const [createOpen, setCreateOpen] = useState( false );
+
+ const fetchClients = async () => {
+ await VPNService.fetchClients()
+ .then( res => setClients( res ) )
+ .catch( err => setMessage( err ) );
+ };
+
+ const fetchAvailableClients = async () => {
+ await VPNService.fetchAvailableClients()
+ .then( res => setAvailableClients( res ) )
+ .catch( err => setMessage( err ) );
+ };
+
+ const handleCreateClientSubmit = async ( e, data ) => {
+ const { clientName, useStaticIp, staticIp } = data;
+ e.preventDefault();
+ setMessage( await VPNService.createClient( { clientName, useStaticIp, staticIp }, fetchClients ) );
+ fetchAvailableClients().catch( e => setMessage( e ) );
+ setCreateOpen( false );
+ };
+
+ const handleRevokeClientSubmit = async () => {
+ setMessage( await VPNService.revokeClient( { revokeClientName }, fetchClients ) );
+ fetchAvailableClients().catch( e => setMessage( e ) );
+ setRevokeOpen( false );
+ };
+
+ useEffect( () => {
+ fetchClients().catch( e => setMessage( e ) );
+ fetchAvailableClients().catch( e => setMessage( e ) );
+
+ const interval = setInterval( () => {
+ fetchClients().catch( e => setMessage( e ) );
+ fetchAvailableClients().catch( e => setMessage( e ) );
+ }, 10000 * 120 );
+
+ return () => clearInterval( interval );
+ }, [] );
+
+ const value = {
+ revokeOpen,
+ setRevokeOpen,
+ revokeClientName,
+ setRevokeClientName,
+ clients,
+ availableClients,
+ message,
+ setMessage,
+ createOpen,
+ setCreateOpen,
+ handleCreateClientSubmit,
+ handleRevokeClientSubmit
+ };
+
+ return <VPNContext.Provider value={ value }>{ children }</VPNContext.Provider>;
+};
import { Route, Routes } from 'react-router-dom';
import { Login, NotFound, Dashboard, Git, VPN, Docker } from './views';
-/*import NotFound from './views/404/Error404Page';
-import Dashboard from './views/Dashboard/Dashboard';
-import Git from './views/Git/Git';*/
+
+import { VPNProvider } from './components/VPN/VPNContext';
export default function AppRoutes() {
<Route path="/" element={<Dashboard />} />
<Route path="/login" element={<Login />} />
<Route path="/git" element={<Git />} />
- <Route path="/vpn" element={<VPN />} />
+ <Route path="/vpn" element={ <VPNProvider><VPN/></VPNProvider>} />
<Route path="/docker" element={<Docker />} />
<Route path="*" element={<NotFound />} />
</Routes>
-import React, { useState, useEffect } from 'react';
-import { Container, Typography, Button } from '@mui/material';
+import { Container, Typography, Button, Grid } from '@mui/material';
import { MaterialReactTable, useMaterialReactTable } from 'material-react-table';
-import { VPNService } from '../../services';
import { ConfirmRevoke, CreateVPNClientDialog } from '../../components';
+import { useVPN } from '../../components/VPN/VPNContext';
const VPN = () => {
- const [revokeOpen, setRevokeOpen] = useState( false );
- const [revokeClientName, setRevokeClientName] = useState('');
- const [clients, setClients] = useState([]);
- const [availableClients, setAvailableClients] = useState( [] );
- const [message, setMessage] = useState('');
- const [createOpen, setCreateOpen] = useState( false );
+ const { revokeOpen,
+ setRevokeOpen,
+ setRevokeClientName,
+ clients,
+ availableClients,
+ message,
+ createOpen,
+ setCreateOpen,
+ handleCreateClientSubmit,
+ handleRevokeClientSubmit } = useVPN();
const clientTable = useMaterialReactTable( {
columns: [
{ accessorKey: 'name', header: 'Name' },
{ accessorFn: row => clients.find( c => c.name === row.clientName ) ? 'Yes' : 'No', header: 'Connected' },
{ accessorFn: row => row.hasOvpn ? 'Yes' : 'No', header: 'Has Profile' },
{
- header: 'Revoke',
+ header: 'Banning',
Cell: ({ row }) => (
- <Button
- variant="contained"
- color="secondary"
- onClick={() => {
- setRevokeClientName( row.original.clientName );
- setRevokeOpen( true );
- }}
- >
- Revoke
- </Button>
+ <Grid container spacing={1} alignItems='center'>
+ <Grid item xs={6}>
+ <Button
+ size='small'
+ variant='contained'
+ color='secondary'
+ onClick={() => {
+ setRevokeClientName( row.original.clientName );
+ setRevokeOpen( true );
+ }}
+ >
+ Revoke
+ </Button>
+ </Grid>
+ <Grid item xs={6}>
+ <Button
+ size='small'
+ variant='contained'
+ color='secondary'
+ onClick={() => {
+ setRevokeClientName( row.original.clientName );
+ setRevokeOpen( true );
+ }}
+ >
+ Suspend
+ </Button>
+ </Grid>
+ </Grid>
),
},
],
)
});
- const fetchClients = async () => {
- await VPNService.fetchClients().then( res => setClients( res ) ).catch( err => setMessage( err ) );
- };
-
- const fetchAvailableClients = async () => {
- await VPNService.fetchAvailableClients().then( res => setAvailableClients( res ) ).catch( err => setMessage( err ) );
- };
-
- useEffect( () => {
- fetchClients().catch( e => setMessage( e ) );
- fetchAvailableClients().catch( e => setMessage( e ) );
- }, [] );
-
- const handleCreateClientSubmit = async (e, data) => {
- const { clientName, useStaticIp, staticIp } = data;
- e.preventDefault();
- setMessage( await VPNService.createClient({ clientName, useStaticIp, staticIp }, fetchClients ) );
- fetchAvailableClients().catch( e => setMessage( e ) );
- setCreateOpen( false );
- };
-
- const handleRevokeClientSubmit = async () => {
- setMessage( await VPNService.revokeClient( { revokeClientName }, fetchClients ) );
- fetchAvailableClients().catch( e => setMessage( e ) );
- setRevokeOpen( false );
- };
-
- setTimeout( () => {
- fetchClients().catch( e => setMessage( e ) );
- fetchAvailableClients().catch( e => setMessage( e ) );
- }, 10000 * 120 );
-
return (
<Container>
{ revokeOpen &&
onClose={() => setRevokeOpen(false)}
onConfirm={handleRevokeClientSubmit}
/>}
- {/*<Button variant="contained" color="primary" onClick={() => setCreateOpen(true)}>Create Client</Button>
- {createOpen && <CreateVPNClientDialog open={createOpen} onClose={() => setCreateOpen(false)} onCreate={handleCreateClientSubmit}/>}*/}
<Typography variant="h5" className="mt-6">Available OpenVPN Clients</Typography>
<MaterialReactTable table={ availableTable } />