-
Notifications
You must be signed in to change notification settings - Fork 6.5k
Expand file tree
/
Copy pathuse-artifact.ts
More file actions
58 lines (49 loc) · 1.52 KB
/
use-artifact.ts
File metadata and controls
58 lines (49 loc) · 1.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
"use client";
import { useCallback, useMemo } from "react";
import useSWR from "swr";
import type { UIArtifact } from "@/components/chat/artifact";
export const initialArtifactData: UIArtifact = {
documentId: "init",
content: "",
kind: "text",
title: "",
status: "idle",
isVisible: false,
boundingBox: { top: 0, left: 0, width: 0, height: 0 },
};
type Selector<T> = (state: UIArtifact) => T;
const SWR_OPTIONS = { fallbackData: initialArtifactData };
export function useArtifact() {
// Main artifact SWR
const { data: artifact = initialArtifactData, mutate: setArtifactData } =
useSWR<UIArtifact>("artifact", null, SWR_OPTIONS);
// Setter function for artifact
const setArtifact = useCallback(
(updater: UIArtifact | ((current: UIArtifact) => UIArtifact)) =>
setArtifactData((current = initialArtifactData) =>
typeof updater === "function" ? updater(current) : updater
),
[setArtifactData]
);
// Metadata per documentId
const { data: metadata, mutate: setMetadata } = useSWR(
artifact.documentId ? `artifact-metadata-${artifact.documentId}` : null,
null,
{ fallbackData: null }
);
// Selector helper
const selectArtifact = useCallback(
<Selected>(selector: Selector<Selected>) => selector(artifact),
[artifact]
);
return useMemo(
() => ({
artifact,
setArtifact,
metadata,
setMetadata,
selectArtifact, // function to select from artifact
}),
[artifact, setArtifact, metadata, setMetadata, selectArtifact]
);
}