PluginProbe
Extendify / 2.2.0
Extendify v2.2.0
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 0.7.0 All 126 releases
extendify / src / Launch / state / Pages.js

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

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