@@ -33,8 +33,6 @@ import { useEffect, useMemo, useState } from "react";
3333import { toast } from "sonner" ;
3434import useSWR from "swr" ;
3535
36- type Target = "preview" | "production" ;
37-
3836type AgentEnvironmentVariable = {
3937 id : string ;
4038 created_at : Date ;
@@ -60,10 +58,6 @@ export default function EnvManager({
6058 const [ newKey , setNewKey ] = useState ( "" ) ;
6159 const [ newValue , setNewValue ] = useState ( "" ) ;
6260 const [ newSecret , setNewSecret ] = useState ( false ) ;
63- const [ newTargets , setNewTargets ] = useState < Target [ ] > ( [
64- "preview" ,
65- "production" ,
66- ] ) ;
6761 const [ saving , setSaving ] = useState ( false ) ;
6862
6963 const fetchEnvs = async ( ) => {
@@ -95,23 +89,18 @@ export default function EnvManager({
9589 toast . error ( "Value is required for non-secret variables" ) ;
9690 return ;
9791 }
98- if ( newTargets . length === 0 ) {
99- toast . error ( "At least one environment is required" ) ;
100- return ;
101- }
10292 setSaving ( true ) ;
10393 try {
10494 await client . agents . env . create ( {
10595 agent_id : agentId ,
10696 key : newKey . trim ( ) ,
10797 value : newValue ,
10898 secret : newSecret ,
109- target : newTargets ,
99+ target : [ "preview" , "production" ] ,
110100 } ) ;
111101 setNewKey ( "" ) ;
112102 setNewValue ( "" ) ;
113103 setNewSecret ( false ) ;
114- setNewTargets ( [ "preview" , "production" ] ) ;
115104 await fetchEnvs ( ) ;
116105 toast . success ( "Environment variable created" ) ;
117106 } catch ( err ) {
@@ -185,52 +174,6 @@ export default function EnvManager({
185174 </ div >
186175 </ div >
187176
188- < div className = "space-y-2" >
189- < Label > Environments</ Label >
190- < div className = "flex items-center gap-4" >
191- < div className = "flex items-center space-x-2" >
192- < Checkbox
193- id = "new-preview"
194- checked = { newTargets . includes ( "preview" ) }
195- onCheckedChange = { ( checked ) => {
196- if ( checked ) {
197- setNewTargets ( [ ...newTargets , "preview" ] ) ;
198- } else {
199- setNewTargets ( newTargets . filter ( ( t ) => t !== "preview" ) ) ;
200- }
201- } }
202- />
203- < label
204- htmlFor = "new-preview"
205- className = "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
206- >
207- Preview
208- </ label >
209- </ div >
210- < div className = "flex items-center space-x-2" >
211- < Checkbox
212- id = "new-production"
213- checked = { newTargets . includes ( "production" ) }
214- onCheckedChange = { ( checked ) => {
215- if ( checked ) {
216- setNewTargets ( [ ...newTargets , "production" ] ) ;
217- } else {
218- setNewTargets (
219- newTargets . filter ( ( t ) => t !== "production" )
220- ) ;
221- }
222- } }
223- />
224- < label
225- htmlFor = "new-production"
226- className = "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
227- >
228- Production
229- </ label >
230- </ div >
231- </ div >
232- </ div >
233-
234177 < div className = "flex items-center space-x-2" >
235178 < Checkbox
236179 id = "new-secret"
@@ -297,9 +240,6 @@ function EnvRow({
297240 const [ editValue , setEditValue ] = useState (
298241 env . secret ? "" : ( env . value ?? "" )
299242 ) ;
300- const [ editTargets , setEditTargets ] = useState < Target [ ] > (
301- env . target as Target [ ]
302- ) ;
303243 const [ saving , setSaving ] = useState ( false ) ;
304244 const client = useMemo ( ( ) => new Client ( ) , [ ] ) ;
305245
@@ -312,10 +252,6 @@ function EnvRow({
312252 toast . error ( "Value is required for non-secret variables" ) ;
313253 return ;
314254 }
315- if ( editTargets . length === 0 ) {
316- toast . error ( "At least one environment is required" ) ;
317- return ;
318- }
319255
320256 setSaving ( true ) ;
321257 try {
@@ -325,7 +261,7 @@ function EnvRow({
325261 key : editKey . trim ( ) ,
326262 value : env . secret && ! editValue ? undefined : editValue ,
327263 secret : env . secret ,
328- target : editTargets ,
264+ target : [ "preview" , "production" ] ,
329265 } ) ;
330266 setIsEditing ( false ) ;
331267 await onUpdate ( ) ;
@@ -359,13 +295,6 @@ function EnvRow({
359295 return new Date ( date ) . toLocaleDateString ( ) ;
360296 } ;
361297
362- const formatEnvironments = ( targets : Target [ ] ) => {
363- if ( targets . length === 2 ) return "Preview and Production" ;
364- if ( targets . length === 1 )
365- return targets [ 0 ] . charAt ( 0 ) . toUpperCase ( ) + targets [ 0 ] . slice ( 1 ) ;
366- return "None" ;
367- } ;
368-
369298 const isUpdated = new Date ( env . updated_at ) > new Date ( env . created_at ) ;
370299 const displayDate = isUpdated ? env . updated_at : env . created_at ;
371300 const displayVerb = isUpdated ? "Updated" : "Added" ;
@@ -375,9 +304,9 @@ function EnvRow({
375304 < >
376305 < Card >
377306 < CardContent className = "p-4" >
378- < div className = "flex items-start gap-4" >
307+ < div className = "flex items-center gap-4" >
379308 { /* Icon */ }
380- < div className = "flex-shrink-0 mt-1 " >
309+ < div className = "flex-shrink-0" >
381310 { env . secret ? (
382311 < Lock className = "w-5 h-5 text-muted-foreground" />
383312 ) : (
@@ -387,17 +316,14 @@ function EnvRow({
387316
388317 { /* Main content */ }
389318 < div className = "flex-1 min-w-0" >
390- < div className = "flex items-center gap-2 mb-1 " >
319+ < div className = "flex items-center gap-2" >
391320 < span className = "font-mono font-medium" > { env . key } </ span >
392321 { env . secret && (
393322 < Badge variant = "secondary" className = "text-xs" >
394323 Secret
395324 </ Badge >
396325 ) }
397326 </ div >
398- < div className = "text-sm text-muted-foreground" >
399- { formatEnvironments ( env . target as Target [ ] ) }
400- </ div >
401327 </ div >
402328
403329 { /* Value */ }
@@ -415,7 +341,7 @@ function EnvRow({
415341
416342 { /* Metadata */ }
417343 < div className = "flex-shrink-0 flex items-center gap-3" >
418- < div className = "flex flex-col items-end gap-1 " >
344+ < div className = "flex items-center gap-2 " >
419345 < span className = "text-xs text-muted-foreground" >
420346 { displayVerb } { formatTimeAgo ( displayDate ) }
421347 </ span >
@@ -492,54 +418,6 @@ function EnvRow({
492418 </ div >
493419 </ div >
494420
495- < div className = "space-y-2" >
496- < Label > Environments</ Label >
497- < div className = "flex items-center gap-4" >
498- < div className = "flex items-center space-x-2" >
499- < Checkbox
500- id = { `edit-preview-${ env . id } ` }
501- checked = { editTargets . includes ( "preview" ) }
502- onCheckedChange = { ( checked ) => {
503- if ( checked ) {
504- setEditTargets ( [ ...editTargets , "preview" ] ) ;
505- } else {
506- setEditTargets (
507- editTargets . filter ( ( t ) => t !== "preview" )
508- ) ;
509- }
510- } }
511- />
512- < label
513- htmlFor = { `edit-preview-${ env . id } ` }
514- className = "text-sm font-medium"
515- >
516- Preview
517- </ label >
518- </ div >
519- < div className = "flex items-center space-x-2" >
520- < Checkbox
521- id = { `edit-production-${ env . id } ` }
522- checked = { editTargets . includes ( "production" ) }
523- onCheckedChange = { ( checked ) => {
524- if ( checked ) {
525- setEditTargets ( [ ...editTargets , "production" ] ) ;
526- } else {
527- setEditTargets (
528- editTargets . filter ( ( t ) => t !== "production" )
529- ) ;
530- }
531- } }
532- />
533- < label
534- htmlFor = { `edit-production-${ env . id } ` }
535- className = "text-sm font-medium"
536- >
537- Production
538- </ label >
539- </ div >
540- </ div >
541- </ div >
542-
543421 < div className = "flex gap-2" >
544422 < Button onClick = { handleSave } disabled = { saving } >
545423 Save Changes
@@ -550,7 +428,6 @@ function EnvRow({
550428 setIsEditing ( false ) ;
551429 setEditKey ( env . key ) ;
552430 setEditValue ( env . secret ? "" : ( env . value ?? "" ) ) ;
553- setEditTargets ( env . target as Target [ ] ) ;
554431 } }
555432 disabled = { saving }
556433 >
0 commit comments