@@ -14,26 +14,21 @@ export type Task = {
1414 id : string
1515 text : string
1616 is_checked : boolean
17- is_starred : boolean
1817 created_at : number
1918}
2019
2120type Props = {
2221 tasks : Task [ ]
23- on_reorder ? : ( tasks : Task [ ] ) => void
24- on_change ? : ( task : Task ) => void
22+ on_reorder : ( tasks : Task [ ] ) => void
23+ on_change : ( task : Task ) => void
2524}
2625
2726export const Tasks : React . FC < Props > = ( { tasks, on_reorder, on_change } ) => {
2827 use_periodic_re_render ( 60 * 1000 )
2928 const [ editing_id , set_editing_id ] = useState < string | null > ( null )
3029
3130 const handle_check_change = ( task : Task , checked : boolean ) => {
32- on_change ?.( { ...task , is_checked : checked } )
33- }
34-
35- const handle_star_toggle = ( task : Task ) => {
36- on_change ?.( { ...task , is_starred : ! task . is_starred } )
31+ on_change ( { ...task , is_checked : checked } )
3732 }
3833
3934 const render_item = ( task : Task ) => {
@@ -46,7 +41,7 @@ export const Tasks: React.FC<Props> = ({ tasks, on_reorder, on_change }) => {
4641 checked = { task . is_checked }
4742 on_change = { ( checked ) => handle_check_change ( task , checked ) }
4843 />
49- < div className = { styles . item__drag_handle } >
44+ < div className = { styles [ 'item__drag-handle' ] } >
5045 < span className = "codicon codicon-gripper" />
5146 </ div >
5247 </ div >
@@ -56,20 +51,18 @@ export const Tasks: React.FC<Props> = ({ tasks, on_reorder, on_change }) => {
5651 < span
5752 className = { cn (
5853 'codicon' ,
59- task . is_starred ? 'codicon-star-full' : 'codicon-star-empty' ,
60- styles . item__star ,
61- {
62- [ styles [ 'item__star--active' ] ] : task . is_starred
63- }
54+ is_editing ? 'codicon-check' : 'codicon-edit' ,
55+ styles . item__edit
6456 ) }
65- onClick = { ( ) => handle_star_toggle ( task ) }
66- title = { task . is_starred ? 'Unstar' : 'Star' }
57+ onMouseDown = { ( e ) => e . preventDefault ( ) }
58+ onClick = { ( ) => set_editing_id ( is_editing ? null : task . id ) }
59+ title = { is_editing ? 'Save task' : 'Edit task' }
6760 />
6861 </ div >
6962 { is_editing ? (
7063 < Textarea
7164 value = { task . text }
72- on_change = { ( value ) => on_change ?. ( { ...task , text : value } ) }
65+ on_change = { ( value ) => on_change ( { ...task , text : value } ) }
7366 autofocus
7467 on_blur = { ( ) => set_editing_id ( null ) }
7568 on_key_down = { ( e ) => {
@@ -85,7 +78,7 @@ export const Tasks: React.FC<Props> = ({ tasks, on_reorder, on_change }) => {
8578 [ styles [ 'item__text--checked' ] ] : task . is_checked ,
8679 [ styles [ 'item__text--placeholder' ] ] : ! task . text
8780 } ) }
88- onDoubleClick = { ( ) => set_editing_id ( task . id ) }
81+ onClick = { ( ) => set_editing_id ( task . id ) }
8982 >
9083 { task . text || 'Double click to add text...' }
9184 </ div >
@@ -95,19 +88,15 @@ export const Tasks: React.FC<Props> = ({ tasks, on_reorder, on_change }) => {
9588 )
9689 }
9790
98- if ( on_reorder ) {
99- return (
100- < ReactSortable
101- list = { tasks }
102- setList = { on_reorder }
103- handle = { `.${ styles . item__drag_handle } ` }
104- className = { styles . tasks }
105- animation = { 150 }
106- >
107- { tasks . map ( render_item ) }
108- </ ReactSortable >
109- )
110- }
111-
112- return < div className = { styles . tasks } > { tasks . map ( render_item ) } </ div >
91+ return (
92+ < ReactSortable
93+ list = { tasks }
94+ setList = { on_reorder }
95+ handle = { `.${ styles [ 'item__drag-handle' ] } ` }
96+ className = { styles . tasks }
97+ animation = { 150 }
98+ >
99+ { tasks . map ( render_item ) }
100+ </ ReactSortable >
101+ )
113102}
0 commit comments