This repository has been archived by the owner on Feb 10, 2024. It is now read-only.
/
useDropdownToggle.ts
57 lines (54 loc) · 1.73 KB
/
useDropdownToggle.ts
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
// Copyright (c) 2021-2022. Heusala Group Oy <info@heusalagroup.fi>. All rights reserved.
import {
useState,
useCallback
} from "react";
import { LogService } from "../../core/LogService";
import { useWindowSizeChange } from "./useWindowSizeChange";
import { useLocationChange } from "./useLocationChange";
import { useScrollTopChange } from "./useScrollTopChange";
import { VoidCallback } from "../../core/interfaces/callbacks";
const LOG = LogService.createLogger('useDropdownToggle');
/**
*
* @param context Logging context, e.g. parent's name.
* @param initialState
*/
export function useDropdownToggle (
context: string,
initialState: boolean = false
) : [boolean, VoidCallback, VoidCallback, VoidCallback] {
const [ isDropdownOpen, setDropdownOpen ] = useState<boolean>(initialState);
const toggleMenuCallback = useCallback(
() => {
LOG.debug('Toggling dropdown menu');
setDropdownOpen(() => !isDropdownOpen);
},
[
setDropdownOpen,
isDropdownOpen
]
);
const openMenuCallback = useCallback(
() => {
LOG.debug('Opening dropdown menu');
setDropdownOpen(false);
},
[
setDropdownOpen
]
);
const closeMenuCallback = useCallback(
() => {
LOG.debug('Closing dropdown menu');
setDropdownOpen(false);
},
[
setDropdownOpen
]
);
useWindowSizeChange('useDropdownToggle', closeMenuCallback);
useLocationChange('useDropdownToggle', closeMenuCallback);
useScrollTopChange('useDropdownToggle', closeMenuCallback);
return [ isDropdownOpen, toggleMenuCallback, closeMenuCallback, openMenuCallback ];
}