PluginProbe
Extendify / 1.17.1
Extendify v1.17.1
3.2.1 3.2.0 3.1.6 3.1.5 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.6 3.0.5 3.0.4 trunk 0.1.0 0.10.0 0.10.1 0.10.2 0.11.0 0.11.1 0.2.0 0.3.0 0.3.1 0.4.0 0.5.0 0.6.0 All 127 releases
extendify / src / Launch / state / Pages.js

Pages.js in Extendify 1.17.1, at src/Launch/state/Pages.js

120 lines 3.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import { create } from 'zustand';
2 import { persist, devtools } from 'zustand/middleware';
3 import { pages } from '@launch/lib/pages';
4
5 const store = (set, get) => ({
6 pages: new Map(pages),
7 currentPageIndex: 0,
8 count: () => get().pages.size,
9 getPageOrder: () => Array.from(get().pages.keys()),
10 getCurrentPageData: () => get().pages.get(get().getCurrentPageSlug()),
11 getPageSlug: (idx) => get().getPageOrder()[idx],
12 getCurrentPageSlug: () => {
13 const page = get().getPageOrder()[get().currentPageIndex];
14 if (!page) {
15 get().setPage(0);
16 return get().getPageOrder()[0];
17 }
18 return page;
19 },
20 getPageData: (slug) => get().pages.get(slug),
21 getPageState: (slug) => get().getPageData(slug)?.state.getState(),
22 getNextPageData: () => {
23 const nextIndex = get().currentPageIndex + 1;
24 if (nextIndex > get().count() - 1) return {};
25 return get().getPageData(get().getPageSlug(nextIndex));
26 },
27 setPage: (page) => {
28 // If page is a string, get the index
29 if (typeof page === 'string') {
30 page = get().getPageOrder().indexOf(page);
31 }
32 if (page > get().count() - 1) return;
33 if (page < 0) return;
34 set({ currentPageIndex: page });
35 },
36 removePage: (page) => {
37 const thePage = get().pages.get(page);
38 if (!thePage) return;
39 const newPages = new Map();
40 get().pages.forEach((value, key) => {
41 if (key !== page) {
42 newPages.set(key, value);
43 }
44 });
45 set({ pages: newPages });
46 // If the page has a cleanup function, run it
47 thePage?.state?.getState()?.onRemove();
48 },
49 addPage: (page, data, after) => {
50 // If the after page is not found, throw
51 if (!get().pages.has(after)) {
52 throw new Error(`Page ${after} not found`);
53 }
54 // If it already exists return
55 if (get().pages.has(page)) return;
56 const newPages = new Map();
57 get().pages.forEach((value, key) => {
58 newPages.set(key, value);
59 if (key === after) {
60 newPages.set(page, data);
61 }
62 });
63 set({ pages: newPages });
64 },
65 findPreviousValidPage: (idx) => {
66 let prevIdx = idx;
67 // go back until you find useNav = true
68 do {
69 prevIdx -= 1;
70 } while (
71 prevIdx > 0 &&
72 !get().getPageState(get().getPageSlug(prevIdx))?.useNav
73 );
74 return prevIdx;
75 },
76 pushHistory: (idx) => {
77 history.pushState(
78 {
79 currentPageIndex: idx,
80 currentPageKey: get().getPageSlug(idx),
81 previousPageIndex: get().findPreviousValidPage(idx),
82 },
83 '',
84 );
85 },
86 replaceHistory: (idx) => {
87 history.replaceState(
88 {
89 currentPageIndex: idx,
90 currentPageKey: get().getPageSlug(idx),
91 previousPageIndex: get().findPreviousValidPage(idx),
92 },
93 '',
94 );
95 },
96 nextPage: () => {
97 const pageIndex = get().currentPageIndex + 1;
98 const nextPageState = get().getPageState(get().getPageSlug(pageIndex));
99 if (nextPageState?.useNav) get().pushHistory(pageIndex);
100 get().setPage(pageIndex);
101 },
102 previousPage: () => {
103 get().setPage(get().findPreviousValidPage(get().currentPageIndex));
104 },
105 });
106
107 const withDevtools = devtools(store, {
108 name: 'Extendify Launch Pages',
109 serialize: true,
110 });
111 const withPersist = persist(withDevtools, {
112 name: `extendify-pages-${window.extSharedData.siteId}`,
113 partialize: (state) => ({
114 currentPageIndex: state?.currentPageIndex ?? 0,
115 currentPageSlug: state?.getCurrentPageSlug() ?? null,
116 availablePages: state?.getPageOrder() ?? [],
117 }),
118 });
119 export const usePagesStore = create(withPersist);
120