import { createContext, PropsWithChildren, useContext, useEffect, useState } from 'react' import { GlobalStoryblok, PageStoryblok } from '../../typings/generated/components-schema' import NextScript from 'next/script' import { useAppContext } from '@context/AppContext' const SettingsContext = createContext({} as GlobalStoryblok) const PageContext = createContext({} as PageStoryblok) declare global { interface Window { StoryblokBridge: any } } function SettingsPageProvider({ settings, page, children }: PropsWithChildren<{ settings: GlobalStoryblok page?: PageStoryblok | null }>) { const { insideStoryblok } = useAppContext() const [stateSettings, setSettings] = useState(settings) const [statePage, setPage] = useState(page || null) // keep page in sync when props change useEffect(() => { setPage((prev) => { if (!page) return null if (prev?.uuid === page.uuid) return prev return page }) }, [page]) // keep settings in sync when props change useEffect(() => { setSettings((prev) => { if (!settings) return prev if (prev?.uuid === settings.uuid) return prev return settings }) }, [settings]) return ( {insideStoryblok && ( { const { StoryblokBridge } = window if (typeof StoryblokBridge !== 'undefined') { const storyblokInstance = new StoryblokBridge() storyblokInstance.on( ['change', 'published', 'unpublished'], () => { console.log('published triggered') // window.location.reload() } ) storyblokInstance.on('input', (event: any) => { const newContent = { ...event?.story.content, uuid: event?.story.uuid } if ( event?.story.content.component === 'global' && event?.story.uuid === settings?.uuid ) { setSettings(newContent) return } if (event?.story.uuid === page?.uuid) { setPage(newContent) } }) } }} /> )} {children} ) } export default SettingsPageProvider export const useSettings = () => useContext(SettingsContext) export const usePage = () => useContext(PageContext)