1+ import { getApi } from "@/app/store/global" ;
12import { fireAndForget , makeIconClass } from "@/util/util" ;
23import clsx from "clsx" ;
34import { memo , useEffect , useRef , useState } from "react" ;
@@ -13,19 +14,20 @@ interface ColorSelectorProps {
1314 className ?: string ;
1415}
1516
16- const ColorSelector = memo ( ( { colors, selectedColor, onSelect, className } : ColorSelectorProps ) => {
17- const handleColorClick = ( color : string ) => {
18- onSelect ( color ) ;
19- } ;
20-
17+ const ColorSelector = memo ( function ColorSelector ( {
18+ colors,
19+ selectedColor,
20+ onSelect,
21+ className,
22+ } : ColorSelectorProps ) {
2123 return (
2224 < div className = { clsx ( "color-selector" , className ) } >
2325 { colors . map ( ( color ) => (
2426 < div
2527 key = { color }
2628 className = { clsx ( "color-circle" , { selected : selectedColor === color } ) }
2729 style = { { backgroundColor : color } }
28- onClick = { ( ) => handleColorClick ( color ) }
30+ onClick = { ( ) => onSelect ( color ) }
2931 />
3032 ) ) }
3133 </ div >
@@ -39,11 +41,12 @@ interface IconSelectorProps {
3941 className ?: string ;
4042}
4143
42- const IconSelector = memo ( ( { icons, selectedIcon, onSelect, className } : IconSelectorProps ) => {
43- const handleIconClick = ( icon : string ) => {
44- onSelect ( icon ) ;
45- } ;
46-
44+ const IconSelector = memo ( function IconSelector ( {
45+ icons,
46+ selectedIcon,
47+ onSelect,
48+ className,
49+ } : IconSelectorProps ) {
4750 return (
4851 < div className = { clsx ( "icon-selector" , className ) } >
4952 { icons . map ( ( icon ) => {
@@ -52,7 +55,7 @@ const IconSelector = memo(({ icons, selectedIcon, onSelect, className }: IconSel
5255 < i
5356 key = { icon }
5457 className = { clsx ( iconClass , "icon-item" , { selected : selectedIcon === icon } ) }
55- onClick = { ( ) => handleIconClick ( icon ) }
58+ onClick = { ( ) => onSelect ( icon ) }
5659 />
5760 ) ;
5861 } ) }
@@ -64,33 +67,37 @@ interface WorkspaceEditorProps {
6467 title : string ;
6568 icon : string ;
6669 color : string ;
70+ directory : string ;
6771 focusInput : boolean ;
6872 onTitleChange : ( newTitle : string ) => void ;
6973 onColorChange : ( newColor : string ) => void ;
7074 onIconChange : ( newIcon : string ) => void ;
75+ onDirectoryChange : ( newDirectory : string ) => void ;
7176 onDeleteWorkspace : ( ) => void ;
7277}
73- const WorkspaceEditorComponent = ( {
78+ export const WorkspaceEditor = memo ( function WorkspaceEditor ( {
7479 title,
7580 icon,
7681 color,
82+ directory,
7783 focusInput,
7884 onTitleChange,
7985 onColorChange,
8086 onIconChange,
87+ onDirectoryChange,
8188 onDeleteWorkspace,
82- } : WorkspaceEditorProps ) => {
89+ } : WorkspaceEditorProps ) {
8390 const inputRef = useRef < HTMLInputElement > ( null ) ;
8491
8592 const [ colors , setColors ] = useState < string [ ] > ( [ ] ) ;
8693 const [ icons , setIcons ] = useState < string [ ] > ( [ ] ) ;
8794
8895 useEffect ( ( ) => {
8996 fireAndForget ( async ( ) => {
90- const colors = await WorkspaceService . GetColors ( ) ;
91- const icons = await WorkspaceService . GetIcons ( ) ;
92- setColors ( colors ) ;
93- setIcons ( icons ) ;
97+ const fetchedColors = await WorkspaceService . GetColors ( ) ;
98+ const fetchedIcons = await WorkspaceService . GetIcons ( ) ;
99+ setColors ( fetchedColors ) ;
100+ setIcons ( fetchedIcons ) ;
94101 } ) ;
95102 } , [ ] ) ;
96103
@@ -113,13 +120,37 @@ const WorkspaceEditorComponent = ({
113120 />
114121 < ColorSelector selectedColor = { color } colors = { colors } onSelect = { onColorChange } />
115122 < IconSelector selectedIcon = { icon } icons = { icons } onSelect = { onIconChange } />
123+ < div className = "directory-selector" >
124+ < label className = "directory-label" > Directory</ label >
125+ < div className = "directory-input-row" >
126+ < Input
127+ value = { directory }
128+ onChange = { onDirectoryChange }
129+ placeholder = "~/projects/myworkspace"
130+ className = "directory-input"
131+ />
132+ < Button
133+ className = "ghost browse-btn"
134+ onClick = { async ( ) => {
135+ try {
136+ const path = await getApi ( ) . showOpenFolderDialog ( ) ;
137+ if ( path ) {
138+ onDirectoryChange ( path ) ;
139+ }
140+ } catch ( e ) {
141+ console . error ( "error opening folder dialog:" , e ) ;
142+ }
143+ } }
144+ >
145+ Browse
146+ </ Button >
147+ </ div >
148+ </ div >
116149 < div className = "delete-ws-btn-wrapper" >
117150 < Button className = "ghost red text-[12px] bold" onClick = { onDeleteWorkspace } >
118151 Delete workspace
119152 </ Button >
120153 </ div >
121154 </ div >
122155 ) ;
123- } ;
124-
125- export const WorkspaceEditor = memo ( WorkspaceEditorComponent ) as typeof WorkspaceEditorComponent ;
156+ } ) ;
0 commit comments