|
@@ -26,67 +26,72 @@ export function createDialogProviderOptions() {
|
|
|
const sync = useSync()
|
|
const sync = useSync()
|
|
|
const dialog = useDialog()
|
|
const dialog = useDialog()
|
|
|
const sdk = useSDK()
|
|
const sdk = useSDK()
|
|
|
|
|
+ const connected = createMemo(() => new Set(sync.data.provider_next.connected))
|
|
|
const options = createMemo(() => {
|
|
const options = createMemo(() => {
|
|
|
return pipe(
|
|
return pipe(
|
|
|
sync.data.provider_next.all,
|
|
sync.data.provider_next.all,
|
|
|
sortBy((x) => PROVIDER_PRIORITY[x.id] ?? 99),
|
|
sortBy((x) => PROVIDER_PRIORITY[x.id] ?? 99),
|
|
|
- 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!} />
|
|
|
|
|
- ))
|
|
|
|
|
|
|
+ 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 (result.data?.method === "auto") {
|
|
|
|
|
- dialog.replace(() => (
|
|
|
|
|
- <AutoMethod providerID={provider.id} title={method.label} index={index} authorization={result.data!} />
|
|
|
|
|
- ))
|
|
|
|
|
|
|
+ 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!} />
|
|
|
|
|
+ ))
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
- if (method.type === "api") {
|
|
|
|
|
- return dialog.replace(() => <ApiMethod providerID={provider.id} title={method.label} />)
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- })),
|
|
|
|
|
|
|
+ if (method.type === "api") {
|
|
|
|
|
+ return dialog.replace(() => <ApiMethod providerID={provider.id} title={method.label} />)
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+ }),
|
|
|
)
|
|
)
|
|
|
})
|
|
})
|
|
|
return options
|
|
return options
|