@@ -14,7 +14,7 @@ import {
1414 TooltipTrigger ,
1515} from "@/client/components/Tooltip" ;
1616import { useTheme } from "@/client/contexts/theme" ;
17- import { snippets } from "@/client/snippets" ;
17+ import { snippets , type SnippetFunc } from "@/client/snippets" ;
1818import { cn } from "@/utils/cn" ;
1919import { Editor as MonacoEditor } from "@monaco-editor/react" ;
2020import {
@@ -27,28 +27,45 @@ import {
2727} from "lucide-react" ;
2828import { type FC , useEffect , useRef , useState } from "react" ;
2929import { useEditor } from "@/client/contexts/editor" ;
30+ import type { ParameterWithSource } from "@/gen/types" ;
3031
3132type EditorProps = {
3233 code : string ;
3334 setCode : React . Dispatch < React . SetStateAction < string > > ;
35+ parameters : ParameterWithSource [ ] ;
3436} ;
3537
36- export const Editor : FC < EditorProps > = ( { code, setCode } ) => {
38+ export const Editor : FC < EditorProps > = ( { code, setCode, parameters } ) => {
3739 const { appliedTheme } = useTheme ( ) ;
3840 const editorRef = useEditor ( ) ;
3941
42+ const [ tab , setTab ] = useState ( ( ) => "code" ) ;
43+
4044 const [ codeCopied , setCodeCopied ] = useState ( ( ) => false ) ;
4145 const copyTimeoutId = useRef < ReturnType < typeof setTimeout > | undefined > (
4246 undefined ,
4347 ) ;
4448
45- const [ tab , setTab ] = useState ( ( ) => "code" ) ;
46-
4749 const onCopy = ( ) => {
4850 navigator . clipboard . writeText ( code ) ;
4951 setCodeCopied ( ( ) => true ) ;
5052 } ;
5153
54+ const onAddSnippet = ( name : string , snippet : SnippetFunc ) => {
55+ const nextInOrder =
56+ parameters . reduce (
57+ ( highestOrder , parameter ) =>
58+ highestOrder < parameter . order ? parameter . order : highestOrder ,
59+ 0 ,
60+ ) + 1 ;
61+
62+ const nameCount = parameters . filter ( ( p ) => p . name . startsWith ( name ) ) . length ;
63+
64+ setCode (
65+ `${ code . trimEnd ( ) } \n\n${ snippet ( nameCount > 0 ? `${ name } -${ nameCount } ` : name , nextInOrder ) } \n` ,
66+ ) ;
67+ } ;
68+
5269 useEffect ( ( ) => {
5370 if ( ! codeCopied ) {
5471 return ;
@@ -99,17 +116,20 @@ export const Editor: FC<EditorProps> = ({ code, setCode }) => {
99116
100117 < DropdownMenuPortal >
101118 < DropdownMenuContent align = "start" >
102- { snippets . map ( ( { label, icon : Icon , snippet } , index ) => (
103- < DropdownMenuItem
104- key = { index }
105- onClick = { ( ) =>
106- setCode ( `${ code . trimEnd ( ) } \n\n${ snippet ( ) } \n` )
107- }
108- >
109- < Icon size = { 24 } />
110- { label }
111- </ DropdownMenuItem >
112- ) ) }
119+ { snippets . map (
120+ ( { name, label, icon : Icon , snippet } , index ) => (
121+ < DropdownMenuItem
122+ key = { index }
123+ onClick = { ( ) =>
124+ // setCode(`${code.trimEnd()}\n\n${snippet()}\n`)
125+ onAddSnippet ( name , snippet )
126+ }
127+ >
128+ < Icon size = { 24 } />
129+ { label }
130+ </ DropdownMenuItem >
131+ ) ,
132+ ) }
113133 </ DropdownMenuContent >
114134 </ DropdownMenuPortal >
115135 </ DropdownMenu >
0 commit comments