-
Notifications
You must be signed in to change notification settings - Fork 640
/
SidebarNote.client.js
83 lines (78 loc) · 2.22 KB
/
SidebarNote.client.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
import {useState, useRef, useEffect, useTransition} from 'react';
import {useLocation} from './LocationContext.client';
export default function SidebarNote({id, title, children, expandedChildren}) {
const [location, setLocation] = useLocation();
const [isPending, startTransition] = useTransition();
const [isExpanded, setIsExpanded] = useState(false);
const isActive = id === location.selectedId;
// Animate after title is edited.
const itemRef = useRef(null);
const prevTitleRef = useRef(title);
useEffect(() => {
if (title !== prevTitleRef.current) {
prevTitleRef.current = title;
itemRef.current.classList.add('flash');
}
}, [title]);
return (
<div
ref={itemRef}
onAnimationEnd={() => {
itemRef.current.classList.remove('flash');
}}
className={[
'sidebar-note-list-item',
isExpanded ? 'note-expanded' : '',
].join(' ')}>
{children}
<button
className="sidebar-note-open"
style={{
backgroundColor: isPending
? 'var(--gray-80)'
: isActive
? 'var(--tertiary-blue)'
: '',
border: isActive
? '1px solid var(--primary-border)'
: '1px solid transparent',
}}
onClick={() => {
startTransition(() => {
setLocation((loc) => ({
selectedId: id,
isEditing: false,
searchText: loc.searchText,
}));
});
}}>
Open note for preview
</button>
<button
className="sidebar-note-toggle-expand"
onClick={(e) => {
e.stopPropagation();
setIsExpanded(!isExpanded);
}}>
{isExpanded ? (
<img
src="chevron-down.svg"
width="10px"
height="10px"
alt="Collapse"
/>
) : (
<img src="chevron-up.svg" width="10px" height="10px" alt="Expand" />
)}
</button>
{isExpanded && expandedChildren}
</div>
);
}