@@ -2,21 +2,60 @@ import { type Component, createResource, Show } from "solid-js"
22import { Icon } from "@opencode-ai/ui/icon"
33import { useLanguage } from "@/context/language"
44import { useGlobalSDK } from "@/context/global-sdk"
5+ import { useServer } from "@/context/server"
56import { usePlatform } from "@/context/platform"
67import { SettingsList } from "./settings-list"
78
8- type PairResult = { enabled : false } | { enabled : true ; hosts : string [ ] ; link : string ; qr : string }
9+ type PairResult =
10+ | { enabled : false }
11+ | {
12+ enabled : true
13+ hosts : string [ ]
14+ relayURL ?: string
15+ serverID ?: string
16+ relaySecretHash ?: string
17+ link : string
18+ qr : string
19+ }
920
1021export const SettingsPair : Component = ( ) => {
1122 const language = useLanguage ( )
1223 const globalSDK = useGlobalSDK ( )
24+ const server = useServer ( )
1325 const platform = usePlatform ( )
1426
1527 const [ data ] = createResource ( async ( ) => {
28+ const url = `${ globalSDK . url } /experimental/push/pair`
29+ console . debug ( "[settings-pair] fetching pair data" , {
30+ serverUrl : globalSDK . url ,
31+ serverName : server . name ,
32+ serverKey : server . key ,
33+ } )
1634 const f = platform . fetch ?? fetch
17- const res = await f ( `${ globalSDK . url } /experimental/push/pair` )
18- if ( ! res . ok ) return { enabled : false as const }
19- return ( await res . json ( ) ) as PairResult
35+ const res = await f ( url )
36+ if ( ! res . ok ) {
37+ console . debug ( "[settings-pair] pair endpoint returned non-ok" , {
38+ status : res . status ,
39+ serverUrl : globalSDK . url ,
40+ } )
41+ return { enabled : false as const }
42+ }
43+ const result = ( await res . json ( ) ) as PairResult
44+ console . debug ( "[settings-pair] pair data received" , {
45+ enabled : result . enabled ,
46+ serverUrl : globalSDK . url ,
47+ serverName : server . name ,
48+ ...( result . enabled
49+ ? {
50+ relayURL : result . relayURL ,
51+ serverID : result . serverID ,
52+ relaySecretHash : result . relaySecretHash ,
53+ hostCount : result . hosts . length ,
54+ hosts : result . hosts ,
55+ }
56+ : { } ) ,
57+ } )
58+ return result
2059 } )
2160
2261 return (
@@ -69,21 +108,56 @@ export const SettingsPair: Component = () => {
69108 </ SettingsList >
70109 }
71110 >
72- { ( pair ) => (
73- < SettingsList >
74- < div class = "flex flex-col items-center py-8 gap-4" >
75- < img src = { ( pair ( ) as PairResult & { enabled : true } ) . qr } alt = "Pairing QR code" class = "w-64 h-64" />
76- < div class = "flex flex-col gap-1 text-center max-w-sm" >
77- < span class = "text-14-medium text-text-strong" >
78- { language . t ( "settings.pair.instructions.title" ) }
79- </ span >
80- < span class = "text-13-regular text-text-weak" >
81- { language . t ( "settings.pair.instructions.description" ) }
82- </ span >
111+ { ( pair ) => {
112+ const p = pair ( ) as PairResult & { enabled : true }
113+ return (
114+ < SettingsList >
115+ < div class = "flex flex-col items-center py-8 gap-4" >
116+ < Show when = { server . list . length > 1 || p . relayURL } >
117+ < div class = "flex flex-col gap-1.5 w-full max-w-sm text-left" >
118+ < div class = "flex items-center gap-2" >
119+ < span class = "text-12-medium text-text-weak shrink-0" >
120+ { language . t ( "settings.pair.server.label" ) }
121+ </ span >
122+ < code class = "text-12-regular text-text-default bg-surface-inset px-2 py-0.5 rounded truncate" >
123+ { server . name }
124+ </ code >
125+ </ div >
126+ < Show when = { p . relayURL } >
127+ < div class = "flex items-center gap-2" >
128+ < span class = "text-12-medium text-text-weak shrink-0" >
129+ { language . t ( "settings.pair.relay.label" ) }
130+ </ span >
131+ < code class = "text-12-regular text-text-default bg-surface-inset px-2 py-0.5 rounded truncate" >
132+ { p . relayURL }
133+ </ code >
134+ </ div >
135+ </ Show >
136+ < Show when = { p . relaySecretHash } >
137+ < div class = "flex items-center gap-2" >
138+ < span class = "text-12-medium text-text-weak shrink-0" >
139+ { language . t ( "settings.pair.secret.label" ) }
140+ </ span >
141+ < code class = "text-12-regular text-text-default bg-surface-inset px-2 py-0.5 rounded truncate" >
142+ { p . relaySecretHash }
143+ </ code >
144+ </ div >
145+ </ Show >
146+ </ div >
147+ </ Show >
148+ < img src = { p . qr } alt = "Pairing QR code" class = "w-64 h-64" />
149+ < div class = "flex flex-col gap-1 text-center max-w-sm" >
150+ < span class = "text-14-medium text-text-strong" >
151+ { language . t ( "settings.pair.instructions.title" ) }
152+ </ span >
153+ < span class = "text-13-regular text-text-weak" >
154+ { language . t ( "settings.pair.instructions.description" ) }
155+ </ span >
156+ </ div >
83157 </ div >
84- </ div >
85- </ SettingsList >
86- ) }
158+ </ SettingsList >
159+ )
160+ } }
87161 </ Show >
88162 ) }
89163 </ Show >
0 commit comments