@devvistatech/devvista-kit 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +7 -0
  3. package/README.md +15 -0
  4. package/app/about/page.tsx +306 -0
  5. package/app/adRequest/page.tsx +550 -0
  6. package/app/analytics/page.tsx +347 -0
  7. package/app/api/about/route.ts +307 -0
  8. package/app/api/adRequest/route.ts +568 -0
  9. package/app/api/analytics/[reportType]/route.ts +338 -0
  10. package/app/api/bio/route.ts +314 -0
  11. package/app/api/blog/route.ts +307 -0
  12. package/app/api/chat/route.ts +15 -0
  13. package/app/api/contact/route.ts +410 -0
  14. package/app/api/contacts/route.ts +225 -0
  15. package/app/api/files/route.ts +430 -0
  16. package/app/api/gallery-data/route.ts +661 -0
  17. package/app/api/schedule/route.ts +456 -0
  18. package/app/api/sync-user/route.ts +114 -0
  19. package/app/api/trial-request/route.ts +298 -0
  20. package/app/blog/[id]/page.tsx +281 -0
  21. package/app/blog/page.tsx +217 -0
  22. package/app/constants/about.ts +49 -0
  23. package/app/constants/adRequest.ts +114 -0
  24. package/app/constants/contact.ts +41 -0
  25. package/app/constants/faq.ts +46 -0
  26. package/app/constants/gallery.ts +43 -0
  27. package/app/constants/page.ts +70 -0
  28. package/app/constants/schedule.ts +72 -0
  29. package/app/contact/page.tsx +285 -0
  30. package/app/faq/page.tsx +192 -0
  31. package/app/favicon.ico +0 -0
  32. package/app/gallery/page.tsx +320 -0
  33. package/app/globals.css +58 -0
  34. package/app/layout.tsx +62 -0
  35. package/app/page.tsx +339 -0
  36. package/app/schedule/page.tsx +661 -0
  37. package/bin/init.js +187 -0
  38. package/components/addOns/functional/BioEditor.tsx +430 -0
  39. package/components/addOns/functional/CalendlyWidget.tsx +101 -0
  40. package/components/addOns/functional/ClassList.tsx +146 -0
  41. package/components/addOns/functional/ClassPopup.tsx +399 -0
  42. package/components/addOns/functional/ContactForm.tsx +285 -0
  43. package/components/addOns/functional/FileUploader.tsx +293 -0
  44. package/components/addOns/functional/ImageDescCarousel.tsx +821 -0
  45. package/components/addOns/functional/NewUserAnalytics.tsx +101 -0
  46. package/components/addOns/functional/ScheduleCarousel.tsx +172 -0
  47. package/components/addOns/functional/aboutSections/AboutSection.tsx +571 -0
  48. package/components/addOns/functional/aboutSections/constants/aboutSection.ts +66 -0
  49. package/components/addOns/functional/blogSections/BlogDashboard.tsx +185 -0
  50. package/components/addOns/functional/blogSections/BlogFormPopUp.tsx +555 -0
  51. package/components/addOns/functional/blogSections/BlogList.tsx +149 -0
  52. package/components/addOns/functional/blogSections/BlogSidebar.tsx +59 -0
  53. package/components/addOns/functional/blogSections/constants/blogDashboard.ts +29 -0
  54. package/components/addOns/functional/blogSections/constants/blogFormPopUp.ts +98 -0
  55. package/components/addOns/functional/blogSections/constants/blogList.ts +23 -0
  56. package/components/addOns/functional/blogSections/constants/blogSidebar.ts +16 -0
  57. package/components/addOns/functional/contactsDashboard/ContactsDashboard.tsx +348 -0
  58. package/components/addOns/functional/contactsDashboard/constants/contactsDashboard.ts +71 -0
  59. package/components/addOns/functional/galleries/GalleryComplex.tsx +908 -0
  60. package/components/addOns/functional/galleries/GallerySimple.tsx +604 -0
  61. package/components/addOns/functional/galleries/constants/galleryComplex.ts +105 -0
  62. package/components/addOns/functional/galleries/constants/gallerySimple.ts +75 -0
  63. package/components/addOns/functional/schedules/ScheduleGridOne.tsx +263 -0
  64. package/components/addOns/functional/schedules/ScheduleGridTwo.tsx +295 -0
  65. package/components/addOns/functional/schedules/ScheduleGridTwoBasic.tsx +289 -0
  66. package/components/addOns/functional/schedules/SchedulerForm.tsx +429 -0
  67. package/components/addOns/functional/schedules/constants/ScheduleGridTwo.ts +41 -0
  68. package/components/addOns/functional/schedules/constants/ScheduleGridTwoBasic.ts +41 -0
  69. package/components/addOns/functional/schedules/constants/SchedulerForm.ts +66 -0
  70. package/components/addOns/functional/schedules/constants/scheduleGridOne.ts +55 -0
  71. package/components/addOns/non-functional/AnnouncementBanner.tsx +47 -0
  72. package/components/addOns/non-functional/FeaturesSection.tsx +63 -0
  73. package/components/addOns/non-functional/HeroSection.tsx +143 -0
  74. package/components/addOns/non-functional/IconBubble.tsx +50 -0
  75. package/components/addOns/non-functional/SampleCarousel.tsx +205 -0
  76. package/components/addOns/non-functional/Testimonials.tsx +336 -0
  77. package/components/addOns/non-functional/ThreeSetGallery.tsx +64 -0
  78. package/components/addOns/non-functional/aboutSections/AboutSection.tsx +63 -0
  79. package/components/addOns/non-functional/aboutSections/constants/aboutSection.ts +25 -0
  80. package/components/addOns/non-functional/imageCarousels/ProductSlider.tsx +118 -0
  81. package/components/addOns/non-functional/imageCarousels/ProgramCarousel.tsx +233 -0
  82. package/components/addOns/non-functional/imageCarousels/constants/programCarousel.ts +40 -0
  83. package/components/addOns/non-functional/imageCarousels/constants/programSlider.ts +37 -0
  84. package/components/addOns/non-functional/spinner.tsx +22 -0
  85. package/components/footers/footer.tsx +454 -0
  86. package/components/navBars/navbar.tsx +311 -0
  87. package/components/other/accordion.tsx +58 -0
  88. package/components/other/admin-menu.tsx +69 -0
  89. package/components/other/alert-dialog.tsx +141 -0
  90. package/components/other/alert.tsx +59 -0
  91. package/components/other/aspect-ratio.tsx +7 -0
  92. package/components/other/avatar.tsx +50 -0
  93. package/components/other/badge.tsx +36 -0
  94. package/components/other/breadcrumb.tsx +115 -0
  95. package/components/other/button.tsx +733 -0
  96. package/components/other/calendar.tsx +66 -0
  97. package/components/other/card.tsx +86 -0
  98. package/components/other/carousel.tsx +275 -0
  99. package/components/other/chart.tsx +363 -0
  100. package/components/other/checkbox.tsx +30 -0
  101. package/components/other/collapsible.tsx +11 -0
  102. package/components/other/command.tsx +155 -0
  103. package/components/other/context-menu.tsx +200 -0
  104. package/components/other/dialog.tsx +122 -0
  105. package/components/other/drawer.tsx +118 -0
  106. package/components/other/dropdown-menu.tsx +200 -0
  107. package/components/other/form.tsx +179 -0
  108. package/components/other/hover-card.tsx +29 -0
  109. package/components/other/input-otp.tsx +71 -0
  110. package/components/other/input.tsx +25 -0
  111. package/components/other/label.tsx +26 -0
  112. package/components/other/login-popup.tsx +0 -0
  113. package/components/other/menubar.tsx +236 -0
  114. package/components/other/mobile-icon.tsx +22 -0
  115. package/components/other/navigation-menu.tsx +128 -0
  116. package/components/other/pagination.tsx +117 -0
  117. package/components/other/popover.tsx +31 -0
  118. package/components/other/progress.tsx +28 -0
  119. package/components/other/radio-group.tsx +44 -0
  120. package/components/other/resizable.tsx +45 -0
  121. package/components/other/scroll-area.tsx +48 -0
  122. package/components/other/select.tsx +160 -0
  123. package/components/other/separator.tsx +31 -0
  124. package/components/other/sheet.tsx +140 -0
  125. package/components/other/signup-popup.tsx +0 -0
  126. package/components/other/skeleton.tsx +15 -0
  127. package/components/other/slider.tsx +28 -0
  128. package/components/other/social-icons.tsx +40 -0
  129. package/components/other/sonner.tsx +31 -0
  130. package/components/other/switch.tsx +29 -0
  131. package/components/other/table.tsx +117 -0
  132. package/components/other/tabs.tsx +55 -0
  133. package/components/other/textarea.tsx +24 -0
  134. package/components/other/toast.tsx +123 -0
  135. package/components/other/toaster.tsx +35 -0
  136. package/components/other/toggle-group.tsx +61 -0
  137. package/components/other/toggle.tsx +45 -0
  138. package/components/other/tooltip.tsx +30 -0
  139. package/components/theme-provider.tsx +9 -0
  140. package/components/types.ts +22 -0
  141. package/dist/.next/types/app/api/about/route.js +52 -0
  142. package/dist/.next/types/app/api/blog/route.js +52 -0
  143. package/dist/.next/types/app/api/files/route.js +52 -0
  144. package/dist/.next/types/app/api/schedule/route.js +52 -0
  145. package/dist/.next/types/app/api/sync-user/route.js +52 -0
  146. package/dist/.next/types/app/layout.js +22 -0
  147. package/dist/.next/types/app/page.js +22 -0
  148. package/dist/app/about/page.jsx +259 -0
  149. package/dist/app/adRequest/page.jsx +531 -0
  150. package/dist/app/analytics/page.jsx +298 -0
  151. package/dist/app/api/about/route.js +285 -0
  152. package/dist/app/api/adRequest/route.js +440 -0
  153. package/dist/app/api/analytics/[reportType]/route.js +346 -0
  154. package/dist/app/api/bio/route.js +293 -0
  155. package/dist/app/api/blog/route.js +366 -0
  156. package/dist/app/api/chat/route.js +58 -0
  157. package/dist/app/api/contact/route.js +163 -0
  158. package/dist/app/api/contacts/route.js +234 -0
  159. package/dist/app/api/files/route.js +444 -0
  160. package/dist/app/api/gallery-data/route.js +642 -0
  161. package/dist/app/api/schedule/route.js +461 -0
  162. package/dist/app/api/sync-user/route.js +174 -0
  163. package/dist/app/api/trial-request/route.js +165 -0
  164. package/dist/app/blog/[id]/page.jsx +307 -0
  165. package/dist/app/blog/page.jsx +210 -0
  166. package/dist/app/constants/about.js +32 -0
  167. package/dist/app/constants/adRequest.js +113 -0
  168. package/dist/app/constants/contact.js +40 -0
  169. package/dist/app/constants/faq.js +36 -0
  170. package/dist/app/constants/gallery.js +42 -0
  171. package/dist/app/constants/page.js +69 -0
  172. package/dist/app/constants/schedule.js +71 -0
  173. package/dist/app/contact/page.jsx +119 -0
  174. package/dist/app/faq/page.jsx +97 -0
  175. package/dist/app/gallery/page.jsx +280 -0
  176. package/dist/app/layout.jsx +45 -0
  177. package/dist/app/page.jsx +324 -0
  178. package/dist/app/schedule/page.jsx +500 -0
  179. package/dist/components/addOns/functional/BioEditor.jsx +175 -0
  180. package/dist/components/addOns/functional/CalendlyWidget.jsx +61 -0
  181. package/dist/components/addOns/functional/ClassList.jsx +158 -0
  182. package/dist/components/addOns/functional/ClassPopup.jsx +300 -0
  183. package/dist/components/addOns/functional/ContactForm.jsx +219 -0
  184. package/dist/components/addOns/functional/FileUploader.jsx +222 -0
  185. package/dist/components/addOns/functional/ImageDescCarousel.jsx +464 -0
  186. package/dist/components/addOns/functional/NewUserAnalytics.jsx +71 -0
  187. package/dist/components/addOns/functional/ScheduleCarousel.jsx +68 -0
  188. package/dist/components/addOns/functional/aboutSections/AboutSection.jsx +369 -0
  189. package/dist/components/addOns/functional/aboutSections/constants/aboutSection.js +65 -0
  190. package/dist/components/addOns/functional/blogSections/BlogDashboard.jsx +111 -0
  191. package/dist/components/addOns/functional/blogSections/BlogFormPopUp.jsx +465 -0
  192. package/dist/components/addOns/functional/blogSections/BlogList.jsx +170 -0
  193. package/dist/components/addOns/functional/blogSections/BlogSidebar.jsx +35 -0
  194. package/dist/components/addOns/functional/blogSections/constants/blogDashboard.js +28 -0
  195. package/dist/components/addOns/functional/blogSections/constants/blogFormPopUp.js +97 -0
  196. package/dist/components/addOns/functional/blogSections/constants/blogList.js +22 -0
  197. package/dist/components/addOns/functional/blogSections/constants/blogSidebar.js +15 -0
  198. package/dist/components/addOns/functional/contactsDashboard/ContactsDashboard.jsx +323 -0
  199. package/dist/components/addOns/functional/contactsDashboard/constants/contactsDashboard.js +70 -0
  200. package/dist/components/addOns/functional/galleries/GalleryComplex.jsx +586 -0
  201. package/dist/components/addOns/functional/galleries/GallerySimple.jsx +385 -0
  202. package/dist/components/addOns/functional/galleries/constants/galleryComplex.js +104 -0
  203. package/dist/components/addOns/functional/galleries/constants/gallerySimple.js +74 -0
  204. package/dist/components/addOns/functional/schedules/ScheduleGridOne.jsx +167 -0
  205. package/dist/components/addOns/functional/schedules/ScheduleGridTwo.jsx +100 -0
  206. package/dist/components/addOns/functional/schedules/ScheduleGridTwoBasic.jsx +97 -0
  207. package/dist/components/addOns/functional/schedules/SchedulerForm.jsx +188 -0
  208. package/dist/components/addOns/functional/schedules/constants/ScheduleGridTwo.js +40 -0
  209. package/dist/components/addOns/functional/schedules/constants/ScheduleGridTwoBasic.js +40 -0
  210. package/dist/components/addOns/functional/schedules/constants/SchedulerForm.js +65 -0
  211. package/dist/components/addOns/functional/schedules/constants/scheduleGridOne.js +54 -0
  212. package/dist/components/addOns/non-functional/AnnouncementBanner.jsx +24 -0
  213. package/dist/components/addOns/non-functional/FeaturesSection.jsx +38 -0
  214. package/dist/components/addOns/non-functional/HeroSection.jsx +71 -0
  215. package/dist/components/addOns/non-functional/IconBubble.jsx +36 -0
  216. package/dist/components/addOns/non-functional/SampleCarousel.jsx +114 -0
  217. package/dist/components/addOns/non-functional/Testimonials.jsx +177 -0
  218. package/dist/components/addOns/non-functional/ThreeSetGallery.jsx +40 -0
  219. package/dist/components/addOns/non-functional/aboutSections/AboutSection.jsx +35 -0
  220. package/dist/components/addOns/non-functional/aboutSections/constants/aboutSection.js +24 -0
  221. package/dist/components/addOns/non-functional/imageCarousels/ProductSlider.jsx +80 -0
  222. package/dist/components/addOns/non-functional/imageCarousels/ProgramCarousel.jsx +155 -0
  223. package/dist/components/addOns/non-functional/imageCarousels/constants/programCarousel.js +39 -0
  224. package/dist/components/addOns/non-functional/imageCarousels/constants/programSlider.js +36 -0
  225. package/dist/components/addOns/non-functional/spinner.jsx +13 -0
  226. package/dist/components/footers/footer.jsx +219 -0
  227. package/dist/components/navBars/navbar.jsx +158 -0
  228. package/dist/components/other/accordion.jsx +40 -0
  229. package/dist/components/other/admin-menu.jsx +34 -0
  230. package/dist/components/other/alert-dialog.jsx +64 -0
  231. package/dist/components/other/alert.jsx +41 -0
  232. package/dist/components/other/aspect-ratio.jsx +4 -0
  233. package/dist/components/other/avatar.jsx +31 -0
  234. package/dist/components/other/badge.jsx +32 -0
  235. package/dist/components/other/breadcrumb.jsx +57 -0
  236. package/dist/components/other/button.jsx +321 -0
  237. package/dist/components/other/calendar.jsx +43 -0
  238. package/dist/components/other/card.jsx +44 -0
  239. package/dist/components/other/carousel.jsx +140 -0
  240. package/dist/components/other/chart.jsx +182 -0
  241. package/dist/components/other/checkbox.jsx +26 -0
  242. package/dist/components/other/collapsible.jsx +6 -0
  243. package/dist/components/other/command.jsx +68 -0
  244. package/dist/components/other/context-menu.jsx +88 -0
  245. package/dist/components/other/dialog.jsx +60 -0
  246. package/dist/components/other/drawer.jsx +60 -0
  247. package/dist/components/other/dropdown-menu.jsx +90 -0
  248. package/dist/components/other/form.jsx +89 -0
  249. package/dist/components/other/hover-card.jsx +23 -0
  250. package/dist/components/other/input-otp.jsx +46 -0
  251. package/dist/components/other/input.jsx +19 -0
  252. package/dist/components/other/label.jsx +23 -0
  253. package/dist/components/other/login-popup.jsx +1 -0
  254. package/dist/components/other/menubar.jsx +96 -0
  255. package/dist/components/other/mobile-icon.jsx +11 -0
  256. package/dist/components/other/navigation-menu.jsx +62 -0
  257. package/dist/components/other/pagination.jsx +63 -0
  258. package/dist/components/other/popover.jsx +25 -0
  259. package/dist/components/other/progress.jsx +23 -0
  260. package/dist/components/other/radio-group.jsx +31 -0
  261. package/dist/components/other/resizable.jsx +29 -0
  262. package/dist/components/other/scroll-area.jsx +36 -0
  263. package/dist/components/other/select.jsx +83 -0
  264. package/dist/components/other/separator.jsx +21 -0
  265. package/dist/components/other/sheet.jsx +74 -0
  266. package/dist/components/other/signup-popup.jsx +1 -0
  267. package/dist/components/other/skeleton.jsx +17 -0
  268. package/dist/components/other/slider.jsx +26 -0
  269. package/dist/components/other/social-icons.jsx +15 -0
  270. package/dist/components/other/sonner.jsx +27 -0
  271. package/dist/components/other/switch.jsx +23 -0
  272. package/dist/components/other/table.jsx +56 -0
  273. package/dist/components/other/tabs.jsx +32 -0
  274. package/dist/components/other/textarea.jsx +19 -0
  275. package/dist/components/other/toast.jsx +58 -0
  276. package/dist/components/other/toaster.jsx +31 -0
  277. package/dist/components/other/toggle-group.jsx +41 -0
  278. package/dist/components/other/toggle.jsx +39 -0
  279. package/dist/components/other/tooltip.jsx +24 -0
  280. package/dist/components/theme-provider.jsx +18 -0
  281. package/dist/components/types.js +1 -0
  282. package/dist/hooks/use-toast.js +135 -0
  283. package/dist/lib/auth-context.jsx +144 -0
  284. package/dist/lib/google-analytics.jsx +148 -0
  285. package/dist/lib/utils.js +9 -0
  286. package/dist/lib/verify-user.js +142 -0
  287. package/dist/middleware.js +32 -0
  288. package/dist/tailwind.config.js +86 -0
  289. package/dist/tsconfig.tsbuildinfo +1 -0
  290. package/hooks/use-toast.ts +188 -0
  291. package/lib/auth-context.tsx +131 -0
  292. package/lib/google-analytics.tsx +98 -0
  293. package/lib/utils.ts +6 -0
  294. package/lib/verify-user.ts +118 -0
  295. package/middleware.ts +35 -0
  296. package/next.config.js +10 -0
  297. package/package.json +116 -0
  298. package/postcss.config.js +6 -0
  299. package/public/images/FitStop.png +0 -0
  300. package/public/images/classes/bodyblast.JPG +0 -0
  301. package/public/images/classes/cardioxtrain.JPG +0 -0
  302. package/public/images/classes/combo.JPG +0 -0
  303. package/public/images/classes/flexiblefriday.JPG +0 -0
  304. package/public/images/classes/freestyle.jpg +0 -0
  305. package/public/images/classes/noclasses.jpg +0 -0
  306. package/public/images/classes/seniorstretch.JPG +0 -0
  307. package/public/images/classes/stretch.JPG +0 -0
  308. package/public/images/classes/zoomba.JPG +0 -0
  309. package/public/images/fitstoproom1.jpg +0 -0
  310. package/public/images/fitstoproom2.jpg +0 -0
  311. package/public/images/gallery/021-1024x768.jpg +0 -0
  312. package/public/images/gallery/023-1024x768.jpg +0 -0
  313. package/public/images/gallery/027-1024x768.jpg +0 -0
  314. package/public/images/gallery/029-1024x768.jpg +0 -0
  315. package/public/images/gallery/030-1024x768.jpg +0 -0
  316. package/public/images/gallery/042-1024x768.jpg +0 -0
  317. package/public/images/gallery/049-1024x768.jpg +0 -0
  318. package/public/images/gallery/073-1024x768.jpg +0 -0
  319. package/public/images/gallery/108-300x225.jpg +0 -0
  320. package/public/images/gallery/109-300x225.jpg +0 -0
  321. package/public/images/gallery/116.jpg +0 -0
  322. package/public/images/gallery/123-1-1024x768.jpg +0 -0
  323. package/public/images/gallery/133.jpg +0 -0
  324. package/public/images/gallery/142-1.jpg +0 -0
  325. package/public/images/gallery/143.jpg +0 -0
  326. package/public/images/gallery/145-1-1024x768.jpg +0 -0
  327. package/public/images/gallery/151-1024x768.jpg +0 -0
  328. package/public/images/gallery/166-300x225.jpg +0 -0
  329. package/public/images/gallery/175.jpg +0 -0
  330. package/public/images/gallery/183-1024x768.jpg +0 -0
  331. package/public/images/gallery/311.JPG +0 -0
  332. package/public/images/gallery/413-1.jpg +0 -0
  333. package/public/images/gallery/Cathys-Fit-Stop-Holiday-Party-0003-1024x683.jpg +0 -0
  334. package/public/images/gallery/Cathys-Fit-Stop-Holiday-Party-0076-1024x683.jpg +0 -0
  335. package/public/images/gallery/Cathys-Fit-Stop-Holiday-Party-0171-1024x683.jpg +0 -0
  336. package/public/images/gallery/DSCN0233-1024x768.jpg +0 -0
  337. package/public/images/gallery/DSCN0245-1-1024x768.jpg +0 -0
  338. package/public/images/gallery/Fitstopgirls2.jpg +0 -0
  339. package/public/images/gallery/GrandOpening2009.JPG +0 -0
  340. package/public/images/gallery/IMG_1937.JPG +0 -0
  341. package/public/images/gallery/IMG_1950-20.jpg +0 -0
  342. package/public/images/gallery/IMG_2112.JPG +0 -0
  343. package/public/images/gallery/IMG_2229.JPG +0 -0
  344. package/public/images/gallery/IMG_2272.JPG +0 -0
  345. package/public/images/gallery/IMG_2336.JPG +0 -0
  346. package/public/images/gallery/IMG_2367.JPG +0 -0
  347. package/public/images/gallery/IMG_2520.jpg +0 -0
  348. package/public/images/gallery/IMG_2564.jpg +0 -0
  349. package/public/images/gallery/IMG_3678.jpg +0 -0
  350. package/public/images/gallery/IMG_3744.jpg +0 -0
  351. package/public/images/gallery/IMG_3745.jpg +0 -0
  352. package/public/images/gallery/IMG_6383.jpg +0 -0
  353. package/public/images/gallery/Jillian-8-Months-2338-1024x683.jpg +0 -0
  354. package/public/images/gallery/Kathys-Fit-Stop-0032-1024x675.jpg +0 -0
  355. package/public/images/gallery/LaurieinPlank.jpeg +0 -0
  356. package/public/images/gallery/May2017032.JPG +0 -0
  357. package/public/images/gallery/clubpic10.jpg +0 -0
  358. package/public/images/gallery/clubpic15.jpg +0 -0
  359. package/public/images/gallery/clubpic2.jpg +0 -0
  360. package/public/images/gallery/clubpic3.jpg +0 -0
  361. package/public/images/gallery/clubpic4.jpg +0 -0
  362. package/public/images/gallery/clubpic5.jpg +0 -0
  363. package/public/images/gallery/clubpic6.jpg +0 -0
  364. package/public/images/gallery/clubpic7.jpg +0 -0
  365. package/public/images/gallery/clubpic8.jpg +0 -0
  366. package/public/images/gallery/clubpic9.jpg +0 -0
  367. package/public/images/gallery/z014-1024x768.jpg +0 -0
  368. package/public/images/gallery/z019-1-1024x768.jpg +0 -0
  369. package/public/images/kathy_faq-300x132.jpg +0 -0
  370. package/public/images/kathyportrait.jpg +0 -0
  371. package/public/images/kristiportrait.jpg +0 -0
  372. package/public/images/maincoverbackground.JPG +0 -0
  373. package/public/images/videos/FitStopLoopVideo.mp4 +0 -0
  374. package/public/images/weights.jpg +0 -0
  375. package/public/pdf/FitStop-Forum-April-2025.pdf +0 -0
  376. package/tailwind.config.ts +89 -0
  377. package/tsconfig.json +24 -0
