@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,372 +0,0 @@
|
|
|
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 = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
13
|
-
return g.next = verb(0), g["throw"] = verb(1), g["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 { motion } from "framer-motion";
|
|
39
|
-
import Image from "next/image";
|
|
40
|
-
import { useState, useEffect, useRef } from "react";
|
|
41
|
-
import { EditIconButton, CloseButton, UpdateButton, CancelButton, ToggleButton } from "@/components/other/button";
|
|
42
|
-
import Spinner from "@/components/addOns/non-functional/spinner";
|
|
43
|
-
import { X } from "lucide-react";
|
|
44
|
-
import { useAuth, useUser } from "@clerk/nextjs";
|
|
45
|
-
import { ABOUT_SECTION } from "./constants/aboutSection";
|
|
46
|
-
export function AboutSection(_a) {
|
|
47
|
-
var _this = this;
|
|
48
|
-
var user = _a.user, authLoading = _a.authLoading;
|
|
49
|
-
var getToken = useAuth().getToken;
|
|
50
|
-
var isSignedIn = useUser().isSignedIn;
|
|
51
|
-
var _b = useState(false), isMobile = _b[0], setIsMobile = _b[1];
|
|
52
|
-
var _c = useState(false), isEditModalOpen = _c[0], setIsEditModalOpen = _c[1];
|
|
53
|
-
var _d = useState(""), formTitle = _d[0], setFormTitle = _d[1];
|
|
54
|
-
var _e = useState(""), formDescription = _e[0], setFormDescription = _e[1];
|
|
55
|
-
var _f = useState(null), formImage = _f[0], setFormImage = _f[1];
|
|
56
|
-
var _g = useState(false), isSubmitting = _g[0], setIsSubmitting = _g[1];
|
|
57
|
-
var _h = useState(false), isExpanded = _h[0], setIsExpanded = _h[1];
|
|
58
|
-
var _j = useState(null), title = _j[0], setTitle = _j[1];
|
|
59
|
-
var _k = useState(null), description = _k[0], setDescription = _k[1];
|
|
60
|
-
var _l = useState(null), imageUrl = _l[0], setImageUrl = _l[1];
|
|
61
|
-
var _m = useState(null), error = _m[0], setError = _m[1];
|
|
62
|
-
var _o = useState(true), isLoading = _o[0], setIsLoading = _o[1];
|
|
63
|
-
var hasFetched = useRef(false);
|
|
64
|
-
useEffect(function () {
|
|
65
|
-
if (hasFetched.current)
|
|
66
|
-
return;
|
|
67
|
-
hasFetched.current = true;
|
|
68
|
-
var fetchAboutData = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
69
|
-
var response, result, aboutData, errorData, err_1;
|
|
70
|
-
var _a;
|
|
71
|
-
return __generator(this, function (_b) {
|
|
72
|
-
switch (_b.label) {
|
|
73
|
-
case 0:
|
|
74
|
-
setIsLoading(true);
|
|
75
|
-
_b.label = 1;
|
|
76
|
-
case 1:
|
|
77
|
-
_b.trys.push([1, 7, 8, 9]);
|
|
78
|
-
return [4 /*yield*/, fetch("/api/about?t=".concat(Date.now()), {
|
|
79
|
-
headers: { "Content-Type": "application/json" },
|
|
80
|
-
cache: "no-store",
|
|
81
|
-
})];
|
|
82
|
-
case 2:
|
|
83
|
-
response = _b.sent();
|
|
84
|
-
if (!response.ok) return [3 /*break*/, 4];
|
|
85
|
-
return [4 /*yield*/, response.json()];
|
|
86
|
-
case 3:
|
|
87
|
-
result = _b.sent();
|
|
88
|
-
if (result.data) {
|
|
89
|
-
aboutData = Array.isArray(result.data)
|
|
90
|
-
? result.data[0]
|
|
91
|
-
: result.data;
|
|
92
|
-
setTitle(aboutData.title || null);
|
|
93
|
-
setDescription(aboutData.description || null);
|
|
94
|
-
setImageUrl(((_a = aboutData.image) === null || _a === void 0 ? void 0 : _a.url) || null);
|
|
95
|
-
setFormTitle(aboutData.title || "");
|
|
96
|
-
setFormDescription(aboutData.description || "");
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
throw new Error(ABOUT_SECTION.ERRORS.NO_DATA_FOUND);
|
|
100
|
-
}
|
|
101
|
-
return [3 /*break*/, 6];
|
|
102
|
-
case 4: return [4 /*yield*/, response.json()];
|
|
103
|
-
case 5:
|
|
104
|
-
errorData = _b.sent();
|
|
105
|
-
throw new Error(errorData.error || ABOUT_SECTION.ERRORS.FETCH_FAILED.replace("${response.status}", response.status.toString()));
|
|
106
|
-
case 6: return [3 /*break*/, 9];
|
|
107
|
-
case 7:
|
|
108
|
-
err_1 = _b.sent();
|
|
109
|
-
console.error("Fetch About Error:", err_1);
|
|
110
|
-
setError(err_1 instanceof Error ? err_1.message : ABOUT_SECTION.ERRORS.FETCH_ERROR);
|
|
111
|
-
return [3 /*break*/, 9];
|
|
112
|
-
case 8:
|
|
113
|
-
setIsLoading(false);
|
|
114
|
-
return [7 /*endfinally*/];
|
|
115
|
-
case 9: return [2 /*return*/];
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
}); };
|
|
119
|
-
fetchAboutData();
|
|
120
|
-
}, []);
|
|
121
|
-
useEffect(function () {
|
|
122
|
-
var debounce = function (fn, delay) {
|
|
123
|
-
var timeout;
|
|
124
|
-
return function () {
|
|
125
|
-
clearTimeout(timeout);
|
|
126
|
-
timeout = setTimeout(fn, delay);
|
|
127
|
-
};
|
|
128
|
-
};
|
|
129
|
-
var checkMobile = debounce(function () {
|
|
130
|
-
setIsMobile(window.innerWidth < 768);
|
|
131
|
-
}, 100);
|
|
132
|
-
checkMobile();
|
|
133
|
-
window.addEventListener("resize", checkMobile);
|
|
134
|
-
return function () { return window.removeEventListener("resize", checkMobile); };
|
|
135
|
-
}, []);
|
|
136
|
-
useEffect(function () {
|
|
137
|
-
var event = new CustomEvent("modalStateChange", {
|
|
138
|
-
detail: { isOpen: isEditModalOpen },
|
|
139
|
-
});
|
|
140
|
-
window.dispatchEvent(event);
|
|
141
|
-
}, [isEditModalOpen]);
|
|
142
|
-
useEffect(function () {
|
|
143
|
-
if (isEditModalOpen) {
|
|
144
|
-
var scrollY_1 = window.scrollY;
|
|
145
|
-
document.body.style.position = "fixed";
|
|
146
|
-
document.body.style.top = "-".concat(scrollY_1, "px");
|
|
147
|
-
document.body.style.width = "100%";
|
|
148
|
-
document.body.classList.add("overflow-hidden");
|
|
149
|
-
return function () {
|
|
150
|
-
var scrollYRestored = parseInt(document.body.style.top || "0", 10) * -1;
|
|
151
|
-
document.body.style.position = "";
|
|
152
|
-
document.body.style.top = "";
|
|
153
|
-
document.body.style.width = "";
|
|
154
|
-
document.body.classList.remove("overflow-hidden");
|
|
155
|
-
window.scrollTo(0, scrollYRestored);
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
}, [isEditModalOpen]);
|
|
159
|
-
useEffect(function () {
|
|
160
|
-
var handleEsc = function (e) {
|
|
161
|
-
if (e.key === "Escape" && isEditModalOpen) {
|
|
162
|
-
handleCancelEdit();
|
|
163
|
-
}
|
|
164
|
-
};
|
|
165
|
-
window.addEventListener("keydown", handleEsc);
|
|
166
|
-
return function () { return window.removeEventListener("keydown", handleEsc); };
|
|
167
|
-
}, [isEditModalOpen]);
|
|
168
|
-
var openEditModal = function () {
|
|
169
|
-
setFormTitle(title || "");
|
|
170
|
-
setFormDescription(description || "");
|
|
171
|
-
setFormImage(null);
|
|
172
|
-
setIsEditModalOpen(true);
|
|
173
|
-
};
|
|
174
|
-
var handleCancelEdit = function () {
|
|
175
|
-
setIsEditModalOpen(false);
|
|
176
|
-
setFormTitle(title || "");
|
|
177
|
-
setFormDescription(description || "");
|
|
178
|
-
setFormImage(null);
|
|
179
|
-
};
|
|
180
|
-
var handlePatchSubmit = function (e, formTitle, formDescription, formImage, onSuccess) { return __awaiter(_this, void 0, void 0, function () {
|
|
181
|
-
var formData, token, response, errorData, result, aboutData, err_2;
|
|
182
|
-
var _a;
|
|
183
|
-
return __generator(this, function (_b) {
|
|
184
|
-
switch (_b.label) {
|
|
185
|
-
case 0:
|
|
186
|
-
e.preventDefault();
|
|
187
|
-
if (!isSignedIn || !(user === null || user === void 0 ? void 0 : user.businessAdminId)) {
|
|
188
|
-
console.error("No user or businessAdminId:", {
|
|
189
|
-
user: user,
|
|
190
|
-
businessAdminId: user === null || user === void 0 ? void 0 : user.businessAdminId,
|
|
191
|
-
});
|
|
192
|
-
setError(ABOUT_SECTION.ERRORS.UNAUTHORIZED_UPDATE);
|
|
193
|
-
return [2 /*return*/];
|
|
194
|
-
}
|
|
195
|
-
_b.label = 1;
|
|
196
|
-
case 1:
|
|
197
|
-
_b.trys.push([1, 7, , 8]);
|
|
198
|
-
formData = new FormData();
|
|
199
|
-
if (formTitle && formTitle !== title) {
|
|
200
|
-
formData.append("title", formTitle);
|
|
201
|
-
}
|
|
202
|
-
if (formDescription && formDescription !== description) {
|
|
203
|
-
formData.append("description", formDescription);
|
|
204
|
-
}
|
|
205
|
-
if (formImage) {
|
|
206
|
-
if (!["image/jpeg", "image/png", "image/gif"].includes(formImage.type)) {
|
|
207
|
-
throw new Error(ABOUT_SECTION.ERRORS.INVALID_IMAGE_TYPE);
|
|
208
|
-
}
|
|
209
|
-
formData.append("image", formImage);
|
|
210
|
-
}
|
|
211
|
-
if (!formData.has("title") && !formData.has("description") && !formData.has("image")) {
|
|
212
|
-
onSuccess();
|
|
213
|
-
return [2 /*return*/];
|
|
214
|
-
}
|
|
215
|
-
return [4 /*yield*/, getToken()];
|
|
216
|
-
case 2:
|
|
217
|
-
token = _b.sent();
|
|
218
|
-
if (!token) {
|
|
219
|
-
throw new Error(ABOUT_SECTION.ERRORS.NO_AUTH_TOKEN);
|
|
220
|
-
}
|
|
221
|
-
return [4 /*yield*/, fetch("/api/about", {
|
|
222
|
-
method: "PUT",
|
|
223
|
-
headers: {
|
|
224
|
-
Authorization: "Bearer ".concat(token),
|
|
225
|
-
},
|
|
226
|
-
body: formData,
|
|
227
|
-
})];
|
|
228
|
-
case 3:
|
|
229
|
-
response = _b.sent();
|
|
230
|
-
if (!!response.ok) return [3 /*break*/, 5];
|
|
231
|
-
return [4 /*yield*/, response.json()];
|
|
232
|
-
case 4:
|
|
233
|
-
errorData = _b.sent();
|
|
234
|
-
throw new Error(errorData.error || ABOUT_SECTION.ERRORS.UPDATE_FAILED.replace("${response.status}", response.status.toString()));
|
|
235
|
-
case 5: return [4 /*yield*/, response.json()];
|
|
236
|
-
case 6:
|
|
237
|
-
result = _b.sent();
|
|
238
|
-
if (result.data) {
|
|
239
|
-
aboutData = Array.isArray(result.data)
|
|
240
|
-
? result.data[0]
|
|
241
|
-
: result.data;
|
|
242
|
-
setImageUrl(((_a = aboutData.image) === null || _a === void 0 ? void 0 : _a.url) || null);
|
|
243
|
-
setDescription(aboutData.description || null);
|
|
244
|
-
setTitle(aboutData.title || null);
|
|
245
|
-
setFormTitle(aboutData.title || "");
|
|
246
|
-
setFormDescription(aboutData.description || "");
|
|
247
|
-
setError(null);
|
|
248
|
-
onSuccess();
|
|
249
|
-
}
|
|
250
|
-
return [3 /*break*/, 8];
|
|
251
|
-
case 7:
|
|
252
|
-
err_2 = _b.sent();
|
|
253
|
-
console.error("Update Error:", err_2);
|
|
254
|
-
setError(err_2 instanceof Error ? err_2.message : ABOUT_SECTION.ERRORS.UPDATE_ERROR);
|
|
255
|
-
return [3 /*break*/, 8];
|
|
256
|
-
case 8: return [2 /*return*/];
|
|
257
|
-
}
|
|
258
|
-
});
|
|
259
|
-
}); };
|
|
260
|
-
var isAdmin = isSignedIn && !!(user === null || user === void 0 ? void 0 : user.businessAdminId);
|
|
261
|
-
var sectionVariants = {
|
|
262
|
-
hidden: { opacity: 0, y: 20 },
|
|
263
|
-
visible: {
|
|
264
|
-
opacity: 1,
|
|
265
|
-
y: 0,
|
|
266
|
-
transition: { duration: isMobile ? 0.3 : 0.5, ease: "easeOut" },
|
|
267
|
-
},
|
|
268
|
-
};
|
|
269
|
-
var itemVariants = {
|
|
270
|
-
hidden: { opacity: 0, y: 10 },
|
|
271
|
-
visible: {
|
|
272
|
-
opacity: 1,
|
|
273
|
-
y: 0,
|
|
274
|
-
transition: { duration: isMobile ? 0.3 : 0.5, ease: "easeOut" },
|
|
275
|
-
},
|
|
276
|
-
};
|
|
277
|
-
var modalVariants = {
|
|
278
|
-
hidden: { opacity: 0, y: "100vh" },
|
|
279
|
-
visible: { opacity: 1, y: 0, transition: { duration: 0.5, ease: [0.16, 1, 0.3, 1] } },
|
|
280
|
-
exit: { opacity: 0, y: "100vh", transition: { duration: 0.3, ease: "easeIn" } },
|
|
281
|
-
};
|
|
282
|
-
var paragraphs = description
|
|
283
|
-
? description.split("\n").filter(function (paragraph) { return paragraph.trim() !== ""; })
|
|
284
|
-
: [];
|
|
285
|
-
return (<div className="w-full">
|
|
286
|
-
<style jsx>{"\n :root {\n --jubilee: #F47C7C;\n --exuberant-blue: #FF69B4;\n --modern-purple: #D946EF;\n --green-primary: #1a3c34;\n }\n\n .glassmorphism {\n background: rgba(255, 255, 255, 0.08);\n backdrop-filter: blur(10px);\n border: 2px solid transparent;\n border-image: linear-gradient(45deg, var(--exuberant-blue), var(--jubilee), var(--modern-purple)) 1;\n box-shadow: 0 16px 48px rgba(0, 0, 0, 0.1);\n }\n\n .modal-form {\n max-height: 90vh;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n }\n\n .modal-form input,\n .modal-form textarea {\n font-size: 0.875rem;\n padding: 0.5rem;\n border-radius: 0.375rem;\n background: #374151;\n color: #f3f4f6;\n border: 1px solid #4b5563;\n }\n\n .modal-form input:focus,\n .modal-form textarea:focus {\n outline: none;\n ring: 2px solid #3b82f6;\n }\n\n .modal-form label {\n font-size: 0.875rem;\n color: #d1d5db;\n }\n\n body.overflow-hidden {\n overflow: hidden;\n }\n\n @supports not (backdrop-filter: blur(10px)) {\n .glassmorphism {\n background: rgba(255, 255, 255, 0.2);\n }\n }\n\n @media (max-width: 768px) {\n .glassmorphism {\n backdrop-filter: none;\n background: rgba(255, 255, 255, 0.2);\n }\n\n .modal-form input,\n .modal-form textarea {\n font-size: 0.875rem;\n padding: 0.5rem;\n border-radius: 0.375rem;\n }\n\n .modal-form label {\n font-size: 0.875rem;\n }\n\n .modal-form .flex {\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .modal-form textarea {\n min-height: 80px;\n }\n }\n\n @media (max-width: 320px) {\n .modal-form input,\n .modal-form textarea {\n font-size: 0.75rem;\n padding: 0.5rem;\n }\n\n .modal-form label {\n font-size: 0.75rem;\n }\n }\n "}</style>
|
|
287
|
-
<motion.div variants={sectionVariants} initial="hidden" animate="visible" className="mb-24 max-w-[200rem] mx-auto px-8 sm:px-10 pt-24">
|
|
288
|
-
<div className="flex flex-col md:flex-row gap-10 items-start min-h-[fit-content]">
|
|
289
|
-
<motion.div variants={itemVariants} className="relative h-[40vh] min-h-[400px] sm:h-[50vh] lg:h-[600px] rounded-[1.5rem] overflow-hidden glassmorphism w-full mx-auto max-w-3xl md:max-w-none md:mx-0">
|
|
290
|
-
{imageUrl ? (<div className="relative w-full h-full">
|
|
291
|
-
<Image src={imageUrl} alt="About DevVista Kit" fill className="object-cover rounded-[1rem] transition-transform duration-700 hover:scale-110" sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw" loading="lazy" quality={85}/>
|
|
292
|
-
<div className="absolute inset-0 bg-gradient-to-t from-black/40 to-transparent opacity-0 hover:opacity-100 transition-opacity duration-500"></div>
|
|
293
|
-
{isAdmin && (<div className="absolute top-2 right-0 flex">
|
|
294
|
-
<EditIconButton onClick={function (e) {
|
|
295
|
-
e.stopPropagation();
|
|
296
|
-
openEditModal();
|
|
297
|
-
}}/>
|
|
298
|
-
</div>)}
|
|
299
|
-
</div>) : (<div className="w-full h-full flex items-center justify-center">
|
|
300
|
-
<p className="text-gray-600 text-lg">{ABOUT_SECTION.UI.NO_IMAGE_AVAILABLE}</p>
|
|
301
|
-
</div>)}
|
|
302
|
-
</motion.div>
|
|
303
|
-
<motion.div variants={itemVariants} className="space-y-6 min-h-[fit-content] h-auto w-full relative">
|
|
304
|
-
{title && (<motion.h2 variants={itemVariants} className="text-2xl sm:text-3xl font-bold text-gray-800">
|
|
305
|
-
{title}
|
|
306
|
-
</motion.h2>)}
|
|
307
|
-
{paragraphs.length > 0 ? (<>
|
|
308
|
-
{paragraphs
|
|
309
|
-
.slice(0, isExpanded ? paragraphs.length : 3)
|
|
310
|
-
.map(function (paragraph, index) { return (<motion.p key={index} variants={itemVariants} className="text-gray-800 text-base sm:text-lg md:text-xl leading-relaxed font-medium">
|
|
311
|
-
{paragraph}
|
|
312
|
-
</motion.p>); })}
|
|
313
|
-
{paragraphs.length > 3 && (<motion.div variants={itemVariants} className="mt-4">
|
|
314
|
-
<ToggleButton variant="toggle-bio" onClick={function () { return setIsExpanded(!isExpanded); }}>
|
|
315
|
-
{isExpanded ? ABOUT_SECTION.BUTTONS.READ_LESS_BUTTON : ABOUT_SECTION.BUTTONS.READ_MORE_BUTTON}
|
|
316
|
-
</ToggleButton>
|
|
317
|
-
</motion.div>)}
|
|
318
|
-
</>) : (<motion.p variants={itemVariants} className="text-gray-600 text-base sm:text-lg md:text-xl leading-relaxed font-medium">
|
|
319
|
-
{ABOUT_SECTION.UI.NO_DESCRIPTION_AVAILABLE}
|
|
320
|
-
</motion.p>)}
|
|
321
|
-
{authLoading || isLoading ? (<Spinner />) : isAdmin ? (<p className="text-gray-400 text-sm font-medium">
|
|
322
|
-
{ABOUT_SECTION.UI.ADMIN_LOGGED_IN_MESSAGE}
|
|
323
|
-
</p>) : null}
|
|
324
|
-
{error && (<p className="text-red-400 text-base sm:text-lg md:text-xl text-center mt-4">{error}</p>)}
|
|
325
|
-
</motion.div>
|
|
326
|
-
</div>
|
|
327
|
-
</motion.div>
|
|
328
|
-
{isEditModalOpen && (<motion.div variants={modalVariants} initial="hidden" animate="visible" exit="exit" className="fixed inset-0 bg-black/90 flex items-center justify-center z-[10000] p-4 isolate" onClick={handleCancelEdit} aria-modal="true" role="dialog">
|
|
329
|
-
<div className="relative max-w-5xl w-full mx-4 p-6 bg-gray-800/50 border border-gray-700/50 rounded-lg shadow-lg max-h-[90vh] overflow-y-auto modal-form" onClick={function (e) { return e.stopPropagation(); }}>
|
|
330
|
-
<CloseButton onClick={handleCancelEdit}>
|
|
331
|
-
<X className="h-6 w-6 sm:h-8 sm:w-8"/>
|
|
332
|
-
</CloseButton>
|
|
333
|
-
<h3 className="text-xl font-bold text-white mb-4">{ABOUT_SECTION.UI.MODAL_HEADING}</h3>
|
|
334
|
-
<form onSubmit={function (e) {
|
|
335
|
-
setIsSubmitting(true);
|
|
336
|
-
handlePatchSubmit(e, formTitle, formDescription, formImage, function () {
|
|
337
|
-
setIsEditModalOpen(false);
|
|
338
|
-
}).finally(function () { return setIsSubmitting(false); });
|
|
339
|
-
}} className="space-y-4 modal-form">
|
|
340
|
-
<div>
|
|
341
|
-
<label htmlFor="aboutTitle" className="block text-sm font-medium text-gray-300 mb-1">
|
|
342
|
-
{ABOUT_SECTION.UI.TITLE_LABEL}
|
|
343
|
-
</label>
|
|
344
|
-
<input id="aboutTitle" type="text" value={formTitle} onChange={function (e) { return setFormTitle(e.target.value); }} className="w-full p-2 rounded bg-gray-700 text-white border border-gray-600 focus:outline-none focus:ring-2 focus:ring-blue-500 text-sm" placeholder={ABOUT_SECTION.UI.TITLE_PLACEHOLDER}/>
|
|
345
|
-
</div>
|
|
346
|
-
<div>
|
|
347
|
-
<label htmlFor="aboutImage" className="block text-sm font-medium text-gray-300 mb-1">
|
|
348
|
-
{ABOUT_SECTION.UI.IMAGE_LABEL}
|
|
349
|
-
</label>
|
|
350
|
-
<input id="aboutImage" type="file" accept="image/jpeg,image/png,image/gif" onChange={function (e) { var _a; return setFormImage(((_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0]) || null); }} className="w-full p-2 rounded bg-gray-700 text-white border border-gray-600 focus:outline-none focus:ring-2 focus:ring-blue-500 text-sm"/>
|
|
351
|
-
{formImage && (<p className="mt-2 text-gray-300 text-sm">{ABOUT_SECTION.UI.SELECTED_IMAGE_TEXT.replace("${formImage.name}", formImage.name)}</p>)}
|
|
352
|
-
</div>
|
|
353
|
-
<div>
|
|
354
|
-
<label htmlFor="aboutDescription" className="block text-sm font-medium text-gray-300 mb-1">
|
|
355
|
-
{ABOUT_SECTION.UI.DESCRIPTION_LABEL}
|
|
356
|
-
</label>
|
|
357
|
-
<textarea id="aboutDescription" value={formDescription} onChange={function (e) { return setFormDescription(e.target.value); }} className="w-full p-2 rounded bg-gray-700 text-white border border-gray-600 focus:outline-none focus:ring-2 focus:ring-blue-500 text-sm min-h-[80px]" placeholder={ABOUT_SECTION.UI.DESCRIPTION_PLACEHOLDER}/>
|
|
358
|
-
</div>
|
|
359
|
-
<div className="flex flex-col sm:flex-row space-y-2 sm:space-y-0 sm:space-x-3">
|
|
360
|
-
<UpdateButton type="submit" disabled={isSubmitting}>
|
|
361
|
-
{isSubmitting ? ABOUT_SECTION.BUTTONS.SAVING_BUTTON : ABOUT_SECTION.BUTTONS.UPDATE_BUTTON}
|
|
362
|
-
</UpdateButton>
|
|
363
|
-
<CancelButton type="button" onClick={handleCancelEdit}>
|
|
364
|
-
{ABOUT_SECTION.BUTTONS.CANCEL_BUTTON}
|
|
365
|
-
</CancelButton>
|
|
366
|
-
</div>
|
|
367
|
-
{error && <p className="text-red-400 text-sm font-medium">{error}</p>}
|
|
368
|
-
</form>
|
|
369
|
-
</div>
|
|
370
|
-
</motion.div>)}
|
|
371
|
-
</div>);
|
|
372
|
-
}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
// components/addOns/functional/aboutSections/constants/aboutSection.ts
|
|
2
|
-
// Constants for hardcoded text in AboutSection.tsx, organized by purpose
|
|
3
|
-
export var ABOUT_SECTION = {
|
|
4
|
-
// UI Text for AboutSection
|
|
5
|
-
UI: {
|
|
6
|
-
// Blockquote text
|
|
7
|
-
BLOCKQUOTE_TEXT: "“DevVista Kit is a modern, well-equipped facility with a friendly and vibrant atmosphere.”",
|
|
8
|
-
// Placeholder text when no image is available
|
|
9
|
-
NO_IMAGE_AVAILABLE: "No image available",
|
|
10
|
-
// Text when no description is available
|
|
11
|
-
NO_DESCRIPTION_AVAILABLE: "No about description available.",
|
|
12
|
-
// Message when logged in as admin
|
|
13
|
-
ADMIN_LOGGED_IN_MESSAGE: "You are logged in as an admin.",
|
|
14
|
-
// Modal heading
|
|
15
|
-
MODAL_HEADING: "Edit About",
|
|
16
|
-
// Form label for title input
|
|
17
|
-
TITLE_LABEL: "About Title",
|
|
18
|
-
// Placeholder for title input
|
|
19
|
-
TITLE_PLACEHOLDER: "Enter the about title",
|
|
20
|
-
// Form label for image input
|
|
21
|
-
IMAGE_LABEL: "Update Image (optional)",
|
|
22
|
-
// Text showing selected image name
|
|
23
|
-
SELECTED_IMAGE_TEXT: "Selected: ${formImage.name}",
|
|
24
|
-
// Form label for description textarea
|
|
25
|
-
DESCRIPTION_LABEL: "Update Description",
|
|
26
|
-
// Placeholder for description textarea
|
|
27
|
-
DESCRIPTION_PLACEHOLDER: "Enter the about description",
|
|
28
|
-
},
|
|
29
|
-
// Button Text for AboutSection
|
|
30
|
-
BUTTONS: {
|
|
31
|
-
// EditButton text
|
|
32
|
-
EDIT_BUTTON: "Edit",
|
|
33
|
-
// ReadMoreButton text when not expanded
|
|
34
|
-
READ_MORE_BUTTON: "Read More",
|
|
35
|
-
// ReadMoreButton text when expanded
|
|
36
|
-
READ_LESS_BUTTON: "Read Less",
|
|
37
|
-
// ActionButton text
|
|
38
|
-
GET_STARTED_BUTTON: "Get Started",
|
|
39
|
-
// UpdateButton text
|
|
40
|
-
UPDATE_BUTTON: "Update",
|
|
41
|
-
// UpdateButton text when submitting
|
|
42
|
-
SAVING_BUTTON: "Saving...",
|
|
43
|
-
// CancelButton text
|
|
44
|
-
CANCEL_BUTTON: "Cancel",
|
|
45
|
-
},
|
|
46
|
-
// Error Messages for AboutSection
|
|
47
|
-
ERRORS: {
|
|
48
|
-
// Error when no about data is returned
|
|
49
|
-
NO_DATA_FOUND: "About data not found",
|
|
50
|
-
// Error when fetch fails with status code
|
|
51
|
-
FETCH_FAILED: "Failed to fetch about data: ${response.status}",
|
|
52
|
-
// Generic error for fetch failure
|
|
53
|
-
FETCH_ERROR: "An error occurred while fetching about data",
|
|
54
|
-
// Error for non-admin update attempt
|
|
55
|
-
UNAUTHORIZED_UPDATE: "Unauthorized: Only admin can update about data",
|
|
56
|
-
// Error for invalid image type
|
|
57
|
-
INVALID_IMAGE_TYPE: "Only JPEG, PNG, or GIF images are allowed",
|
|
58
|
-
// Error when no authentication token is available
|
|
59
|
-
NO_AUTH_TOKEN: "No authentication token available",
|
|
60
|
-
// Error when update fails with status code
|
|
61
|
-
UPDATE_FAILED: "Failed to update about data: ${response.status}",
|
|
62
|
-
// Generic error for update failure
|
|
63
|
-
UPDATE_ERROR: "Failed to update about data",
|
|
64
|
-
},
|
|
65
|
-
};
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import React, { useEffect, useState } from "react";
|
|
3
|
-
import { useRouter } from "next/navigation";
|
|
4
|
-
import { AddButton, EditIconButton, TrashIconButton } from "@/components/other/button";
|
|
5
|
-
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/other/card";
|
|
6
|
-
import { Heart, Send } from "lucide-react";
|
|
7
|
-
import { Separator } from "@/components/other/separator";
|
|
8
|
-
import { useAuth } from "@clerk/nextjs";
|
|
9
|
-
import { useStrapiAuth } from "@/lib/auth-context";
|
|
10
|
-
import { BLOG_DASHBOARD } from "./constants/blogDashboard";
|
|
11
|
-
var BlogDashboard = function (_a) {
|
|
12
|
-
var isModalOpen = _a.isModalOpen, setIsModalOpen = _a.setIsModalOpen, isConfirmDeleteOpen = _a.isConfirmDeleteOpen, setIsConfirmDeleteOpen = _a.setIsConfirmDeleteOpen, posts = _a.posts, setPosts = _a.setPosts, setError = _a.setError, isLoading = _a.isLoading, setIsLoading = _a.setIsLoading, fetchData = _a.fetchData, formData = _a.formData, setFormData = _a.setFormData, postToDelete = _a.postToDelete, setPostToDelete = _a.setPostToDelete, showSuccess = _a.showSuccess, setShowSuccess = _a.setShowSuccess;
|
|
13
|
-
var router = useRouter();
|
|
14
|
-
var user = useStrapiAuth().user;
|
|
15
|
-
var _b = useAuth(), getToken = _b.getToken, isSignedIn = _b.isSignedIn, isLoaded = _b.isLoaded;
|
|
16
|
-
var _c = useState(false), isAdmin = _c[0], setIsAdmin = _c[1];
|
|
17
|
-
useEffect(function () {
|
|
18
|
-
if (isLoaded) {
|
|
19
|
-
setIsAdmin(isSignedIn && !!(user === null || user === void 0 ? void 0 : user.businessAdminId));
|
|
20
|
-
}
|
|
21
|
-
}, [isLoaded, isSignedIn, user === null || user === void 0 ? void 0 : user.businessAdminId]);
|
|
22
|
-
var handleEdit = function (post) {
|
|
23
|
-
setFormData(post);
|
|
24
|
-
setIsModalOpen(true);
|
|
25
|
-
};
|
|
26
|
-
var openModal = function (post) {
|
|
27
|
-
if (post) {
|
|
28
|
-
setFormData(post);
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
setFormData({
|
|
32
|
-
id: 0,
|
|
33
|
-
documentId: "",
|
|
34
|
-
title: "",
|
|
35
|
-
description: "",
|
|
36
|
-
author: (user === null || user === void 0 ? void 0 : user.firstName) && (user === null || user === void 0 ? void 0 : user.lastName) ? "".concat(user.firstName, " ").concat(user.lastName) : "",
|
|
37
|
-
publishedAt: "",
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
setIsModalOpen(true);
|
|
41
|
-
};
|
|
42
|
-
useEffect(function () {
|
|
43
|
-
}, [posts, isAdmin, isLoaded, isSignedIn, user]);
|
|
44
|
-
if (!isLoaded) {
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
return (<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">
|
|
48
|
-
<CardHeader className="pb-4">
|
|
49
|
-
<CardTitle className="text-2xl font-bold text-blue-200">{BLOG_DASHBOARD.UI.CARD_TITLE}</CardTitle>
|
|
50
|
-
<CardDescription className="text-gray-400">{BLOG_DASHBOARD.UI.CARD_DESCRIPTION}</CardDescription>
|
|
51
|
-
</CardHeader>
|
|
52
|
-
<CardContent className="p-6 sm:p-8">
|
|
53
|
-
{showSuccess && (<div className="bg-green-900/50 border-l-4 border-green-600 p-4 rounded-lg backdrop-blur-sm mb-8 animate-pulse">
|
|
54
|
-
<div className="flex items-center gap-2">
|
|
55
|
-
<Heart className="h-5 w-5 text-green-400"/>
|
|
56
|
-
<p className="text-green-300">{BLOG_DASHBOARD.UI.SUCCESS_MESSAGE}</p>
|
|
57
|
-
</div>
|
|
58
|
-
</div>)}
|
|
59
|
-
<div className="mb-6">
|
|
60
|
-
<AddButton onClick={function () { return openModal(); }} disabled={isLoading || !isSignedIn}>
|
|
61
|
-
<Send className="w-5 h-5 mr-2"/>
|
|
62
|
-
{BLOG_DASHBOARD.BUTTONS.ADD_BUTTON}
|
|
63
|
-
</AddButton>
|
|
64
|
-
</div>
|
|
65
|
-
{posts.length > 0 ? (<div className="space-y-4 max-h-[400px] overflow-y-auto pr-2">
|
|
66
|
-
{posts.map(function (post, index) { return (<div key={post.id} className="group">
|
|
67
|
-
<div onClick={function () { return router.push("/blog/".concat(post.id)); }} 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
|
|
68
|
-
>
|
|
69
|
-
<div className="flex items-start justify-between mb-3">
|
|
70
|
-
<div className="flex flex-col max-w-[70%]">
|
|
71
|
-
<h4 className="font-medium text-blue-200 mb-1 truncate">{post.title}</h4>
|
|
72
|
-
<div className="text-sm text-gray-400">
|
|
73
|
-
<span>
|
|
74
|
-
{new Date(post.publishedAt).toLocaleDateString("en-US", {
|
|
75
|
-
year: "numeric",
|
|
76
|
-
month: "short",
|
|
77
|
-
day: "numeric",
|
|
78
|
-
})}
|
|
79
|
-
</span>
|
|
80
|
-
<span> | {post.author}</span>
|
|
81
|
-
</div>
|
|
82
|
-
</div>
|
|
83
|
-
{isAdmin && (<div className="absolute top-2 right-2 flex space-x-2">
|
|
84
|
-
<EditIconButton variant="edit-icon" onClick={function (e) {
|
|
85
|
-
e.stopPropagation();
|
|
86
|
-
handleEdit(post);
|
|
87
|
-
}} aria-label={BLOG_DASHBOARD.BUTTONS.EDIT_BUTTON_ARIA.replace("${post.title}", post.title)}>
|
|
88
|
-
</EditIconButton>
|
|
89
|
-
<TrashIconButton variant="trash-icon" onClick={function (e) {
|
|
90
|
-
e.stopPropagation();
|
|
91
|
-
setPostToDelete({ id: post.id, documentId: post.documentId, title: post.title });
|
|
92
|
-
setIsConfirmDeleteOpen(true);
|
|
93
|
-
}} aria-label={BLOG_DASHBOARD.BUTTONS.DELETE_BUTTON_ARIA.replace("${post.title}", post.title)}>
|
|
94
|
-
</TrashIconButton>
|
|
95
|
-
</div>)}
|
|
96
|
-
</div>
|
|
97
|
-
<p className="text-sm text-gray-400 line-clamp-2">{post.description}</p>
|
|
98
|
-
</div>
|
|
99
|
-
{index < posts.length - 1 && <Separator className="my-3 bg-gray-700/50"/>}
|
|
100
|
-
</div>); })}
|
|
101
|
-
</div>) : (<div className="text-center py-10 text-gray-400">
|
|
102
|
-
<div className="w-16 h-16 bg-gray-900/50 rounded-full flex items-center justify-center mx-auto mb-4">
|
|
103
|
-
<Send className="w-6 h-6 text-gray-500"/>
|
|
104
|
-
</div>
|
|
105
|
-
<p className="font-medium">{BLOG_DASHBOARD.UI.NO_POSTS_MESSAGE}</p>
|
|
106
|
-
<p className="text-sm">{BLOG_DASHBOARD.UI.NO_POSTS_SUBTEXT}</p>
|
|
107
|
-
</div>)}
|
|
108
|
-
</CardContent>
|
|
109
|
-
</Card>);
|
|
110
|
-
};
|
|
111
|
-
export default BlogDashboard;
|