feat:
--Working Dont touch
This commit is contained in:
1 parent
e9178bc340
commit
0a5899b009
1 file changed
+88
-4
+88
-4
@@ -10,6 +10,16 @@ const navItems = [
|
|||||||
type PageId = (typeof navItems)[number]['id']
|
type PageId = (typeof navItems)[number]['id']
|
||||||
type Theme = 'light' | 'dark'
|
type Theme = 'light' | 'dark'
|
||||||
type TokenStatus = 'idle' | 'loading' | 'success' | 'error'
|
type TokenStatus = 'idle' | 'loading' | 'success' | 'error'
|
||||||
|
type RegisterStatus = 'idle' | 'loading' | 'success' | 'error'
|
||||||
|
|
||||||
|
type RegisterNodePayload = {
|
||||||
|
node_name: string
|
||||||
|
host: string
|
||||||
|
port: number
|
||||||
|
dbname: string
|
||||||
|
user: string
|
||||||
|
password: string
|
||||||
|
}
|
||||||
|
|
||||||
const getSavedTheme = (): Theme => {
|
const getSavedTheme = (): Theme => {
|
||||||
try {
|
try {
|
||||||
@@ -74,6 +84,29 @@ const getSessionToken = async () => {
|
|||||||
return storedToken
|
return storedToken
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const registerNode = async (payload: RegisterNodePayload) => {
|
||||||
|
const accessToken = localStorage.getItem('access_token')
|
||||||
|
const headers: Record<string, string> = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
}
|
||||||
|
|
||||||
|
if (accessToken) {
|
||||||
|
headers.Authorization = `Bearer ${accessToken}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await fetch('http://127.0.0.1:8000/register-node', {
|
||||||
|
method: 'POST',
|
||||||
|
headers,
|
||||||
|
body: JSON.stringify(payload),
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Failed to register node')
|
||||||
|
}
|
||||||
|
|
||||||
|
return response.json()
|
||||||
|
}
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
const [isCollapsed, setIsCollapsed] = useState(false)
|
const [isCollapsed, setIsCollapsed] = useState(false)
|
||||||
const [activePage, setActivePage] = useState<PageId>(getSavedPage)
|
const [activePage, setActivePage] = useState<PageId>(getSavedPage)
|
||||||
@@ -81,6 +114,8 @@ function App() {
|
|||||||
const [isRegisterFormOpen, setIsRegisterFormOpen] = useState(false)
|
const [isRegisterFormOpen, setIsRegisterFormOpen] = useState(false)
|
||||||
const [tokenStatus, setTokenStatus] = useState<TokenStatus>('idle')
|
const [tokenStatus, setTokenStatus] = useState<TokenStatus>('idle')
|
||||||
const [tokenError, setTokenError] = useState('')
|
const [tokenError, setTokenError] = useState('')
|
||||||
|
const [registerStatus, setRegisterStatus] = useState<RegisterStatus>('idle')
|
||||||
|
const [registerError, setRegisterError] = useState('')
|
||||||
const nextTheme = theme === 'light' ? 'dark' : 'light'
|
const nextTheme = theme === 'light' ? 'dark' : 'light'
|
||||||
|
|
||||||
const selectPage = (page: PageId) => {
|
const selectPage = (page: PageId) => {
|
||||||
@@ -113,6 +148,39 @@ function App() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleRegisterNode = async (
|
||||||
|
event: React.FormEvent<HTMLFormElement>,
|
||||||
|
) => {
|
||||||
|
event.preventDefault()
|
||||||
|
setRegisterStatus('loading')
|
||||||
|
setRegisterError('')
|
||||||
|
|
||||||
|
const formData = new FormData(event.currentTarget)
|
||||||
|
const payload: RegisterNodePayload = {
|
||||||
|
node_name: String(formData.get('node_name') ?? ''),
|
||||||
|
host: String(formData.get('host') ?? ''),
|
||||||
|
port: Number(formData.get('port')),
|
||||||
|
dbname: String(formData.get('dbname') ?? ''),
|
||||||
|
user: String(formData.get('user') ?? ''),
|
||||||
|
password: String(formData.get('password') ?? ''),
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const registerResponse = await registerNode(payload)
|
||||||
|
|
||||||
|
console.log('Node registration response:', registerResponse)
|
||||||
|
|
||||||
|
setRegisterStatus('success')
|
||||||
|
event.currentTarget.reset()
|
||||||
|
setIsRegisterFormOpen(false)
|
||||||
|
} catch (error) {
|
||||||
|
setRegisterStatus('error')
|
||||||
|
setRegisterError(
|
||||||
|
error instanceof Error ? error.message : 'Failed to register node',
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={`app-shell theme-${theme} ${isCollapsed ? 'nav-collapsed' : ''}`}
|
className={`app-shell theme-${theme} ${isCollapsed ? 'nav-collapsed' : ''}`}
|
||||||
@@ -186,7 +254,11 @@ function App() {
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="primary-button"
|
className="primary-button"
|
||||||
onClick={() => setIsRegisterFormOpen(true)}
|
onClick={() => {
|
||||||
|
setIsRegisterFormOpen(true)
|
||||||
|
setRegisterStatus('idle')
|
||||||
|
setRegisterError('')
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
Register Nodes
|
Register Nodes
|
||||||
</button>
|
</button>
|
||||||
@@ -209,8 +281,16 @@ function App() {
|
|||||||
<p className="status-message error">{tokenError}</p>
|
<p className="status-message error">{tokenError}</p>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{registerStatus === 'success' && (
|
||||||
|
<p className="status-message success">Node registered successfully.</p>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{registerStatus === 'error' && (
|
||||||
|
<p className="status-message error">{registerError}</p>
|
||||||
|
)}
|
||||||
|
|
||||||
{isRegisterFormOpen ? (
|
{isRegisterFormOpen ? (
|
||||||
<form className="register-form">
|
<form className="register-form" onSubmit={handleRegisterNode}>
|
||||||
<div className="form-grid">
|
<div className="form-grid">
|
||||||
<label className="form-field">
|
<label className="form-field">
|
||||||
<span>Node Name</span>
|
<span>Node Name</span>
|
||||||
@@ -258,8 +338,12 @@ function App() {
|
|||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
<button type="submit" className="primary-button">
|
<button
|
||||||
Register
|
type="submit"
|
||||||
|
className="primary-button"
|
||||||
|
disabled={registerStatus === 'loading'}
|
||||||
|
>
|
||||||
|
{registerStatus === 'loading' ? 'Registering' : 'Register'}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
Reference in new issue
Block a user