@@ -0,0 +1,217 @@
1
+ "use client";
2
+
3
+ import { useState, useEffect } from "react";
4
+ import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/other/card";
5
+ import { Button } from "@/components/other/button";
6
+ import { AlertCircle } from "lucide-react";
7
+ import { Alert, AlertDescription } from "@/components/other/alert";
8
+ import { useAuth, useUser } from "@clerk/nextjs";
9
+ import { useStrapiAuth } from "@/lib/auth-context";
10
+ import Spinner from "@/components/addOns/non-functional/spinner";
11
+ import BlogDashboard from "@/components/addOns/functional/blogSections/BlogDashboard";
12
+ import BlogFormPopUp from "@/components/addOns/functional/blogSections/BlogFormPopUp";
13
+
14
+ interface BlogPost {
15
+ id: number;
16
+ documentId: string;
17
+ title: string;
18
+ description: string;
19
+ author: string;
20
+ publishedAt: string;
21
+ }
22
+
23
+ export default function BlogPage() {
24
+ const { user, authLoading, checkSession } = useStrapiAuth();
25
+ const { getToken, isSignedIn } = useAuth();
26
+ const { user: clerkUser } = useUser();
27
+ const [isLoading, setIsLoading] = useState(true);
28
+ const [error, setError] = useState<string | null>(null);
29
+ const [isModalOpen, setIsModalOpen] = useState(false);
30
+ const [isConfirmDeleteOpen, setIsConfirmDeleteOpen] = useState(false);
31
+ const [posts, setPosts] = useState<BlogPost[]>([]);
32
+ const [postToDelete, setPostToDelete] = useState<{ id: number; documentId: string; title: string } | null>(null);
33
+ const [showSuccess, setShowSuccess] = useState(false);
34
+ const [formData, setFormData] = useState<BlogPost>({
35
+ id: 0,
36
+ documentId: "",
37
+ title: "",
38
+ description: "",
39
+ author: user?.firstName && user?.lastName ? `${user.firstName} ${user.lastName}` : "",
40
+ publishedAt: "",
41
+ });
42
+
43
+ const isAdmin = isSignedIn && !!user?.businessAdminId;
44
+
45
+ const timeoutPromise = (promise: Promise<any>, timeout: number) => {
46
+ return Promise.race([
47
+ promise,
48
+ new Promise((_, reject) => setTimeout(() => reject(new Error("Session check timed out")), timeout)),
49
+ ]);
50
+ };
51
+
52
+ useEffect(() => {
53
+ window.scrollTo(0, 0);
54
+ }, []);
55
+
56
+ useEffect(() => {
57
+ const handleLogin = () => checkSession();
58
+ const handleLogout = () => checkSession();
59
+ window.addEventListener("user-login", handleLogin);
60
+ window.addEventListener("user-logout", handleLogout);
61
+ return () => {
62
+ window.removeEventListener("user-login", handleLogin);
63
+ window.removeEventListener("user-logout", handleLogout);
64
+ };
65
+ }, [checkSession]);
66
+
67
+ useEffect(() => {
68
+ if (isModalOpen && !formData.id && user?.firstName && user?.lastName) {
69
+ setFormData({
70
+ ...formData,
71
+ author: `${user.firstName} ${user.lastName}`,
72
+ });
73
+ }
74
+ }, [isModalOpen, formData.id, user?.firstName, user?.lastName]);
75
+
76
+ const fetchData = async () => {
77
+ if (!isSignedIn || !clerkUser?.id) {
78
+ setIsLoading(false);
79
+ return;
80
+ }
81
+ setIsLoading(true);
82
+ try {
83
+ const token = await getToken();
84
+ if (!token) {
85
+ throw new Error("No authentication token available");
86
+ }
87
+ const response = await fetch("/api/blog", {
88
+ headers: {
89
+ "Content-Type": "application/json",
90
+ Authorization: `Bearer ${token}`,
91
+ },
92
+ cache: "no-store",
93
+ });
94
+ if (!response.ok) {
95
+ const errorData = await response.json();
96
+ throw new Error(errorData.error || "Failed to fetch blog posts");
97
+ }
98
+ const { data } = await response.json();
99
+ setPosts(
100
+ data.blogPosts.map((post: BlogPost) => ({
101
+ ...post,
102
+ publishedAt: new Date(post.publishedAt).toISOString(),
103
+ }))
104
+ );
105
+ } catch (err) {
106
+ setError(err instanceof Error ? err.message : "An unknown error occurred");
107
+ } finally {
108
+ setIsLoading(false);
109
+ }
110
+ };
111
+
112
+ useEffect(() => {
113
+ if (!isSignedIn || !clerkUser?.id) {
114
+ setIsLoading(false);
115
+ return;
116
+ }
117
+ fetchData();
118
+ }, [isSignedIn, clerkUser?.id]);
119
+
120
+ if (authLoading || isLoading) {
121
+ return (
122
+ <div className="min-h-screen bg-gray-900 text-gray-200 flex items-center justify-center">
123
+ <div className="text-center">
124
+ <Spinner />
125
+ </div>
126
+ </div>
127
+ );
128
+ }
129
+
130
+ if (!isSignedIn || !clerkUser?.id) {
131
+ return (
132
+ <div className="min-h-screen bg-gray-900 text-gray-200 flex items-center justify-center">
133
+ <div className="text-center">
134
+ <h1 className="text-3xl font-bold text-gray-400">Not authenticated</h1>
135
+ <p className="mt-4 text-gray-500">
136
+ You must be logged in to view this page.{" "}
137
+ </p>
138
+ </div>
139
+ </div>
140
+ );
141
+ }
142
+
143
+ if (!isAdmin) {
144
+ return (
145
+ <div className="min-h-screen bg-gray-900 text-gray-200 flex items-center justify-center">
146
+ <div className="text-center">
147
+ <h1 className="text-3xl font-bold text-gray-400">Unauthorized</h1>
148
+ <p className="mt-4 text-gray-500">Only admins can access the blog dashboard.</p>
149
+ </div>
150
+ </div>
151
+ );
152
+ }
153
+
154
+ return (
155
+ <div className="min-h-screen bg-gray-900 text-gray-200 py-32 px-4 sm:px-6 lg:px-8 pt-48 lg:pt-56">
156
+ <div className="max-w-7xl mx-auto">
157
+ <header className="mb-12 relative">
158
+ <div className="absolute inset-0 bg-gradient-to-r from-blue-500/10 to-gray-800/20 rounded-full blur-3xl"></div>
159
+ <h1 className="text-4xl sm:text-5xl font-extrabold tracking-tight bg-clip-text text-transparent bg-gradient-to-r from-blue-400 to-gray-300 p-2">
160
+ Blog Dashboard
161
+ </h1>
162
+ <p className="mt-2 text-sm sm:text-base text-gray-400">
163
+ Create and manage your blog posts
164
+ </p>
165
+ </header>
166
+
167
+ {error && (
168
+ <div className="bg-red-900/50 border-l-4 border-red-600 p-4 rounded-lg backdrop-blur-sm mb-8">
169
+ <div className="flex items-center gap-2">
170
+ <AlertCircle className="h-5 w-5 text-red-400" />
171
+ <p className="text-red-300">{error}</p>
172
+ </div>
173
+ </div>
174
+ )}
175
+
176
+ <div className="mb-8 text-center">
177
+ <p className="text-sm text-gray-400 font-medium">Admin access granted</p>
178
+ </div>
179
+
180
+ <BlogDashboard
181
+ isModalOpen={isModalOpen}
182
+ setIsModalOpen={setIsModalOpen}
183
+ isConfirmDeleteOpen={isConfirmDeleteOpen}
184
+ setIsConfirmDeleteOpen={setIsConfirmDeleteOpen}
185
+ posts={posts}
186
+ setPosts={setPosts}
187
+ setError={setError}
188
+ isLoading={isLoading}
189
+ setIsLoading={setIsLoading}
190
+ fetchData={fetchData}
191
+ formData={formData}
192
+ setFormData={setFormData}
193
+ postToDelete={postToDelete}
194
+ setPostToDelete={setPostToDelete}
195
+ showSuccess={showSuccess}
196
+ setShowSuccess={setShowSuccess}
197
+ />
198
+
199
+ <BlogFormPopUp
200
+ isModalOpen={isModalOpen}
201
+ setIsModalOpen={setIsModalOpen}
202
+ isConfirmDeleteOpen={isConfirmDeleteOpen}
203
+ setIsConfirmDeleteOpen={setIsConfirmDeleteOpen}
204
+ postToDelete={postToDelete}
205
+ setPostToDelete={setPostToDelete}
206
+ isLoading={isLoading}
207
+ setIsLoading={setIsLoading}
208
+ formData={formData}
209
+ setFormData={setFormData}
210
+ setError={setError}
211
+ setShowSuccess={setShowSuccess}
212
+ fetchData={fetchData}
213
+ />
214
+ </div>
215
+ </div>
216
+ );
217
+ }
@@ -0,0 +1,49 @@
1
+ // constants.ts
2
+ // Constants for hardcoded text in the application, organized by file and purpose
3
+
4
+ export const ABOUT_PAGE = {
5
+ // UI Text for AboutPage.tsx
6
+ UI: {
7
+ // Main heading for the About page
8
+ MAIN_HEADING: "About DevVista Kit",
9
+ // Section heading for the client success story
10
+ SUCCESS_STORY_HEADING: "Client Success Story: Radio Host Ted Long’s Fitness Journey",
11
+ // Paragraph describing Ted Long's fitness journey
12
+ SUCCESS_STORY_TEXT: `
13
+ Ted Long is a busy man, so creating the right workout plan for him was essential. I
14
+ scheduled him to come to the gym five days per week just after his radio Co-hosting work at
15
+ 93Q each day. Two days per week, Mondays and Fridays, we worked one on one for about 90
16
+ minutes. Our workouts followed my philosophy of continuous cross training, so they included
17
+ weight training, circuit training, interval training, core work and more. On Tuesdays,
18
+ Wednesdays and Thursdays he joined in on my group exercise classes. On Tuesdays he joined
19
+ Body Blast, where we worked on muscle strength and endurance from head to toe, and focused
20
+ the first portion of that workout on the core of the body. On Wednesdays, Ted joined my
21
+ Flex Fusion class, his favorite, which is a yoga-type class that focuses on flexibility,
22
+ strength and balance. On Thursdays he came to my Core and Cardio X-train class. In that
23
+ class, we first work the core of the body, often using stability balls, medicine balls and
24
+ bosu’s, we then do an intense cardio workout class. Thursday’s class varies from step
25
+ aerobics, cardio kickbox with jump ropes, to circuit or interval tyle workout classes. Ted was
26
+ especially good on the step and not too shabby with a jump rope either! He was a pleasure
27
+ to work with and we loved having him around!
28
+ `,
29
+ },
30
+ // Error messages for AboutPage.tsx
31
+ ERRORS: {
32
+ // Error when bio data fetch fails with status code
33
+ FETCH_BIO_FAILED: "Failed to fetch bio data: ${response.status}",
34
+ // Error when bio data is not found in the response
35
+ BIO_NOT_FOUND: "Bio data not found",
36
+ // Generic error for bio data fetch failure
37
+ FETCH_BIO_ERROR: "An error occurred while fetching bio data",
38
+ // Error when user is not authorized to update bio
39
+ UNAUTHORIZED_UPDATE: "Unauthorized: Only admin can update bio data",
40
+ // Error when an invalid image type is uploaded
41
+ INVALID_IMAGE_TYPE: "Only JPEG, PNG, or GIF images are allowed",
42
+ // Error when no authentication token is available
43
+ NO_AUTH_TOKEN: "No authentication token available",
44
+ // Error when bio update fails with status code
45
+ UPDATE_BIO_FAILED: "Failed to update bio data: ${response.status}",
46
+ // Generic error for bio update failure
47
+ UPDATE_BIO_ERROR: "Failed to update bio data",
48
+ },
49
+ };
@@ -0,0 +1,114 @@
1
+ // app/constants/adRequest.ts
2
+ // Constants for hardcoded text in app/adRequest/page.tsx, organized by purpose
3
+
4
+ export const AD_REQUEST_PAGE = {
5
+ // UI Text for AdRequest page
6
+ UI: {
7
+ // Heading when user is not signed in
8
+ NOT_AUTHENTICATED_HEADING: "Not authenticated",
9
+ // Message when user is not signed in
10
+ NOT_AUTHENTICATED_MESSAGE: "You must be logged in to view this page.",
11
+ // Heading when user is not admin
12
+ UNAUTHORIZED_HEADING: "Unauthorized",
13
+ // Message when user is not admin
14
+ UNAUTHORIZED_MESSAGE: "Only admins can access the Ad Request dashboard.",
15
+ // Main dashboard heading
16
+ DASHBOARD_HEADING: "Ad Request Dashboard",
17
+ // Dashboard subheading
18
+ DASHBOARD_SUBHEADING: "Create and manage your advertising campaigns",
19
+ // Message indicating admin access
20
+ ADMIN_ACCESS_MESSAGE: "Admin access granted",
21
+ // Heading for credits section
22
+ CREDITS_HEADING: "Available Credits",
23
+ // Description for credits section
24
+ CREDITS_DESCRIPTION: "Use credits to create ad requests",
25
+ // Partial text for credits reset date
26
+ CREDITS_RESET_TEXT: "Credits reset to 3 on ",
27
+ // Heading for ad request form
28
+ CREATE_AD_REQUEST_HEADING: "Create Ad Request",
29
+ // Description for ad request form
30
+ CREATE_AD_REQUEST_DESCRIPTION: "Specify your ad campaign details",
31
+ // Label for platform select
32
+ PLATFORM_LABEL: "Select Platform *",
33
+ // Placeholder for platform select
34
+ PLATFORM_PLACEHOLDER: "Choose a platform",
35
+ // Platform option for Facebook
36
+ FACEBOOK_ADS: "Facebook Ads",
37
+ // Platform option for TikTok
38
+ TIKTOK_ADS: "TikTok Ads",
39
+ // Error message when platform is not selected
40
+ PLATFORM_REQUIRED: "Please select a platform",
41
+ // Label for ad type input
42
+ AD_TYPE_LABEL: "Ad Type *",
43
+ // Placeholder for ad type input
44
+ AD_TYPE_PLACEHOLDER: "e.g., Video ad, Carousel ad, Story ad",
45
+ // Error message when ad type is empty
46
+ AD_TYPE_REQUIRED: "Please enter an ad type",
47
+ // Label for description textarea
48
+ DESCRIPTION_LABEL: "Additional Details",
49
+ // Placeholder for description textarea
50
+ DESCRIPTION_PLACEHOLDER: "Describe your target audience, goals, or specific requirements...",
51
+ // Character count text for description
52
+ DESCRIPTION_CHAR_COUNT: "{description.length}/500 characters",
53
+ // Partial text for no credits alert
54
+ NO_CREDITS_MESSAGE: "No credits available. ",
55
+ // Message for admins when no credits
56
+ NO_CREDITS_ADMIN: "Reset to continue.",
57
+ // Message for non-admins when no credits
58
+ NO_CREDITS_NON_ADMIN: "Await next reset.",
59
+ // Heading for confirm popup
60
+ CONFIRM_POPUP_HEADING: "Confirm Ad Request",
61
+ // Partial message for confirm popup
62
+ CONFIRM_POPUP_MESSAGE: "Are you sure you want to submit this ad request? This action cannot be undone unless you contact support at ",
63
+ // Email for confirm popup
64
+ SUPPORT_EMAIL: "devvistainfo@gmail.com",
65
+ // Heading for request history
66
+ REQUEST_HISTORY_HEADING: "Request History",
67
+ // Description for request history
68
+ REQUEST_HISTORY_DESCRIPTION: "View your recent ad requests",
69
+ // Message when no requests exist
70
+ NO_REQUESTS_MESSAGE: "No requests yet",
71
+ // Message encouraging first request
72
+ FIRST_REQUEST_MESSAGE: "Submit your first ad request to get started",
73
+ // Footer text about credits
74
+ FOOTER_TEXT: "Each ad request costs 1 credit • Credits reset monthly • Admin manual reset available",
75
+ // Success message after submission
76
+ SUCCESS_MESSAGE: "Ad request submitted successfully! Credit deducted.",
77
+ // Badge text for Facebook platform
78
+ FACEBOOK_BADGE: "Facebook",
79
+ // Badge text for TikTok platform
80
+ TIKTOK_BADGE: "TikTok",
81
+ },
82
+ // Button Text for AdRequest page
83
+ BUTTONS: {
84
+ // Reset credits button
85
+ RESET_CREDITS: "Reset Credits",
86
+ // Cancel button in confirm popup
87
+ CANCEL: "Cancel",
88
+ // Confirm button in confirm popup
89
+ CONFIRM: "Confirm",
90
+ // Submit button in non-loading state
91
+ SUBMIT_REQUEST: "Submit Request (1 Credit)",
92
+ // Submit button in loading state
93
+ SUBMITTING: "Submitting...",
94
+ },
95
+ // Error Messages for AdRequest page
96
+ ERRORS: {
97
+ // Default error for fetch failure
98
+ FETCH_AD_REQUESTS_FAILED: "Failed to fetch ad requests",
99
+ // Generic error for fetch and submit failures
100
+ UNKNOWN_ERROR: "An unknown error occurred",
101
+ // Error when submitting without sign-in
102
+ NOT_SIGNED_IN: "You must be signed in to submit an ad request",
103
+ // Error when no credits available
104
+ CREDIT_LIMIT_REACHED: "Monthly ad request limit reached (3 requests)",
105
+ // Error when required fields are missing
106
+ REQUIRED_FIELDS_MISSING: "Please fill in all required fields",
107
+ // Default error for submit failure
108
+ SUBMIT_AD_REQUEST_FAILED: "Failed to submit ad request",
109
+ // Error when non-admin tries to reset credits
110
+ UNAUTHORIZED_RESET: "Unauthorized: Only admins can reset credits",
111
+ // Default error for reset credits failure
112
+ RESET_CREDITS_FAILED: "Failed to reset credits!!",
113
+ },
114
+ };
@@ -0,0 +1,41 @@
1
+ // app/constants/contact.ts
2
+ // Constants for hardcoded text in app/contact/page.tsx, organized by purpose
3
+
4
+ export const CONTACT_PAGE = {
5
+ // UI Text for ContactPage
6
+ UI: {
7
+ // Main heading for the Contact page
8
+ MAIN_HEADING: "Contact",
9
+ // Loading text for iframe
10
+ LOADING_TEXT: "Loading...",
11
+ // Section heading for contact info
12
+ CONTACT_INFO_HEADING: "Find Us",
13
+ // Address for contact info
14
+ ADDRESS: "215 W. Manlius St., East Syracuse, NY 13057",
15
+ // Phone number 1 for contact info
16
+ PHONE_1: "315-214-5466",
17
+ // Phone number 2 for contact info
18
+ PHONE_2: "315-415-4043",
19
+ // Email for contact info
20
+ SUPPORT_EMAIL: "devvistainfo@gmail.com",
21
+ // Heading for gym hours
22
+ HOURS_HEADING: "Hours of Gym",
23
+ // Text for gym hours
24
+ HOURS_TEXT: "Open 24/7—We Never Stop!",
25
+ // Title for map iframe
26
+ MAP_TITLE: "DevVista Kit Location",
27
+ },
28
+ // Error Messages and Toast Notifications for ContactPage
29
+ ERRORS: {
30
+ // Form validation error for name
31
+ NAME_VALIDATION_ERROR: "Name must be at least 2 characters.",
32
+ // Form validation error for email
33
+ EMAIL_VALIDATION_ERROR: "Please enter a valid email address.",
34
+ // Form validation error for message
35
+ MESSAGE_VALIDATION_ERROR: "Message must be at least 10 characters.",
36
+ // Toast title on successful form submission
37
+ TOAST_SUCCESS_TITLE: "Message Fired Off!",
38
+ // Toast description on successful form submission
39
+ TOAST_SUCCESS_DESCRIPTION: "We’ll hit you back ASAP—get ready!",
40
+ },
41
+ };
@@ -0,0 +1,46 @@
1
+ // app/constants/faq.ts
2
+ // Constants for hardcoded text in app/faq/page.tsx, organized by purpose
3
+
4
+ export const FAQ_PAGE = {
5
+ // UI Text for FAQPage
6
+ UI: {
7
+ // Main heading for the FAQ page
8
+ MAIN_HEADING: "Frequently Asked Questions",
9
+ // FAQ 1
10
+ FAQ_1_QUESTION: "Who should check with a doctor before starting an exercise program?",
11
+ FAQ_1_ANSWER:
12
+ "You should check with your doctor before you start any exercise program if you are over 40, if you smoke, if you are being treated for any chronic illness or injury, if you lead a sedentary lifestyle, if you are on medications, have diabetes, high blood pressure, or high cholesterol, any history of heart disease, back pain or any other orthopedic problems.",
13
+ // FAQ 2
14
+ FAQ_2_QUESTION: "How many days per week should I exercise?",
15
+ FAQ_2_ANSWER:
16
+ "The old government guidelines used to suggest that three days per week was all that was needed, but the new government guidelines suggest that persons should exercise most days per week. So if you aim to do some form of physical activity 6 to 7 times per week, and if you only get in 4 to 5 days, that’s not so bad!",
17
+ // FAQ 3
18
+ FAQ_3_QUESTION: "What is the best type of cardiovascular exercise a person can do?",
19
+ FAQ_3_ANSWER:
20
+ "There are so many forms of cardiovascular exercise a person can choose from. Some of the more common forms are walking, running, cycling, swimming, cross country skiing, elliptical trainer, stair climber, any aerobics class (step, kickboxing, high/low dance etc…), jump rope, rebounding on a mini trampoline as well as sports such as soccer and basketball and many more. The best type of cardiovascular exercise for any person are the ones that the individual enjoys and will stick with over the long haul. Not every exercise is for every person, but each person can find something that suits their needs and abilities.",
21
+ // FAQ 4
22
+ FAQ_4_QUESTION: "What is my Target Heart Rate and how do I find it?",
23
+ FAQ_4_ANSWER:
24
+ "Your target heart rate is where your heart rate should optimally be during an aerobic workout. Your target heart rate range is 50% – 90% of your maximum heart rate. Here’s how to calculate your target heart rate: 220 – your age = Maximum Heart Rate (MHR). MHR times 50% to 90% = Target Heart Rate (THR). These numbers serve as a guideline—an indicator of how hard you should be working. Newer exercisers should begin at the lower end of the % and experienced exercisers can go up toward the higher end of the % as their fitness levels increase and allow.",
25
+ // FAQ 5
26
+ FAQ_5_QUESTION: "How often should I lift weights?",
27
+ FAQ_5_ANSWER:
28
+ "In general, strength training or weight lifting for each muscle group should be done 2 to 3 days per week on non-consecutive days. On the other hand, you don’t have to take the all or nothing approach either. It’s better to do a little strength training than none at all. So, even if you can only fit in one strength training routine in a week, you’ll still benefit from it.",
29
+ // FAQ 6
30
+ FAQ_6_QUESTION: "How long will it take before I see results?",
31
+ FAQ_6_ANSWER:
32
+ "Seeing results usually varies with each individual. Generally, if a person is consistent with a balanced program, they should begin to feel a difference in their bodies in about three weeks and actually see some significant changes in about three months.",
33
+ // FAQ 7
34
+ FAQ_7_QUESTION: "When is the best time to stretch my muscles, before or after a workout?",
35
+ FAQ_7_ANSWER:
36
+ "Stretching and flexibility are very important aspects of good physical fitness. Ideally it’s best to stretch before and after a workout. When stretching before a workout, be sure that the muscles are warmed up for at least 5 minutes. If you can’t do both, then make stretching after your workout a priority. Remember to start slowly, breathe into the stretch and don’t bounce!",
37
+ // FAQ 8
38
+ FAQ_8_QUESTION: "Should I eat before or after a workout?",
39
+ FAQ_8_ANSWER:
40
+ "It’s okay to eat certain foods before and after exercise, but don’t overdo it. Consuming a heavy meal just before a workout can interfere with proper digestion. By the same token, don’t try to work out if you are starving. Your body needs fuel for the activity. Some quick carbohydrates from a piece of fruit or an energy bar should do the trick. The same goes for an early morning workout; maybe a piece of whole grain toast and some fruit juice. After exercise, allow your body to cool down before eating. Then be sure to include some carbs with your meal to replace the glycogen stores in the muscle that you used during your workout. And of course, be sure to drink plenty of water before, during and after your workouts.",
41
+ // FAQ 9
42
+ FAQ_9_QUESTION: "What can I do to stay motivated to work out?",
43
+ FAQ_9_ANSWER:
44
+ "Staying motivated over the long haul can sometimes be a challenge. Get a friend/spouse or significant other to join you and help keep you accountable. You can also try changing your routine every few months. Maybe trying a new class at your health club or take your workouts outside for a change. You may also want to hire a qualified personal trainer for a few sessions to give you different ideas on how to change your current workouts to keep them fun and effective.",
45
+ },
46
+ };
@@ -0,0 +1,43 @@
1
+ // app/constants/gallery.ts
2
+ // Constants for hardcoded text in app/gallery/page.tsx, organized by purpose
3
+
4
+ export const GALLERY_PAGE = {
5
+ // UI Text for GalleryPage
6
+ UI: {
7
+ // Main heading for the Gallery page
8
+ MAIN_HEADING: "Gallery",
9
+ // Loading text for admin status feedback
10
+ LOADING_TEXT: "Loading...",
11
+ // Message when logged in as admin
12
+ ADMIN_LOGGED_IN_MESSAGE: "You are logged in as an admin.",
13
+ },
14
+ // Error Messages for GalleryPage
15
+ ERRORS: {
16
+ // Error when no authentication token is available
17
+ NO_AUTH_TOKEN: "No authentication token available",
18
+ // Error when fetching images fails with error text
19
+ FETCH_IMAGES_FAILED: "Failed to load images: ${errorText}",
20
+ // Warning when more than 100 images are available
21
+ PAGINATION_WARNING: "Warning: Only the first 100 images are displayed. Contact support to view all images.",
22
+ // Generic error for fetch failure
23
+ FETCH_ERROR: "An error occurred while fetching data",
24
+ // Error when no file is selected for upload
25
+ NO_FILE_SELECTED: "No file selected",
26
+ // Error when an invalid file type is uploaded
27
+ INVALID_FILE_TYPE: "Only JPEG, PNG, or GIF images are allowed",
28
+ // Error when non-admin tries to upload
29
+ UNAUTHORIZED_UPLOAD: "Unauthorized: Only admins can upload images",
30
+ // Error for authentication issues during upload or delete
31
+ AUTHENTICATION_ERROR: "Authentication error. Please log in again.",
32
+ // Error when upload fails with status code
33
+ UPLOAD_IMAGE_FAILED: "Failed to upload image: ${response.status}",
34
+ // Generic error for upload failure
35
+ UPLOAD_IMAGE_ERROR: "Failed to upload image",
36
+ // Error when non-admin tries to delete
37
+ UNAUTHORIZED_DELETE: "Unauthorized: Only admins can delete images",
38
+ // Error when delete fails with status code
39
+ DELETE_IMAGE_FAILED: "Failed to delete image: ${response.status}",
40
+ // Generic error for delete failure
41
+ DELETE_IMAGE_ERROR: "Failed to delete image",
42
+ },
43
+ };
@@ -0,0 +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: "Your 24/7 Fitness Destination",
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/FitStopLoopVideo.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
+ };
@@ -0,0 +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
+ },
72
+ };