@devvistatech/devvista-kit 0.0.10 → 0.0.12
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/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 -34
- 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
- package/dist/.next/types/app/api/about/route.js +0 -52
- package/dist/.next/types/app/api/blog/route.js +0 -52
- package/dist/.next/types/app/api/files/route.js +0 -52
- package/dist/.next/types/app/api/schedule/route.js +0 -52
- package/dist/.next/types/app/api/sync-user/route.js +0 -52
- package/dist/.next/types/app/layout.js +0 -22
- package/dist/.next/types/app/page.js +0 -22
- package/dist/app/about/page.jsx +0 -258
- package/dist/app/adRequest/page.jsx +0 -531
- package/dist/app/analytics/page.jsx +0 -298
- package/dist/app/api/about/route.js +0 -285
- package/dist/app/api/adRequest/route.js +0 -440
- package/dist/app/api/analytics/[reportType]/route.js +0 -357
- package/dist/app/api/bio/route.js +0 -293
- package/dist/app/api/blog/route.js +0 -366
- package/dist/app/api/chat/route.js +0 -58
- package/dist/app/api/contact/route.js +0 -163
- package/dist/app/api/contacts/route.js +0 -234
- package/dist/app/api/files/route.js +0 -444
- package/dist/app/api/gallery-data/route.js +0 -719
- package/dist/app/api/schedule/route.js +0 -461
- package/dist/app/api/sync-user/route.js +0 -186
- package/dist/app/api/trial-request/route.js +0 -165
- package/dist/app/blog/[id]/page.jsx +0 -312
- package/dist/app/blog/page.jsx +0 -210
- package/dist/app/constants/about.js +0 -32
- package/dist/app/constants/adRequest.js +0 -113
- package/dist/app/constants/contact.js +0 -40
- package/dist/app/constants/faq.js +0 -36
- package/dist/app/constants/gallery.js +0 -42
- package/dist/app/constants/page.js +0 -69
- package/dist/app/constants/schedule.js +0 -71
- package/dist/app/contact/page.jsx +0 -119
- package/dist/app/faq/page.jsx +0 -97
- package/dist/app/gallery/page.jsx +0 -281
- package/dist/app/layout.jsx +0 -45
- package/dist/app/not-found.jsx +0 -14
- package/dist/app/page.jsx +0 -324
- package/dist/app/schedule/page.jsx +0 -500
- package/dist/components/addOns/functional/BioEditor.jsx +0 -187
- package/dist/components/addOns/functional/CalendlyWidget.jsx +0 -61
- package/dist/components/addOns/functional/ClassList.jsx +0 -158
- package/dist/components/addOns/functional/ClassPopup.jsx +0 -300
- package/dist/components/addOns/functional/ContactForm.jsx +0 -219
- package/dist/components/addOns/functional/FileUploader.jsx +0 -222
- package/dist/components/addOns/functional/ImageDescCarousel.jsx +0 -491
- package/dist/components/addOns/functional/NewUserAnalytics.jsx +0 -71
- package/dist/components/addOns/functional/ScheduleCarousel.jsx +0 -68
- package/dist/components/addOns/functional/aboutSections/AboutSection.jsx +0 -372
- package/dist/components/addOns/functional/aboutSections/constants/aboutSection.js +0 -65
- package/dist/components/addOns/functional/blogSections/BlogDashboard.jsx +0 -111
- package/dist/components/addOns/functional/blogSections/BlogFormPopUp.jsx +0 -465
- package/dist/components/addOns/functional/blogSections/BlogList.jsx +0 -170
- package/dist/components/addOns/functional/blogSections/BlogSidebar.jsx +0 -35
- package/dist/components/addOns/functional/blogSections/constants/blogDashboard.js +0 -28
- package/dist/components/addOns/functional/blogSections/constants/blogFormPopUp.js +0 -97
- package/dist/components/addOns/functional/blogSections/constants/blogList.js +0 -22
- package/dist/components/addOns/functional/blogSections/constants/blogSidebar.js +0 -15
- package/dist/components/addOns/functional/contactsDashboard/ContactsDashboard.jsx +0 -355
- package/dist/components/addOns/functional/contactsDashboard/constants/contactsDashboard.js +0 -70
- package/dist/components/addOns/functional/galleries/GalleryComplex.jsx +0 -605
- package/dist/components/addOns/functional/galleries/GallerySimple.jsx +0 -363
- package/dist/components/addOns/functional/galleries/constants/galleryComplex.js +0 -106
- package/dist/components/addOns/functional/galleries/constants/gallerySimple.js +0 -76
- package/dist/components/addOns/functional/schedules/ScheduleGridOne.jsx +0 -167
- package/dist/components/addOns/functional/schedules/ScheduleGridTwo.jsx +0 -100
- package/dist/components/addOns/functional/schedules/ScheduleGridTwoBasic.jsx +0 -97
- package/dist/components/addOns/functional/schedules/SchedulerForm.jsx +0 -188
- package/dist/components/addOns/functional/schedules/constants/ScheduleGridTwo.js +0 -40
- package/dist/components/addOns/functional/schedules/constants/ScheduleGridTwoBasic.js +0 -40
- package/dist/components/addOns/functional/schedules/constants/SchedulerForm.js +0 -65
- package/dist/components/addOns/functional/schedules/constants/scheduleGridOne.js +0 -54
- package/dist/components/addOns/non-functional/AnnouncementBanner.jsx +0 -24
- package/dist/components/addOns/non-functional/FeaturesSection.jsx +0 -38
- package/dist/components/addOns/non-functional/HeroSection.jsx +0 -71
- package/dist/components/addOns/non-functional/Heros/HeroSection.jsx +0 -71
- package/dist/components/addOns/non-functional/IconBubble.jsx +0 -36
- package/dist/components/addOns/non-functional/SampleCarousel.jsx +0 -114
- package/dist/components/addOns/non-functional/Testimonials.jsx +0 -177
- package/dist/components/addOns/non-functional/ThreeSetGallery.jsx +0 -40
- package/dist/components/addOns/non-functional/aboutSections/AboutSection.jsx +0 -35
- package/dist/components/addOns/non-functional/aboutSections/constants/aboutSection.js +0 -24
- package/dist/components/addOns/non-functional/imageCarousels/ProductSlider.jsx +0 -80
- package/dist/components/addOns/non-functional/imageCarousels/ProgramCarousel.jsx +0 -155
- package/dist/components/addOns/non-functional/imageCarousels/constants/programCarousel.js +0 -39
- package/dist/components/addOns/non-functional/imageCarousels/constants/programSlider.js +0 -36
- package/dist/components/addOns/non-functional/spinner.jsx +0 -13
- package/dist/components/footers/footer.jsx +0 -217
- package/dist/components/navBars/navbar.jsx +0 -159
- package/dist/components/other/accordion.jsx +0 -40
- package/dist/components/other/admin-menu.jsx +0 -34
- package/dist/components/other/alert-dialog.jsx +0 -64
- package/dist/components/other/alert.jsx +0 -41
- package/dist/components/other/aspect-ratio.jsx +0 -4
- package/dist/components/other/avatar.jsx +0 -31
- package/dist/components/other/badge.jsx +0 -32
- package/dist/components/other/breadcrumb.jsx +0 -57
- package/dist/components/other/button.jsx +0 -322
- package/dist/components/other/calendar.jsx +0 -43
- package/dist/components/other/card.jsx +0 -44
- package/dist/components/other/carousel.jsx +0 -140
- package/dist/components/other/chart.jsx +0 -182
- package/dist/components/other/checkbox.jsx +0 -26
- package/dist/components/other/collapsible.jsx +0 -6
- package/dist/components/other/command.jsx +0 -68
- package/dist/components/other/context-menu.jsx +0 -88
- package/dist/components/other/dialog.jsx +0 -60
- package/dist/components/other/drawer.jsx +0 -60
- package/dist/components/other/dropdown-menu.jsx +0 -90
- package/dist/components/other/form.jsx +0 -89
- package/dist/components/other/hover-card.jsx +0 -23
- package/dist/components/other/input-otp.jsx +0 -46
- package/dist/components/other/input.jsx +0 -19
- package/dist/components/other/label.jsx +0 -23
- package/dist/components/other/login-popup.jsx +0 -1
- package/dist/components/other/menubar.jsx +0 -96
- package/dist/components/other/mobile-icon.jsx +0 -11
- package/dist/components/other/navigation-menu.jsx +0 -62
- package/dist/components/other/pagination.jsx +0 -63
- package/dist/components/other/popover.jsx +0 -25
- package/dist/components/other/progress.jsx +0 -23
- package/dist/components/other/radio-group.jsx +0 -31
- package/dist/components/other/resizable.jsx +0 -29
- package/dist/components/other/scroll-area.jsx +0 -36
- package/dist/components/other/select.jsx +0 -83
- package/dist/components/other/separator.jsx +0 -21
- package/dist/components/other/sheet.jsx +0 -74
- package/dist/components/other/signup-popup.jsx +0 -1
- package/dist/components/other/skeleton.jsx +0 -17
- package/dist/components/other/slider.jsx +0 -26
- package/dist/components/other/social-icons.jsx +0 -15
- package/dist/components/other/sonner.jsx +0 -27
- package/dist/components/other/switch.jsx +0 -23
- package/dist/components/other/table.jsx +0 -56
- package/dist/components/other/tabs.jsx +0 -32
- package/dist/components/other/textarea.jsx +0 -19
- package/dist/components/other/toast.jsx +0 -58
- package/dist/components/other/toaster.jsx +0 -31
- package/dist/components/other/toggle-group.jsx +0 -41
- package/dist/components/other/toggle.jsx +0 -39
- package/dist/components/other/tooltip.jsx +0 -24
- package/dist/components/theme-provider.jsx +0 -18
- package/dist/components/types.js +0 -1
- package/dist/hooks/use-toast.js +0 -135
- package/dist/lib/auth-context.jsx +0 -144
- package/dist/lib/constants/about.js +0 -32
- package/dist/lib/constants/adRequest.js +0 -113
- package/dist/lib/constants/contact.js +0 -40
- package/dist/lib/constants/faq.js +0 -36
- package/dist/lib/constants/gallery.js +0 -42
- package/dist/lib/constants/page.js +0 -69
- package/dist/lib/constants/schedule.js +0 -71
- package/dist/lib/google-analytics.jsx +0 -148
- package/dist/lib/utils.js +0 -9
- package/dist/lib/verify-user.js +0 -142
- package/dist/middleware.js +0 -37
- package/dist/tailwind.config.js +0 -86
- package/dist/tsconfig.tsbuildinfo +0 -1
package/lib/constants/page.ts
CHANGED
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
// app/constants/home.ts
|
|
2
|
-
// Constants for hardcoded text in app/page.tsx, organized by purpose
|
|
3
|
-
|
|
4
|
-
export const HOME_PAGE = {
|
|
5
|
-
// UI Text for HomePage
|
|
6
|
-
UI: {
|
|
7
|
-
// HeroSection title
|
|
8
|
-
HERO_TITLE: "DevVista Kit",
|
|
9
|
-
// HeroSection subtitle
|
|
10
|
-
HERO_SUBTITLE: "Start Building!",
|
|
11
|
-
// HeroSection video aria label
|
|
12
|
-
HERO_VIDEO_ARIA_LABEL: "Promotional video for DevVista Kit",
|
|
13
|
-
// FeaturesSection title
|
|
14
|
-
FEATURES_TITLE: "Zumba®",
|
|
15
|
-
// FeaturesSection description
|
|
16
|
-
FEATURES_DESCRIPTION: "Variety of Memberships Available",
|
|
17
|
-
// Features for FeaturesSection
|
|
18
|
-
FEATURE_1: "24 Hour Access",
|
|
19
|
-
FEATURE_2: "Locker Rooms",
|
|
20
|
-
FEATURE_3: "Strength, Cardio & Flexibility Classes",
|
|
21
|
-
FEATURE_4: "Personal Training",
|
|
22
|
-
FEATURE_5: "Partner and Small Group Training",
|
|
23
|
-
// Background images for ScheduleCarousel
|
|
24
|
-
BACKGROUND_IMAGE_1: "/images/classes/zoomba.jpg",
|
|
25
|
-
BACKGROUND_IMAGE_2: "/images/classes/cardioxtrain.jpg",
|
|
26
|
-
BACKGROUND_IMAGE_3: "/images/classes/seniorstretch.jpg",
|
|
27
|
-
BACKGROUND_IMAGE_4: "/images/classes/bodyblast.jpg",
|
|
28
|
-
BACKGROUND_IMAGE_5: "/images/classes/flexiblefriday.jpg",
|
|
29
|
-
BACKGROUND_IMAGE_6: "/images/classes/combo.jpg",
|
|
30
|
-
BACKGROUND_IMAGE_7: "/images/classes/noclasses.jpg",
|
|
31
|
-
// Video source for HeroSection
|
|
32
|
-
HERO_VIDEO_SRC: "/images/videos/TestLoopVideo.mp4",
|
|
33
|
-
},
|
|
34
|
-
// Button Text for HomePage
|
|
35
|
-
BUTTONS: {
|
|
36
|
-
// HeroSection call-to-action text
|
|
37
|
-
HERO_CTA_TEXT: "Check Our Rates",
|
|
38
|
-
// FeaturesSection call-to-action text
|
|
39
|
-
FEATURES_CTA_TEXT: "Explore Classes",
|
|
40
|
-
},
|
|
41
|
-
// Error Messages for HomePage
|
|
42
|
-
ERRORS: {
|
|
43
|
-
// Error when schedule fetch fails
|
|
44
|
-
FETCH_SCHEDULE_FAILED: "Failed to load schedule. Displaying empty schedule.",
|
|
45
|
-
// Warning when more than 100 files are available
|
|
46
|
-
PAGINATION_WARNING: "Warning: Only the first 100 files are displayed. Contact support to view all files.",
|
|
47
|
-
// Error when files fetch fails
|
|
48
|
-
FETCH_FILES_FAILED: "Failed to load files.",
|
|
49
|
-
// Generic error for fetch failure
|
|
50
|
-
FETCH_ERROR: "An error occurred while fetching data",
|
|
51
|
-
// Error when non-admin tries to upload
|
|
52
|
-
UNAUTHORIZED_UPLOAD: "Unauthorized: Only admin can upload files",
|
|
53
|
-
// Error when no file is selected for upload
|
|
54
|
-
NO_FILE_SELECTED: "No file selected",
|
|
55
|
-
// Error when an invalid file type is uploaded
|
|
56
|
-
INVALID_FILE_TYPE: "Only PDF files are allowed",
|
|
57
|
-
// Error when no authentication token is available
|
|
58
|
-
NO_AUTH_TOKEN: "No authentication token available",
|
|
59
|
-
// Error when upload fails with status code
|
|
60
|
-
UPLOAD_FILE_FAILED: "Failed to upload file: ${response.status}",
|
|
61
|
-
// Generic error for upload failure
|
|
62
|
-
UPLOAD_FILE_ERROR: "Failed to upload file",
|
|
63
|
-
// Error when non-admin tries to delete
|
|
64
|
-
UNAUTHORIZED_DELETE: "Unauthorized: Only admin can delete files",
|
|
65
|
-
// Error when delete fails with status code
|
|
66
|
-
DELETE_FILE_FAILED: "Failed to delete file: ${response.status}",
|
|
67
|
-
// Generic error for delete failure
|
|
68
|
-
DELETE_FILE_ERROR: "Failed to delete file",
|
|
69
|
-
},
|
|
1
|
+
// app/constants/home.ts
|
|
2
|
+
// Constants for hardcoded text in app/page.tsx, organized by purpose
|
|
3
|
+
|
|
4
|
+
export const HOME_PAGE = {
|
|
5
|
+
// UI Text for HomePage
|
|
6
|
+
UI: {
|
|
7
|
+
// HeroSection title
|
|
8
|
+
HERO_TITLE: "DevVista Kit",
|
|
9
|
+
// HeroSection subtitle
|
|
10
|
+
HERO_SUBTITLE: "Start Building!",
|
|
11
|
+
// HeroSection video aria label
|
|
12
|
+
HERO_VIDEO_ARIA_LABEL: "Promotional video for DevVista Kit",
|
|
13
|
+
// FeaturesSection title
|
|
14
|
+
FEATURES_TITLE: "Zumba®",
|
|
15
|
+
// FeaturesSection description
|
|
16
|
+
FEATURES_DESCRIPTION: "Variety of Memberships Available",
|
|
17
|
+
// Features for FeaturesSection
|
|
18
|
+
FEATURE_1: "24 Hour Access",
|
|
19
|
+
FEATURE_2: "Locker Rooms",
|
|
20
|
+
FEATURE_3: "Strength, Cardio & Flexibility Classes",
|
|
21
|
+
FEATURE_4: "Personal Training",
|
|
22
|
+
FEATURE_5: "Partner and Small Group Training",
|
|
23
|
+
// Background images for ScheduleCarousel
|
|
24
|
+
BACKGROUND_IMAGE_1: "/images/classes/zoomba.jpg",
|
|
25
|
+
BACKGROUND_IMAGE_2: "/images/classes/cardioxtrain.jpg",
|
|
26
|
+
BACKGROUND_IMAGE_3: "/images/classes/seniorstretch.jpg",
|
|
27
|
+
BACKGROUND_IMAGE_4: "/images/classes/bodyblast.jpg",
|
|
28
|
+
BACKGROUND_IMAGE_5: "/images/classes/flexiblefriday.jpg",
|
|
29
|
+
BACKGROUND_IMAGE_6: "/images/classes/combo.jpg",
|
|
30
|
+
BACKGROUND_IMAGE_7: "/images/classes/noclasses.jpg",
|
|
31
|
+
// Video source for HeroSection
|
|
32
|
+
HERO_VIDEO_SRC: "/images/videos/TestLoopVideo.mp4",
|
|
33
|
+
},
|
|
34
|
+
// Button Text for HomePage
|
|
35
|
+
BUTTONS: {
|
|
36
|
+
// HeroSection call-to-action text
|
|
37
|
+
HERO_CTA_TEXT: "Check Our Rates",
|
|
38
|
+
// FeaturesSection call-to-action text
|
|
39
|
+
FEATURES_CTA_TEXT: "Explore Classes",
|
|
40
|
+
},
|
|
41
|
+
// Error Messages for HomePage
|
|
42
|
+
ERRORS: {
|
|
43
|
+
// Error when schedule fetch fails
|
|
44
|
+
FETCH_SCHEDULE_FAILED: "Failed to load schedule. Displaying empty schedule.",
|
|
45
|
+
// Warning when more than 100 files are available
|
|
46
|
+
PAGINATION_WARNING: "Warning: Only the first 100 files are displayed. Contact support to view all files.",
|
|
47
|
+
// Error when files fetch fails
|
|
48
|
+
FETCH_FILES_FAILED: "Failed to load files.",
|
|
49
|
+
// Generic error for fetch failure
|
|
50
|
+
FETCH_ERROR: "An error occurred while fetching data",
|
|
51
|
+
// Error when non-admin tries to upload
|
|
52
|
+
UNAUTHORIZED_UPLOAD: "Unauthorized: Only admin can upload files",
|
|
53
|
+
// Error when no file is selected for upload
|
|
54
|
+
NO_FILE_SELECTED: "No file selected",
|
|
55
|
+
// Error when an invalid file type is uploaded
|
|
56
|
+
INVALID_FILE_TYPE: "Only PDF files are allowed",
|
|
57
|
+
// Error when no authentication token is available
|
|
58
|
+
NO_AUTH_TOKEN: "No authentication token available",
|
|
59
|
+
// Error when upload fails with status code
|
|
60
|
+
UPLOAD_FILE_FAILED: "Failed to upload file: ${response.status}",
|
|
61
|
+
// Generic error for upload failure
|
|
62
|
+
UPLOAD_FILE_ERROR: "Failed to upload file",
|
|
63
|
+
// Error when non-admin tries to delete
|
|
64
|
+
UNAUTHORIZED_DELETE: "Unauthorized: Only admin can delete files",
|
|
65
|
+
// Error when delete fails with status code
|
|
66
|
+
DELETE_FILE_FAILED: "Failed to delete file: ${response.status}",
|
|
67
|
+
// Generic error for delete failure
|
|
68
|
+
DELETE_FILE_ERROR: "Failed to delete file",
|
|
69
|
+
},
|
|
70
70
|
};
|
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
// app/constants/schedule.ts
|
|
2
|
-
// Constants for hardcoded text in app/schedule/page.tsx, organized by purpose
|
|
3
|
-
|
|
4
|
-
export const SCHEDULE_PAGE = {
|
|
5
|
-
// UI Text for SchedulePage
|
|
6
|
-
UI: {
|
|
7
|
-
// Main heading for the Schedule page
|
|
8
|
-
MAIN_HEADING: "Rates & Classes",
|
|
9
|
-
// Section heading for membership plans
|
|
10
|
-
MEMBERSHIP_HEADING: "Membership & Training",
|
|
11
|
-
// Bold text for family rates
|
|
12
|
-
FAMILY_RATES_BOLD: "Family Rates:",
|
|
13
|
-
// Text for family rates
|
|
14
|
-
FAMILY_RATES_TEXT: "½ off Select or Basic 12-month programs for additional members living with you!",
|
|
15
|
-
// Bold text for membership note
|
|
16
|
-
NOTE_BOLD: "*Note:",
|
|
17
|
-
// Text for membership note
|
|
18
|
-
NOTE_TEXT: "Training clients who train at least two sessions per week with a trainer will receive Basic Membership Status in addition, for an extra $100.00, training clients can also receive 24-hour access privileges.",
|
|
19
|
-
// Section heading for class descriptions
|
|
20
|
-
CLASSES_HEADING: "Classes Available",
|
|
21
|
-
// Text when no class descriptions are available
|
|
22
|
-
NO_CLASS_DESCRIPTIONS: "No class descriptions available.",
|
|
23
|
-
// Message when logged in as admin
|
|
24
|
-
ADMIN_LOGGED_IN_MESSAGE: "You are logged in as an admin.",
|
|
25
|
-
// Membership Plans
|
|
26
|
-
MEMBERSHIP_1_NAME: "Select Membership",
|
|
27
|
-
MEMBERSHIP_1_DESC: "Includes 24-hour access to club and classes",
|
|
28
|
-
MEMBERSHIP_1_PRICING_1: "$599.00 (12 months) paid in full or $54.00/month for 12 months",
|
|
29
|
-
MEMBERSHIP_1_PRICING_2: "$399.00 (6 months) paid in full or $72.00/month for 6 months",
|
|
30
|
-
MEMBERSHIP_1_PRICING_3: "$199.00 (3 months) paid in full or $72.00/month for 3 months",
|
|
31
|
-
MEMBERSHIP_2_NAME: "Basic Membership",
|
|
32
|
-
MEMBERSHIP_2_DESC: "Available M-F 6:00 AM - 8:00 PM, Sat 7:00 AM - noon, no classes included",
|
|
33
|
-
MEMBERSHIP_2_PRICING_1: "$499.00 (12 months) paid in full or $45.00/month for 12 months",
|
|
34
|
-
MEMBERSHIP_2_PRICING_2: "$299.00 (6 months) paid in full or $54.00/month for 6 months",
|
|
35
|
-
MEMBERSHIP_2_PRICING_3: "$169.00 (3 months) paid in full or $62.00/month for 3 months",
|
|
36
|
-
MEMBERSHIP_3_NAME: "Super Senior",
|
|
37
|
-
MEMBERSHIP_3_DESC: "Includes classes and optional 24-hour access",
|
|
38
|
-
MEMBERSHIP_3_PRICING_1: "$499.00 (12 months) paid in full or $45.00/month for 12 months",
|
|
39
|
-
MEMBERSHIP_4_NAME: "Basic Senior Membership",
|
|
40
|
-
MEMBERSHIP_4_DESC: "No classes or 24-hour access",
|
|
41
|
-
MEMBERSHIP_4_PRICING_1: "$399.00 (12 months) paid in full or $37.00/month for 12 months",
|
|
42
|
-
MEMBERSHIP_4_PRICING_2: "$268.00 (6 months) paid in full or $47.00/month for 6 months",
|
|
43
|
-
MEMBERSHIP_4_PRICING_3: "$140.00 (3 months) paid in full or $52.00/month for 3 months",
|
|
44
|
-
MEMBERSHIP_5_NAME: "Senior Classes Only",
|
|
45
|
-
MEMBERSHIP_5_DESC: "For non-members and basic members",
|
|
46
|
-
MEMBERSHIP_5_PRICING_1: "$99.00 every 2 months (non-members)",
|
|
47
|
-
MEMBERSHIP_5_PRICING_2: "$59.00 every 2 months (basic membership members)",
|
|
48
|
-
MEMBERSHIP_5_PRICING_3: "$6.00 per class (all basic membership members)",
|
|
49
|
-
MEMBERSHIP_6_NAME: "Personal Training",
|
|
50
|
-
MEMBERSHIP_6_DESC: "One-on-one or up to three-on-one",
|
|
51
|
-
MEMBERSHIP_6_PRICING_1: "$60.00 per session per person",
|
|
52
|
-
MEMBERSHIP_6_PRICING_2: "$1000.00 for 20-session package per person",
|
|
53
|
-
MEMBERSHIP_6_PRICING_3: "Note: Train 2x/week for Basic Membership status; add $100.00 for 24-hour access",
|
|
54
|
-
},
|
|
55
|
-
// Error Messages for SchedulePage
|
|
56
|
-
ERRORS: {
|
|
57
|
-
// Error when fetching events fails with status code
|
|
58
|
-
FETCH_EVENTS_FAILED: "Failed to fetch events: ${response.status}",
|
|
59
|
-
// Generic error for fetch, submit, and delete failures
|
|
60
|
-
UNKNOWN_ERROR: "An unknown error occurred",
|
|
61
|
-
// Error when non-admin tries to modify classes
|
|
62
|
-
UNAUTHORIZED_MODIFY: "Unauthorized: Only admin can modify classes",
|
|
63
|
-
// Error when no token is provided
|
|
64
|
-
NO_TOKEN_PROVIDED: "Unauthorized: No token provided",
|
|
65
|
-
// Error when submit fails
|
|
66
|
-
SUBMIT_CLASS_FAILED: "Failed to ${formData.documentId ? 'update' : 'create'} class",
|
|
67
|
-
// Error when non-admin tries to delete classes
|
|
68
|
-
UNAUTHORIZED_DELETE: "Unauthorized: Only admin can delete classes",
|
|
69
|
-
// Error when delete fails with status code
|
|
70
|
-
DELETE_CLASS_FAILED: "Failed to delete class: ${response.status}",
|
|
71
|
-
},
|
|
1
|
+
// app/constants/schedule.ts
|
|
2
|
+
// Constants for hardcoded text in app/schedule/page.tsx, organized by purpose
|
|
3
|
+
|
|
4
|
+
export const SCHEDULE_PAGE = {
|
|
5
|
+
// UI Text for SchedulePage
|
|
6
|
+
UI: {
|
|
7
|
+
// Main heading for the Schedule page
|
|
8
|
+
MAIN_HEADING: "Rates & Classes",
|
|
9
|
+
// Section heading for membership plans
|
|
10
|
+
MEMBERSHIP_HEADING: "Membership & Training",
|
|
11
|
+
// Bold text for family rates
|
|
12
|
+
FAMILY_RATES_BOLD: "Family Rates:",
|
|
13
|
+
// Text for family rates
|
|
14
|
+
FAMILY_RATES_TEXT: "½ off Select or Basic 12-month programs for additional members living with you!",
|
|
15
|
+
// Bold text for membership note
|
|
16
|
+
NOTE_BOLD: "*Note:",
|
|
17
|
+
// Text for membership note
|
|
18
|
+
NOTE_TEXT: "Training clients who train at least two sessions per week with a trainer will receive Basic Membership Status in addition, for an extra $100.00, training clients can also receive 24-hour access privileges.",
|
|
19
|
+
// Section heading for class descriptions
|
|
20
|
+
CLASSES_HEADING: "Classes Available",
|
|
21
|
+
// Text when no class descriptions are available
|
|
22
|
+
NO_CLASS_DESCRIPTIONS: "No class descriptions available.",
|
|
23
|
+
// Message when logged in as admin
|
|
24
|
+
ADMIN_LOGGED_IN_MESSAGE: "You are logged in as an admin.",
|
|
25
|
+
// Membership Plans
|
|
26
|
+
MEMBERSHIP_1_NAME: "Select Membership",
|
|
27
|
+
MEMBERSHIP_1_DESC: "Includes 24-hour access to club and classes",
|
|
28
|
+
MEMBERSHIP_1_PRICING_1: "$599.00 (12 months) paid in full or $54.00/month for 12 months",
|
|
29
|
+
MEMBERSHIP_1_PRICING_2: "$399.00 (6 months) paid in full or $72.00/month for 6 months",
|
|
30
|
+
MEMBERSHIP_1_PRICING_3: "$199.00 (3 months) paid in full or $72.00/month for 3 months",
|
|
31
|
+
MEMBERSHIP_2_NAME: "Basic Membership",
|
|
32
|
+
MEMBERSHIP_2_DESC: "Available M-F 6:00 AM - 8:00 PM, Sat 7:00 AM - noon, no classes included",
|
|
33
|
+
MEMBERSHIP_2_PRICING_1: "$499.00 (12 months) paid in full or $45.00/month for 12 months",
|
|
34
|
+
MEMBERSHIP_2_PRICING_2: "$299.00 (6 months) paid in full or $54.00/month for 6 months",
|
|
35
|
+
MEMBERSHIP_2_PRICING_3: "$169.00 (3 months) paid in full or $62.00/month for 3 months",
|
|
36
|
+
MEMBERSHIP_3_NAME: "Super Senior",
|
|
37
|
+
MEMBERSHIP_3_DESC: "Includes classes and optional 24-hour access",
|
|
38
|
+
MEMBERSHIP_3_PRICING_1: "$499.00 (12 months) paid in full or $45.00/month for 12 months",
|
|
39
|
+
MEMBERSHIP_4_NAME: "Basic Senior Membership",
|
|
40
|
+
MEMBERSHIP_4_DESC: "No classes or 24-hour access",
|
|
41
|
+
MEMBERSHIP_4_PRICING_1: "$399.00 (12 months) paid in full or $37.00/month for 12 months",
|
|
42
|
+
MEMBERSHIP_4_PRICING_2: "$268.00 (6 months) paid in full or $47.00/month for 6 months",
|
|
43
|
+
MEMBERSHIP_4_PRICING_3: "$140.00 (3 months) paid in full or $52.00/month for 3 months",
|
|
44
|
+
MEMBERSHIP_5_NAME: "Senior Classes Only",
|
|
45
|
+
MEMBERSHIP_5_DESC: "For non-members and basic members",
|
|
46
|
+
MEMBERSHIP_5_PRICING_1: "$99.00 every 2 months (non-members)",
|
|
47
|
+
MEMBERSHIP_5_PRICING_2: "$59.00 every 2 months (basic membership members)",
|
|
48
|
+
MEMBERSHIP_5_PRICING_3: "$6.00 per class (all basic membership members)",
|
|
49
|
+
MEMBERSHIP_6_NAME: "Personal Training",
|
|
50
|
+
MEMBERSHIP_6_DESC: "One-on-one or up to three-on-one",
|
|
51
|
+
MEMBERSHIP_6_PRICING_1: "$60.00 per session per person",
|
|
52
|
+
MEMBERSHIP_6_PRICING_2: "$1000.00 for 20-session package per person",
|
|
53
|
+
MEMBERSHIP_6_PRICING_3: "Note: Train 2x/week for Basic Membership status; add $100.00 for 24-hour access",
|
|
54
|
+
},
|
|
55
|
+
// Error Messages for SchedulePage
|
|
56
|
+
ERRORS: {
|
|
57
|
+
// Error when fetching events fails with status code
|
|
58
|
+
FETCH_EVENTS_FAILED: "Failed to fetch events: ${response.status}",
|
|
59
|
+
// Generic error for fetch, submit, and delete failures
|
|
60
|
+
UNKNOWN_ERROR: "An unknown error occurred",
|
|
61
|
+
// Error when non-admin tries to modify classes
|
|
62
|
+
UNAUTHORIZED_MODIFY: "Unauthorized: Only admin can modify classes",
|
|
63
|
+
// Error when no token is provided
|
|
64
|
+
NO_TOKEN_PROVIDED: "Unauthorized: No token provided",
|
|
65
|
+
// Error when submit fails
|
|
66
|
+
SUBMIT_CLASS_FAILED: "Failed to ${formData.documentId ? 'update' : 'create'} class",
|
|
67
|
+
// Error when non-admin tries to delete classes
|
|
68
|
+
UNAUTHORIZED_DELETE: "Unauthorized: Only admin can delete classes",
|
|
69
|
+
// Error when delete fails with status code
|
|
70
|
+
DELETE_CLASS_FAILED: "Failed to delete class: ${response.status}",
|
|
71
|
+
},
|
|
72
72
|
};
|
package/lib/google-analytics.tsx
CHANGED
|
@@ -1,98 +1,98 @@
|
|
|
1
|
-
export interface AnalyticsData {
|
|
2
|
-
date: string;
|
|
3
|
-
country: string;
|
|
4
|
-
deviceCategory: string;
|
|
5
|
-
activeUsers: number;
|
|
6
|
-
totalUsers: number;
|
|
7
|
-
newUsers: number;
|
|
8
|
-
pageViews: number;
|
|
9
|
-
engagedSessions: number;
|
|
10
|
-
averageSessionDuration: number;
|
|
11
|
-
averageEngagementTimePerActiveUser: number;
|
|
12
|
-
bounceRate: number;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface ChannelGroupData {
|
|
16
|
-
date: string;
|
|
17
|
-
channelGroup: string;
|
|
18
|
-
newUsers: number;
|
|
19
|
-
activeUsers: number;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface RealtimeData {
|
|
23
|
-
activeUsersInLast30Minutes: number;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface UserActivityData {
|
|
27
|
-
date: string;
|
|
28
|
-
country: string;
|
|
29
|
-
activeUsers: number;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export async function getAnalyticsData(mainAnalyticsYear: number, token: string): Promise<AnalyticsData[]> {
|
|
33
|
-
const response = await fetch(`/api/analytics/main?year=${mainAnalyticsYear}&t=${Date.now()}`, {
|
|
34
|
-
method: 'GET',
|
|
35
|
-
headers: {
|
|
36
|
-
Authorization: `Bearer ${token}`,
|
|
37
|
-
'Content-Type': 'application/json',
|
|
38
|
-
},
|
|
39
|
-
cache: "no-store",
|
|
40
|
-
});
|
|
41
|
-
if (!response.ok) {
|
|
42
|
-
const errorText = await response.text();
|
|
43
|
-
throw new Error(`Failed to fetch analytics data: ${response.status} ${errorText}`);
|
|
44
|
-
}
|
|
45
|
-
const data = await response.json();
|
|
46
|
-
return data;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export async function getChannelGroupData(channelGroupYear: number, token: string): Promise<ChannelGroupData[]> {
|
|
50
|
-
const response = await fetch(`/api/analytics/channel-group?year=${channelGroupYear}&t=${Date.now()}`, {
|
|
51
|
-
method: 'GET',
|
|
52
|
-
headers: {
|
|
53
|
-
Authorization: `Bearer ${token}`,
|
|
54
|
-
'Content-Type': 'application/json',
|
|
55
|
-
},
|
|
56
|
-
cache: "no-store",
|
|
57
|
-
});
|
|
58
|
-
if (!response.ok) {
|
|
59
|
-
const errorText = await response.text();
|
|
60
|
-
throw new Error(`Failed to fetch channel group data: ${response.status} ${errorText}`);
|
|
61
|
-
}
|
|
62
|
-
const data = await response.json();
|
|
63
|
-
return data;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export async function getRealtimeData(token: string): Promise<RealtimeData> {
|
|
67
|
-
const response = await fetch(`/api/analytics/realtime?t=${Date.now()}`, {
|
|
68
|
-
method: 'GET',
|
|
69
|
-
headers: {
|
|
70
|
-
Authorization: `Bearer ${token}`,
|
|
71
|
-
'Content-Type': 'application/json',
|
|
72
|
-
},
|
|
73
|
-
cache: "no-store",
|
|
74
|
-
});
|
|
75
|
-
if (!response.ok) {
|
|
76
|
-
const errorText = await response.text();
|
|
77
|
-
throw new Error(`Failed to fetch realtime data: ${response.status} ${errorText}`);
|
|
78
|
-
}
|
|
79
|
-
const data = await response.json();
|
|
80
|
-
return data;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export async function getUserActivityData(userActivityYear: number, token: string): Promise<UserActivityData[]> {
|
|
84
|
-
const response = await fetch(`/api/analytics/user-activity?year=${userActivityYear}&t=${Date.now()}`, {
|
|
85
|
-
method: 'GET',
|
|
86
|
-
headers: {
|
|
87
|
-
Authorization: `Bearer ${token}`,
|
|
88
|
-
'Content-Type': 'application/json',
|
|
89
|
-
},
|
|
90
|
-
cache: "no-store",
|
|
91
|
-
});
|
|
92
|
-
if (!response.ok) {
|
|
93
|
-
const errorText = await response.text();
|
|
94
|
-
throw new Error(`Failed to fetch user activity data: ${response.status} ${errorText}`);
|
|
95
|
-
}
|
|
96
|
-
const data = await response.json();
|
|
97
|
-
return data;
|
|
1
|
+
export interface AnalyticsData {
|
|
2
|
+
date: string;
|
|
3
|
+
country: string;
|
|
4
|
+
deviceCategory: string;
|
|
5
|
+
activeUsers: number;
|
|
6
|
+
totalUsers: number;
|
|
7
|
+
newUsers: number;
|
|
8
|
+
pageViews: number;
|
|
9
|
+
engagedSessions: number;
|
|
10
|
+
averageSessionDuration: number;
|
|
11
|
+
averageEngagementTimePerActiveUser: number;
|
|
12
|
+
bounceRate: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface ChannelGroupData {
|
|
16
|
+
date: string;
|
|
17
|
+
channelGroup: string;
|
|
18
|
+
newUsers: number;
|
|
19
|
+
activeUsers: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface RealtimeData {
|
|
23
|
+
activeUsersInLast30Minutes: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface UserActivityData {
|
|
27
|
+
date: string;
|
|
28
|
+
country: string;
|
|
29
|
+
activeUsers: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export async function getAnalyticsData(mainAnalyticsYear: number, token: string): Promise<AnalyticsData[]> {
|
|
33
|
+
const response = await fetch(`/api/analytics/main?year=${mainAnalyticsYear}&t=${Date.now()}`, {
|
|
34
|
+
method: 'GET',
|
|
35
|
+
headers: {
|
|
36
|
+
Authorization: `Bearer ${token}`,
|
|
37
|
+
'Content-Type': 'application/json',
|
|
38
|
+
},
|
|
39
|
+
cache: "no-store",
|
|
40
|
+
});
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
const errorText = await response.text();
|
|
43
|
+
throw new Error(`Failed to fetch analytics data: ${response.status} ${errorText}`);
|
|
44
|
+
}
|
|
45
|
+
const data = await response.json();
|
|
46
|
+
return data;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export async function getChannelGroupData(channelGroupYear: number, token: string): Promise<ChannelGroupData[]> {
|
|
50
|
+
const response = await fetch(`/api/analytics/channel-group?year=${channelGroupYear}&t=${Date.now()}`, {
|
|
51
|
+
method: 'GET',
|
|
52
|
+
headers: {
|
|
53
|
+
Authorization: `Bearer ${token}`,
|
|
54
|
+
'Content-Type': 'application/json',
|
|
55
|
+
},
|
|
56
|
+
cache: "no-store",
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
const errorText = await response.text();
|
|
60
|
+
throw new Error(`Failed to fetch channel group data: ${response.status} ${errorText}`);
|
|
61
|
+
}
|
|
62
|
+
const data = await response.json();
|
|
63
|
+
return data;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function getRealtimeData(token: string): Promise<RealtimeData> {
|
|
67
|
+
const response = await fetch(`/api/analytics/realtime?t=${Date.now()}`, {
|
|
68
|
+
method: 'GET',
|
|
69
|
+
headers: {
|
|
70
|
+
Authorization: `Bearer ${token}`,
|
|
71
|
+
'Content-Type': 'application/json',
|
|
72
|
+
},
|
|
73
|
+
cache: "no-store",
|
|
74
|
+
});
|
|
75
|
+
if (!response.ok) {
|
|
76
|
+
const errorText = await response.text();
|
|
77
|
+
throw new Error(`Failed to fetch realtime data: ${response.status} ${errorText}`);
|
|
78
|
+
}
|
|
79
|
+
const data = await response.json();
|
|
80
|
+
return data;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export async function getUserActivityData(userActivityYear: number, token: string): Promise<UserActivityData[]> {
|
|
84
|
+
const response = await fetch(`/api/analytics/user-activity?year=${userActivityYear}&t=${Date.now()}`, {
|
|
85
|
+
method: 'GET',
|
|
86
|
+
headers: {
|
|
87
|
+
Authorization: `Bearer ${token}`,
|
|
88
|
+
'Content-Type': 'application/json',
|
|
89
|
+
},
|
|
90
|
+
cache: "no-store",
|
|
91
|
+
});
|
|
92
|
+
if (!response.ok) {
|
|
93
|
+
const errorText = await response.text();
|
|
94
|
+
throw new Error(`Failed to fetch user activity data: ${response.status} ${errorText}`);
|
|
95
|
+
}
|
|
96
|
+
const data = await response.json();
|
|
97
|
+
return data;
|
|
98
98
|
}
|