94 lines
2.2 KiB
TypeScript
94 lines
2.2 KiB
TypeScript
import { createContext, useContext, useState, type ReactNode } from "react";
|
|
|
|
import { useSidebar } from "@/components/ui/sidebar";
|
|
import { env } from "@/env";
|
|
|
|
export interface ArtifactsContextType {
|
|
artifacts: string[];
|
|
setArtifacts: (artifacts: string[]) => void;
|
|
|
|
selectedArtifact: string | null;
|
|
autoSelect: boolean;
|
|
select: (artifact: string, autoSelect?: boolean) => void;
|
|
deselect: () => void;
|
|
|
|
open: boolean;
|
|
autoOpen: boolean;
|
|
setOpen: (open: boolean) => void;
|
|
|
|
fullscreen: boolean;
|
|
setFullscreen: (fullscreen: boolean) => void;
|
|
}
|
|
|
|
const ArtifactsContext = createContext<ArtifactsContextType | undefined>(
|
|
undefined,
|
|
);
|
|
|
|
interface ArtifactsProviderProps {
|
|
children: ReactNode;
|
|
}
|
|
|
|
export function ArtifactsProvider({ children }: ArtifactsProviderProps) {
|
|
const [artifacts, setArtifacts] = useState<string[]>([]);
|
|
const [selectedArtifact, setSelectedArtifact] = useState<string | null>(null);
|
|
const [autoSelect, setAutoSelect] = useState(true);
|
|
const [open, setOpen] = useState(
|
|
env.NEXT_PUBLIC_STATIC_WEBSITE_ONLY === "true",
|
|
);
|
|
const [autoOpen, setAutoOpen] = useState(true);
|
|
const [fullscreen, setFullscreen] = useState(false);
|
|
const { setOpen: setSidebarOpen } = useSidebar();
|
|
|
|
const select = (artifact: string, autoSelect = false) => {
|
|
setSelectedArtifact(artifact);
|
|
if (env.NEXT_PUBLIC_STATIC_WEBSITE_ONLY !== "true") {
|
|
setSidebarOpen(false);
|
|
}
|
|
if (!autoSelect) {
|
|
setAutoSelect(false);
|
|
}
|
|
};
|
|
|
|
const deselect = () => {
|
|
setSelectedArtifact(null);
|
|
setAutoSelect(true);
|
|
};
|
|
|
|
const value: ArtifactsContextType = {
|
|
artifacts,
|
|
setArtifacts,
|
|
|
|
open,
|
|
autoOpen,
|
|
autoSelect,
|
|
setOpen: (isOpen: boolean) => {
|
|
if (!isOpen && autoOpen) {
|
|
setAutoOpen(false);
|
|
setAutoSelect(false);
|
|
}
|
|
setOpen(isOpen);
|
|
},
|
|
|
|
selectedArtifact,
|
|
select,
|
|
deselect,
|
|
|
|
fullscreen,
|
|
setFullscreen,
|
|
};
|
|
|
|
return (
|
|
<ArtifactsContext.Provider value={value}>
|
|
{children}
|
|
</ArtifactsContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useArtifacts() {
|
|
const context = useContext(ArtifactsContext);
|
|
if (context === undefined) {
|
|
throw new Error("useArtifacts must be used within an ArtifactsProvider");
|
|
}
|
|
return context;
|
|
}
|