1
- import { ChatIcon , MinusIcon } from '@navikt/aksel-icons' ;
2
- import { Box , Button , HStack } from '@navikt/ds-react' ;
1
+ import { ChatIcon , ExpandIcon , MinusIcon , ShrinkIcon } from '@navikt/aksel-icons' ;
2
+ import { Box , Button , HStack , VStack } from '@navikt/ds-react' ;
3
3
import { useAtomValue } from 'jotai' ;
4
- import { useEffect , useState } from 'react' ;
4
+ import { useCallback , useEffect , useRef , useState } from 'react' ;
5
+ import { type ImperativePanelHandle , Panel } from 'react-resizable-panels' ;
5
6
import { dialogUnderArbeidAtom } from 'src/lib/state/dialog' ;
6
7
import { SendMelding } from './SendMelding' ;
7
8
9
+ const PANEL_SIZE = 30 ;
10
+ const LARGE_SIZE = 50 ;
11
+
8
12
export function LukkbarNyMelding ( ) {
13
+ const panelRef = useRef < ImperativePanelHandle > ( null ) ;
14
+ const [ isLarge , setIsLarge ] = useState ( ( panelRef . current ?. getSize ( ) ?? PANEL_SIZE ) > PANEL_SIZE ) ;
9
15
const [ isOpen , setIsOpen ] = useState ( localStorage . getItem ( 'ny-melding-is-open' ) !== 'false' ) ;
10
16
11
17
useEffect ( ( ) => {
@@ -19,31 +25,56 @@ export function LukkbarNyMelding() {
19
25
}
20
26
} , [ oppgave ] ) ;
21
27
28
+ const onExpand = useCallback ( ( ) => {
29
+ if ( ! panelRef . current ) return ;
30
+
31
+ setIsLarge ( panelRef . current . getSize ( ) > PANEL_SIZE ) ;
32
+ } , [ ] ) ;
33
+
34
+ if ( ! isOpen ) {
35
+ return (
36
+ < Box >
37
+ < Button
38
+ type = "button"
39
+ icon = { < ChatIcon title = "Skriv ny melding" /> }
40
+ size = "small"
41
+ onClick = { ( ) => setIsOpen ( true ) }
42
+ />
43
+ </ Box >
44
+ ) ;
45
+ }
46
+
22
47
return (
23
- < HStack flexGrow = "1" >
24
- { ! isOpen && (
25
- < Box >
26
- < Button
27
- type = "button"
28
- icon = { < ChatIcon title = "Skriv ny melding" /> }
29
- size = "small"
30
- onClick = { ( ) => setIsOpen ( true ) }
31
- />
32
- </ Box >
33
- ) }
34
- { isOpen && (
48
+ < Panel onResize = { onExpand } ref = { panelRef } defaultSize = { PANEL_SIZE } minSize = { 20 } maxSize = { 60 } order = { 2 } >
49
+ < VStack height = "100%" >
35
50
< SendMelding
36
51
lukkeKnapp = {
37
- < Button
38
- type = "button"
39
- icon = { < MinusIcon title = "Lukk" /> }
40
- variant = "tertiary"
41
- size = "small"
42
- onClick = { ( ) => setIsOpen ( false ) }
43
- />
52
+ < HStack gap = "2" >
53
+ < Button
54
+ aria-hidden
55
+ type = "button"
56
+ icon = { isLarge ? < ShrinkIcon title = "Minimer" /> : < ExpandIcon title = "Ekspander" /> }
57
+ variant = "tertiary"
58
+ size = "small"
59
+ onClick = { ( ) => {
60
+ if ( ! panelRef . current ) return ;
61
+
62
+ const newSize = isLarge ? PANEL_SIZE : LARGE_SIZE ;
63
+ panelRef . current . resize ( newSize ) ;
64
+ } }
65
+ />
66
+ < Button
67
+ aria-hidden
68
+ type = "button"
69
+ icon = { < MinusIcon title = "Lukk" /> }
70
+ variant = "tertiary"
71
+ size = "small"
72
+ onClick = { ( ) => setIsOpen ( false ) }
73
+ />
74
+ </ HStack >
44
75
}
45
76
/>
46
- ) }
47
- </ HStack >
77
+ </ VStack >
78
+ </ Panel >
48
79
) ;
49
80
}
0 commit comments