1
- import React , { FC , useCallback , useState , Fragment } from "react" ;
1
+ import React , {
2
+ FC ,
3
+ useCallback ,
4
+ useState ,
5
+ Fragment ,
6
+ useContext ,
7
+ useEffect ,
8
+ } from "react" ;
2
9
import sortBy from "lodash.sortby" ;
3
10
4
11
import StarImgage from "../vectors/StarImage" ;
@@ -8,9 +15,11 @@ import { mostCommon } from "../../utils/arrays";
8
15
import { Article } from "../../utils/customTypes" ;
9
16
10
17
import "./Tree.css" ;
18
+ import FirebaseContext from "../../context/FirebaseContext" ;
11
19
12
20
interface Props {
13
21
data : { [ section : string ] : Article [ ] } ;
22
+ treeId : string ;
14
23
}
15
24
16
25
const INFO : {
@@ -40,9 +49,10 @@ const INFO: {
40
49
} ,
41
50
} ;
42
51
43
- const Tree : FC < Props > = ( { data } : Props ) => {
52
+ const Tree : FC < Props > = ( { data, treeId } : Props ) => {
44
53
const [ star , setStar ] = useState < { [ label : string ] : boolean } > ( { } ) ;
45
54
const [ show , setShow ] = useState < "root" | "trunk" | "leaf" | null > ( null ) ;
55
+ const firebase = useContext ( FirebaseContext ) ;
46
56
let keywords : { [ label : string ] : string [ ] } = {
47
57
root : [ ] ,
48
58
trunk : [ ] ,
@@ -62,9 +72,23 @@ const Tree: FC<Props> = ({ data }: Props) => {
62
72
) ;
63
73
}
64
74
65
- const toggleStar = useCallback ( ( label : string ) => {
66
- setStar ( ( current ) => ( { ...current , [ label ] : ! current [ label ] } ) ) ;
67
- } , [ ] ) ;
75
+ useEffect ( ( ) => {
76
+ if ( ! firebase ) return ;
77
+ firebase
78
+ . database ( )
79
+ . ref ( `stars/${ treeId } ` )
80
+ . on ( "value" , ( snapshot ) => setStar ( snapshot . val ( ) ) ) ;
81
+ } , [ firebase , treeId ] ) ;
82
+
83
+ const toggleStar = useCallback (
84
+ ( label : string ) => {
85
+ firebase
86
+ ?. database ( )
87
+ . ref ( `stars/${ treeId } ` )
88
+ . set ( { ...star , [ btoa ( label ) ] : ! star [ btoa ( label ) ] } ) ;
89
+ } ,
90
+ [ firebase , treeId , star ]
91
+ ) ;
68
92
69
93
const toggleShow = useCallback ( ( label : "root" | "trunk" | "leaf" ) => {
70
94
setShow ( ( curr ) => {
@@ -112,7 +136,7 @@ const Tree: FC<Props> = ({ data }: Props) => {
112
136
</ div >
113
137
< div className = "articles" >
114
138
{ sortBy ( data [ sectionName ] , ( article ) =>
115
- ! star [ article . label ] ? 1 : 0
139
+ ! star [ btoa ( article . label ) ] ? 1 : 0
116
140
) . map ( ( article ) => (
117
141
< div className = "article" key = { `article-${ article . label } ` } >
118
142
< Reference key = { article . label } { ...article } />
@@ -121,11 +145,15 @@ const Tree: FC<Props> = ({ data }: Props) => {
121
145
</button> */ }
122
146
< button
123
147
className = { `btn-star ${
124
- star [ article . label ] ? "favorite" : ""
148
+ star [ btoa ( article . label ) ] ? "favorite" : ""
125
149
} `}
126
150
onClick = { ( ) => toggleStar ( article . label ) }
127
151
>
128
- { ! ! star [ article . label ] ? < StarImgage /> : < StarImgage /> }
152
+ { ! ! star [ btoa ( article . label ) ] ? (
153
+ < StarImgage />
154
+ ) : (
155
+ < StarImgage />
156
+ ) }
129
157
</ button >
130
158
</ div >
131
159
) ) }
0 commit comments