mirror of
https://github.com/aljazceru/opencode.git
synced 2025-12-22 10:14:22 +01:00
wip: desktop work
This commit is contained in:
@@ -1,26 +1,36 @@
|
|||||||
import { useSync, useLocal } from "@/context"
|
import { useSync, useLocal } from "@/context"
|
||||||
import { Button, Tooltip } from "@/ui"
|
import { Tooltip } from "@/ui"
|
||||||
|
import { DateTime } from "luxon"
|
||||||
import { VList } from "virtua/solid"
|
import { VList } from "virtua/solid"
|
||||||
|
|
||||||
export default function SessionList() {
|
export default function SessionList() {
|
||||||
const sync = useSync()
|
const sync = useSync()
|
||||||
const local = useLocal()
|
const local = useLocal()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<VList data={sync.data.session} class="p-2">
|
<VList data={sync.data.session} class="p-3">
|
||||||
{(session) => (
|
{(session) => (
|
||||||
<Tooltip placement="right" value={session.title} class="w-full min-w-0">
|
<Tooltip placement="right" value={session.title} class="w-full min-w-0">
|
||||||
<Button
|
<button
|
||||||
size="sm"
|
data-active={local.session.active()?.id === session.id}
|
||||||
variant="ghost"
|
class="group w-full min-w-0 text-left truncate justify-start text-xs my-0.5 cursor-pointer
|
||||||
classList={{
|
flex flex-col gap-1 rounded-md p-2 border-[0.5px] border-transparent
|
||||||
"w-full min-w-0 py-1 text-left truncate justify-start text-text-muted text-xs": true,
|
hover:not-data-[active=true]:bg-background-panel
|
||||||
"text-text!": local.session.active()?.id === session.id,
|
data-[active=true]:bg-background-element data-[active=true]:border-border-subtle"
|
||||||
}}
|
|
||||||
onClick={() => local.session.setActive(session.id)}
|
onClick={() => local.session.setActive(session.id)}
|
||||||
>
|
>
|
||||||
<span class="truncate">{session.title}</span>
|
<div class="flex gap-1 items-center">
|
||||||
</Button>
|
<div
|
||||||
|
classList={{
|
||||||
|
"text-text/80 min-w-0 grow truncate": true,
|
||||||
|
"group-data-[active=true]:text-text!": true,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{session.title}
|
||||||
|
</div>
|
||||||
|
<div class="shrink-0 text-text-muted/60">{DateTime.fromMillis(session.time.updated).toRelative()}</div>
|
||||||
|
</div>
|
||||||
|
<span class="text-text-muted truncate">{session.share?.url}</span>
|
||||||
|
</button>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
)}
|
)}
|
||||||
</VList>
|
</VList>
|
||||||
|
|||||||
@@ -467,6 +467,11 @@ function init() {
|
|||||||
return sync.session.get(store.active)
|
return sync.session.get(store.active)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
createEffect(() => {
|
||||||
|
if (!store.active) return
|
||||||
|
sync.session.sync(store.active)
|
||||||
|
})
|
||||||
|
|
||||||
return {
|
return {
|
||||||
active,
|
active,
|
||||||
setActive(sessionId: string | undefined) {
|
setActive(sessionId: string | undefined) {
|
||||||
|
|||||||
@@ -214,9 +214,10 @@ export default function Page() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div class="relative">
|
<div class="relative h-screen flex flex-col">
|
||||||
<div class="h-screen flex">
|
<header class="h-10 shrink-0 bg-background-panel"></header>
|
||||||
<div class="shrink-0 w-56">
|
<main class="h-[calc(100vh-2.5rem)] flex">
|
||||||
|
<div class="shrink-0 w-64">
|
||||||
<SessionList />
|
<SessionList />
|
||||||
</div>
|
</div>
|
||||||
<div class="grow w-full min-w-0 overflow-y-auto flex justify-center">
|
<div class="grow w-full min-w-0 overflow-y-auto flex justify-center">
|
||||||
@@ -342,7 +343,7 @@ export default function Page() {
|
|||||||
</Show>
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</main>
|
||||||
<Show when={store.modelSelectOpen}>
|
<Show when={store.modelSelectOpen}>
|
||||||
<SelectDialog
|
<SelectDialog
|
||||||
key={(x) => `${x.provider.id}:${x.id}`}
|
key={(x) => `${x.provider.id}:${x.id}`}
|
||||||
|
|||||||
Reference in New Issue
Block a user