@@ -15,7 +15,6 @@ const createRowsAtom = atom(null, (_, set, amount: number) => {
15
15
16
16
const appendRowsAtom = atom ( null , ( _ , set ) => {
17
17
set ( dataAtom , ( data ) => data . concat ( buildDataAtoms ( 1000 ) ) ) ;
18
- set ( selectedAtom , null ) ;
19
18
} ) ;
20
19
21
20
const updateRowsAtom = atom ( null , ( get , set ) => {
@@ -32,7 +31,15 @@ const removeRowAtom = atom(null, (_, set, item: PrimitiveAtom<Data>) =>
32
31
} )
33
32
) ;
34
33
35
- const selectRowAtom = atom ( null , ( _ , set , selected : PrimitiveAtom < Data > ) => {
34
+ const selectRowAtom = atom ( null , ( get , set , selected : PrimitiveAtom < Data > ) => {
35
+ const prevSelected = get ( selectedAtom ) ;
36
+ if ( prevSelected === selected ) {
37
+ return ;
38
+ }
39
+ if ( prevSelected ) {
40
+ set ( prevSelected , ( prev ) => ( { ...prev , isSelected : false } ) )
41
+ }
42
+ set ( selected , ( prev ) => ( { ...prev , isSelected : true } ) )
36
43
set ( selectedAtom , selected ) ;
37
44
} ) ;
38
45
@@ -54,11 +61,10 @@ const GlyphIcon = (
54
61
55
62
interface RowProps {
56
63
item : PrimitiveAtom < Data > ;
57
- isSelected : boolean ;
58
64
}
59
65
60
- const Row = memo < RowProps > ( ( { item, isSelected } ) => {
61
- const [ { id, label } ] = useAtom ( item ) ;
66
+ const Row = memo < RowProps > ( ( { item } ) => {
67
+ const [ { id, label, isSelected } ] = useAtom ( item ) ;
62
68
const selectRow = useUpdateAtom ( selectRowAtom ) ;
63
69
const removeRow = useUpdateAtom ( removeRowAtom ) ;
64
70
return (
@@ -78,14 +84,12 @@ const Row = memo<RowProps>(({ item, isSelected }) => {
78
84
79
85
const RowList = memo ( ( ) => {
80
86
const [ data ] = useAtom ( dataAtom ) ;
81
- const [ selected ] = useAtom ( selectedAtom ) ;
82
87
return (
83
88
< >
84
89
{ data . map ( ( item ) => (
85
90
< Row
86
91
key = { String ( item ) }
87
92
item = { item }
88
- isSelected = { item === selected }
89
93
/>
90
94
) ) }
91
95
</ >
0 commit comments