@griddo/ax 11.11.6 → 11.11.7-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -5
- package/package.json +2 -2
- package/src/__tests__/components/Browser/Browser.test.tsx +1 -87
- package/src/__tests__/helpers/shareToken.test.ts +91 -0
- package/src/api/index.tsx +4 -0
- package/src/api/pages.tsx +21 -18
- package/src/api/shareToken.tsx +62 -0
- package/src/api/utils.tsx +13 -0
- package/src/components/Browser/index.tsx +77 -31
- package/src/components/Browser/style.tsx +15 -8
- package/src/components/BrowserContent/index.tsx +20 -5
- package/src/components/ErrorPage/index.tsx +28 -14
- package/src/components/Fields/TextField/index.tsx +18 -4
- package/src/components/Icon/components/GriddoLogo.js +16 -0
- package/src/components/Icon/index.tsx +1 -0
- package/src/components/Icon/svgs/GriddoLogo.svg +9 -0
- package/src/components/Modal/index.tsx +3 -1
- package/src/components/Modal/style.tsx +14 -8
- package/src/components/PageInfoBanner/index.tsx +38 -0
- package/src/components/PageInfoBanner/styles.tsx +40 -0
- package/src/components/SharePageModal/index.tsx +198 -0
- package/src/components/SharePageModal/style.tsx +42 -0
- package/src/components/StatusTile/index.tsx +28 -0
- package/src/components/StatusTile/styles.ts +63 -0
- package/src/components/index.tsx +103 -102
- package/src/global.d.ts +8 -0
- package/src/helpers/dates.tsx +14 -8
- package/src/helpers/index.tsx +5 -0
- package/src/helpers/shareToken.ts +27 -0
- package/src/modules/PublicPreview/index.tsx +35 -13
- package/src/routes/publicRoutes.tsx +2 -2
- package/src/themes/theme.json +4 -0
package/src/components/index.tsx
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
import ActionMenu from "./ActionMenu";
|
|
2
|
+
import Avatar from "./Avatar";
|
|
3
|
+
import BackFolder from "./BackFolder";
|
|
4
|
+
import Breadcrumb from "./Breadcrumb";
|
|
5
|
+
import Browser from "./Browser";
|
|
6
|
+
import BrowserContent from "./BrowserContent";
|
|
7
|
+
import BulkSelectionOptions from "./BulkSelectionOptions";
|
|
8
|
+
import Button from "./Button";
|
|
9
|
+
import CategoryCell from "./CategoryCell";
|
|
10
|
+
import Circle from "./Circle";
|
|
11
|
+
import ConfigPanel from "./ConfigPanel";
|
|
12
|
+
import DragAndDrop from "./DragAndDrop";
|
|
13
|
+
import ElementsTooltip from "./ElementsTooltip";
|
|
14
|
+
import EmptyState from "./EmptyState";
|
|
15
|
+
import ErrorCenter from "./ErrorCenter";
|
|
16
|
+
import ErrorPage from "./ErrorPage";
|
|
17
|
+
import ErrorToast from "./ErrorToast";
|
|
18
|
+
import ExportButton from "./ExportButton";
|
|
19
|
+
import FieldContainer from "./FieldContainer";
|
|
1
20
|
import {
|
|
2
21
|
AIReferenceField,
|
|
3
22
|
ArrayFieldGroup,
|
|
@@ -18,6 +37,7 @@ import {
|
|
|
18
37
|
HeadingField,
|
|
19
38
|
HiddenField,
|
|
20
39
|
ImageField,
|
|
40
|
+
IntegrationsField,
|
|
21
41
|
LinkField,
|
|
22
42
|
NoteField,
|
|
23
43
|
NumberField,
|
|
@@ -37,46 +57,7 @@ import {
|
|
|
37
57
|
VisualOption,
|
|
38
58
|
VisualUniqueSelection,
|
|
39
59
|
Wysiwyg,
|
|
40
|
-
IntegrationsField,
|
|
41
60
|
} from "./Fields";
|
|
42
|
-
import { ListTitle, ListItem } from "./Lists";
|
|
43
|
-
import {
|
|
44
|
-
CategoryFilter,
|
|
45
|
-
CustomizeFilters,
|
|
46
|
-
LiveFilter,
|
|
47
|
-
NameFilter,
|
|
48
|
-
SiteFilter,
|
|
49
|
-
StatusFilter,
|
|
50
|
-
TranslationsFilter,
|
|
51
|
-
TypeFilter,
|
|
52
|
-
DateFilter,
|
|
53
|
-
LastAccessFilter,
|
|
54
|
-
PermissionsFilter,
|
|
55
|
-
UsersFilter,
|
|
56
|
-
RoleFilter,
|
|
57
|
-
CheckGroupFilter,
|
|
58
|
-
StateFilter,
|
|
59
|
-
} from "./TableFilters";
|
|
60
|
-
|
|
61
|
-
import ActionMenu from "./ActionMenu";
|
|
62
|
-
import Avatar from "./Avatar";
|
|
63
|
-
import BackFolder from "./BackFolder";
|
|
64
|
-
import Breadcrumb from "./Breadcrumb";
|
|
65
|
-
import Browser from "./Browser";
|
|
66
|
-
import BrowserContent from "./BrowserContent";
|
|
67
|
-
import BulkSelectionOptions from "./BulkSelectionOptions";
|
|
68
|
-
import Button from "./Button";
|
|
69
|
-
import CategoryCell from "./CategoryCell";
|
|
70
|
-
import Circle from "./Circle";
|
|
71
|
-
import ConfigPanel from "./ConfigPanel";
|
|
72
|
-
import DragAndDrop from "./DragAndDrop";
|
|
73
|
-
import ElementsTooltip from "./ElementsTooltip";
|
|
74
|
-
import EmptyState from "./EmptyState";
|
|
75
|
-
import ErrorCenter from "./ErrorCenter";
|
|
76
|
-
import ErrorPage from "./ErrorPage";
|
|
77
|
-
import ErrorToast from "./ErrorToast";
|
|
78
|
-
import ExportButton from "./ExportButton";
|
|
79
|
-
import FieldContainer from "./FieldContainer";
|
|
80
61
|
import FieldsBehavior from "./FieldsBehavior";
|
|
81
62
|
import FileGallery from "./FileGallery";
|
|
82
63
|
import FilterTagsBar from "./FilterTagsBar";
|
|
@@ -91,96 +72,61 @@ import IconAction from "./IconAction";
|
|
|
91
72
|
import Image from "./Image";
|
|
92
73
|
import InformativeMenu from "./InformativeMenu";
|
|
93
74
|
import LanguageMenu from "./LanguageMenu";
|
|
75
|
+
import { ListItem, ListTitle } from "./Lists";
|
|
94
76
|
import Loader from "./Loader";
|
|
95
77
|
import Loading from "./Loading";
|
|
96
78
|
import Login from "./Login";
|
|
97
79
|
import MainWrapper from "./MainWrapper";
|
|
98
|
-
import MenuItem from "./MenuItem";
|
|
99
80
|
import MenuGroup from "./MenuGroup";
|
|
81
|
+
import MenuItem from "./MenuItem";
|
|
100
82
|
import Modal from "./Modal";
|
|
101
83
|
import Nav from "./Nav";
|
|
102
84
|
import Notification from "./Notification";
|
|
103
85
|
import OcassionalToast from "./OcassionalToast";
|
|
104
86
|
import PageFinder from "./PageFinder";
|
|
87
|
+
import PageInfoBanner from "./PageInfoBanner";
|
|
105
88
|
import Pagination from "./Pagination";
|
|
106
89
|
import ProgressBar from "./ProgressBar";
|
|
107
90
|
import ReorderArrows from "./ReorderArrows";
|
|
108
91
|
import ResizePanel from "./ResizePanel";
|
|
109
92
|
import RestoreModal from "./RestoreModal";
|
|
110
|
-
import {
|
|
93
|
+
import { CancelScheduleModal, ScheduleModal } from "./ScheduleModal";
|
|
111
94
|
import SearchField from "./SearchField";
|
|
112
95
|
import SearchTagsBar from "./SearchTagsBar";
|
|
96
|
+
import SharePageModal from "./SharePageModal";
|
|
113
97
|
import SideModal from "./SideModal";
|
|
98
|
+
import StatusTile from "./StatusTile";
|
|
114
99
|
import SubNav from "./SubNav";
|
|
115
100
|
import TableCounter from "./TableCounter";
|
|
116
|
-
import
|
|
117
|
-
import Tabs from "./Tabs";
|
|
118
|
-
import Tag from "./Tag";
|
|
119
|
-
import Tooltip from "./Tooltip";
|
|
120
|
-
import Toast from "./Toast";
|
|
121
|
-
|
|
122
|
-
export {
|
|
123
|
-
//Fields
|
|
124
|
-
AIReferenceField,
|
|
125
|
-
ArrayFieldGroup,
|
|
126
|
-
AsyncCheckGroup,
|
|
127
|
-
AsyncSelect,
|
|
128
|
-
CheckField,
|
|
129
|
-
CheckGroup,
|
|
130
|
-
ComponentArray,
|
|
131
|
-
ComponentContainer,
|
|
132
|
-
ConditionalField,
|
|
133
|
-
DateField,
|
|
134
|
-
FieldGroup,
|
|
135
|
-
FieldsDivider,
|
|
136
|
-
FileField,
|
|
137
|
-
FormCategorySelect,
|
|
138
|
-
FormContainer,
|
|
139
|
-
FormFieldArray,
|
|
140
|
-
HeadingField,
|
|
141
|
-
HiddenField,
|
|
142
|
-
ImageField,
|
|
143
|
-
LinkField,
|
|
144
|
-
NoteField,
|
|
145
|
-
NumberField,
|
|
146
|
-
RadioField,
|
|
147
|
-
RadioGroup,
|
|
148
|
-
ReferenceField,
|
|
149
|
-
RichText,
|
|
150
|
-
Select,
|
|
151
|
-
SummaryButton,
|
|
152
|
-
TextArea,
|
|
153
|
-
TextField,
|
|
154
|
-
TimeField,
|
|
155
|
-
ToggleField,
|
|
156
|
-
TranslateButton,
|
|
157
|
-
UniqueCheck,
|
|
158
|
-
UrlField,
|
|
159
|
-
VisualOption,
|
|
160
|
-
VisualUniqueSelection,
|
|
161
|
-
Wysiwyg,
|
|
162
|
-
IntegrationsField,
|
|
163
|
-
//Lists
|
|
164
|
-
ListTitle,
|
|
165
|
-
ListItem,
|
|
166
|
-
//Filters
|
|
167
|
-
CheckGroupFilter,
|
|
168
|
-
DateFilter,
|
|
101
|
+
import {
|
|
169
102
|
CategoryFilter,
|
|
103
|
+
CheckGroupFilter,
|
|
170
104
|
CustomizeFilters,
|
|
105
|
+
DateFilter,
|
|
106
|
+
LastAccessFilter,
|
|
171
107
|
LiveFilter,
|
|
172
108
|
NameFilter,
|
|
109
|
+
PermissionsFilter,
|
|
110
|
+
RoleFilter,
|
|
173
111
|
SiteFilter,
|
|
112
|
+
StateFilter,
|
|
174
113
|
StatusFilter,
|
|
175
114
|
TranslationsFilter,
|
|
176
115
|
TypeFilter,
|
|
177
|
-
StateFilter,
|
|
178
|
-
LastAccessFilter,
|
|
179
|
-
PermissionsFilter,
|
|
180
116
|
UsersFilter,
|
|
181
|
-
|
|
182
|
-
|
|
117
|
+
} from "./TableFilters";
|
|
118
|
+
import TableList from "./TableList";
|
|
119
|
+
import Tabs from "./Tabs";
|
|
120
|
+
import Tag from "./Tag";
|
|
121
|
+
import Toast from "./Toast";
|
|
122
|
+
import Tooltip from "./Tooltip";
|
|
123
|
+
|
|
124
|
+
export {
|
|
183
125
|
ActionMenu,
|
|
126
|
+
AIReferenceField,
|
|
127
|
+
ArrayFieldGroup,
|
|
128
|
+
AsyncCheckGroup,
|
|
129
|
+
AsyncSelect,
|
|
184
130
|
Avatar,
|
|
185
131
|
BackFolder,
|
|
186
132
|
Breadcrumb,
|
|
@@ -188,9 +134,20 @@ export {
|
|
|
188
134
|
BrowserContent,
|
|
189
135
|
BulkSelectionOptions,
|
|
190
136
|
Button,
|
|
137
|
+
CancelScheduleModal,
|
|
191
138
|
CategoryCell,
|
|
139
|
+
CategoryFilter,
|
|
140
|
+
CheckField,
|
|
141
|
+
CheckGroup,
|
|
142
|
+
CheckGroupFilter,
|
|
192
143
|
Circle,
|
|
144
|
+
ComponentArray,
|
|
145
|
+
ComponentContainer,
|
|
146
|
+
ConditionalField,
|
|
193
147
|
ConfigPanel,
|
|
148
|
+
CustomizeFilters,
|
|
149
|
+
DateField,
|
|
150
|
+
DateFilter,
|
|
194
151
|
DragAndDrop,
|
|
195
152
|
ElementsTooltip,
|
|
196
153
|
EmptyState,
|
|
@@ -199,46 +156,90 @@ export {
|
|
|
199
156
|
ErrorToast,
|
|
200
157
|
ExportButton,
|
|
201
158
|
FieldContainer,
|
|
159
|
+
FieldGroup,
|
|
202
160
|
FieldsBehavior,
|
|
161
|
+
FieldsDivider,
|
|
162
|
+
FileField,
|
|
203
163
|
FileGallery,
|
|
204
164
|
FilterTagsBar,
|
|
205
165
|
Flag,
|
|
206
166
|
FloatingButton,
|
|
207
167
|
FloatingMenu,
|
|
208
168
|
FloatingPanel,
|
|
169
|
+
FormCategorySelect,
|
|
170
|
+
FormContainer,
|
|
171
|
+
FormFieldArray,
|
|
209
172
|
Gallery,
|
|
210
173
|
GuardModal,
|
|
174
|
+
HeadingField,
|
|
175
|
+
HiddenField,
|
|
211
176
|
Icon,
|
|
212
177
|
IconAction,
|
|
213
178
|
Image,
|
|
179
|
+
ImageField,
|
|
214
180
|
InformativeMenu,
|
|
181
|
+
IntegrationsField,
|
|
215
182
|
LanguageMenu,
|
|
183
|
+
LastAccessFilter,
|
|
184
|
+
LinkField,
|
|
185
|
+
ListItem,
|
|
186
|
+
ListTitle,
|
|
187
|
+
LiveFilter,
|
|
216
188
|
Loader,
|
|
217
189
|
Loading,
|
|
218
190
|
Login,
|
|
219
191
|
MainWrapper,
|
|
220
|
-
MenuItem,
|
|
221
192
|
MenuGroup,
|
|
193
|
+
MenuItem,
|
|
222
194
|
Modal,
|
|
195
|
+
NameFilter,
|
|
223
196
|
Nav,
|
|
197
|
+
NoteField,
|
|
224
198
|
Notification,
|
|
199
|
+
NumberField,
|
|
225
200
|
OcassionalToast,
|
|
226
201
|
PageFinder,
|
|
202
|
+
PageInfoBanner,
|
|
227
203
|
Pagination,
|
|
204
|
+
PermissionsFilter,
|
|
228
205
|
ProgressBar,
|
|
206
|
+
RadioField,
|
|
207
|
+
RadioGroup,
|
|
208
|
+
ReferenceField,
|
|
229
209
|
ReorderArrows,
|
|
230
210
|
ResizePanel,
|
|
231
211
|
RestoreModal,
|
|
212
|
+
RichText,
|
|
213
|
+
RoleFilter,
|
|
232
214
|
ScheduleModal,
|
|
233
|
-
CancelScheduleModal,
|
|
234
215
|
SearchField,
|
|
235
216
|
SearchTagsBar,
|
|
217
|
+
Select,
|
|
218
|
+
SharePageModal,
|
|
236
219
|
SideModal,
|
|
220
|
+
SiteFilter,
|
|
221
|
+
StateFilter,
|
|
222
|
+
StatusFilter,
|
|
223
|
+
StatusTile,
|
|
237
224
|
SubNav,
|
|
225
|
+
SummaryButton,
|
|
238
226
|
TableCounter,
|
|
239
227
|
TableList,
|
|
240
228
|
Tabs,
|
|
241
229
|
Tag,
|
|
242
|
-
|
|
230
|
+
TextArea,
|
|
231
|
+
TextField,
|
|
232
|
+
TimeField,
|
|
243
233
|
Toast,
|
|
234
|
+
ToggleField,
|
|
235
|
+
Tooltip,
|
|
236
|
+
TranslateButton,
|
|
237
|
+
TranslationsFilter,
|
|
238
|
+
TypeFilter,
|
|
239
|
+
UniqueCheck,
|
|
240
|
+
UrlField,
|
|
241
|
+
UsersFilter,
|
|
242
|
+
VisualOption,
|
|
243
|
+
VisualUniqueSelection,
|
|
244
|
+
Wysiwyg,
|
|
244
245
|
};
|
package/src/global.d.ts
CHANGED
|
@@ -8,3 +8,11 @@ declare module "react-draft-wysiwyg";
|
|
|
8
8
|
declare module "history";
|
|
9
9
|
declare module "draftjs-to-html";
|
|
10
10
|
declare module "html-to-draftjs";
|
|
11
|
+
declare module "*.module.css" {
|
|
12
|
+
const classes: { [key: string]: string };
|
|
13
|
+
export default classes;
|
|
14
|
+
}
|
|
15
|
+
declare module "*.css" {
|
|
16
|
+
const classes: { [key: string]: string };
|
|
17
|
+
export default classes;
|
|
18
|
+
}
|
package/src/helpers/dates.tsx
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { format, formatDistanceToNowStrict,
|
|
1
|
+
import { addMinutes, format, formatDistanceToNowStrict, isValid, parse } from "date-fns";
|
|
2
|
+
import { enUS } from "date-fns/locale";
|
|
2
3
|
|
|
3
4
|
const formatString = "dd/MM/yyyy";
|
|
4
5
|
|
|
@@ -83,17 +84,22 @@ const getScheduleFormatDate = (date: string): string => {
|
|
|
83
84
|
return dateToString(dateObj, "dd/MM/yy · HH:mm");
|
|
84
85
|
};
|
|
85
86
|
|
|
87
|
+
const formatDate = (date: number | Date): string => {
|
|
88
|
+
return format(date, "MMMM d, yyyy", { locale: enUS });
|
|
89
|
+
};
|
|
90
|
+
|
|
86
91
|
export {
|
|
92
|
+
areEqualDates,
|
|
87
93
|
dateToString,
|
|
88
|
-
|
|
89
|
-
isValidDate,
|
|
90
|
-
isValidDateRange,
|
|
94
|
+
formatDate,
|
|
91
95
|
getDateRange,
|
|
92
|
-
areEqualDates,
|
|
93
|
-
getStringifyDateRange,
|
|
94
|
-
getHumanLastModifiedDate,
|
|
95
|
-
getFormattedDateWithTimezone,
|
|
96
96
|
getDaysAgo,
|
|
97
|
+
getFormattedDateWithTimezone,
|
|
98
|
+
getHumanLastModifiedDate,
|
|
97
99
|
getRange,
|
|
98
100
|
getScheduleFormatDate,
|
|
101
|
+
getStringifyDateRange,
|
|
102
|
+
isValidDate,
|
|
103
|
+
isValidDateRange,
|
|
104
|
+
stringToDate,
|
|
99
105
|
};
|
package/src/helpers/index.tsx
CHANGED
|
@@ -11,6 +11,7 @@ import { getActivatedDataPacksIds, getDeactivatedModules, isModuleDisabled } fro
|
|
|
11
11
|
import {
|
|
12
12
|
areEqualDates,
|
|
13
13
|
dateToString,
|
|
14
|
+
formatDate,
|
|
14
15
|
getDateRange,
|
|
15
16
|
getDaysAgo,
|
|
16
17
|
getFormattedDateWithTimezone,
|
|
@@ -73,6 +74,7 @@ import {
|
|
|
73
74
|
getTemplateType,
|
|
74
75
|
isMultipleNavigationModules,
|
|
75
76
|
} from "./schemas";
|
|
77
|
+
import { DEV_NOW, getShareTokenInfo } from "./shareToken";
|
|
76
78
|
import {
|
|
77
79
|
camelize,
|
|
78
80
|
capitalize,
|
|
@@ -132,6 +134,7 @@ export {
|
|
|
132
134
|
filterThemeTemplates,
|
|
133
135
|
findObjectValue,
|
|
134
136
|
formatBytes,
|
|
137
|
+
formatDate,
|
|
135
138
|
getActivatedDataPacksIds,
|
|
136
139
|
getCurrentPageStructuredData,
|
|
137
140
|
getDataPackSchema,
|
|
@@ -171,6 +174,8 @@ export {
|
|
|
171
174
|
getSchemaFormCategories,
|
|
172
175
|
getSchemaThumbnails,
|
|
173
176
|
getSchemaType,
|
|
177
|
+
DEV_NOW,
|
|
178
|
+
getShareTokenInfo,
|
|
174
179
|
getSlugFromUrl,
|
|
175
180
|
getStringifyDateRange,
|
|
176
181
|
getStructuredDataFromPage,
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { IShareData } from "@ax/api";
|
|
2
|
+
|
|
3
|
+
import { differenceInCalendarDays, isBefore } from "date-fns";
|
|
4
|
+
|
|
5
|
+
import { formatDate } from "./dates";
|
|
6
|
+
|
|
7
|
+
const TOKEN_CAN_BE_RENEWED_DAYS = 14;
|
|
8
|
+
const TOKEN_EXPIRING_SOON_DAYS = 3;
|
|
9
|
+
|
|
10
|
+
// DEV ONLY — set a future/past date to simulate token states, then revert to undefined
|
|
11
|
+
export const DEV_NOW: Date | undefined = undefined; // new Date("2026-08-06");
|
|
12
|
+
|
|
13
|
+
export const getShareTokenInfo = (shareData: IShareData, now = new Date()) => {
|
|
14
|
+
const expirationDate = new Date(shareData.endDate);
|
|
15
|
+
const tokenHasExpired = isBefore(expirationDate, now);
|
|
16
|
+
const validTokenDaysUntilExpires = Math.max(0, differenceInCalendarDays(expirationDate, now));
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
tokenExpirationDate: formatDate(expirationDate),
|
|
20
|
+
tokenHasExpired,
|
|
21
|
+
tokenCanBeRenewed: !tokenHasExpired && validTokenDaysUntilExpires < TOKEN_CAN_BE_RENEWED_DAYS,
|
|
22
|
+
tokenExpiringSoon: !tokenHasExpired && validTokenDaysUntilExpires <= TOKEN_EXPIRING_SOON_DAYS,
|
|
23
|
+
validTokenDaysUntilExpires,
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type ShareTokenInfo = ReturnType<typeof getShareTokenInfo>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { useEffect, useState } from "react";
|
|
2
2
|
import { useParams } from "react-router-dom";
|
|
3
3
|
|
|
4
|
-
import { pages } from "@ax/api";
|
|
5
|
-
import { BrowserContent, Loading } from "@ax/components";
|
|
4
|
+
import { pages, shareToken as shareTokenApi } from "@ax/api";
|
|
5
|
+
import { BrowserContent, ErrorPage, Loading } from "@ax/components";
|
|
6
6
|
import { getDefaultTheme, isReqOk } from "@ax/helpers";
|
|
7
7
|
|
|
8
8
|
import * as S from "./style";
|
|
@@ -11,21 +11,35 @@ const PublicPreview = () => {
|
|
|
11
11
|
const { id: pageID, entity } = useParams<{ id: string; entity: string }>();
|
|
12
12
|
const [state, setState] = useState<any>(null);
|
|
13
13
|
const [isLoading, setIsLoading] = useState(false);
|
|
14
|
+
const [tokenError, setTokenError] = useState(false);
|
|
15
|
+
const [shareEndDate, setShareEndDate] = useState<string | null>(null);
|
|
14
16
|
|
|
15
17
|
// biome-ignore lint/correctness/useExhaustiveDependencies: TODO: fix this
|
|
16
18
|
useEffect(() => {
|
|
17
19
|
let isMounted = true;
|
|
18
20
|
document.body.classList.add("preview");
|
|
19
21
|
|
|
22
|
+
// Store preview credentials in sessionStorage for API calls
|
|
23
|
+
if (pageID && entity) {
|
|
24
|
+
sessionStorage.setItem("previewPageId", pageID);
|
|
25
|
+
sessionStorage.setItem("previewEntity", entity);
|
|
26
|
+
}
|
|
27
|
+
|
|
20
28
|
const getPage = async () => {
|
|
21
29
|
if (!isMounted) return;
|
|
22
30
|
|
|
23
31
|
setIsLoading(true);
|
|
32
|
+
|
|
24
33
|
const response = await pages.getPublicPage(parseInt(pageID), entity);
|
|
25
34
|
if (isReqOk(response.status)) {
|
|
26
35
|
setState(response.data);
|
|
36
|
+
|
|
37
|
+
const shareResponse = await shareTokenApi.getShare(parseInt(pageID));
|
|
38
|
+
if (isReqOk(shareResponse.status)) {
|
|
39
|
+
setShareEndDate(shareResponse.data.endDate);
|
|
40
|
+
}
|
|
27
41
|
} else {
|
|
28
|
-
|
|
42
|
+
setTokenError(true);
|
|
29
43
|
}
|
|
30
44
|
setIsLoading(false);
|
|
31
45
|
};
|
|
@@ -35,14 +49,21 @@ const PublicPreview = () => {
|
|
|
35
49
|
return function cleanup() {
|
|
36
50
|
isMounted = false;
|
|
37
51
|
document.body.classList.remove("preview");
|
|
52
|
+
// Clean up preview credentials when leaving preview
|
|
53
|
+
sessionStorage.removeItem("previewPageId");
|
|
54
|
+
sessionStorage.removeItem("previewEntity");
|
|
38
55
|
};
|
|
39
56
|
}, []);
|
|
40
57
|
|
|
41
58
|
const globalTheme = getDefaultTheme();
|
|
42
|
-
const theme = state
|
|
43
|
-
const socials = state
|
|
44
|
-
const langs = state
|
|
45
|
-
const siteID = state
|
|
59
|
+
const theme = state?.site ? state.siteInfo.theme : globalTheme;
|
|
60
|
+
const socials = state?.site ? state.siteInfo.socials : [];
|
|
61
|
+
const langs = state?.site ? state.siteInfo.siteLanguages : [];
|
|
62
|
+
const siteID = state?.siteInfo ? state.siteInfo.siteId : undefined;
|
|
63
|
+
|
|
64
|
+
if (tokenError) {
|
|
65
|
+
return <ErrorPage type="linkExpired" />;
|
|
66
|
+
}
|
|
46
67
|
|
|
47
68
|
if (isLoading || !state) return <Loading />;
|
|
48
69
|
|
|
@@ -50,18 +71,19 @@ const PublicPreview = () => {
|
|
|
50
71
|
// biome-ignore lint/suspicious/noAssignInExpressions: TODO: fix this
|
|
51
72
|
<S.Wrapper ref={(ref: any) => ((window as any).browserRef = ref)}>
|
|
52
73
|
<BrowserContent
|
|
53
|
-
cloudinaryName={state
|
|
74
|
+
cloudinaryName={state?.cloudinaryName}
|
|
54
75
|
theme={theme}
|
|
55
76
|
socials={socials}
|
|
56
77
|
siteLangs={langs}
|
|
57
78
|
siteID={siteID}
|
|
58
79
|
isPage={true}
|
|
59
80
|
content={state}
|
|
60
|
-
header={state
|
|
61
|
-
footer={state
|
|
62
|
-
languageID={state
|
|
63
|
-
pageLanguages={state
|
|
64
|
-
renderer="
|
|
81
|
+
header={state?.headerContent}
|
|
82
|
+
footer={state?.footerContent}
|
|
83
|
+
languageID={state?.language}
|
|
84
|
+
pageLanguages={state?.pageLanguages}
|
|
85
|
+
renderer="sharedPage"
|
|
86
|
+
shareEndDate={shareEndDate}
|
|
65
87
|
/>
|
|
66
88
|
</S.Wrapper>
|
|
67
89
|
);
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import ResetPass from "./../modules/ResetPass";
|
|
2
1
|
import CreatePass from "./../modules/CreatePass";
|
|
3
2
|
import Login from "./../modules/Login";
|
|
4
3
|
import PublicPreview from "./../modules/PublicPreview";
|
|
4
|
+
import ResetPass from "./../modules/ResetPass";
|
|
5
5
|
|
|
6
6
|
const publicRoutes = [
|
|
7
7
|
{ path: "/login/:petitionId", component: Login, name: "Login", hideNav: true },
|
|
8
8
|
{ path: "/login", component: Login, name: "Login", hideNav: true },
|
|
9
9
|
{ path: "/new-password/:id/:token", component: ResetPass, name: "Reset Password", hideNav: true },
|
|
10
10
|
{ path: "/set-password/:id/:token", component: CreatePass, name: "Create Password", hideNav: true },
|
|
11
|
-
{ path: "/page-preview/:id/:entity", component: PublicPreview, name: "Preview", hideNav: true },
|
|
11
|
+
{ path: "/page-preview/:id/:entity/:token?", component: PublicPreview, name: "Preview", hideNav: true },
|
|
12
12
|
];
|
|
13
13
|
|
|
14
14
|
export default publicRoutes;
|
package/src/themes/theme.json
CHANGED