@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
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
// components/addOns/functional/aboutSections/constants/aboutSection.ts
|
|
2
|
-
// Constants for hardcoded text in AboutSection.tsx, organized by purpose
|
|
3
|
-
|
|
4
|
-
export const ABOUT_SECTION = {
|
|
5
|
-
// UI Text for AboutSection
|
|
6
|
-
UI: {
|
|
7
|
-
// Blockquote text
|
|
8
|
-
BLOCKQUOTE_TEXT: "“DevVista Kit is a modern, well-equipped facility with a friendly and vibrant atmosphere.”",
|
|
9
|
-
// Placeholder text when no image is available
|
|
10
|
-
NO_IMAGE_AVAILABLE: "No image available",
|
|
11
|
-
// Text when no description is available
|
|
12
|
-
NO_DESCRIPTION_AVAILABLE: "No about description available.",
|
|
13
|
-
// Message when logged in as admin
|
|
14
|
-
ADMIN_LOGGED_IN_MESSAGE: "You are logged in as an admin.",
|
|
15
|
-
// Modal heading
|
|
16
|
-
MODAL_HEADING: "Edit About",
|
|
17
|
-
// Form label for title input
|
|
18
|
-
TITLE_LABEL: "About Title",
|
|
19
|
-
// Placeholder for title input
|
|
20
|
-
TITLE_PLACEHOLDER: "Enter the about title",
|
|
21
|
-
// Form label for image input
|
|
22
|
-
IMAGE_LABEL: "Update Image (optional)",
|
|
23
|
-
// Text showing selected image name
|
|
24
|
-
SELECTED_IMAGE_TEXT: "Selected: ${formImage.name}",
|
|
25
|
-
// Form label for description textarea
|
|
26
|
-
DESCRIPTION_LABEL: "Update Description",
|
|
27
|
-
// Placeholder for description textarea
|
|
28
|
-
DESCRIPTION_PLACEHOLDER: "Enter the about description",
|
|
29
|
-
},
|
|
30
|
-
// Button Text for AboutSection
|
|
31
|
-
BUTTONS: {
|
|
32
|
-
// EditButton text
|
|
33
|
-
EDIT_BUTTON: "Edit",
|
|
34
|
-
// ReadMoreButton text when not expanded
|
|
35
|
-
READ_MORE_BUTTON: "Read More",
|
|
36
|
-
// ReadMoreButton text when expanded
|
|
37
|
-
READ_LESS_BUTTON: "Read Less",
|
|
38
|
-
// ActionButton text
|
|
39
|
-
GET_STARTED_BUTTON: "Get Started",
|
|
40
|
-
// UpdateButton text
|
|
41
|
-
UPDATE_BUTTON: "Update",
|
|
42
|
-
// UpdateButton text when submitting
|
|
43
|
-
SAVING_BUTTON: "Saving...",
|
|
44
|
-
// CancelButton text
|
|
45
|
-
CANCEL_BUTTON: "Cancel",
|
|
46
|
-
},
|
|
47
|
-
// Error Messages for AboutSection
|
|
48
|
-
ERRORS: {
|
|
49
|
-
// Error when no about data is returned
|
|
50
|
-
NO_DATA_FOUND: "About data not found",
|
|
51
|
-
// Error when fetch fails with status code
|
|
52
|
-
FETCH_FAILED: "Failed to fetch about data: ${response.status}",
|
|
53
|
-
// Generic error for fetch failure
|
|
54
|
-
FETCH_ERROR: "An error occurred while fetching about data",
|
|
55
|
-
// Error for non-admin update attempt
|
|
56
|
-
UNAUTHORIZED_UPDATE: "Unauthorized: Only admin can update about data",
|
|
57
|
-
// Error for invalid image type
|
|
58
|
-
INVALID_IMAGE_TYPE: "Only JPEG, PNG, or GIF images are allowed",
|
|
59
|
-
// Error when no authentication token is available
|
|
60
|
-
NO_AUTH_TOKEN: "No authentication token available",
|
|
61
|
-
// Error when update fails with status code
|
|
62
|
-
UPDATE_FAILED: "Failed to update about data: ${response.status}",
|
|
63
|
-
// Generic error for update failure
|
|
64
|
-
UPDATE_ERROR: "Failed to update about data",
|
|
65
|
-
},
|
|
1
|
+
// components/addOns/functional/aboutSections/constants/aboutSection.ts
|
|
2
|
+
// Constants for hardcoded text in AboutSection.tsx, organized by purpose
|
|
3
|
+
|
|
4
|
+
export const ABOUT_SECTION = {
|
|
5
|
+
// UI Text for AboutSection
|
|
6
|
+
UI: {
|
|
7
|
+
// Blockquote text
|
|
8
|
+
BLOCKQUOTE_TEXT: "“DevVista Kit is a modern, well-equipped facility with a friendly and vibrant atmosphere.”",
|
|
9
|
+
// Placeholder text when no image is available
|
|
10
|
+
NO_IMAGE_AVAILABLE: "No image available",
|
|
11
|
+
// Text when no description is available
|
|
12
|
+
NO_DESCRIPTION_AVAILABLE: "No about description available.",
|
|
13
|
+
// Message when logged in as admin
|
|
14
|
+
ADMIN_LOGGED_IN_MESSAGE: "You are logged in as an admin.",
|
|
15
|
+
// Modal heading
|
|
16
|
+
MODAL_HEADING: "Edit About",
|
|
17
|
+
// Form label for title input
|
|
18
|
+
TITLE_LABEL: "About Title",
|
|
19
|
+
// Placeholder for title input
|
|
20
|
+
TITLE_PLACEHOLDER: "Enter the about title",
|
|
21
|
+
// Form label for image input
|
|
22
|
+
IMAGE_LABEL: "Update Image (optional)",
|
|
23
|
+
// Text showing selected image name
|
|
24
|
+
SELECTED_IMAGE_TEXT: "Selected: ${formImage.name}",
|
|
25
|
+
// Form label for description textarea
|
|
26
|
+
DESCRIPTION_LABEL: "Update Description",
|
|
27
|
+
// Placeholder for description textarea
|
|
28
|
+
DESCRIPTION_PLACEHOLDER: "Enter the about description",
|
|
29
|
+
},
|
|
30
|
+
// Button Text for AboutSection
|
|
31
|
+
BUTTONS: {
|
|
32
|
+
// EditButton text
|
|
33
|
+
EDIT_BUTTON: "Edit",
|
|
34
|
+
// ReadMoreButton text when not expanded
|
|
35
|
+
READ_MORE_BUTTON: "Read More",
|
|
36
|
+
// ReadMoreButton text when expanded
|
|
37
|
+
READ_LESS_BUTTON: "Read Less",
|
|
38
|
+
// ActionButton text
|
|
39
|
+
GET_STARTED_BUTTON: "Get Started",
|
|
40
|
+
// UpdateButton text
|
|
41
|
+
UPDATE_BUTTON: "Update",
|
|
42
|
+
// UpdateButton text when submitting
|
|
43
|
+
SAVING_BUTTON: "Saving...",
|
|
44
|
+
// CancelButton text
|
|
45
|
+
CANCEL_BUTTON: "Cancel",
|
|
46
|
+
},
|
|
47
|
+
// Error Messages for AboutSection
|
|
48
|
+
ERRORS: {
|
|
49
|
+
// Error when no about data is returned
|
|
50
|
+
NO_DATA_FOUND: "About data not found",
|
|
51
|
+
// Error when fetch fails with status code
|
|
52
|
+
FETCH_FAILED: "Failed to fetch about data: ${response.status}",
|
|
53
|
+
// Generic error for fetch failure
|
|
54
|
+
FETCH_ERROR: "An error occurred while fetching about data",
|
|
55
|
+
// Error for non-admin update attempt
|
|
56
|
+
UNAUTHORIZED_UPDATE: "Unauthorized: Only admin can update about data",
|
|
57
|
+
// Error for invalid image type
|
|
58
|
+
INVALID_IMAGE_TYPE: "Only JPEG, PNG, or GIF images are allowed",
|
|
59
|
+
// Error when no authentication token is available
|
|
60
|
+
NO_AUTH_TOKEN: "No authentication token available",
|
|
61
|
+
// Error when update fails with status code
|
|
62
|
+
UPDATE_FAILED: "Failed to update about data: ${response.status}",
|
|
63
|
+
// Generic error for update failure
|
|
64
|
+
UPDATE_ERROR: "Failed to update about data",
|
|
65
|
+
},
|
|
66
66
|
};
|
|
@@ -1,185 +1,185 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import React, { useEffect, useState } from "react";
|
|
4
|
-
import { useRouter } from "next/navigation";
|
|
5
|
-
import { AddButton, EditIconButton, TrashIconButton } from "@/components/other/button";
|
|
6
|
-
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/other/card";
|
|
7
|
-
import { Trash2, Edit, Heart, Send } from "lucide-react";
|
|
8
|
-
import { Separator } from "@/components/other/separator";
|
|
9
|
-
import { useAuth, useUser } from "@clerk/nextjs";
|
|
10
|
-
import { useStrapiAuth } from "@/lib/auth-context";
|
|
11
|
-
import { BLOG_DASHBOARD } from "./constants/blogDashboard";
|
|
12
|
-
|
|
13
|
-
interface BlogPost {
|
|
14
|
-
id: number;
|
|
15
|
-
documentId: string;
|
|
16
|
-
title: string;
|
|
17
|
-
description: string;
|
|
18
|
-
author: string;
|
|
19
|
-
publishedAt: string;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
interface BlogDashboardProps {
|
|
23
|
-
isModalOpen: boolean;
|
|
24
|
-
setIsModalOpen: (open: boolean) => void;
|
|
25
|
-
isConfirmDeleteOpen: boolean;
|
|
26
|
-
setIsConfirmDeleteOpen: (open: boolean) => void;
|
|
27
|
-
posts: BlogPost[];
|
|
28
|
-
setPosts: (posts: BlogPost[]) => void;
|
|
29
|
-
setError: (error: string | null) => void;
|
|
30
|
-
isLoading: boolean;
|
|
31
|
-
setIsLoading: (loading: boolean) => void;
|
|
32
|
-
fetchData: () => Promise<void>;
|
|
33
|
-
formData: BlogPost;
|
|
34
|
-
setFormData: (data: BlogPost) => void;
|
|
35
|
-
postToDelete: { id: number; documentId: string; title: string } | null;
|
|
36
|
-
setPostToDelete: (post: { id: number; documentId: string; title: string } | null) => void;
|
|
37
|
-
showSuccess: boolean;
|
|
38
|
-
setShowSuccess: (show: boolean) => void;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const BlogDashboard: React.FC<BlogDashboardProps> = ({
|
|
42
|
-
isModalOpen,
|
|
43
|
-
setIsModalOpen,
|
|
44
|
-
isConfirmDeleteOpen,
|
|
45
|
-
setIsConfirmDeleteOpen,
|
|
46
|
-
posts,
|
|
47
|
-
setPosts,
|
|
48
|
-
setError,
|
|
49
|
-
isLoading,
|
|
50
|
-
setIsLoading,
|
|
51
|
-
fetchData,
|
|
52
|
-
formData,
|
|
53
|
-
setFormData,
|
|
54
|
-
postToDelete,
|
|
55
|
-
setPostToDelete,
|
|
56
|
-
showSuccess,
|
|
57
|
-
setShowSuccess,
|
|
58
|
-
}) => {
|
|
59
|
-
const router = useRouter();
|
|
60
|
-
const { user } = useStrapiAuth();
|
|
61
|
-
const { getToken, isSignedIn, isLoaded } = useAuth();
|
|
62
|
-
const [isAdmin, setIsAdmin] = useState(false);
|
|
63
|
-
|
|
64
|
-
useEffect(() => {
|
|
65
|
-
if (isLoaded) {
|
|
66
|
-
setIsAdmin(isSignedIn && !!user?.businessAdminId);
|
|
67
|
-
}
|
|
68
|
-
}, [isLoaded, isSignedIn, user?.businessAdminId]);
|
|
69
|
-
|
|
70
|
-
const handleEdit = (post: BlogPost) => {
|
|
71
|
-
setFormData(post);
|
|
72
|
-
setIsModalOpen(true);
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
const openModal = (post?: BlogPost) => {
|
|
76
|
-
if (post) {
|
|
77
|
-
setFormData(post);
|
|
78
|
-
} else {
|
|
79
|
-
setFormData({
|
|
80
|
-
id: 0,
|
|
81
|
-
documentId: "",
|
|
82
|
-
title: "",
|
|
83
|
-
description: "",
|
|
84
|
-
author: user?.firstName && user?.lastName ? `${user.firstName} ${user.lastName}` : "",
|
|
85
|
-
publishedAt: "",
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
setIsModalOpen(true);
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
useEffect(() => {
|
|
92
|
-
}, [posts, isAdmin, isLoaded, isSignedIn, user]);
|
|
93
|
-
|
|
94
|
-
if (!isLoaded) {
|
|
95
|
-
return null;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return (
|
|
99
|
-
<Card className="rounded-2xl border border-gray-700/50 bg-gray-800/50 backdrop-blur-md shadow-lg hover:border-blue-500/50 transition-colors">
|
|
100
|
-
<CardHeader className="pb-4">
|
|
101
|
-
<CardTitle className="text-2xl font-bold text-blue-200">{BLOG_DASHBOARD.UI.CARD_TITLE}</CardTitle>
|
|
102
|
-
<CardDescription className="text-gray-400">{BLOG_DASHBOARD.UI.CARD_DESCRIPTION}</CardDescription>
|
|
103
|
-
</CardHeader>
|
|
104
|
-
<CardContent className="p-6 sm:p-8">
|
|
105
|
-
{showSuccess && (
|
|
106
|
-
<div className="bg-green-900/50 border-l-4 border-green-600 p-4 rounded-lg backdrop-blur-sm mb-8 animate-pulse">
|
|
107
|
-
<div className="flex items-center gap-2">
|
|
108
|
-
<Heart className="h-5 w-5 text-green-400" />
|
|
109
|
-
<p className="text-green-300">{BLOG_DASHBOARD.UI.SUCCESS_MESSAGE}</p>
|
|
110
|
-
</div>
|
|
111
|
-
</div>
|
|
112
|
-
)}
|
|
113
|
-
<div className="mb-6">
|
|
114
|
-
<AddButton onClick={() => openModal()} disabled={isLoading || !isSignedIn}>
|
|
115
|
-
<Send className="w-5 h-5 mr-2" />
|
|
116
|
-
{BLOG_DASHBOARD.BUTTONS.ADD_BUTTON}
|
|
117
|
-
</AddButton>
|
|
118
|
-
</div>
|
|
119
|
-
{posts.length > 0 ? (
|
|
120
|
-
<div className="space-y-4 max-h-[400px] overflow-y-auto pr-2">
|
|
121
|
-
{posts.map((post, index) => (
|
|
122
|
-
<div key={post.id} className="group">
|
|
123
|
-
<div
|
|
124
|
-
onClick={() => router.push(`/blog/${post.id}`)}
|
|
125
|
-
className="cursor-pointer p-4 bg-gray-900/40 rounded-lg border border-gray-700/50 hover:bg-gray-700/30 transition-all relative" // Added relative
|
|
126
|
-
>
|
|
127
|
-
<div className="flex items-start justify-between mb-3">
|
|
128
|
-
<div className="flex flex-col max-w-[70%]">
|
|
129
|
-
<h4 className="font-medium text-blue-200 mb-1 truncate">{post.title}</h4>
|
|
130
|
-
<div className="text-sm text-gray-400">
|
|
131
|
-
<span>
|
|
132
|
-
{new Date(post.publishedAt).toLocaleDateString("en-US", {
|
|
133
|
-
year: "numeric",
|
|
134
|
-
month: "short",
|
|
135
|
-
day: "numeric",
|
|
136
|
-
})}
|
|
137
|
-
</span>
|
|
138
|
-
<span> | {post.author}</span>
|
|
139
|
-
</div>
|
|
140
|
-
</div>
|
|
141
|
-
{isAdmin && (
|
|
142
|
-
<div className="absolute top-2 right-2 flex space-x-2">
|
|
143
|
-
<EditIconButton
|
|
144
|
-
variant="edit-icon"
|
|
145
|
-
onClick={(e) => {
|
|
146
|
-
e.stopPropagation();
|
|
147
|
-
handleEdit(post);
|
|
148
|
-
}}
|
|
149
|
-
aria-label={BLOG_DASHBOARD.BUTTONS.EDIT_BUTTON_ARIA.replace("${post.title}", post.title)}
|
|
150
|
-
>
|
|
151
|
-
</EditIconButton>
|
|
152
|
-
<TrashIconButton
|
|
153
|
-
variant="trash-icon"
|
|
154
|
-
onClick={(e) => {
|
|
155
|
-
e.stopPropagation();
|
|
156
|
-
setPostToDelete({ id: post.id, documentId: post.documentId, title: post.title });
|
|
157
|
-
setIsConfirmDeleteOpen(true);
|
|
158
|
-
}}
|
|
159
|
-
aria-label={BLOG_DASHBOARD.BUTTONS.DELETE_BUTTON_ARIA.replace("${post.title}", post.title)}
|
|
160
|
-
>
|
|
161
|
-
</TrashIconButton>
|
|
162
|
-
</div>
|
|
163
|
-
)}
|
|
164
|
-
</div>
|
|
165
|
-
<p className="text-sm text-gray-400 line-clamp-2">{post.description}</p>
|
|
166
|
-
</div>
|
|
167
|
-
{index < posts.length - 1 && <Separator className="my-3 bg-gray-700/50" />}
|
|
168
|
-
</div>
|
|
169
|
-
))}
|
|
170
|
-
</div>
|
|
171
|
-
) : (
|
|
172
|
-
<div className="text-center py-10 text-gray-400">
|
|
173
|
-
<div className="w-16 h-16 bg-gray-900/50 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
174
|
-
<Send className="w-6 h-6 text-gray-500" />
|
|
175
|
-
</div>
|
|
176
|
-
<p className="font-medium">{BLOG_DASHBOARD.UI.NO_POSTS_MESSAGE}</p>
|
|
177
|
-
<p className="text-sm">{BLOG_DASHBOARD.UI.NO_POSTS_SUBTEXT}</p>
|
|
178
|
-
</div>
|
|
179
|
-
)}
|
|
180
|
-
</CardContent>
|
|
181
|
-
</Card>
|
|
182
|
-
);
|
|
183
|
-
};
|
|
184
|
-
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React, { useEffect, useState } from "react";
|
|
4
|
+
import { useRouter } from "next/navigation";
|
|
5
|
+
import { AddButton, EditIconButton, TrashIconButton } from "@/components/other/button";
|
|
6
|
+
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/other/card";
|
|
7
|
+
import { Trash2, Edit, Heart, Send } from "lucide-react";
|
|
8
|
+
import { Separator } from "@/components/other/separator";
|
|
9
|
+
import { useAuth, useUser } from "@clerk/nextjs";
|
|
10
|
+
import { useStrapiAuth } from "@/lib/auth-context";
|
|
11
|
+
import { BLOG_DASHBOARD } from "./constants/blogDashboard";
|
|
12
|
+
|
|
13
|
+
interface BlogPost {
|
|
14
|
+
id: number;
|
|
15
|
+
documentId: string;
|
|
16
|
+
title: string;
|
|
17
|
+
description: string;
|
|
18
|
+
author: string;
|
|
19
|
+
publishedAt: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
interface BlogDashboardProps {
|
|
23
|
+
isModalOpen: boolean;
|
|
24
|
+
setIsModalOpen: (open: boolean) => void;
|
|
25
|
+
isConfirmDeleteOpen: boolean;
|
|
26
|
+
setIsConfirmDeleteOpen: (open: boolean) => void;
|
|
27
|
+
posts: BlogPost[];
|
|
28
|
+
setPosts: (posts: BlogPost[]) => void;
|
|
29
|
+
setError: (error: string | null) => void;
|
|
30
|
+
isLoading: boolean;
|
|
31
|
+
setIsLoading: (loading: boolean) => void;
|
|
32
|
+
fetchData: () => Promise<void>;
|
|
33
|
+
formData: BlogPost;
|
|
34
|
+
setFormData: (data: BlogPost) => void;
|
|
35
|
+
postToDelete: { id: number; documentId: string; title: string } | null;
|
|
36
|
+
setPostToDelete: (post: { id: number; documentId: string; title: string } | null) => void;
|
|
37
|
+
showSuccess: boolean;
|
|
38
|
+
setShowSuccess: (show: boolean) => void;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const BlogDashboard: React.FC<BlogDashboardProps> = ({
|
|
42
|
+
isModalOpen,
|
|
43
|
+
setIsModalOpen,
|
|
44
|
+
isConfirmDeleteOpen,
|
|
45
|
+
setIsConfirmDeleteOpen,
|
|
46
|
+
posts,
|
|
47
|
+
setPosts,
|
|
48
|
+
setError,
|
|
49
|
+
isLoading,
|
|
50
|
+
setIsLoading,
|
|
51
|
+
fetchData,
|
|
52
|
+
formData,
|
|
53
|
+
setFormData,
|
|
54
|
+
postToDelete,
|
|
55
|
+
setPostToDelete,
|
|
56
|
+
showSuccess,
|
|
57
|
+
setShowSuccess,
|
|
58
|
+
}) => {
|
|
59
|
+
const router = useRouter();
|
|
60
|
+
const { user } = useStrapiAuth();
|
|
61
|
+
const { getToken, isSignedIn, isLoaded } = useAuth();
|
|
62
|
+
const [isAdmin, setIsAdmin] = useState(false);
|
|
63
|
+
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (isLoaded) {
|
|
66
|
+
setIsAdmin(isSignedIn && !!user?.businessAdminId);
|
|
67
|
+
}
|
|
68
|
+
}, [isLoaded, isSignedIn, user?.businessAdminId]);
|
|
69
|
+
|
|
70
|
+
const handleEdit = (post: BlogPost) => {
|
|
71
|
+
setFormData(post);
|
|
72
|
+
setIsModalOpen(true);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const openModal = (post?: BlogPost) => {
|
|
76
|
+
if (post) {
|
|
77
|
+
setFormData(post);
|
|
78
|
+
} else {
|
|
79
|
+
setFormData({
|
|
80
|
+
id: 0,
|
|
81
|
+
documentId: "",
|
|
82
|
+
title: "",
|
|
83
|
+
description: "",
|
|
84
|
+
author: user?.firstName && user?.lastName ? `${user.firstName} ${user.lastName}` : "",
|
|
85
|
+
publishedAt: "",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
setIsModalOpen(true);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
}, [posts, isAdmin, isLoaded, isSignedIn, user]);
|
|
93
|
+
|
|
94
|
+
if (!isLoaded) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return (
|
|
99
|
+
<Card className="rounded-2xl border border-gray-700/50 bg-gray-800/50 backdrop-blur-md shadow-lg hover:border-blue-500/50 transition-colors">
|
|
100
|
+
<CardHeader className="pb-4">
|
|
101
|
+
<CardTitle className="text-2xl font-bold text-blue-200">{BLOG_DASHBOARD.UI.CARD_TITLE}</CardTitle>
|
|
102
|
+
<CardDescription className="text-gray-400">{BLOG_DASHBOARD.UI.CARD_DESCRIPTION}</CardDescription>
|
|
103
|
+
</CardHeader>
|
|
104
|
+
<CardContent className="p-6 sm:p-8">
|
|
105
|
+
{showSuccess && (
|
|
106
|
+
<div className="bg-green-900/50 border-l-4 border-green-600 p-4 rounded-lg backdrop-blur-sm mb-8 animate-pulse">
|
|
107
|
+
<div className="flex items-center gap-2">
|
|
108
|
+
<Heart className="h-5 w-5 text-green-400" />
|
|
109
|
+
<p className="text-green-300">{BLOG_DASHBOARD.UI.SUCCESS_MESSAGE}</p>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
)}
|
|
113
|
+
<div className="mb-6">
|
|
114
|
+
<AddButton onClick={() => openModal()} disabled={isLoading || !isSignedIn}>
|
|
115
|
+
<Send className="w-5 h-5 mr-2" />
|
|
116
|
+
{BLOG_DASHBOARD.BUTTONS.ADD_BUTTON}
|
|
117
|
+
</AddButton>
|
|
118
|
+
</div>
|
|
119
|
+
{posts.length > 0 ? (
|
|
120
|
+
<div className="space-y-4 max-h-[400px] overflow-y-auto pr-2">
|
|
121
|
+
{posts.map((post, index) => (
|
|
122
|
+
<div key={post.id} className="group">
|
|
123
|
+
<div
|
|
124
|
+
onClick={() => router.push(`/blog/${post.id}`)}
|
|
125
|
+
className="cursor-pointer p-4 bg-gray-900/40 rounded-lg border border-gray-700/50 hover:bg-gray-700/30 transition-all relative" // Added relative
|
|
126
|
+
>
|
|
127
|
+
<div className="flex items-start justify-between mb-3">
|
|
128
|
+
<div className="flex flex-col max-w-[70%]">
|
|
129
|
+
<h4 className="font-medium text-blue-200 mb-1 truncate">{post.title}</h4>
|
|
130
|
+
<div className="text-sm text-gray-400">
|
|
131
|
+
<span>
|
|
132
|
+
{new Date(post.publishedAt).toLocaleDateString("en-US", {
|
|
133
|
+
year: "numeric",
|
|
134
|
+
month: "short",
|
|
135
|
+
day: "numeric",
|
|
136
|
+
})}
|
|
137
|
+
</span>
|
|
138
|
+
<span> | {post.author}</span>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
{isAdmin && (
|
|
142
|
+
<div className="absolute top-2 right-2 flex space-x-2">
|
|
143
|
+
<EditIconButton
|
|
144
|
+
variant="edit-icon"
|
|
145
|
+
onClick={(e) => {
|
|
146
|
+
e.stopPropagation();
|
|
147
|
+
handleEdit(post);
|
|
148
|
+
}}
|
|
149
|
+
aria-label={BLOG_DASHBOARD.BUTTONS.EDIT_BUTTON_ARIA.replace("${post.title}", post.title)}
|
|
150
|
+
>
|
|
151
|
+
</EditIconButton>
|
|
152
|
+
<TrashIconButton
|
|
153
|
+
variant="trash-icon"
|
|
154
|
+
onClick={(e) => {
|
|
155
|
+
e.stopPropagation();
|
|
156
|
+
setPostToDelete({ id: post.id, documentId: post.documentId, title: post.title });
|
|
157
|
+
setIsConfirmDeleteOpen(true);
|
|
158
|
+
}}
|
|
159
|
+
aria-label={BLOG_DASHBOARD.BUTTONS.DELETE_BUTTON_ARIA.replace("${post.title}", post.title)}
|
|
160
|
+
>
|
|
161
|
+
</TrashIconButton>
|
|
162
|
+
</div>
|
|
163
|
+
)}
|
|
164
|
+
</div>
|
|
165
|
+
<p className="text-sm text-gray-400 line-clamp-2">{post.description}</p>
|
|
166
|
+
</div>
|
|
167
|
+
{index < posts.length - 1 && <Separator className="my-3 bg-gray-700/50" />}
|
|
168
|
+
</div>
|
|
169
|
+
))}
|
|
170
|
+
</div>
|
|
171
|
+
) : (
|
|
172
|
+
<div className="text-center py-10 text-gray-400">
|
|
173
|
+
<div className="w-16 h-16 bg-gray-900/50 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
174
|
+
<Send className="w-6 h-6 text-gray-500" />
|
|
175
|
+
</div>
|
|
176
|
+
<p className="font-medium">{BLOG_DASHBOARD.UI.NO_POSTS_MESSAGE}</p>
|
|
177
|
+
<p className="text-sm">{BLOG_DASHBOARD.UI.NO_POSTS_SUBTEXT}</p>
|
|
178
|
+
</div>
|
|
179
|
+
)}
|
|
180
|
+
</CardContent>
|
|
181
|
+
</Card>
|
|
182
|
+
);
|
|
183
|
+
};
|
|
184
|
+
|
|
185
185
|
export default BlogDashboard;
|