Skip to content
This repository was archived by the owner on Oct 19, 2026. It is now read-only.

Commit 5b265f6

Browse files
authored
Add Orion Client API integration for client list display (#1747)
1 parent c262e1d commit 5b265f6

10 files changed

Lines changed: 1175 additions & 280 deletions

File tree

‎moon/apps/web/components/ClView/components/Checks/index.tsx‎

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,32 @@ const Checks = ({ cl }: { cl: number }) => {
2424
useEffect(() => {
2525
if (!tasks || tasks.length === 0) return
2626

27-
const allBuildIds = tasks.flatMap((task) => task.build_list.map((build) => build.id))
27+
const builds = tasks.flatMap((task) =>
28+
(task.build_list ?? []).map((build) => ({
29+
build_id: build.id,
30+
task_id: build.task_id ?? task.task_id,
31+
repo: build.repo
32+
}))
33+
)
34+
35+
const validBuilds = builds.filter((b) => Boolean(b.build_id && b.task_id && b.repo))
2836

29-
if (allBuildIds.length === 0) return
37+
if (validBuilds.length === 0) return
3038

31-
allBuildIds.forEach((id) => {
32-
setEventSource(id)
33-
setLogStatus((prev) => ({ ...prev, [id]: 'loading' }))
39+
validBuilds.forEach((b) => {
40+
setEventSource(b.build_id)
41+
setLogStatus((prev) => ({ ...prev, [b.build_id]: 'loading' }))
3442
})
3543

3644
const fetchLogs = async () => {
3745
const logsResult = await Promise.allSettled(
38-
allBuildIds.map(async (id) => {
46+
validBuilds.map(async ({ build_id, task_id, repo }) => {
3947
try {
40-
const res = await fetchHTTPLog({ id, type: 'full' })
48+
const res = await fetchHTTPLog({ task_id, build_id, repo })
4149

42-
return { id, res, error: null }
50+
return { id: build_id, res, error: null }
4351
} catch (error) {
44-
return { id, res: null, error }
52+
return { id: build_id, res: null, error }
4553
}
4654
})
4755
)
@@ -78,7 +86,7 @@ const Checks = ({ cl }: { cl: number }) => {
7886
}
7987
} else {
8088
// Promise.allSettled rejected (shouldn't happen with try-catch, but defensive)
81-
const id = allBuildIds[logsResult.indexOf(item)]
89+
const id = validBuilds[logsResult.indexOf(item)]?.build_id
8290

8391
if (id) {
8492
newLogStatus[id] = 'error'
@@ -93,8 +101,8 @@ const Checks = ({ cl }: { cl: number }) => {
93101

94102
fetchLogs()
95103

96-
if (!buildid && allBuildIds.length > 0) {
97-
setBuildId(allBuildIds[0])
104+
if (!buildid && validBuilds.length > 0) {
105+
setBuildId(validBuilds[0].build_id)
98106
}
99107

100108
return () => {

‎moon/apps/web/components/OrionClient/ClientsTable.tsx‎

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
import React from 'react'
44
import { DataTable } from '@primer/react/experimental'
55

6+
import { CoreWorkerStatus, TaskPhase } from '@gitmono/types/generated'
67
import { Select, SelectTrigger, SelectValue, UIText } from '@gitmono/ui'
78

9+
import { useGetOrionClientStatusById } from '@/hooks/OrionClient/OrionClientStatusById'
10+
811
import { StatusBadge } from './StatusBadge'
912
import { deriveStatus, OrionClient, OrionClientStatus } from './types'
1013

@@ -86,7 +89,7 @@ export function ClientsTable({ clients, isLoading, statusFilter, onStatusChange,
8689
),
8790
field: 'statusDerived',
8891
width: '14%',
89-
renderCell: (row: Row) => <StatusBadge status={row.statusDerived} />
92+
renderCell: (row: Row) => <OrionClientStatusCell client={row} />
9093
}
9194
],
9295
[onStatusChange, statusFilter, statusOptions]
@@ -114,6 +117,38 @@ export function ClientsTable({ clients, isLoading, statusFilter, onStatusChange,
114117
)
115118
}
116119

120+
function OrionClientStatusCell({ client }: { client: OrionClient }) {
121+
const { data, isLoading, isError } = useGetOrionClientStatusById(client.client_id, undefined, 5 * 60 * 1000)
122+
123+
if (isLoading) {
124+
return (
125+
<UIText color='text-muted' size='text-xs'>
126+
Loading…
127+
</UIText>
128+
)
129+
}
130+
131+
if (isError || !data) {
132+
return <StatusBadge status={deriveStatus(client)} />
133+
}
134+
135+
return <StatusBadge status={mapApiStatusToUiStatus(data.core_status, data.phase)} />
136+
}
137+
138+
function mapApiStatusToUiStatus(coreStatus: CoreWorkerStatus, phase: TaskPhase | null | undefined): OrionClientStatus {
139+
if (coreStatus === CoreWorkerStatus.Idle) return 'idle'
140+
if (coreStatus === CoreWorkerStatus.Error) return 'error'
141+
if (coreStatus === CoreWorkerStatus.Lost) return 'offline'
142+
143+
if (coreStatus === CoreWorkerStatus.Busy) {
144+
if (phase === TaskPhase.DownloadingSource) return 'downloading'
145+
if (phase === TaskPhase.RunningBuild) return 'running'
146+
return 'busy'
147+
}
148+
149+
return 'idle'
150+
}
151+
117152
function formatDateTime(iso: string) {
118153
if (!iso) return '—'
119154
const d = new Date(iso)

‎moon/apps/web/components/OrionClient/StatusBadge.tsx‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,23 @@ import { Badge } from '@gitmono/ui'
44

55
import { OrionClientStatus } from './types'
66

7+
type UIOrionClientStatus = Exclude<OrionClientStatus, 'preparing' | 'uploading'>
8+
79
const STATUS_META: Record<
8-
OrionClientStatus,
10+
UIOrionClientStatus,
911
{ color: 'default' | 'blue' | 'green' | 'brand' | 'orange' | 'amber'; label: string }
1012
> = {
1113
idle: { color: 'green', label: 'Idle' },
1214
busy: { color: 'orange', label: 'Busy ' },
1315
running: { color: 'blue', label: 'Running build' },
1416
downloading: { color: 'blue', label: 'Downloading source' },
15-
preparing: { color: 'blue', label: 'Preparing environment' },
16-
uploading: { color: 'blue', label: 'Uploading artifacts' },
1717
error: { color: 'brand', label: 'Error ' },
1818
offline: { color: 'default', label: 'Lost / Offline' }
1919
}
2020

2121
export function StatusBadge({ status }: { status: OrionClientStatus }) {
22-
const meta = STATUS_META[status] ?? STATUS_META.idle
22+
const normalizedStatus: UIOrionClientStatus = status
23+
const meta = STATUS_META[normalizedStatus]
2324

2425
return (
2526
<Badge className='min-w-[140px] justify-center px-3 py-0.5 text-xs' color={meta.color}>

‎moon/apps/web/components/OrionClient/types.ts‎

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,11 @@
11
'use client'
22

3-
export type OrionClientStatus =
4-
| 'idle'
5-
| 'busy'
6-
| 'running'
7-
| 'downloading'
8-
| 'preparing'
9-
| 'uploading'
10-
| 'error'
11-
| 'offline'
3+
export type OrionClientStatus = 'idle' | 'busy' | 'running' | 'downloading' | 'error' | 'offline'
124

135
export interface OrionClient {
146
client_id: string
157
hostname: string
16-
instance_id: string
8+
instance_id?: string
179
orion_version: string
1810
start_time: string
1911
last_heartbeat: string
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { useQuery } from '@tanstack/react-query'
2+
3+
import type { GetOrionClientStatusByIdData, RequestParams } from '@gitmono/types/generated'
4+
5+
import { orionApiClient } from '@/utils/queryClient'
6+
7+
export function useGetOrionClientStatusById(id: string, params?: RequestParams, refetchIntervalMs?: number) {
8+
return useQuery<GetOrionClientStatusByIdData, Error>({
9+
queryKey: [...orionApiClient.id.getOrionClientStatusById().requestKey(id), params],
10+
queryFn: () => orionApiClient.id.getOrionClientStatusById().request(id, params),
11+
refetchInterval: refetchIntervalMs,
12+
refetchIntervalInBackground: Boolean(refetchIntervalMs),
13+
enabled: Boolean(id)
14+
})
15+
}
16+
17+
export const fetchOrionClientStatusById = (id: string, params?: RequestParams) => {
18+
return orionApiClient.id.getOrionClientStatusById().request(id, params)
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { useMutation, useQueryClient } from '@tanstack/react-query'
2+
3+
import type { PageParamsOrionClientQuery, PostOrionClientsInfoData, RequestParams } from '@gitmono/types/generated'
4+
5+
import { orionApiClient } from '@/utils/queryClient'
6+
7+
export function usePostOrionClientsInfo(params?: RequestParams) {
8+
const queryClient = useQueryClient()
9+
const mutation = orionApiClient.postOrionClientsInfo()
10+
11+
return useMutation<PostOrionClientsInfoData, Error, PageParamsOrionClientQuery>({
12+
mutationFn: (data) => mutation.request(data, params),
13+
onSuccess: () => {
14+
queryClient.invalidateQueries({
15+
queryKey: mutation.baseKey
16+
})
17+
}
18+
})
19+
}
Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
import { useQuery } from '@tanstack/react-query'
22

3-
import { GetTaskHistoryOutputByIdData, GetTaskHistoryOutputByIdParams, RequestParams } from '@gitmono/types/generated'
3+
import { GetTaskHistoryOutputData, GetTaskHistoryOutputParams, RequestParams } from '@gitmono/types/generated'
44

55
import { orionApiClient } from '@/utils/queryClient'
66

7-
export function useGetHTTPLog(payload: GetTaskHistoryOutputByIdParams, params?: RequestParams) {
8-
return useQuery<GetTaskHistoryOutputByIdData, Error>({
9-
queryKey: [...orionApiClient.id.getTaskHistoryOutputById().requestKey(payload), params],
10-
queryFn: () => orionApiClient.id.getTaskHistoryOutputById().request(payload, params)
7+
export function useGetHTTPLog(query: GetTaskHistoryOutputParams, params?: RequestParams) {
8+
const request = orionApiClient.getTaskHistoryOutput()
9+
10+
return useQuery<GetTaskHistoryOutputData, Error>({
11+
queryKey: [...request.requestKey(query), params],
12+
queryFn: () => request.request(query, params),
13+
enabled: Boolean(query?.task_id && query?.build_id && query?.repo)
1114
})
1215
}
1316

14-
export const fetchHTTPLog = (payload: GetTaskHistoryOutputByIdParams, params?: RequestParams) => {
15-
return orionApiClient.id.getTaskHistoryOutputById().request(payload, params)
17+
export const fetchHTTPLog = (query: GetTaskHistoryOutputParams, params?: RequestParams) => {
18+
return orionApiClient.getTaskHistoryOutput().request(query, params)
1619
}
Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
11
import { useMutation } from '@tanstack/react-query'
22

3-
import { GetApiCommitsDetailData, GetApiCommitsDetailParams, RequestParams } from '@gitmono/types/generated'
3+
import {
4+
Pagination,
5+
PostApiCommitsFilesChangedData,
6+
PostApiCommitsFilesChangedParams,
7+
RequestParams
8+
} from '@gitmono/types/generated'
49

510
import { legacyApiClient } from '@/utils/queryClient'
611

712
export function useGetCommitsDetail() {
8-
return useMutation<GetApiCommitsDetailData, Error, { data: GetApiCommitsDetailParams; params?: RequestParams }>({
9-
mutationFn: ({ data, params }) => legacyApiClient.v1.getApiCommitsDetail().request(data, params)
13+
return useMutation<
14+
PostApiCommitsFilesChangedData,
15+
Error,
16+
{ params: PostApiCommitsFilesChangedParams; data: Pagination; requestParams?: RequestParams }
17+
>({
18+
mutationFn: ({ params, data, requestParams }) =>
19+
legacyApiClient.v1.postApiCommitsFilesChanged().request(params, data, requestParams)
1020
})
1121
}

0 commit comments

Comments
 (0)