-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Expand file tree
/
Copy pathPromptPage.tsx
More file actions
130 lines (121 loc) · 4.6 KB
/
Copy pathPromptPage.tsx
File metadata and controls
130 lines (121 loc) · 4.6 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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import React, { useEffect } from "react";
import { StringParam, useQueryParam } from "use-query-params";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/ui/tabs";
import useBreadcrumbsStore from "@/store/BreadcrumbsStore";
import { usePromptIdFromURL } from "@/v2/pages/PromptPage/usePromptIdFromURL";
import usePromptById from "@/api/prompts/usePromptById";
import PromptTab from "@/v2/pages/PromptPage/PromptTab/PromptTab";
import { EXPLAINER_ID, EXPLAINERS_MAP } from "@/v2/constants/explainers";
import ExplainerIcon from "@/shared/ExplainerIcon/ExplainerIcon";
import BackButton from "@/shared/BackButton/BackButton";
import DateTag from "@/shared/DateTag/DateTag";
import { RESOURCE_TYPE } from "@/shared/ResourceLink/ResourceLink";
import PromptTagsList from "@/v2/pages/PromptPage/PromptTagsList";
import { Separator } from "@/ui/separator";
import PageBodyScrollContainer from "@/v2/layout/PageBodyScrollContainer/PageBodyScrollContainer";
import PageBodyStickyContainer from "@/shared/PageBodyStickyContainer/PageBodyStickyContainer";
import { usePermissions } from "@/contexts/PermissionsContext";
import ExperimentsTab from "./ExperimentsTab/ExperimentsTab";
const PromptPage: React.FunctionComponent = () => {
const [tab, setTab] = useQueryParam("tab", StringParam);
const {
permissions: { canViewExperiments },
} = usePermissions();
const promptId = usePromptIdFromURL();
// Cheap poll so the (unbounded) paginated version list can detect other
// users' changes without itself refetching every loaded page on a timer —
// see usePromptVersionHistory's version_count watcher.
const { data: prompt } = usePromptById(
{ promptId },
{ enabled: !!promptId, refetchInterval: 30000 },
);
const promptName = prompt?.name || "";
const setBreadcrumbParam = useBreadcrumbsStore((state) => state.setParam);
useEffect(() => {
if (promptId && promptName) {
setBreadcrumbParam("promptId", promptId, promptName);
}
}, [promptId, promptName, setBreadcrumbParam]);
useEffect(() => {
if (!tab) {
setTab("prompt", "replaceIn");
}
}, [tab, setTab]);
return (
<PageBodyScrollContainer>
<PageBodyStickyContainer
className="mb-2 mt-6 flex min-h-8 items-center justify-between"
direction="horizontal"
>
<div className="flex min-w-0 items-center gap-2">
<BackButton
to="/$workspaceName/projects/$projectId/prompts"
tooltip="Back to prompts"
/>
<h1 className="comet-title-xs truncate break-words">{promptName}</h1>
</div>
</PageBodyStickyContainer>
{prompt?.description && (
<PageBodyStickyContainer
className="-mt-3 flex min-h-8 items-center justify-between"
direction="horizontal"
>
<div className="comet-body-s text-muted-slate">
{prompt.description}
</div>
</PageBodyStickyContainer>
)}
<PageBodyStickyContainer
className="pb-4"
direction="horizontal"
limitWidth
>
<div className="flex items-center overflow-x-auto">
{prompt?.created_at && (
<DateTag date={prompt.created_at} resource={RESOURCE_TYPE.prompt} />
)}
<Separator orientation="vertical" className="mx-2 h-4" />
<PromptTagsList
tags={prompt?.tags ?? []}
promptId={promptId}
prompt={prompt}
/>
</div>
</PageBodyStickyContainer>
<Tabs
defaultValue="prompt"
value={tab as string}
onValueChange={setTab}
className="min-w-min"
>
<PageBodyStickyContainer direction="horizontal" limitWidth>
<TabsList variant="segmented-primary">
<TabsTrigger variant="segmented-primary" value="prompt">
Prompt
</TabsTrigger>
{canViewExperiments && (
<TabsTrigger variant="segmented-primary" value="experiments">
Experiments
<ExplainerIcon
className="ml-1"
{...EXPLAINERS_MAP[
EXPLAINER_ID.why_do_i_have_experiments_in_the_prompt_library
]}
/>
</TabsTrigger>
)}
</TabsList>
</PageBodyStickyContainer>
<TabsContent value="prompt">
<PromptTab prompt={prompt} />
</TabsContent>
{canViewExperiments && (
<TabsContent value="experiments">
<ExperimentsTab promptId={promptId} />
</TabsContent>
)}
</Tabs>
</PageBodyScrollContainer>
);
};
export default PromptPage;