docs: comprehensive documentation polish & CI/CD automation
Major Updates: - Rewrote all docs in beginner-friendly 'ELI5' language - Created docs index with user journey navigation - Added complete getting-started guide for novice users - Set up GitHub Container Registry (GHCR) automation - Configured GitHub Pages deployment for documentation Documentation: - docs/index.md - Central navigation hub - docs/getting-started.md - Step-by-step beginner guide - docs/github-setup.md - CI/CD setup instructions - README.md - Complete rewrite in accessible language - CONTRIBUTING.md - Contributor guidelines - Multiple comprehensive API and schema docs CI/CD Workflows: - .github/workflows/docker-build.yml - Multi-platform builds to GHCR - .github/workflows/docs.yml - Automated docs deployment to Pages - Supports main (latest), development (dev), and version tags - Automated testing of built images - Beautiful documentation site with dark theme Benefits: - Zero barrier to entry for new users - Automated Docker builds (AMD64 + ARM64) - Professional documentation site - No Docker Hub account needed (uses GHCR) - Complete CI/CD pipeline All 7 implementation phases complete - project is production ready!
This commit is contained in:
78
frontend/src/hooks/useRemoteServers.ts
Normal file
78
frontend/src/hooks/useRemoteServers.ts
Normal file
@@ -0,0 +1,78 @@
|
||||
import { useState, useEffect } from 'react'
|
||||
import { remoteServersAPI } from '../services/api'
|
||||
|
||||
export interface RemoteServer {
|
||||
uuid: string
|
||||
name: string
|
||||
provider: string
|
||||
host: string
|
||||
port: number
|
||||
username?: string
|
||||
enabled: boolean
|
||||
reachable: boolean
|
||||
last_check?: string
|
||||
created_at: string
|
||||
updated_at: string
|
||||
}
|
||||
|
||||
export function useRemoteServers() {
|
||||
const [servers, setServers] = useState<RemoteServer[]>([])
|
||||
const [loading, setLoading] = useState(true)
|
||||
const [error, setError] = useState<string | null>(null)
|
||||
|
||||
const fetchServers = async (enabledOnly = false) => {
|
||||
try {
|
||||
setLoading(true)
|
||||
setError(null)
|
||||
const data = await remoteServersAPI.list(enabledOnly)
|
||||
setServers(data)
|
||||
} catch (err) {
|
||||
setError(err instanceof Error ? err.message : 'Failed to fetch remote servers')
|
||||
} finally {
|
||||
setLoading(false)
|
||||
}
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
fetchServers()
|
||||
}, [])
|
||||
|
||||
const createServer = async (data: Partial<RemoteServer>) => {
|
||||
try {
|
||||
const newServer = await remoteServersAPI.create(data)
|
||||
setServers([...servers, newServer])
|
||||
return newServer
|
||||
} catch (err) {
|
||||
throw new Error(err instanceof Error ? err.message : 'Failed to create remote server')
|
||||
}
|
||||
}
|
||||
|
||||
const updateServer = async (uuid: string, data: Partial<RemoteServer>) => {
|
||||
try {
|
||||
const updatedServer = await remoteServersAPI.update(uuid, data)
|
||||
setServers(servers.map(s => s.uuid === uuid ? updatedServer : s))
|
||||
return updatedServer
|
||||
} catch (err) {
|
||||
throw new Error(err instanceof Error ? err.message : 'Failed to update remote server')
|
||||
}
|
||||
}
|
||||
|
||||
const deleteServer = async (uuid: string) => {
|
||||
try {
|
||||
await remoteServersAPI.delete(uuid)
|
||||
setServers(servers.filter(s => s.uuid !== uuid))
|
||||
} catch (err) {
|
||||
throw new Error(err instanceof Error ? err.message : 'Failed to delete remote server')
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
servers,
|
||||
loading,
|
||||
error,
|
||||
refresh: fetchServers,
|
||||
createServer,
|
||||
updateServer,
|
||||
deleteServer,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user