first commit. added CI, Docker compose, blank client and server. used unit tests, they pass
CI / Go (build + vet + test) (push) Successful in 10m49s
CI / Web (build + lint) (push) Successful in 10m31s

This commit is contained in:
vantablackTea
2026-09-05 01:04:12 +03:00
commit 1a669c948a
30 changed files with 2208 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
import { useEffect, useState } from 'react'
import { pingApi, type PingResponse } from './api'
import './index.css'
type ApiState =
| { status: 'loading' }
| { status: 'ok'; data: PingResponse }
| { status: 'error'; error: string }
function App() {
const [api, setApi] = useState<ApiState>({ status: 'loading' })
useEffect(() => {
let cancelled = false
pingApi()
.then((data) => {
if (!cancelled) setApi({ status: 'ok', data })
})
.catch((err: unknown) => {
if (!cancelled) setApi({ status: 'error', error: String(err) })
})
return () => {
cancelled = true
}
}, [])
return (
<main className="shell">
<h1>Messenger</h1>
<div className="card">
<div className="status-row">
<span className={`dot ${api.status}`} aria-hidden />
<span className="status-label">
{api.status === 'loading' && 'API: connecting…'}
{api.status === 'ok' && 'API: connected'}
{api.status === 'error' && 'API: unreachable'}
</span>
</div>
{api.status === 'ok' && (
<p className="detail">
{api.data.message} · server time {api.data.time}
</p>
)}
{api.status === 'error' && <p className="detail">{api.error}</p>}
</div>
</main>
)
}
export default App