@devvistatech/devvista-kit 0.0.9 → 0.0.10
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/CHANGELOG.md +12 -12
- package/LICENSE +6 -6
- package/README.md +15 -15
- package/app/about/page.tsx +298 -298
- package/app/adRequest/page.tsx +549 -549
- package/app/analytics/page.tsx +346 -346
- package/app/api/about/route.ts +306 -306
- package/app/api/adRequest/route.ts +567 -567
- package/app/api/analytics/[reportType]/route.ts +337 -337
- package/app/api/bio/route.ts +313 -313
- package/app/api/blog/route.ts +306 -306
- package/app/api/chat/route.ts +14 -14
- package/app/api/contact/route.ts +409 -409
- package/app/api/contacts/route.ts +224 -224
- package/app/api/files/route.ts +429 -429
- package/app/api/gallery-data/route.ts +735 -735
- package/app/api/schedule/route.ts +455 -455
- package/app/api/sync-user/route.ts +131 -131
- package/app/api/trial-request/route.ts +297 -297
- package/app/blog/[id]/page.tsx +288 -288
- package/app/blog/page.tsx +216 -216
- package/app/contact/page.tsx +284 -284
- package/app/faq/page.tsx +191 -191
- package/app/gallery/page.tsx +315 -315
- package/app/globals.css +58 -58
- package/app/layout.tsx +110 -110
- package/app/not-found.tsx +20 -20
- package/app/page.tsx +338 -338
- package/app/schedule/page.tsx +660 -660
- package/bin/init.js +219 -219
- package/components/addOns/functional/BioEditor.tsx +446 -446
- package/components/addOns/functional/CalendlyWidget.tsx +107 -107
- package/components/addOns/functional/ClassList.tsx +145 -145
- package/components/addOns/functional/ClassPopup.tsx +398 -398
- package/components/addOns/functional/ContactForm.tsx +284 -284
- package/components/addOns/functional/FileUploader.tsx +294 -294
- package/components/addOns/functional/ImageDescCarousel.tsx +730 -730
- package/components/addOns/functional/NewUserAnalytics.tsx +100 -100
- package/components/addOns/functional/ScheduleCarousel.tsx +171 -171
- package/components/addOns/functional/aboutSections/AboutSection.tsx +544 -544
- package/components/addOns/functional/aboutSections/constants/aboutSection.ts +65 -65
- package/components/addOns/functional/blogSections/BlogDashboard.tsx +184 -184
- package/components/addOns/functional/blogSections/BlogFormPopUp.tsx +554 -554
- package/components/addOns/functional/blogSections/BlogList.tsx +148 -148
- package/components/addOns/functional/blogSections/BlogSidebar.tsx +58 -58
- package/components/addOns/functional/blogSections/constants/blogDashboard.ts +28 -28
- package/components/addOns/functional/blogSections/constants/blogFormPopUp.ts +97 -97
- package/components/addOns/functional/blogSections/constants/blogList.ts +22 -22
- package/components/addOns/functional/blogSections/constants/blogSidebar.ts +15 -15
- package/components/addOns/functional/contactsDashboard/ContactsDashboard.tsx +366 -366
- package/components/addOns/functional/contactsDashboard/constants/contactsDashboard.ts +70 -70
- package/components/addOns/functional/galleries/GalleryComplex.tsx +836 -836
- package/components/addOns/functional/galleries/GallerySimple.tsx +509 -509
- package/components/addOns/functional/galleries/constants/galleryComplex.ts +106 -106
- package/components/addOns/functional/galleries/constants/gallerySimple.ts +76 -76
- package/components/addOns/functional/schedules/ScheduleGridOne.tsx +262 -262
- package/components/addOns/functional/schedules/ScheduleGridTwo.tsx +294 -294
- package/components/addOns/functional/schedules/ScheduleGridTwoBasic.tsx +288 -288
- package/components/addOns/functional/schedules/SchedulerForm.tsx +428 -428
- package/components/addOns/functional/schedules/constants/ScheduleGridTwo.ts +40 -40
- package/components/addOns/functional/schedules/constants/ScheduleGridTwoBasic.ts +40 -40
- package/components/addOns/functional/schedules/constants/SchedulerForm.ts +65 -65
- package/components/addOns/functional/schedules/constants/scheduleGridOne.ts +54 -54
- package/components/addOns/non-functional/AnnouncementBanner.tsx +46 -46
- package/components/addOns/non-functional/FeaturesSection.tsx +62 -62
- package/components/addOns/non-functional/Heros/HeroSection.tsx +142 -142
- package/components/addOns/non-functional/IconBubble.tsx +49 -49
- package/components/addOns/non-functional/SampleCarousel.tsx +204 -204
- package/components/addOns/non-functional/Testimonials.tsx +334 -334
- package/components/addOns/non-functional/ThreeSetGallery.tsx +63 -63
- package/components/addOns/non-functional/aboutSections/AboutSection.tsx +62 -62
- package/components/addOns/non-functional/aboutSections/constants/aboutSection.ts +24 -24
- package/components/addOns/non-functional/imageCarousels/ProductSlider.tsx +117 -117
- package/components/addOns/non-functional/imageCarousels/ProgramCarousel.tsx +232 -232
- package/components/addOns/non-functional/imageCarousels/constants/programCarousel.ts +39 -39
- package/components/addOns/non-functional/imageCarousels/constants/programSlider.ts +36 -36
- package/components/addOns/non-functional/spinner.tsx +21 -21
- package/components/footers/footer.tsx +453 -453
- package/components/navBars/navbar.tsx +310 -310
- package/components/other/accordion.tsx +58 -58
- package/components/other/admin-menu.tsx +68 -68
- package/components/other/alert-dialog.tsx +141 -141
- package/components/other/alert.tsx +59 -59
- package/components/other/aspect-ratio.tsx +7 -7
- package/components/other/avatar.tsx +50 -50
- package/components/other/badge.tsx +36 -36
- package/components/other/breadcrumb.tsx +115 -115
- package/components/other/button.tsx +738 -738
- package/components/other/calendar.tsx +66 -66
- package/components/other/card.tsx +86 -86
- package/components/other/carousel.tsx +274 -274
- package/components/other/chart.tsx +363 -363
- package/components/other/checkbox.tsx +30 -30
- package/components/other/collapsible.tsx +11 -11
- package/components/other/command.tsx +155 -155
- package/components/other/context-menu.tsx +200 -200
- package/components/other/dialog.tsx +122 -122
- package/components/other/drawer.tsx +118 -118
- package/components/other/dropdown-menu.tsx +200 -200
- package/components/other/form.tsx +179 -179
- package/components/other/hover-card.tsx +29 -29
- package/components/other/input-otp.tsx +71 -71
- package/components/other/input.tsx +25 -25
- package/components/other/label.tsx +26 -26
- package/components/other/menubar.tsx +236 -236
- package/components/other/mobile-icon.tsx +21 -21
- package/components/other/navigation-menu.tsx +128 -128
- package/components/other/pagination.tsx +117 -117
- package/components/other/popover.tsx +31 -31
- package/components/other/progress.tsx +28 -28
- package/components/other/radio-group.tsx +44 -44
- package/components/other/resizable.tsx +45 -45
- package/components/other/scroll-area.tsx +48 -48
- package/components/other/select.tsx +160 -160
- package/components/other/separator.tsx +31 -31
- package/components/other/sheet.tsx +140 -140
- package/components/other/skeleton.tsx +15 -15
- package/components/other/slider.tsx +28 -28
- package/components/other/social-icons.tsx +39 -39
- package/components/other/sonner.tsx +31 -31
- package/components/other/switch.tsx +29 -29
- package/components/other/table.tsx +117 -117
- package/components/other/tabs.tsx +55 -55
- package/components/other/textarea.tsx +24 -24
- package/components/other/toast.tsx +122 -122
- package/components/other/toaster.tsx +35 -35
- package/components/other/toggle-group.tsx +61 -61
- package/components/other/toggle.tsx +45 -45
- package/components/other/tooltip.tsx +30 -30
- package/components/theme-provider.tsx +8 -8
- package/components/types.ts +49 -49
- package/dist/.next/types/app/api/about/route.js +52 -0
- package/dist/.next/types/app/api/blog/route.js +52 -0
- package/dist/.next/types/app/api/files/route.js +52 -0
- package/dist/.next/types/app/api/schedule/route.js +52 -0
- package/dist/.next/types/app/api/sync-user/route.js +52 -0
- package/dist/.next/types/app/layout.js +22 -0
- package/dist/.next/types/app/page.js +22 -0
- package/dist/app/about/page.jsx +258 -0
- package/dist/app/adRequest/page.jsx +531 -0
- package/dist/app/analytics/page.jsx +298 -0
- package/dist/app/api/about/route.js +285 -0
- package/dist/app/api/adRequest/route.js +440 -0
- package/dist/app/api/analytics/[reportType]/route.js +357 -0
- package/dist/app/api/bio/route.js +293 -0
- package/dist/app/api/blog/route.js +366 -0
- package/dist/app/api/chat/route.js +58 -0
- package/dist/app/api/contact/route.js +163 -0
- package/dist/app/api/contacts/route.js +234 -0
- package/dist/app/api/files/route.js +444 -0
- package/dist/app/api/gallery-data/route.js +719 -0
- package/dist/app/api/schedule/route.js +461 -0
- package/dist/app/api/sync-user/route.js +186 -0
- package/dist/app/api/trial-request/route.js +165 -0
- package/dist/app/blog/[id]/page.jsx +312 -0
- package/dist/app/blog/page.jsx +210 -0
- package/dist/app/constants/about.js +32 -0
- package/dist/app/constants/adRequest.js +113 -0
- package/dist/app/constants/contact.js +40 -0
- package/dist/app/constants/faq.js +36 -0
- package/dist/app/constants/gallery.js +42 -0
- package/dist/app/constants/page.js +69 -0
- package/dist/app/constants/schedule.js +71 -0
- package/dist/app/contact/page.jsx +119 -0
- package/dist/app/faq/page.jsx +97 -0
- package/dist/app/gallery/page.jsx +281 -0
- package/dist/app/layout.jsx +45 -0
- package/dist/app/not-found.jsx +14 -0
- package/dist/app/page.jsx +324 -0
- package/dist/app/schedule/page.jsx +500 -0
- package/dist/components/addOns/functional/BioEditor.jsx +187 -0
- package/dist/components/addOns/functional/CalendlyWidget.jsx +61 -0
- package/dist/components/addOns/functional/ClassList.jsx +158 -0
- package/dist/components/addOns/functional/ClassPopup.jsx +300 -0
- package/dist/components/addOns/functional/ContactForm.jsx +219 -0
- package/dist/components/addOns/functional/FileUploader.jsx +222 -0
- package/dist/components/addOns/functional/ImageDescCarousel.jsx +491 -0
- package/dist/components/addOns/functional/NewUserAnalytics.jsx +71 -0
- package/dist/components/addOns/functional/ScheduleCarousel.jsx +68 -0
- package/dist/components/addOns/functional/aboutSections/AboutSection.jsx +372 -0
- package/dist/components/addOns/functional/aboutSections/constants/aboutSection.js +65 -0
- package/dist/components/addOns/functional/blogSections/BlogDashboard.jsx +111 -0
- package/dist/components/addOns/functional/blogSections/BlogFormPopUp.jsx +465 -0
- package/dist/components/addOns/functional/blogSections/BlogList.jsx +170 -0
- package/dist/components/addOns/functional/blogSections/BlogSidebar.jsx +35 -0
- package/dist/components/addOns/functional/blogSections/constants/blogDashboard.js +28 -0
- package/dist/components/addOns/functional/blogSections/constants/blogFormPopUp.js +97 -0
- package/dist/components/addOns/functional/blogSections/constants/blogList.js +22 -0
- package/dist/components/addOns/functional/blogSections/constants/blogSidebar.js +15 -0
- package/dist/components/addOns/functional/contactsDashboard/ContactsDashboard.jsx +355 -0
- package/dist/components/addOns/functional/contactsDashboard/constants/contactsDashboard.js +70 -0
- package/dist/components/addOns/functional/galleries/GalleryComplex.jsx +605 -0
- package/dist/components/addOns/functional/galleries/GallerySimple.jsx +363 -0
- package/dist/components/addOns/functional/galleries/constants/galleryComplex.js +106 -0
- package/dist/components/addOns/functional/galleries/constants/gallerySimple.js +76 -0
- package/dist/components/addOns/functional/schedules/ScheduleGridOne.jsx +167 -0
- package/dist/components/addOns/functional/schedules/ScheduleGridTwo.jsx +100 -0
- package/dist/components/addOns/functional/schedules/ScheduleGridTwoBasic.jsx +97 -0
- package/dist/components/addOns/functional/schedules/SchedulerForm.jsx +188 -0
- package/dist/components/addOns/functional/schedules/constants/ScheduleGridTwo.js +40 -0
- package/dist/components/addOns/functional/schedules/constants/ScheduleGridTwoBasic.js +40 -0
- package/dist/components/addOns/functional/schedules/constants/SchedulerForm.js +65 -0
- package/dist/components/addOns/functional/schedules/constants/scheduleGridOne.js +54 -0
- package/dist/components/addOns/non-functional/AnnouncementBanner.jsx +24 -0
- package/dist/components/addOns/non-functional/FeaturesSection.jsx +38 -0
- package/dist/components/addOns/non-functional/HeroSection.jsx +71 -0
- package/dist/components/addOns/non-functional/Heros/HeroSection.jsx +71 -0
- package/dist/components/addOns/non-functional/IconBubble.jsx +36 -0
- package/dist/components/addOns/non-functional/SampleCarousel.jsx +114 -0
- package/dist/components/addOns/non-functional/Testimonials.jsx +177 -0
- package/dist/components/addOns/non-functional/ThreeSetGallery.jsx +40 -0
- package/dist/components/addOns/non-functional/aboutSections/AboutSection.jsx +35 -0
- package/dist/components/addOns/non-functional/aboutSections/constants/aboutSection.js +24 -0
- package/dist/components/addOns/non-functional/imageCarousels/ProductSlider.jsx +80 -0
- package/dist/components/addOns/non-functional/imageCarousels/ProgramCarousel.jsx +155 -0
- package/dist/components/addOns/non-functional/imageCarousels/constants/programCarousel.js +39 -0
- package/dist/components/addOns/non-functional/imageCarousels/constants/programSlider.js +36 -0
- package/dist/components/addOns/non-functional/spinner.jsx +13 -0
- package/dist/components/footers/footer.jsx +217 -0
- package/dist/components/navBars/navbar.jsx +159 -0
- package/dist/components/other/accordion.jsx +40 -0
- package/dist/components/other/admin-menu.jsx +34 -0
- package/dist/components/other/alert-dialog.jsx +64 -0
- package/dist/components/other/alert.jsx +41 -0
- package/dist/components/other/aspect-ratio.jsx +4 -0
- package/dist/components/other/avatar.jsx +31 -0
- package/dist/components/other/badge.jsx +32 -0
- package/dist/components/other/breadcrumb.jsx +57 -0
- package/dist/components/other/button.jsx +322 -0
- package/dist/components/other/calendar.jsx +43 -0
- package/dist/components/other/card.jsx +44 -0
- package/dist/components/other/carousel.jsx +140 -0
- package/dist/components/other/chart.jsx +182 -0
- package/dist/components/other/checkbox.jsx +26 -0
- package/dist/components/other/collapsible.jsx +6 -0
- package/dist/components/other/command.jsx +68 -0
- package/dist/components/other/context-menu.jsx +88 -0
- package/dist/components/other/dialog.jsx +60 -0
- package/dist/components/other/drawer.jsx +60 -0
- package/dist/components/other/dropdown-menu.jsx +90 -0
- package/dist/components/other/form.jsx +89 -0
- package/dist/components/other/hover-card.jsx +23 -0
- package/dist/components/other/input-otp.jsx +46 -0
- package/dist/components/other/input.jsx +19 -0
- package/dist/components/other/label.jsx +23 -0
- package/dist/components/other/login-popup.jsx +1 -0
- package/dist/components/other/menubar.jsx +96 -0
- package/dist/components/other/mobile-icon.jsx +11 -0
- package/dist/components/other/navigation-menu.jsx +62 -0
- package/dist/components/other/pagination.jsx +63 -0
- package/dist/components/other/popover.jsx +25 -0
- package/dist/components/other/progress.jsx +23 -0
- package/dist/components/other/radio-group.jsx +31 -0
- package/dist/components/other/resizable.jsx +29 -0
- package/dist/components/other/scroll-area.jsx +36 -0
- package/dist/components/other/select.jsx +83 -0
- package/dist/components/other/separator.jsx +21 -0
- package/dist/components/other/sheet.jsx +74 -0
- package/dist/components/other/signup-popup.jsx +1 -0
- package/dist/components/other/skeleton.jsx +17 -0
- package/dist/components/other/slider.jsx +26 -0
- package/dist/components/other/social-icons.jsx +15 -0
- package/dist/components/other/sonner.jsx +27 -0
- package/dist/components/other/switch.jsx +23 -0
- package/dist/components/other/table.jsx +56 -0
- package/dist/components/other/tabs.jsx +32 -0
- package/dist/components/other/textarea.jsx +19 -0
- package/dist/components/other/toast.jsx +58 -0
- package/dist/components/other/toaster.jsx +31 -0
- package/dist/components/other/toggle-group.jsx +41 -0
- package/dist/components/other/toggle.jsx +39 -0
- package/dist/components/other/tooltip.jsx +24 -0
- package/dist/components/theme-provider.jsx +18 -0
- package/dist/components/types.js +1 -0
- package/dist/hooks/use-toast.js +135 -0
- package/dist/lib/auth-context.jsx +144 -0
- package/dist/lib/constants/about.js +32 -0
- package/dist/lib/constants/adRequest.js +113 -0
- package/dist/lib/constants/contact.js +40 -0
- package/dist/lib/constants/faq.js +36 -0
- package/dist/lib/constants/gallery.js +42 -0
- package/dist/lib/constants/page.js +69 -0
- package/dist/lib/constants/schedule.js +71 -0
- package/dist/lib/google-analytics.jsx +148 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/verify-user.js +142 -0
- package/dist/middleware.js +37 -0
- package/dist/tailwind.config.js +86 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/hooks/use-toast.ts +188 -188
- package/lib/auth-context.tsx +130 -130
- package/lib/constants/about.ts +34 -34
- package/lib/constants/adRequest.ts +113 -113
- package/lib/constants/contact.ts +40 -40
- package/lib/constants/faq.ts +34 -21
- package/lib/constants/gallery.ts +42 -42
- package/lib/constants/page.ts +69 -69
- package/lib/constants/schedule.ts +71 -71
- package/lib/google-analytics.tsx +97 -97
- package/lib/verify-user.ts +117 -117
- package/middleware.ts +42 -42
- package/netlify.toml +5 -5
- package/next.config.js +10 -10
- package/package.json +115 -115
- package/tailwind.config.ts +89 -89
- package/tsconfig.json +23 -23
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
14
|
+
var t = {};
|
|
15
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
16
|
+
t[p] = s[p];
|
|
17
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
18
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
19
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
20
|
+
t[p[i]] = s[p[i]];
|
|
21
|
+
}
|
|
22
|
+
return t;
|
|
23
|
+
};
|
|
24
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
25
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
26
|
+
if (ar || !(i in from)) {
|
|
27
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
28
|
+
ar[i] = from[i];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
32
|
+
};
|
|
33
|
+
import * as React from 'react';
|
|
34
|
+
var TOAST_LIMIT = 1;
|
|
35
|
+
var TOAST_REMOVE_DELAY = 1000000;
|
|
36
|
+
var actionTypes = {
|
|
37
|
+
ADD_TOAST: 'ADD_TOAST',
|
|
38
|
+
UPDATE_TOAST: 'UPDATE_TOAST',
|
|
39
|
+
DISMISS_TOAST: 'DISMISS_TOAST',
|
|
40
|
+
REMOVE_TOAST: 'REMOVE_TOAST',
|
|
41
|
+
};
|
|
42
|
+
var count = 0;
|
|
43
|
+
function genId() {
|
|
44
|
+
count = (count + 1) % Number.MAX_SAFE_INTEGER;
|
|
45
|
+
return count.toString();
|
|
46
|
+
}
|
|
47
|
+
var toastTimeouts = new Map();
|
|
48
|
+
var addToRemoveQueue = function (toastId) {
|
|
49
|
+
if (toastTimeouts.has(toastId)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
var timeout = setTimeout(function () {
|
|
53
|
+
toastTimeouts.delete(toastId);
|
|
54
|
+
dispatch({
|
|
55
|
+
type: 'REMOVE_TOAST',
|
|
56
|
+
toastId: toastId,
|
|
57
|
+
});
|
|
58
|
+
}, TOAST_REMOVE_DELAY);
|
|
59
|
+
toastTimeouts.set(toastId, timeout);
|
|
60
|
+
};
|
|
61
|
+
export var reducer = function (state, action) {
|
|
62
|
+
switch (action.type) {
|
|
63
|
+
case 'ADD_TOAST':
|
|
64
|
+
return __assign(__assign({}, state), { toasts: __spreadArray([action.toast], state.toasts, true).slice(0, TOAST_LIMIT) });
|
|
65
|
+
case 'UPDATE_TOAST':
|
|
66
|
+
return __assign(__assign({}, state), { toasts: state.toasts.map(function (t) {
|
|
67
|
+
return t.id === action.toast.id ? __assign(__assign({}, t), action.toast) : t;
|
|
68
|
+
}) });
|
|
69
|
+
case 'DISMISS_TOAST': {
|
|
70
|
+
var toastId_1 = action.toastId;
|
|
71
|
+
if (toastId_1) {
|
|
72
|
+
addToRemoveQueue(toastId_1);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
state.toasts.forEach(function (toast) {
|
|
76
|
+
addToRemoveQueue(toast.id);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return __assign(__assign({}, state), { toasts: state.toasts.map(function (t) {
|
|
80
|
+
return t.id === toastId_1 || toastId_1 === undefined
|
|
81
|
+
? __assign(__assign({}, t), { open: false }) : t;
|
|
82
|
+
}) });
|
|
83
|
+
}
|
|
84
|
+
case 'REMOVE_TOAST':
|
|
85
|
+
if (action.toastId === undefined) {
|
|
86
|
+
return __assign(__assign({}, state), { toasts: [] });
|
|
87
|
+
}
|
|
88
|
+
return __assign(__assign({}, state), { toasts: state.toasts.filter(function (t) { return t.id !== action.toastId; }) });
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
var listeners = [];
|
|
92
|
+
var memoryState = { toasts: [] };
|
|
93
|
+
function dispatch(action) {
|
|
94
|
+
memoryState = reducer(memoryState, action);
|
|
95
|
+
listeners.forEach(function (listener) {
|
|
96
|
+
listener(memoryState);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
function toast(_a) {
|
|
100
|
+
var props = __rest(_a, []);
|
|
101
|
+
var id = genId();
|
|
102
|
+
var update = function (props) {
|
|
103
|
+
return dispatch({
|
|
104
|
+
type: 'UPDATE_TOAST',
|
|
105
|
+
toast: __assign(__assign({}, props), { id: id }),
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
var dismiss = function () { return dispatch({ type: 'DISMISS_TOAST', toastId: id }); };
|
|
109
|
+
dispatch({
|
|
110
|
+
type: 'ADD_TOAST',
|
|
111
|
+
toast: __assign(__assign({}, props), { id: id, open: true, onOpenChange: function (open) {
|
|
112
|
+
if (!open)
|
|
113
|
+
dismiss();
|
|
114
|
+
} }),
|
|
115
|
+
});
|
|
116
|
+
return {
|
|
117
|
+
id: id,
|
|
118
|
+
dismiss: dismiss,
|
|
119
|
+
update: update,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function useToast() {
|
|
123
|
+
var _a = React.useState(memoryState), state = _a[0], setState = _a[1];
|
|
124
|
+
React.useEffect(function () {
|
|
125
|
+
listeners.push(setState);
|
|
126
|
+
return function () {
|
|
127
|
+
var index = listeners.indexOf(setState);
|
|
128
|
+
if (index > -1) {
|
|
129
|
+
listeners.splice(index, 1);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
}, [state]);
|
|
133
|
+
return __assign(__assign({}, state), { toast: toast, dismiss: function (toastId) { return dispatch({ type: 'DISMISS_TOAST', toastId: toastId }); } });
|
|
134
|
+
}
|
|
135
|
+
export { useToast, toast };
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
import { createContext, useContext, useState, useEffect } from "react";
|
|
39
|
+
import { useAuth as useClerkAuth, useUser } from "@clerk/nextjs";
|
|
40
|
+
var AuthContext = createContext(undefined);
|
|
41
|
+
var userCache = new Map();
|
|
42
|
+
export function AuthProvider(_a) {
|
|
43
|
+
var _this = this;
|
|
44
|
+
var children = _a.children;
|
|
45
|
+
var _b = useState(null), user = _b[0], setUser = _b[1];
|
|
46
|
+
var _c = useState(true), authLoading = _c[0], setAuthLoading = _c[1];
|
|
47
|
+
var _d = useState(null), error = _d[0], setError = _d[1]; // Added error state
|
|
48
|
+
var _e = useClerkAuth(), isSignedIn = _e.isSignedIn, userId = _e.userId;
|
|
49
|
+
var clerkUser = useUser().user;
|
|
50
|
+
var syncUserToStrapi = function (clerkUserData) { return __awaiter(_this, void 0, void 0, function () {
|
|
51
|
+
var response, errorText, strapiUser, error_1;
|
|
52
|
+
return __generator(this, function (_a) {
|
|
53
|
+
switch (_a.label) {
|
|
54
|
+
case 0:
|
|
55
|
+
if (!clerkUserData || !userId) {
|
|
56
|
+
console.error("Missing clerkUserData or userId:", { clerkUserData: clerkUserData, userId: userId });
|
|
57
|
+
setError("Missing user data for sync");
|
|
58
|
+
return [2 /*return*/];
|
|
59
|
+
}
|
|
60
|
+
if (userCache.has(userId)) {
|
|
61
|
+
setUser(userCache.get(userId));
|
|
62
|
+
setError(null);
|
|
63
|
+
return [2 /*return*/];
|
|
64
|
+
}
|
|
65
|
+
_a.label = 1;
|
|
66
|
+
case 1:
|
|
67
|
+
_a.trys.push([1, 6, , 7]);
|
|
68
|
+
return [4 /*yield*/, fetch("/api/sync-user", {
|
|
69
|
+
method: "POST",
|
|
70
|
+
headers: {
|
|
71
|
+
"Content-Type": "application/json",
|
|
72
|
+
},
|
|
73
|
+
body: JSON.stringify(clerkUserData),
|
|
74
|
+
})];
|
|
75
|
+
case 2:
|
|
76
|
+
response = _a.sent();
|
|
77
|
+
if (!!response.ok) return [3 /*break*/, 4];
|
|
78
|
+
return [4 /*yield*/, response.text()];
|
|
79
|
+
case 3:
|
|
80
|
+
errorText = _a.sent();
|
|
81
|
+
console.error("Failed to sync user: ".concat(response.status), errorText);
|
|
82
|
+
setError("Failed to sync user: ".concat(response.status));
|
|
83
|
+
return [2 /*return*/];
|
|
84
|
+
case 4: return [4 /*yield*/, response.json()];
|
|
85
|
+
case 5:
|
|
86
|
+
strapiUser = _a.sent();
|
|
87
|
+
userCache.set(userId, strapiUser);
|
|
88
|
+
setUser(strapiUser);
|
|
89
|
+
setError(null);
|
|
90
|
+
return [3 /*break*/, 7];
|
|
91
|
+
case 6:
|
|
92
|
+
error_1 = _a.sent();
|
|
93
|
+
console.error("Error syncing user to Strapi:", error_1);
|
|
94
|
+
setError(error_1 instanceof Error ? error_1.message : "Failed to sync user");
|
|
95
|
+
return [3 /*break*/, 7];
|
|
96
|
+
case 7: return [2 /*return*/];
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}); };
|
|
100
|
+
var checkSession = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
101
|
+
var err_1;
|
|
102
|
+
return __generator(this, function (_a) {
|
|
103
|
+
switch (_a.label) {
|
|
104
|
+
case 0:
|
|
105
|
+
setAuthLoading(true);
|
|
106
|
+
if (!isSignedIn || !userId || !clerkUser) {
|
|
107
|
+
setUser(null);
|
|
108
|
+
setError("User not signed in");
|
|
109
|
+
setAuthLoading(false);
|
|
110
|
+
return [2 /*return*/];
|
|
111
|
+
}
|
|
112
|
+
_a.label = 1;
|
|
113
|
+
case 1:
|
|
114
|
+
_a.trys.push([1, 3, 4, 5]);
|
|
115
|
+
return [4 /*yield*/, syncUserToStrapi(clerkUser)];
|
|
116
|
+
case 2:
|
|
117
|
+
_a.sent();
|
|
118
|
+
return [3 /*break*/, 5];
|
|
119
|
+
case 3:
|
|
120
|
+
err_1 = _a.sent();
|
|
121
|
+
console.error("checkSession error:", err_1);
|
|
122
|
+
setError(err_1 instanceof Error ? err_1.message : "Session check failed");
|
|
123
|
+
setUser(null);
|
|
124
|
+
return [3 /*break*/, 5];
|
|
125
|
+
case 4:
|
|
126
|
+
setAuthLoading(false);
|
|
127
|
+
return [7 /*endfinally*/];
|
|
128
|
+
case 5: return [2 /*return*/];
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}); };
|
|
132
|
+
useEffect(function () {
|
|
133
|
+
checkSession();
|
|
134
|
+
}, [isSignedIn, userId, clerkUser]);
|
|
135
|
+
return (<AuthContext.Provider value={{ user: user, authLoading: authLoading, error: error, checkSession: checkSession }}>
|
|
136
|
+
{children}
|
|
137
|
+
</AuthContext.Provider>);
|
|
138
|
+
}
|
|
139
|
+
export function useStrapiAuth() {
|
|
140
|
+
var context = useContext(AuthContext);
|
|
141
|
+
if (!context)
|
|
142
|
+
throw new Error("useStrapiAuth must be used within an AuthProvider");
|
|
143
|
+
return context;
|
|
144
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// constants.ts
|
|
2
|
+
// Constants for hardcoded text in the application, organized by file and purpose
|
|
3
|
+
export var ABOUT_PAGE = {
|
|
4
|
+
// UI Text for AboutPage.tsx
|
|
5
|
+
UI: {
|
|
6
|
+
// Main heading for the About page
|
|
7
|
+
MAIN_HEADING: "About DevVista Kit",
|
|
8
|
+
// Section heading for the client success story
|
|
9
|
+
SUCCESS_STORY_HEADING: "Client Success Story: Radio Host Ted Long’s Fitness Journey",
|
|
10
|
+
// Paragraph describing Ted Long's fitness journey
|
|
11
|
+
SUCCESS_STORY_TEXT: "\n Ted Long is a busy man, so creating the right workout plan for him was essential. I\n scheduled him to come to the gym five days per week just after his radio Co-hosting work at\n 93Q each day. Two days per week, Mondays and Fridays, we worked one on one for about 90\n minutes. Our workouts followed my philosophy of continuous cross training, so they included\n weight training, circuit training, interval training, core work and more. On Tuesdays,\n Wednesdays and Thursdays he joined in on my group exercise classes. On Tuesdays he joined\n Body Blast, where we worked on muscle strength and endurance from head to toe, and focused\n the first portion of that workout on the core of the body. On Wednesdays, Ted joined my\n Flex Fusion class, his favorite, which is a yoga-type class that focuses on flexibility,\n strength and balance. On Thursdays he came to my Core and Cardio X-train class. In that\n class, we first work the core of the body, often using stability balls, medicine balls and\n bosu\u2019s, we then do an intense cardio workout class. Thursday\u2019s class varies from step\n aerobics, cardio kickbox with jump ropes, to circuit or interval tyle workout classes. Ted was\n especially good on the step and not too shabby with a jump rope either! He was a pleasure\n to work with and we loved having him around!\n ",
|
|
12
|
+
},
|
|
13
|
+
// Error messages for AboutPage.tsx
|
|
14
|
+
ERRORS: {
|
|
15
|
+
// Error when bio data fetch fails with status code
|
|
16
|
+
FETCH_BIO_FAILED: "Failed to fetch bio data: ${response.status}",
|
|
17
|
+
// Error when bio data is not found in the response
|
|
18
|
+
BIO_NOT_FOUND: "Bio data not found",
|
|
19
|
+
// Generic error for bio data fetch failure
|
|
20
|
+
FETCH_BIO_ERROR: "An error occurred while fetching bio data",
|
|
21
|
+
// Error when user is not authorized to update bio
|
|
22
|
+
UNAUTHORIZED_UPDATE: "Unauthorized: Only admin can update bio data",
|
|
23
|
+
// Error when an invalid image type is uploaded
|
|
24
|
+
INVALID_IMAGE_TYPE: "Only JPEG, PNG, or GIF images are allowed",
|
|
25
|
+
// Error when no authentication token is available
|
|
26
|
+
NO_AUTH_TOKEN: "No authentication token available",
|
|
27
|
+
// Error when bio update fails with status code
|
|
28
|
+
UPDATE_BIO_FAILED: "Failed to update bio data: ${response.status}",
|
|
29
|
+
// Generic error for bio update failure
|
|
30
|
+
UPDATE_BIO_ERROR: "Failed to update bio data",
|
|
31
|
+
},
|
|
32
|
+
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// app/constants/adRequest.ts
|
|
2
|
+
// Constants for hardcoded text in app/adRequest/page.tsx, organized by purpose
|
|
3
|
+
export var AD_REQUEST_PAGE = {
|
|
4
|
+
// UI Text for AdRequest page
|
|
5
|
+
UI: {
|
|
6
|
+
// Heading when user is not signed in
|
|
7
|
+
NOT_AUTHENTICATED_HEADING: "Not authenticated",
|
|
8
|
+
// Message when user is not signed in
|
|
9
|
+
NOT_AUTHENTICATED_MESSAGE: "You must be logged in to view this page.",
|
|
10
|
+
// Heading when user is not admin
|
|
11
|
+
UNAUTHORIZED_HEADING: "Unauthorized",
|
|
12
|
+
// Message when user is not admin
|
|
13
|
+
UNAUTHORIZED_MESSAGE: "Only admins can access the Ad Request dashboard.",
|
|
14
|
+
// Main dashboard heading
|
|
15
|
+
DASHBOARD_HEADING: "Ad Request Dashboard",
|
|
16
|
+
// Dashboard subheading
|
|
17
|
+
DASHBOARD_SUBHEADING: "Create and manage your advertising campaigns",
|
|
18
|
+
// Message indicating admin access
|
|
19
|
+
ADMIN_ACCESS_MESSAGE: "Admin access granted",
|
|
20
|
+
// Heading for credits section
|
|
21
|
+
CREDITS_HEADING: "Available Credits",
|
|
22
|
+
// Description for credits section
|
|
23
|
+
CREDITS_DESCRIPTION: "Use credits to create ad requests",
|
|
24
|
+
// Partial text for credits reset date
|
|
25
|
+
CREDITS_RESET_TEXT: "Credits reset to 3 on ",
|
|
26
|
+
// Heading for ad request form
|
|
27
|
+
CREATE_AD_REQUEST_HEADING: "Create Ad Request",
|
|
28
|
+
// Description for ad request form
|
|
29
|
+
CREATE_AD_REQUEST_DESCRIPTION: "Specify your ad campaign details",
|
|
30
|
+
// Label for platform select
|
|
31
|
+
PLATFORM_LABEL: "Select Platform *",
|
|
32
|
+
// Placeholder for platform select
|
|
33
|
+
PLATFORM_PLACEHOLDER: "Choose a platform",
|
|
34
|
+
// Platform option for Facebook
|
|
35
|
+
FACEBOOK_ADS: "Facebook Ads",
|
|
36
|
+
// Platform option for TikTok
|
|
37
|
+
TIKTOK_ADS: "TikTok Ads",
|
|
38
|
+
// Error message when platform is not selected
|
|
39
|
+
PLATFORM_REQUIRED: "Please select a platform",
|
|
40
|
+
// Label for ad type input
|
|
41
|
+
AD_TYPE_LABEL: "Ad Type *",
|
|
42
|
+
// Placeholder for ad type input
|
|
43
|
+
AD_TYPE_PLACEHOLDER: "e.g., Video ad, Carousel ad, Story ad",
|
|
44
|
+
// Error message when ad type is empty
|
|
45
|
+
AD_TYPE_REQUIRED: "Please enter an ad type",
|
|
46
|
+
// Label for description textarea
|
|
47
|
+
DESCRIPTION_LABEL: "Additional Details",
|
|
48
|
+
// Placeholder for description textarea
|
|
49
|
+
DESCRIPTION_PLACEHOLDER: "Describe your target audience, goals, or specific requirements...",
|
|
50
|
+
// Character count text for description
|
|
51
|
+
DESCRIPTION_CHAR_COUNT: "{description.length}/500 characters",
|
|
52
|
+
// Partial text for no credits alert
|
|
53
|
+
NO_CREDITS_MESSAGE: "No credits available. ",
|
|
54
|
+
// Message for admins when no credits
|
|
55
|
+
NO_CREDITS_ADMIN: "Reset to continue.",
|
|
56
|
+
// Message for non-admins when no credits
|
|
57
|
+
NO_CREDITS_NON_ADMIN: "Await next reset.",
|
|
58
|
+
// Heading for confirm popup
|
|
59
|
+
CONFIRM_POPUP_HEADING: "Confirm Ad Request",
|
|
60
|
+
// Partial message for confirm popup
|
|
61
|
+
CONFIRM_POPUP_MESSAGE: "Are you sure you want to submit this ad request? This action cannot be undone unless you contact support at ",
|
|
62
|
+
// Email for confirm popup
|
|
63
|
+
SUPPORT_EMAIL: "devvistainfo@gmail.com",
|
|
64
|
+
// Heading for request history
|
|
65
|
+
REQUEST_HISTORY_HEADING: "Request History",
|
|
66
|
+
// Description for request history
|
|
67
|
+
REQUEST_HISTORY_DESCRIPTION: "View your recent ad requests",
|
|
68
|
+
// Message when no requests exist
|
|
69
|
+
NO_REQUESTS_MESSAGE: "No requests yet",
|
|
70
|
+
// Message encouraging first request
|
|
71
|
+
FIRST_REQUEST_MESSAGE: "Submit your first ad request to get started",
|
|
72
|
+
// Footer text about credits
|
|
73
|
+
FOOTER_TEXT: "Each ad request costs 1 credit • Credits reset monthly • Admin manual reset available",
|
|
74
|
+
// Success message after submission
|
|
75
|
+
SUCCESS_MESSAGE: "Ad request submitted successfully! Credit deducted.",
|
|
76
|
+
// Badge text for Facebook platform
|
|
77
|
+
FACEBOOK_BADGE: "Facebook",
|
|
78
|
+
// Badge text for TikTok platform
|
|
79
|
+
TIKTOK_BADGE: "TikTok",
|
|
80
|
+
},
|
|
81
|
+
// Button Text for AdRequest page
|
|
82
|
+
BUTTONS: {
|
|
83
|
+
// Reset credits button
|
|
84
|
+
RESET_CREDITS: "Reset Credits",
|
|
85
|
+
// Cancel button in confirm popup
|
|
86
|
+
CANCEL: "Cancel",
|
|
87
|
+
// Confirm button in confirm popup
|
|
88
|
+
CONFIRM: "Confirm",
|
|
89
|
+
// Submit button in non-loading state
|
|
90
|
+
SUBMIT_REQUEST: "Submit Request (1 Credit)",
|
|
91
|
+
// Submit button in loading state
|
|
92
|
+
SUBMITTING: "Submitting...",
|
|
93
|
+
},
|
|
94
|
+
// Error Messages for AdRequest page
|
|
95
|
+
ERRORS: {
|
|
96
|
+
// Default error for fetch failure
|
|
97
|
+
FETCH_AD_REQUESTS_FAILED: "Failed to fetch ad requests",
|
|
98
|
+
// Generic error for fetch and submit failures
|
|
99
|
+
UNKNOWN_ERROR: "An unknown error occurred",
|
|
100
|
+
// Error when submitting without sign-in
|
|
101
|
+
NOT_SIGNED_IN: "You must be signed in to submit an ad request",
|
|
102
|
+
// Error when no credits available
|
|
103
|
+
CREDIT_LIMIT_REACHED: "Monthly ad request limit reached (3 requests)",
|
|
104
|
+
// Error when required fields are missing
|
|
105
|
+
REQUIRED_FIELDS_MISSING: "Please fill in all required fields",
|
|
106
|
+
// Default error for submit failure
|
|
107
|
+
SUBMIT_AD_REQUEST_FAILED: "Failed to submit ad request",
|
|
108
|
+
// Error when non-admin tries to reset credits
|
|
109
|
+
UNAUTHORIZED_RESET: "Unauthorized: Only admins can reset credits",
|
|
110
|
+
// Default error for reset credits failure
|
|
111
|
+
RESET_CREDITS_FAILED: "Failed to reset credits!!",
|
|
112
|
+
},
|
|
113
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// app/constants/contact.ts
|
|
2
|
+
// Constants for hardcoded text in app/contact/page.tsx, organized by purpose
|
|
3
|
+
export var CONTACT_PAGE = {
|
|
4
|
+
// UI Text for ContactPage
|
|
5
|
+
UI: {
|
|
6
|
+
// Main heading for the Contact page
|
|
7
|
+
MAIN_HEADING: "Contact",
|
|
8
|
+
// Loading text for iframe
|
|
9
|
+
LOADING_TEXT: "Loading...",
|
|
10
|
+
// Section heading for contact info
|
|
11
|
+
CONTACT_INFO_HEADING: "Find Us",
|
|
12
|
+
// Address for contact info
|
|
13
|
+
ADDRESS: "215 W. Manlius St., East Syracuse, NY 13057",
|
|
14
|
+
// Phone number 1 for contact info
|
|
15
|
+
PHONE_1: "315-214-5466",
|
|
16
|
+
// Phone number 2 for contact info
|
|
17
|
+
PHONE_2: "315-415-4043",
|
|
18
|
+
// Email for contact info
|
|
19
|
+
SUPPORT_EMAIL: "devvistainfo@gmail.com",
|
|
20
|
+
// Heading for gym hours
|
|
21
|
+
HOURS_HEADING: "Hours of Gym",
|
|
22
|
+
// Text for gym hours
|
|
23
|
+
HOURS_TEXT: "Open 24/7—We Never Stop!",
|
|
24
|
+
// Title for map iframe
|
|
25
|
+
MAP_TITLE: "DevVista Kit Location",
|
|
26
|
+
},
|
|
27
|
+
// Error Messages and Toast Notifications for ContactPage
|
|
28
|
+
ERRORS: {
|
|
29
|
+
// Form validation error for name
|
|
30
|
+
NAME_VALIDATION_ERROR: "Name must be at least 2 characters.",
|
|
31
|
+
// Form validation error for email
|
|
32
|
+
EMAIL_VALIDATION_ERROR: "Please enter a valid email address.",
|
|
33
|
+
// Form validation error for message
|
|
34
|
+
MESSAGE_VALIDATION_ERROR: "Message must be at least 10 characters.",
|
|
35
|
+
// Toast title on successful form submission
|
|
36
|
+
TOAST_SUCCESS_TITLE: "Message Fired Off!",
|
|
37
|
+
// Toast description on successful form submission
|
|
38
|
+
TOAST_SUCCESS_DESCRIPTION: "We’ll hit you back ASAP—get ready!",
|
|
39
|
+
},
|
|
40
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// app/constants/faq.ts
|
|
2
|
+
// Constants for hardcoded text in app/faq/page.tsx, organized by purpose
|
|
3
|
+
export var FAQ_PAGE = {
|
|
4
|
+
// UI Text for FAQPage
|
|
5
|
+
UI: {
|
|
6
|
+
// Main heading for the FAQ page
|
|
7
|
+
MAIN_HEADING: "Frequently Asked Questions",
|
|
8
|
+
// FAQ 1
|
|
9
|
+
FAQ_1_QUESTION: "Who should check with a doctor before starting an exercise program?",
|
|
10
|
+
FAQ_1_ANSWER: "You should check with your doctor before you start any exercise program if you are over 40, if you smoke, if you are being treated for any chronic illness or injury, if you lead a sedentary lifestyle, if you are on medications, have diabetes, high blood pressure, or high cholesterol, any history of heart disease, back pain or any other orthopedic problems.",
|
|
11
|
+
// FAQ 2
|
|
12
|
+
FAQ_2_QUESTION: "How many days per week should I exercise?",
|
|
13
|
+
FAQ_2_ANSWER: "The old government guidelines used to suggest that three days per week was all that was needed, but the new government guidelines suggest that persons should exercise most days per week. So if you aim to do some form of physical activity 6 to 7 times per week, and if you only get in 4 to 5 days, that’s not so bad!",
|
|
14
|
+
// FAQ 3
|
|
15
|
+
FAQ_3_QUESTION: "What is the best type of cardiovascular exercise a person can do?",
|
|
16
|
+
FAQ_3_ANSWER: "There are so many forms of cardiovascular exercise a person can choose from. Some of the more common forms are walking, running, cycling, swimming, cross country skiing, elliptical trainer, stair climber, any aerobics class (step, kickboxing, high/low dance etc…), jump rope, rebounding on a mini trampoline as well as sports such as soccer and basketball and many more. The best type of cardiovascular exercise for any person are the ones that the individual enjoys and will stick with over the long haul. Not every exercise is for every person, but each person can find something that suits their needs and abilities.",
|
|
17
|
+
// FAQ 4
|
|
18
|
+
FAQ_4_QUESTION: "What is my Target Heart Rate and how do I find it?",
|
|
19
|
+
FAQ_4_ANSWER: "Your target heart rate is where your heart rate should optimally be during an aerobic workout. Your target heart rate range is 50% – 90% of your maximum heart rate. Here’s how to calculate your target heart rate: 220 – your age = Maximum Heart Rate (MHR). MHR times 50% to 90% = Target Heart Rate (THR). These numbers serve as a guideline—an indicator of how hard you should be working. Newer exercisers should begin at the lower end of the % and experienced exercisers can go up toward the higher end of the % as their fitness levels increase and allow.",
|
|
20
|
+
// FAQ 5
|
|
21
|
+
FAQ_5_QUESTION: "How often should I lift weights?",
|
|
22
|
+
FAQ_5_ANSWER: "In general, strength training or weight lifting for each muscle group should be done 2 to 3 days per week on non-consecutive days. On the other hand, you don’t have to take the all or nothing approach either. It’s better to do a little strength training than none at all. So, even if you can only fit in one strength training routine in a week, you’ll still benefit from it.",
|
|
23
|
+
// FAQ 6
|
|
24
|
+
FAQ_6_QUESTION: "How long will it take before I see results?",
|
|
25
|
+
FAQ_6_ANSWER: "Seeing results usually varies with each individual. Generally, if a person is consistent with a balanced program, they should begin to feel a difference in their bodies in about three weeks and actually see some significant changes in about three months.",
|
|
26
|
+
// FAQ 7
|
|
27
|
+
FAQ_7_QUESTION: "When is the best time to stretch my muscles, before or after a workout?",
|
|
28
|
+
FAQ_7_ANSWER: "Stretching and flexibility are very important aspects of good physical fitness. Ideally it’s best to stretch before and after a workout. When stretching before a workout, be sure that the muscles are warmed up for at least 5 minutes. If you can’t do both, then make stretching after your workout a priority. Remember to start slowly, breathe into the stretch and don’t bounce!",
|
|
29
|
+
// FAQ 8
|
|
30
|
+
FAQ_8_QUESTION: "Should I eat before or after a workout?",
|
|
31
|
+
FAQ_8_ANSWER: "It’s okay to eat certain foods before and after exercise, but don’t overdo it. Consuming a heavy meal just before a workout can interfere with proper digestion. By the same token, don’t try to work out if you are starving. Your body needs fuel for the activity. Some quick carbohydrates from a piece of fruit or an energy bar should do the trick. The same goes for an early morning workout; maybe a piece of whole grain toast and some fruit juice. After exercise, allow your body to cool down before eating. Then be sure to include some carbs with your meal to replace the glycogen stores in the muscle that you used during your workout. And of course, be sure to drink plenty of water before, during and after your workouts.",
|
|
32
|
+
// FAQ 9
|
|
33
|
+
FAQ_9_QUESTION: "What can I do to stay motivated to work out?",
|
|
34
|
+
FAQ_9_ANSWER: "Staying motivated over the long haul can sometimes be a challenge. Get a friend/spouse or significant other to join you and help keep you accountable. You can also try changing your routine every few months. Maybe trying a new class at your health club or take your workouts outside for a change. You may also want to hire a qualified personal trainer for a few sessions to give you different ideas on how to change your current workouts to keep them fun and effective.",
|
|
35
|
+
},
|
|
36
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// app/constants/gallery.ts
|
|
2
|
+
// Constants for hardcoded text in app/gallery/page.tsx, organized by purpose
|
|
3
|
+
export var GALLERY_PAGE = {
|
|
4
|
+
// UI Text for GalleryPage
|
|
5
|
+
UI: {
|
|
6
|
+
// Main heading for the Gallery page
|
|
7
|
+
MAIN_HEADING: "Gallery",
|
|
8
|
+
// Loading text for admin status feedback
|
|
9
|
+
LOADING_TEXT: "Loading...",
|
|
10
|
+
// Message when logged in as admin
|
|
11
|
+
ADMIN_LOGGED_IN_MESSAGE: "You are logged in as an admin.",
|
|
12
|
+
},
|
|
13
|
+
// Error Messages for GalleryPage
|
|
14
|
+
ERRORS: {
|
|
15
|
+
// Error when no authentication token is available
|
|
16
|
+
NO_AUTH_TOKEN: "No authentication token available",
|
|
17
|
+
// Error when fetching images fails with error text
|
|
18
|
+
FETCH_IMAGES_FAILED: "Failed to load images: ${errorText}",
|
|
19
|
+
// Warning when more than 100 images are available
|
|
20
|
+
PAGINATION_WARNING: "Warning: Only the first 100 images are displayed. Contact support to view all images.",
|
|
21
|
+
// Generic error for fetch failure
|
|
22
|
+
FETCH_ERROR: "An error occurred while fetching data",
|
|
23
|
+
// Error when no file is selected for upload
|
|
24
|
+
NO_FILE_SELECTED: "No file selected",
|
|
25
|
+
// Error when an invalid file type is uploaded
|
|
26
|
+
INVALID_FILE_TYPE: "Only JPEG, PNG, or GIF images are allowed",
|
|
27
|
+
// Error when non-admin tries to upload
|
|
28
|
+
UNAUTHORIZED_UPLOAD: "Unauthorized: Only admins can upload images",
|
|
29
|
+
// Error for authentication issues during upload or delete
|
|
30
|
+
AUTHENTICATION_ERROR: "Authentication error. Please log in again.",
|
|
31
|
+
// Error when upload fails with status code
|
|
32
|
+
UPLOAD_IMAGE_FAILED: "Failed to upload image: ${response.status}",
|
|
33
|
+
// Generic error for upload failure
|
|
34
|
+
UPLOAD_IMAGE_ERROR: "Failed to upload image",
|
|
35
|
+
// Error when non-admin tries to delete
|
|
36
|
+
UNAUTHORIZED_DELETE: "Unauthorized: Only admins can delete images",
|
|
37
|
+
// Error when delete fails with status code
|
|
38
|
+
DELETE_IMAGE_FAILED: "Failed to delete image: ${response.status}",
|
|
39
|
+
// Generic error for delete failure
|
|
40
|
+
DELETE_IMAGE_ERROR: "Failed to delete image",
|
|
41
|
+
},
|
|
42
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// app/constants/home.ts
|
|
2
|
+
// Constants for hardcoded text in app/page.tsx, organized by purpose
|
|
3
|
+
export var HOME_PAGE = {
|
|
4
|
+
// UI Text for HomePage
|
|
5
|
+
UI: {
|
|
6
|
+
// HeroSection title
|
|
7
|
+
HERO_TITLE: "DevVista Kit",
|
|
8
|
+
// HeroSection subtitle
|
|
9
|
+
HERO_SUBTITLE: "Your 24/7 Fitness Destination",
|
|
10
|
+
// HeroSection video aria label
|
|
11
|
+
HERO_VIDEO_ARIA_LABEL: "Promotional video for DevVista Kit",
|
|
12
|
+
// FeaturesSection title
|
|
13
|
+
FEATURES_TITLE: "Zumba®",
|
|
14
|
+
// FeaturesSection description
|
|
15
|
+
FEATURES_DESCRIPTION: "Variety of Memberships Available",
|
|
16
|
+
// Features for FeaturesSection
|
|
17
|
+
FEATURE_1: "24 Hour Access",
|
|
18
|
+
FEATURE_2: "Locker Rooms",
|
|
19
|
+
FEATURE_3: "Strength, Cardio & Flexibility Classes",
|
|
20
|
+
FEATURE_4: "Personal Training",
|
|
21
|
+
FEATURE_5: "Partner and Small Group Training",
|
|
22
|
+
// Background images for ScheduleCarousel
|
|
23
|
+
BACKGROUND_IMAGE_1: "/images/classes/zoomba.jpg",
|
|
24
|
+
BACKGROUND_IMAGE_2: "/images/classes/cardioxtrain.jpg",
|
|
25
|
+
BACKGROUND_IMAGE_3: "/images/classes/seniorstretch.jpg",
|
|
26
|
+
BACKGROUND_IMAGE_4: "/images/classes/bodyblast.jpg",
|
|
27
|
+
BACKGROUND_IMAGE_5: "/images/classes/flexiblefriday.jpg",
|
|
28
|
+
BACKGROUND_IMAGE_6: "/images/classes/combo.jpg",
|
|
29
|
+
BACKGROUND_IMAGE_7: "/images/classes/noclasses.jpg",
|
|
30
|
+
// Video source for HeroSection
|
|
31
|
+
HERO_VIDEO_SRC: "/images/videos/FitStopLoopVideo.mp4",
|
|
32
|
+
},
|
|
33
|
+
// Button Text for HomePage
|
|
34
|
+
BUTTONS: {
|
|
35
|
+
// HeroSection call-to-action text
|
|
36
|
+
HERO_CTA_TEXT: "Check Our Rates",
|
|
37
|
+
// FeaturesSection call-to-action text
|
|
38
|
+
FEATURES_CTA_TEXT: "Explore Classes",
|
|
39
|
+
},
|
|
40
|
+
// Error Messages for HomePage
|
|
41
|
+
ERRORS: {
|
|
42
|
+
// Error when schedule fetch fails
|
|
43
|
+
FETCH_SCHEDULE_FAILED: "Failed to load schedule. Displaying empty schedule.",
|
|
44
|
+
// Warning when more than 100 files are available
|
|
45
|
+
PAGINATION_WARNING: "Warning: Only the first 100 files are displayed. Contact support to view all files.",
|
|
46
|
+
// Error when files fetch fails
|
|
47
|
+
FETCH_FILES_FAILED: "Failed to load files.",
|
|
48
|
+
// Generic error for fetch failure
|
|
49
|
+
FETCH_ERROR: "An error occurred while fetching data",
|
|
50
|
+
// Error when non-admin tries to upload
|
|
51
|
+
UNAUTHORIZED_UPLOAD: "Unauthorized: Only admin can upload files",
|
|
52
|
+
// Error when no file is selected for upload
|
|
53
|
+
NO_FILE_SELECTED: "No file selected",
|
|
54
|
+
// Error when an invalid file type is uploaded
|
|
55
|
+
INVALID_FILE_TYPE: "Only PDF files are allowed",
|
|
56
|
+
// Error when no authentication token is available
|
|
57
|
+
NO_AUTH_TOKEN: "No authentication token available",
|
|
58
|
+
// Error when upload fails with status code
|
|
59
|
+
UPLOAD_FILE_FAILED: "Failed to upload file: ${response.status}",
|
|
60
|
+
// Generic error for upload failure
|
|
61
|
+
UPLOAD_FILE_ERROR: "Failed to upload file",
|
|
62
|
+
// Error when non-admin tries to delete
|
|
63
|
+
UNAUTHORIZED_DELETE: "Unauthorized: Only admin can delete files",
|
|
64
|
+
// Error when delete fails with status code
|
|
65
|
+
DELETE_FILE_FAILED: "Failed to delete file: ${response.status}",
|
|
66
|
+
// Generic error for delete failure
|
|
67
|
+
DELETE_FILE_ERROR: "Failed to delete file",
|
|
68
|
+
},
|
|
69
|
+
};
|