import { Button } from "@opencode-ai/ui/button" import { useDialog } from "@opencode-ai/ui/context/dialog" import { Dialog } from "@opencode-ai/ui/dialog" import { TextField } from "@opencode-ai/ui/text-field" import { Icon } from "@opencode-ai/ui/icon" import { createMemo, createSignal, For, Show } from "solid-js" import { createStore } from "solid-js/store" import { useGlobalSDK } from "@/context/global-sdk" import { type LocalProject, getAvatarColors } from "@/context/layout" import { getFilename } from "@opencode-ai/util/path" import { Avatar } from "@opencode-ai/ui/avatar" const AVATAR_COLOR_KEYS = ["pink", "mint", "orange", "purple", "cyan", "lime"] as const export function DialogEditProject(props: { project: LocalProject }) { const dialog = useDialog() const globalSDK = useGlobalSDK() const folderName = createMemo(() => getFilename(props.project.worktree)) const defaultName = createMemo(() => props.project.name || folderName()) const [store, setStore] = createStore({ name: defaultName(), color: props.project.icon?.color || "pink", iconUrl: props.project.icon?.url || "", saving: false, }) const [dragOver, setDragOver] = createSignal(false) function handleFileSelect(file: File) { if (!file.type.startsWith("image/")) return const reader = new FileReader() reader.onload = (e) => setStore("iconUrl", e.target?.result as string) reader.readAsDataURL(file) } function handleDrop(e: DragEvent) { e.preventDefault() setDragOver(false) const file = e.dataTransfer?.files[0] if (file) handleFileSelect(file) } function handleDragOver(e: DragEvent) { e.preventDefault() setDragOver(true) } function handleDragLeave() { setDragOver(false) } function handleInputChange(e: Event) { const input = e.target as HTMLInputElement const file = input.files?.[0] if (file) handleFileSelect(file) } function clearIcon() { setStore("iconUrl", "") } async function handleSubmit(e: SubmitEvent) { e.preventDefault() if (!props.project.id) return setStore("saving", true) const name = store.name.trim() === folderName() ? "" : store.name.trim() await globalSDK.client.project.update({ projectID: props.project.id, name, icon: { color: store.color, url: store.iconUrl }, }) setStore("saving", false) dialog.close() } return (
setStore("name", v)} />
document.getElementById("icon-upload")?.click()} >
} > Project icon
Click or drag an image Recommended: 128x128px
{(color) => ( )}
) }