REDROOM
PHP 8.2.31
Path:
Logout
Edit File
Size: 3.94 KB
Close
/home/nshryvcy/radiantskinclinics.org/wp-content/plugins/extendify_old/src/Assist/hooks/useRouter.js
Text
Base64
import { Dashboard } from '@assist/pages/Dashboard'; import { homeIcon } from '@assist/svg'; import { safeParseJson } from '@shared/lib/parsing'; import { useActivityStore } from '@shared/state/activity'; import apiFetch from '@wordpress/api-fetch'; import { useCallback, useEffect, useLayoutEffect } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { create } from 'zustand'; import { createJSONStorage, devtools, persist } from 'zustand/middleware'; const pages = [ { slug: 'dashboard', name: __('Dashboard', 'extendify-local'), icon: homeIcon, component: Dashboard, }, ]; let onChangeEvents = []; const state = (set, get) => ({ history: [], viewedPages: [], current: null, // initialize the state with default values ...(safeParseJson(window.extAssistData.userData.routerData)?.state ?? {}), setCurrent: async (page) => { if (!page) return; for (const event of onChangeEvents) { await event(page, { ...get() }); } // If history is the same, dont add (they pressed the same nav button) if (get().history[0]?.slug === page.slug) return; useActivityStore.getState().incrementActivity(`assist-${page.slug}`); set((state) => { const lastViewedAt = new Date().toISOString(); const firstViewedAt = lastViewedAt; const visited = state.viewedPages.find((a) => a.slug === page.slug); return { history: [page, ...state.history].filter(Boolean), current: page, viewedPages: [ // Remove the page if it's already in the list ...state.viewedPages.filter((a) => a.slug !== page.slug), // Either add the page or update the count visited ? { ...visited, count: visited.count + 1, lastViewedAt } : { slug: page.slug, firstViewedAt, lastViewedAt, count: 1, }, ], }; }); }, }); const path = '/extendify/v1/assist/router-data'; const storage = { getItem: async () => await apiFetch({ path }), setItem: async (_name, state) => await apiFetch({ path, method: 'POST', data: { state } }), }; const useRouterState = create( persist(devtools(state, { name: 'Extendify Assist Router' }), { name: 'extendify-assist-router', storage: createJSONStorage(() => storage), skipHydration: true, partialize: ({ viewedPages }) => ({ viewedPages }), }), ); export const router = { onRouteChange: (event) => { // dont add if duplicate if (onChangeEvents.includes(event)) return; onChangeEvents = [...onChangeEvents, event]; }, removeOnRouteChange: (event) => { onChangeEvents = onChangeEvents.filter((e) => e !== event); }, }; let once = false; export const useRouter = () => { const { current, setCurrent, history } = useRouterState(); const Component = current?.component ?? (() => null); const navigateTo = (slug) => { if (window.location.hash === `#${slug}`) { // Fire the event only window.dispatchEvent(new Event('hashchange')); return; } window.location.hash = `#${slug}`; }; useLayoutEffect(() => { // if no hash is present use previous or add #dashboard if (!window.location.hash) { window.location.hash = `#${current?.slug ?? 'dashboard'}`; } }, [current]); useEffect(() => { if (once) return; once = true; // watch url changes for #dashboard, etc const handle = () => { const hash = window.location.hash.replace('#', ''); const page = pages.find((page) => page.slug === hash); if (!page) { navigateTo(current?.slug ?? 'dashboard'); return; } setCurrent(page); // Update title to match the page document.title = page.name; }; window.addEventListener('hashchange', handle); if (!current) handle(); return () => { once = false; window.removeEventListener('hashchange', handle); }; }, [current, setCurrent]); return { current, CurrentPage: useCallback( () => ( <section aria-live="polite"> {/* Announce to SR on change */} <h1 className="sr-only">{current?.name}</h1> <Component /> </section> ), [current], ), pages, navigateTo, history, }; };
Save
Close
Exit & Reset
Text mode: syntax highlighting auto-detects file type.
Directory Contents
Dirs: 0 × Files: 3
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
useRouter.js
3.94 KB
lrw-r--r--
2026-02-19 03:27:14
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
useTasks.js
3.81 KB
lrw-r--r--
2026-02-27 04:48:52
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
useTours.js
778 B
lrw-r--r--
2026-02-19 03:27:14
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).