6ede33ccdb
Build and Push Docker Images / create_manifest (web, surfsense-web, , cpu) (push) Has been cancelled
Build and Push Docker Images / finalize_release (push) Has been cancelled
Obsidian Plugin Lint / lint (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-24.04-arm, linux/arm64, arm64, , runner, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-latest, linux/amd64, amd64, , runner, false, cpu) (push) Has been cancelled
Build and Push Docker Images / compute_version (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, , production, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, , production, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu126, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, -cuda126, production, true, cuda126) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu126, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, -cuda126, production, true, cuda126) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu128, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, -cuda, production, true, cuda) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu128, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, -cuda, production, true, cuda) (push) Has been cancelled
Build and Push Docker Images / verify_digests (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, , cpu) (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda, cuda) (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda126, cuda126) (push) Has been cancelled
40 lines
1.7 KiB
TypeScript
40 lines
1.7 KiB
TypeScript
import { atom } from "jotai";
|
|
import { rightPanelCollapsedAtom, rightPanelTabAtom } from "@/atoms/layout/right-panel.atom";
|
|
import type { ChatArtifact } from "../model/artifact";
|
|
|
|
/** Artifacts of the active thread, synced from the message stream by `useSyncChatArtifacts`. */
|
|
export const chatArtifactsAtom = atom<ChatArtifact[]>([]);
|
|
|
|
/** Open === artifacts owns the tab; derived so the toggle can't drift. */
|
|
export const artifactsPanelOpenAtom = atom((get) => get(rightPanelTabAtom) === "artifacts");
|
|
|
|
/** Snapshot of `rightPanelCollapsedAtom` taken before the panel opens, restored on close. */
|
|
const preArtifactsCollapsedAtom = atom<boolean | null>(null);
|
|
|
|
export const openArtifactsPanelAtom = atom(null, (get, set) => {
|
|
if (get(rightPanelTabAtom) !== "artifacts") {
|
|
set(preArtifactsCollapsedAtom, get(rightPanelCollapsedAtom));
|
|
}
|
|
set(rightPanelTabAtom, "artifacts");
|
|
set(rightPanelCollapsedAtom, false);
|
|
});
|
|
|
|
export const closeArtifactsPanelAtom = atom(null, (get, set) => {
|
|
// Don't clobber the tab when another surface owns it.
|
|
if (get(rightPanelTabAtom) !== "artifacts") return;
|
|
// RightPanel's fallback then re-reveals any surface underneath (e.g. a report).
|
|
set(rightPanelTabAtom, "sources");
|
|
const prev = get(preArtifactsCollapsedAtom);
|
|
if (prev !== null) {
|
|
set(rightPanelCollapsedAtom, prev);
|
|
set(preArtifactsCollapsedAtom, null);
|
|
}
|
|
});
|
|
|
|
export const toggleArtifactsPanelAtom = atom(null, (get, set) => {
|
|
// Only close when artifacts is actually visible; otherwise a click always opens it.
|
|
const shown = get(rightPanelTabAtom) === "artifacts" && !get(rightPanelCollapsedAtom);
|
|
if (shown) set(closeArtifactsPanelAtom);
|
|
else set(openArtifactsPanelAtom);
|
|
});
|