summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx123
1 files changed, 54 insertions, 69 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx
index f8be5577b..f5512140f 100644
--- a/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx
@@ -26,82 +26,67 @@ export function createDialogProviderOptions() {
const sync = useSync()
const dialog = useDialog()
const sdk = useSDK()
- const connected = createMemo(() => new Set(sync.data.provider_next.connected))
const options = createMemo(() => {
return pipe(
sync.data.provider_next.all,
sortBy((x) => PROVIDER_PRIORITY[x.id] ?? 99),
- map((provider) => {
- const isConnected = connected().has(provider.id)
- return {
- title: provider.name,
- value: provider.id,
- description: {
- opencode: "(Recommended)",
- anthropic: "(Claude Max or API key)",
- openai: "(ChatGPT Plus/Pro or API key)",
- }[provider.id],
- category: provider.id in PROVIDER_PRIORITY ? "Popular" : "Other",
- footer: isConnected ? "Connected" : undefined,
- async onSelect() {
- const methods = sync.data.provider_auth[provider.id] ?? [
- {
- type: "api",
- label: "API key",
- },
- ]
- let index: number | null = 0
- if (methods.length > 1) {
- index = await new Promise<number | null>((resolve) => {
- dialog.replace(
- () => (
- <DialogSelect
- title="Select auth method"
- options={methods.map((x, index) => ({
- title: x.label,
- value: index,
- }))}
- onSelect={(option) => resolve(option.value)}
- />
- ),
- () => resolve(null),
- )
- })
- }
- if (index == null) return
- const method = methods[index]
- if (method.type === "oauth") {
- const result = await sdk.client.provider.oauth.authorize({
- providerID: provider.id,
- method: index,
- })
- if (result.data?.method === "code") {
- dialog.replace(() => (
- <CodeMethod
- providerID={provider.id}
- title={method.label}
- index={index}
- authorization={result.data!}
- />
- ))
- }
- if (result.data?.method === "auto") {
- dialog.replace(() => (
- <AutoMethod
- providerID={provider.id}
- title={method.label}
- index={index}
- authorization={result.data!}
+ map((provider) => ({
+ title: provider.name,
+ value: provider.id,
+ description: {
+ opencode: "(Recommended)",
+ anthropic: "(Claude Max or API key)",
+ openai: "(ChatGPT Plus/Pro or API key)",
+ }[provider.id],
+ category: provider.id in PROVIDER_PRIORITY ? "Popular" : "Other",
+ async onSelect() {
+ const methods = sync.data.provider_auth[provider.id] ?? [
+ {
+ type: "api",
+ label: "API key",
+ },
+ ]
+ let index: number | null = 0
+ if (methods.length > 1) {
+ index = await new Promise<number | null>((resolve) => {
+ dialog.replace(
+ () => (
+ <DialogSelect
+ title="Select auth method"
+ options={methods.map((x, index) => ({
+ title: x.label,
+ value: index,
+ }))}
+ onSelect={(option) => resolve(option.value)}
/>
- ))
- }
+ ),
+ () => resolve(null),
+ )
+ })
+ }
+ if (index == null) return
+ const method = methods[index]
+ if (method.type === "oauth") {
+ const result = await sdk.client.provider.oauth.authorize({
+ providerID: provider.id,
+ method: index,
+ })
+ if (result.data?.method === "code") {
+ dialog.replace(() => (
+ <CodeMethod providerID={provider.id} title={method.label} index={index} authorization={result.data!} />
+ ))
}
- if (method.type === "api") {
- return dialog.replace(() => <ApiMethod providerID={provider.id} title={method.label} />)
+ if (result.data?.method === "auto") {
+ dialog.replace(() => (
+ <AutoMethod providerID={provider.id} title={method.label} index={index} authorization={result.data!} />
+ ))
}
- },
- }
- }),
+ }
+ if (method.type === "api") {
+ return dialog.replace(() => <ApiMethod providerID={provider.id} title={method.label} />)
+ }
+ },
+ })),
)
})
return options