diff --git a/app/components/GrantSudoLink.jsx b/app/components/GrantSudoLink.jsx
new file mode 100644
index 0000000..5b87022
--- /dev/null
+++ b/app/components/GrantSudoLink.jsx
@@ -0,0 +1,119 @@
+'use client';
+
+import { useState } from 'react';
+import Link from "next/link";
+
+const GrantSudoLink = ({ text, isCard }) => {
+ const [isHovered, setIsHovered] = useState(false);
+ const [showDialog, setShowDialog] = useState(false);
+ const [username, setUsername] = useState('');
+ const [password, setPassword] = useState('');
+
+ // hover over eeffect
+ const handleMouseEnter = () => {
+ setIsHovered(true);
+ };
+ const handleMouseLeave = () => {
+ setIsHovered(false);
+ };
+ const cardStyle = {
+ boxShadow: isHovered ? '0 4px 20px rgba(0, 0, 0, 0.2)' : '0 1px 3px rgba(0, 0, 0, 0.1)',
+ transition: 'box-shadow 0.3s ease-in-out',
+ };
+
+ // username dialog box
+ const openDialog = () => {
+ setShowDialog(true);
+ };
+ const closeDialog = () => {
+ setShowDialog(false);
+ };
+ const handleGrantSudoRights = async () => {
+ try {
+ const response = await fetch('/api/grant-sudo', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ username, password }),
+ });
+ const data = await response.json();
+ if (response.ok) {
+ alert('Sudo rights granted successfully.');
+ } else {
+ alert(data.error);
+ }
+ closeDialog();
+ } catch (error) {
+ alert('Error granting sudo rights');
+ }
+ };
+
+ return (
+
+ {isCard ? (
+
+
+
+
{text}
+
You need to do this once
+
+
+
+ ) : (
+
+ {text}
+
+ )}
+
+ {showDialog && (
+
+
+
+
+
Grant Sudo Rights
+
+
+
+
+
+
+
+
+
+
+ )}
+
+ );
+};
+
+export default GrantSudoLink;
diff --git a/app/dhcp/configure/page.js b/app/dhcp/configure/page.js
index a680931..b6152a9 100644
--- a/app/dhcp/configure/page.js
+++ b/app/dhcp/configure/page.js
@@ -2,6 +2,7 @@
import { useState, useEffect } from 'react';
import { useNotification } from '@/app/context/NotificationContext';
+import GrantSudoLink from '@/app/components/GrantSudoLink';
export default function ConfigurePage() {
const [config, setConfig] = useState('');
@@ -53,35 +54,6 @@ export default function ConfigurePage() {
}
};
- // automatically add webserver to sudo
- const openDialog = () => {
- setShowDialog(true);
- };
-
- const closeDialog = () => {
- setShowDialog(false);
- };
-
- const handleGrantSudoRights = async () => {
- try {
- const response = await fetch('/api/grant-sudo', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ username, password }),
- });
- const data = await response.json();
- if (response.ok) {
- showNotification('Sudo rights granted successfully.', 'success');
- } else {
- showNotification(data.error, 'error');
- }
- closeDialog();
- } catch (error) {
- showNotification('Error granting sudo rights', 'error');
- }
- };
-
-
return (
Configure DHCP Options
@@ -101,53 +73,11 @@ export default function ConfigurePage() {
-
- {showDialog && (
-
-
-
-
-
Grant Sudo Rights
-
-
-
-
-
-
-
-
-
-
- )}
+
+
+
+
);
}
diff --git a/app/page.js b/app/page.js
index 9862318..fd0a921 100644
--- a/app/page.js
+++ b/app/page.js
@@ -1,10 +1,15 @@
-import Card from './components/Card';
+import Card from '@/app/components/Card';
+import GrantSudoLink from '@/app/components/GrantSudoLink';
export default function Home() {
return (
+
+
+
+
TFTP Server Files
-
-
+
diff --git a/package-lock.json b/package-lock.json
index a39a8cc..5c268f0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,6 @@
"version": "0.1.0",
"dependencies": {
"bootstrap": "^5.3.3",
- "formidable": "^3.5.1",
"fs": "^0.0.1-security",
"next": "14.2.7",
"react": "^18",
@@ -762,11 +761,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
- },
"node_modules/ast-types-flow": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
@@ -1115,15 +1109,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/dezalgo": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
- "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
- "dependencies": {
- "asap": "^2.0.0",
- "wrappy": "1"
- }
- },
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -1925,19 +1910,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/formidable": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz",
- "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==",
- "dependencies": {
- "dezalgo": "^1.0.4",
- "hexoid": "^1.0.0",
- "once": "^1.4.0"
- },
- "funding": {
- "url": "https://ko-fi.com/tunnckoCore/commissions"
- }
- },
"node_modules/fs": {
"version": "0.0.1-security",
"resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
@@ -2246,14 +2218,6 @@
"node": ">= 0.4"
}
},
- "node_modules/hexoid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz",
- "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -3146,6 +3110,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
"dependencies": {
"wrappy": "1"
}
@@ -4360,7 +4325,8 @@
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
},
"node_modules/yocto-queue": {
"version": "0.1.0",
diff --git a/package.json b/package.json
index ca95948..88f0b0c 100644
--- a/package.json
+++ b/package.json
@@ -10,7 +10,6 @@
},
"dependencies": {
"bootstrap": "^5.3.3",
- "formidable": "^3.5.1",
"fs": "^0.0.1-security",
"next": "14.2.7",
"react": "^18",