|
|
@@ -0,0 +1,33 @@
|
|
|
+import { useEffect, useState } from 'react'
|
|
|
+import { useLocation } from './use-location'
|
|
|
+
|
|
|
+function useBookmarkableTabSet(defaultState) {
|
|
|
+ const location = useLocation()
|
|
|
+
|
|
|
+ const [activeTabState, setActiveTabState] = useState(() => {
|
|
|
+ const url = new URL(window.location.href)
|
|
|
+ return url.hash.slice(1) || defaultState
|
|
|
+ })
|
|
|
+
|
|
|
+ function setActiveTab(eventKey) {
|
|
|
+ setActiveTabState(eventKey)
|
|
|
+ location.assign(`#${eventKey}`)
|
|
|
+ }
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ const handlePopstate = () => {
|
|
|
+ const newUrl = new URL(window.location.href)
|
|
|
+ setActiveTabState(newUrl.hash.slice(1) || defaultState)
|
|
|
+ }
|
|
|
+
|
|
|
+ window.addEventListener('popstate', handlePopstate)
|
|
|
+
|
|
|
+ return () => {
|
|
|
+ window.removeEventListener('popstate', handlePopstate)
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ return [activeTabState, setActiveTab]
|
|
|
+}
|
|
|
+
|
|
|
+export default useBookmarkableTabSet
|