1
0
Fork 0
freesewing/sites/shared/hooks/use-app.mjs

67 lines
1.6 KiB
JavaScript
Raw Normal View History

2023-03-26 06:50:59 +02:00
import { loadNavigation } from 'site/lib/load-navigation.mjs'
2023-03-24 16:33:14 +01:00
// Hooks
2023-03-26 06:50:59 +02:00
import { useState, useEffect } from 'react'
import { useBugsnag } from 'shared/hooks/use-bugsnag.mjs'
2023-03-24 16:33:14 +01:00
// Dependencies
2023-03-26 06:50:59 +02:00
import get from 'lodash.get'
2023-03-24 16:33:14 +01:00
import set from 'lodash.set'
import unset from 'lodash.unset'
const defaultState = {
loading: false,
modal: null,
2023-03-26 06:50:59 +02:00
menu: {
main: null,
},
2023-03-24 16:33:14 +01:00
}
/*
* The useApp hook
*/
2023-03-26 06:50:59 +02:00
export function useApp(props = {}) {
const { bugsnag = false, page = {}, loadState = {} } = props
const { saa = [] } = page
const reportError = useBugsnag(props?.bugsnag)
2023-03-24 16:33:14 +01:00
// React state
2023-03-26 06:50:59 +02:00
const [state, setState] = useState(() => ({ ...defaultState, ...loadState }))
useEffect(() => {
// Force update of navigation info (nav, title, crumbs) on each page change
if (saa.length > 0) setState({ ...state, ...loadNavigation(saa) })
}, [saa, state.slug, state.title])
2023-03-24 16:33:14 +01:00
/*
* Helper methods for partial state updates
*/
const updateState = (path, value) => setState(set({ ...state }, path, value))
const unsetState = (path) => setState(unset({ ...state }, path))
/*
* Helper methods for specific state updates
*/
2023-03-26 06:50:59 +02:00
const closeModal = () => updateState('modal', null)
const closeMenu = (name) =>
get(state, `menu.${name}`, false) ? updateState(`menu.${name}`, false) : null
2023-03-24 16:33:14 +01:00
const startLoading = () => updateState('loading', true)
const stopLoading = () => updateState('loading', false)
return {
// All-purpose React state object
state,
setState,
updateState,
unsetState,
// Helper methods
2023-03-26 06:50:59 +02:00
closeModal,
closeMenu,
2023-03-24 16:33:14 +01:00
startLoading,
stopLoading,
// Bugsnag helper
reportError,
}
}