54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
import { ServerConnection, useServer, useSettings, useTabs } from "@opencode-ai/app"
|
|
import { onMount } from "solid-js"
|
|
|
|
export function DesktopFirstLaunchOnboarding(props: { initialUrl: string; onLoaded: () => void }) {
|
|
const server = useServer()
|
|
const settings = useSettings()
|
|
const tabs = useTabs()
|
|
|
|
onMount(() => {
|
|
void runFirstLaunchOnboarding().finally(props.onLoaded)
|
|
})
|
|
|
|
async function runFirstLaunchOnboarding() {
|
|
try {
|
|
await Promise.all(
|
|
[server.ready.promise, tabs.ready.promise, tabs.recentReady.promise].map((p) => p ?? Promise.resolve()),
|
|
)
|
|
const existingInstall = await window.api.isOldLayoutEligible()
|
|
settings.general.setOldLayoutEligible(existingInstall)
|
|
if (!server.isLocal()) return
|
|
|
|
const pending = await window.api.isFirstLaunchOnboardingPending()
|
|
if (!pending) return
|
|
|
|
const shouldTrigger =
|
|
!existingInstall &&
|
|
props.initialUrl === "/" &&
|
|
tabs.store.length === 0 &&
|
|
server.list.every(ServerConnection.builtin)
|
|
|
|
console.info("[desktop-onboarding] first launch onboarding evaluated", {
|
|
pending,
|
|
shouldTrigger,
|
|
existingInstall,
|
|
initialUrl: props.initialUrl,
|
|
tabs: tabs.store.length,
|
|
servers: server.list.map(ServerConnection.key),
|
|
})
|
|
|
|
const directory = await window.api.finishFirstLaunchOnboarding(shouldTrigger)
|
|
if (!shouldTrigger || !directory) return
|
|
|
|
console.info("[desktop-onboarding] starting first launch draft", { directory })
|
|
server.projects.open(directory)
|
|
server.projects.touch(directory)
|
|
tabs.select(await tabs.newDraft({ server: server.key, directory }))
|
|
} catch (error) {
|
|
console.error("[desktop-onboarding] first launch onboarding failed", error)
|
|
}
|
|
}
|
|
|
|
return null
|
|
}
|