1
1
/** @jsx jsx */
2
2
/** @jsxRuntime classic */
3
3
import { css , jsx } from '@emotion/react' ;
4
- import { useRecoilState } from 'recoil' ;
4
+ import { useRecoilState , useSetRecoilState } from 'recoil' ;
5
5
import { useState } from 'react' ;
6
6
7
7
import { Page } from '@/schemes' ;
8
- import { selectedPageState } from '@/stores' ;
8
+ import { blockMapState , pagesState , pageState } from '@/stores' ;
9
9
import { HeaderButton } from '@atoms/index' ;
10
10
import { ReactComponent as Trash } from '@assets/trash.svg' ;
11
+ import { deletePage , readBlockMap , refreshPages } from '@/utils' ;
11
12
12
- const itemCss = ( isHovered : boolean ) => css `
13
+ const itemWrapperCss = ( ) => css `
14
+ position : relative;
13
15
align-items : center;
16
+ cursor : pointer;
17
+ ` ;
18
+ const itemCss = ( isHovered : boolean ) => css `
14
19
min-height : 27px ;
15
20
padding : 2px 14px ;
16
21
padding-right : ${ isHovered ? 8 : 14 } px;
17
- cursor : pointer;
18
22
background : ${ isHovered ? 'rgba(55, 53, 47, 0.08)' : 'inherit' } ;
19
23
` ;
20
24
const selectedItemCss = ( isHovered : boolean ) => css `
21
- align-items : center;
22
25
min-height : 27px ;
23
26
padding : 2px 14px ;
24
27
padding-right : ${ isHovered ? 8 : 14 } px;
25
28
background : ${ isHovered
26
29
? 'rgba(55, 53, 47, 0.16)'
27
30
: 'rgba(55, 53, 47, 0.08)' } ;
28
- cursor : pointer;
29
31
` ;
30
32
const titleCss = ( ) => css `
31
33
color : rgb (55 , 53 , 47 );
@@ -37,40 +39,63 @@ const titleCss = () => css`
37
39
text-overflow : ellipsis;
38
40
` ;
39
41
const trashCss = ( ) => css `
40
- float : right;
42
+ position : absolute;
43
+ top : 2px ;
44
+ right : 13px ;
41
45
` ;
42
46
43
47
interface Props {
44
48
page : Page ;
45
49
}
46
50
47
51
function MenuItem ( { page } : Props ) : JSX . Element {
48
- const [ selectedPage , setSelectedPage ] = useRecoilState ( selectedPageState ) ;
52
+ const [ selectedPage , setSelectedPage ] = useRecoilState ( pageState ) ;
49
53
const [ hoverToggle , setHoverToggle ] = useState ( false ) ;
54
+ const setPages = useSetRecoilState ( pagesState ) ;
55
+ const setBlockMap = useSetRecoilState ( blockMapState ) ;
56
+
57
+ const selectPageHandler = async ( ) => {
58
+ setBlockMap ( ( await readBlockMap ( page . id ) ) . blockMap ) ;
59
+ setSelectedPage ( page ) ;
60
+ } ;
61
+
62
+ const deletePageHandler = async ( ) => {
63
+ await deletePage ( page . id ) ;
64
+ const pages = await refreshPages ( ) ;
50
65
51
- const handleDeletePage = ( ) => { } ;
66
+ if ( page . id === selectedPage . id ) {
67
+ const nextSelectedPage = pages [ 0 ] ;
68
+ setBlockMap ( ( await readBlockMap ( nextSelectedPage . id ) ) . blockMap ) ;
69
+ setSelectedPage ( nextSelectedPage ) ;
70
+ }
71
+ setPages ( pages ) ;
72
+ } ;
52
73
53
74
return (
54
75
< div
55
- key = { page . id }
56
- css = {
57
- selectedPage . id === page . id
58
- ? selectedItemCss ( hoverToggle )
59
- : itemCss ( hoverToggle )
60
- }
61
- onClick = { ( ) => setSelectedPage ( page ) }
62
- onKeyUp = { ( ) => setSelectedPage ( page ) }
76
+ css = { itemWrapperCss ( ) }
63
77
onMouseEnter = { ( ) => setHoverToggle ( true ) }
64
78
onMouseLeave = { ( ) => setHoverToggle ( false ) }
65
79
>
80
+ < div
81
+ key = { page . id }
82
+ css = {
83
+ selectedPage . id === page . id
84
+ ? selectedItemCss ( hoverToggle )
85
+ : itemCss ( hoverToggle )
86
+ }
87
+ onClick = { selectPageHandler }
88
+ onKeyUp = { selectPageHandler }
89
+ >
90
+ < div css = { titleCss ( ) } > { page . title || 'Untitled' } </ div >
91
+ </ div >
66
92
{ hoverToggle && (
67
93
< div css = { trashCss ( ) } >
68
- < HeaderButton handleClick = { handleDeletePage } >
94
+ < HeaderButton clickHandler = { deletePageHandler } >
69
95
< Trash />
70
96
</ HeaderButton >
71
97
</ div >
72
98
) }
73
- < div css = { titleCss ( ) } > { page . title || 'Untitled' } </ div >
74
99
</ div >
75
100
) ;
76
101
}
0 commit comments