summaryrefslogtreecommitdiffhomepage
path: root/packages/desktop/src/context
diff options
context:
space:
mode:
Diffstat (limited to 'packages/desktop/src/context')
-rw-r--r--packages/desktop/src/context/layout.tsx87
-rw-r--r--packages/desktop/src/context/local.tsx28
-rw-r--r--packages/desktop/src/context/session.tsx4
3 files changed, 68 insertions, 51 deletions
diff --git a/packages/desktop/src/context/layout.tsx b/packages/desktop/src/context/layout.tsx
index 24ba55a53..9cafdce96 100644
--- a/packages/desktop/src/context/layout.tsx
+++ b/packages/desktop/src/context/layout.tsx
@@ -6,18 +6,26 @@ import { useGlobalSync } from "./global-sync"
import { useGlobalSDK } from "./global-sdk"
import { Project } from "@opencode-ai/sdk/v2"
-const PASTEL_COLORS = [
- "#FCEAFD", // pastel pink
- "#FFDFBA", // pastel peach
- "#FFFFBA", // pastel yellow
- "#BAFFC9", // pastel green
- "#EAF6FD", // pastel blue
- "#EFEAFD", // pastel lavender
- "#FEC8D8", // pastel rose
- "#D4F0F0", // pastel cyan
- "#FDF0EA", // pastel coral
- "#C1E1C1", // pastel mint
-]
+const AVATAR_COLOR_KEYS = ["pink", "mint", "orange", "purple", "cyan", "lime"] as const
+
+export type AvatarColorKey = (typeof AVATAR_COLOR_KEYS)[number]
+
+export function isAvatarColorKey(value: string): value is AvatarColorKey {
+ return AVATAR_COLOR_KEYS.includes(value as AvatarColorKey)
+}
+
+export function getAvatarColors(key?: string) {
+ if (key && isAvatarColorKey(key)) {
+ return {
+ background: `var(--avatar-background-${key})`,
+ foreground: `var(--avatar-text-${key})`,
+ }
+ }
+ return {
+ background: "var(--surface-info-base)",
+ foreground: "var(--text-base)",
+ }
+}
type Dialog = "provider" | "model" | "connect"
@@ -45,21 +53,24 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
name: "default-layout.v7",
},
)
- const [ephemeral, setEphemeral] = createStore({
+ const [ephemeral, setEphemeral] = createStore<{
connect: {
- provider: undefined as undefined | string,
- state: undefined as undefined | "pending" | "complete" | "error",
- error: undefined as undefined | string,
- },
+ provider?: string
+ state?: "pending" | "complete" | "error"
+ error?: string
+ }
dialog: {
- open: undefined as undefined | Dialog,
- },
+ open?: Dialog
+ }
+ }>({
+ connect: {},
+ dialog: {},
})
- const usedColors = new Set<string>()
+ const usedColors = new Set<AvatarColorKey>()
- function pickAvailableColor() {
- const available = PASTEL_COLORS.filter((c) => !usedColors.has(c))
- if (available.length === 0) return PASTEL_COLORS[Math.floor(Math.random() * PASTEL_COLORS.length)]
+ function pickAvailableColor(): AvatarColorKey {
+ const available = AVATAR_COLOR_KEYS.filter((c) => !usedColors.has(c))
+ if (available.length === 0) return AVATAR_COLOR_KEYS[Math.floor(Math.random() * AVATAR_COLOR_KEYS.length)]
return available[Math.floor(Math.random() * available.length)]
}
@@ -177,22 +188,30 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
dialog: {
opened: createMemo(() => ephemeral.dialog?.open),
open(dialog: Dialog) {
- setEphemeral("dialog", "open", dialog)
- if (dialog !== "connect") {
- setEphemeral("connect", {})
- }
+ batch(() => {
+ // if (dialog !== "connect") {
+ // setEphemeral("connect", {})
+ // }
+ setEphemeral("dialog", "open", dialog)
+ })
},
close(dialog: Dialog) {
- if (ephemeral.dialog?.open === dialog) {
- setEphemeral("dialog", "open", undefined)
- setEphemeral("connect", {})
+ if (ephemeral.dialog.open === dialog) {
+ setEphemeral(
+ produce((state) => {
+ state.dialog.open = undefined
+ state.connect = {}
+ }),
+ )
}
},
connect(provider: string) {
- batch(() => {
- setEphemeral("dialog", "open", "connect")
- setEphemeral("connect", { provider, state: "pending" })
- })
+ setEphemeral(
+ produce((state) => {
+ state.dialog.open = "connect"
+ state.connect = { provider, state: "pending" }
+ }),
+ )
},
},
connect: {
diff --git a/packages/desktop/src/context/local.tsx b/packages/desktop/src/context/local.tsx
index d8dfa732a..39fd1f987 100644
--- a/packages/desktop/src/context/local.tsx
+++ b/packages/desktop/src/context/local.tsx
@@ -41,10 +41,10 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
const providers = useProviders()
function isModelValid(model: ModelKey) {
- const provider = providers().all.find((x) => x.id === model.providerID)
+ const provider = providers.all().find((x) => x.id === model.providerID)
return (
!!provider?.models[model.modelID] &&
- providers()
+ providers
.connected()
.map((p) => p.id)
.includes(model.providerID)
@@ -123,16 +123,14 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
})
const list = createMemo(() =>
- providers()
- .connected()
- .flatMap((p) =>
- Object.values(p.models).map((m) => ({
- ...m,
- name: m.name.replace("(latest)", "").trim(),
- provider: p,
- latest: m.name.includes("(latest)"),
- })),
- ),
+ providers.connected().flatMap((p) =>
+ Object.values(p.models).map((m) => ({
+ ...m,
+ name: m.name.replace("(latest)", "").trim(),
+ provider: p,
+ latest: m.name.includes("(latest)"),
+ })),
+ ),
)
const find = (key: ModelKey) => list().find((m) => m.id === key?.modelID && m.provider.id === key.providerID)
@@ -153,11 +151,11 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
}
}
- for (const p of providers().connected()) {
- if (p.id in providers().default) {
+ for (const p of providers.connected()) {
+ if (p.id in providers.default()) {
return {
providerID: p.id,
- modelID: providers().default[p.id],
+ modelID: providers.default()[p.id],
}
}
}
diff --git a/packages/desktop/src/context/session.tsx b/packages/desktop/src/context/session.tsx
index db2b3af7c..860c1a14f 100644
--- a/packages/desktop/src/context/session.tsx
+++ b/packages/desktop/src/context/session.tsx
@@ -62,10 +62,10 @@ export const { use: useSession, provider: SessionProvider } = createSimpleContex
const userMessages = createMemo(() =>
messages()
.filter((m) => m.role === "user")
- .sort((a, b) => b.id.localeCompare(a.id)),
+ .sort((a, b) => a.id.localeCompare(b.id)),
)
const lastUserMessage = createMemo(() => {
- return userMessages()?.at(0)
+ return userMessages()?.at(-1)
})
const activeMessage = createMemo(() => {
if (!store.messageId) return lastUserMessage()