@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,210 @@
1
+ "use client";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ 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;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ import { useState, useEffect } from "react";
50
+ import { AlertCircle } from "lucide-react";
51
+ import { useAuth, useUser } from "@clerk/nextjs";
52
+ import { useStrapiAuth } from "@/lib/auth-context";
53
+ import Spinner from "@/components/addOns/non-functional/spinner";
54
+ import BlogDashboard from "@/components/addOns/functional/blogSections/BlogDashboard";
55
+ import BlogFormPopUp from "@/components/addOns/functional/blogSections/BlogFormPopUp";
56
+ export default function BlogPage() {
57
+ var _this = this;
58
+ var _a = useStrapiAuth(), user = _a.user, authLoading = _a.authLoading, checkSession = _a.checkSession;
59
+ var _b = useAuth(), getToken = _b.getToken, isSignedIn = _b.isSignedIn;
60
+ var clerkUser = useUser().user;
61
+ var _c = useState(true), isLoading = _c[0], setIsLoading = _c[1];
62
+ var _d = useState(null), error = _d[0], setError = _d[1];
63
+ var _e = useState(false), isModalOpen = _e[0], setIsModalOpen = _e[1];
64
+ var _f = useState(false), isConfirmDeleteOpen = _f[0], setIsConfirmDeleteOpen = _f[1];
65
+ var _g = useState([]), posts = _g[0], setPosts = _g[1];
66
+ var _h = useState(null), postToDelete = _h[0], setPostToDelete = _h[1];
67
+ var _j = useState(false), showSuccess = _j[0], setShowSuccess = _j[1];
68
+ var _k = useState({
69
+ id: 0,
70
+ documentId: "",
71
+ title: "",
72
+ description: "",
73
+ 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) : "",
74
+ publishedAt: "",
75
+ }), formData = _k[0], setFormData = _k[1];
76
+ var isAdmin = isSignedIn && !!(user === null || user === void 0 ? void 0 : user.businessAdminId);
77
+ var timeoutPromise = function (promise, timeout) {
78
+ return Promise.race([
79
+ promise,
80
+ new Promise(function (_, reject) { return setTimeout(function () { return reject(new Error("Session check timed out")); }, timeout); }),
81
+ ]);
82
+ };
83
+ useEffect(function () {
84
+ window.scrollTo(0, 0);
85
+ }, []);
86
+ useEffect(function () {
87
+ var handleLogin = function () { return checkSession(); };
88
+ var handleLogout = function () { return checkSession(); };
89
+ window.addEventListener("user-login", handleLogin);
90
+ window.addEventListener("user-logout", handleLogout);
91
+ return function () {
92
+ window.removeEventListener("user-login", handleLogin);
93
+ window.removeEventListener("user-logout", handleLogout);
94
+ };
95
+ }, [checkSession]);
96
+ useEffect(function () {
97
+ if (isModalOpen && !formData.id && (user === null || user === void 0 ? void 0 : user.firstName) && (user === null || user === void 0 ? void 0 : user.lastName)) {
98
+ setFormData(__assign(__assign({}, formData), { author: "".concat(user.firstName, " ").concat(user.lastName) }));
99
+ }
100
+ }, [isModalOpen, formData.id, user === null || user === void 0 ? void 0 : user.firstName, user === null || user === void 0 ? void 0 : user.lastName]);
101
+ var fetchData = function () { return __awaiter(_this, void 0, void 0, function () {
102
+ var token, response, errorData, data, err_1;
103
+ return __generator(this, function (_a) {
104
+ switch (_a.label) {
105
+ case 0:
106
+ if (!isSignedIn || !(clerkUser === null || clerkUser === void 0 ? void 0 : clerkUser.id)) {
107
+ setIsLoading(false);
108
+ return [2 /*return*/];
109
+ }
110
+ setIsLoading(true);
111
+ _a.label = 1;
112
+ case 1:
113
+ _a.trys.push([1, 7, 8, 9]);
114
+ return [4 /*yield*/, getToken()];
115
+ case 2:
116
+ token = _a.sent();
117
+ if (!token) {
118
+ throw new Error("No authentication token available");
119
+ }
120
+ return [4 /*yield*/, fetch("/api/blog", {
121
+ headers: {
122
+ "Content-Type": "application/json",
123
+ Authorization: "Bearer ".concat(token),
124
+ },
125
+ cache: "no-store",
126
+ })];
127
+ case 3:
128
+ response = _a.sent();
129
+ if (!!response.ok) return [3 /*break*/, 5];
130
+ return [4 /*yield*/, response.json()];
131
+ case 4:
132
+ errorData = _a.sent();
133
+ throw new Error(errorData.error || "Failed to fetch blog posts");
134
+ case 5: return [4 /*yield*/, response.json()];
135
+ case 6:
136
+ data = (_a.sent()).data;
137
+ setPosts(data.blogPosts.map(function (post) { return (__assign(__assign({}, post), { publishedAt: new Date(post.publishedAt).toISOString() })); }));
138
+ return [3 /*break*/, 9];
139
+ case 7:
140
+ err_1 = _a.sent();
141
+ setError(err_1 instanceof Error ? err_1.message : "An unknown error occurred");
142
+ return [3 /*break*/, 9];
143
+ case 8:
144
+ setIsLoading(false);
145
+ return [7 /*endfinally*/];
146
+ case 9: return [2 /*return*/];
147
+ }
148
+ });
149
+ }); };
150
+ useEffect(function () {
151
+ if (!isSignedIn || !(clerkUser === null || clerkUser === void 0 ? void 0 : clerkUser.id)) {
152
+ setIsLoading(false);
153
+ return;
154
+ }
155
+ fetchData();
156
+ }, [isSignedIn, clerkUser === null || clerkUser === void 0 ? void 0 : clerkUser.id]);
157
+ if (authLoading || isLoading) {
158
+ return (<div className="min-h-screen bg-gray-900 text-gray-200 flex items-center justify-center">
159
+ <div className="text-center">
160
+ <Spinner />
161
+ </div>
162
+ </div>);
163
+ }
164
+ if (!isSignedIn || !(clerkUser === null || clerkUser === void 0 ? void 0 : clerkUser.id)) {
165
+ return (<div className="min-h-screen bg-gray-900 text-gray-200 flex items-center justify-center">
166
+ <div className="text-center">
167
+ <h1 className="text-3xl font-bold text-gray-400">Not authenticated</h1>
168
+ <p className="mt-4 text-gray-500">
169
+ You must be logged in to view this page.{" "}
170
+ </p>
171
+ </div>
172
+ </div>);
173
+ }
174
+ if (!isAdmin) {
175
+ return (<div className="min-h-screen bg-gray-900 text-gray-200 flex items-center justify-center">
176
+ <div className="text-center">
177
+ <h1 className="text-3xl font-bold text-gray-400">Unauthorized</h1>
178
+ <p className="mt-4 text-gray-500">Only admins can access the blog dashboard.</p>
179
+ </div>
180
+ </div>);
181
+ }
182
+ return (<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">
183
+ <div className="max-w-7xl mx-auto">
184
+ <header className="mb-12 relative">
185
+ <div className="absolute inset-0 bg-gradient-to-r from-blue-500/10 to-gray-800/20 rounded-full blur-3xl"></div>
186
+ <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">
187
+ Blog Dashboard
188
+ </h1>
189
+ <p className="mt-2 text-sm sm:text-base text-gray-400">
190
+ Create and manage your blog posts
191
+ </p>
192
+ </header>
193
+
194
+ {error && (<div className="bg-red-900/50 border-l-4 border-red-600 p-4 rounded-lg backdrop-blur-sm mb-8">
195
+ <div className="flex items-center gap-2">
196
+ <AlertCircle className="h-5 w-5 text-red-400"/>
197
+ <p className="text-red-300">{error}</p>
198
+ </div>
199
+ </div>)}
200
+
201
+ <div className="mb-8 text-center">
202
+ <p className="text-sm text-gray-400 font-medium">Admin access granted</p>
203
+ </div>
204
+
205
+ <BlogDashboard isModalOpen={isModalOpen} setIsModalOpen={setIsModalOpen} isConfirmDeleteOpen={isConfirmDeleteOpen} setIsConfirmDeleteOpen={setIsConfirmDeleteOpen} posts={posts} setPosts={setPosts} setError={setError} isLoading={isLoading} setIsLoading={setIsLoading} fetchData={fetchData} formData={formData} setFormData={setFormData} postToDelete={postToDelete} setPostToDelete={setPostToDelete} showSuccess={showSuccess} setShowSuccess={setShowSuccess}/>
206
+
207
+ <BlogFormPopUp isModalOpen={isModalOpen} setIsModalOpen={setIsModalOpen} isConfirmDeleteOpen={isConfirmDeleteOpen} setIsConfirmDeleteOpen={setIsConfirmDeleteOpen} postToDelete={postToDelete} setPostToDelete={setPostToDelete} isLoading={isLoading} setIsLoading={setIsLoading} formData={formData} setFormData={setFormData} setError={setError} setShowSuccess={setShowSuccess} fetchData={fetchData}/>
208
+ </div>
209
+ </div>);
210
+ }
@@ -0,0 +1,32 @@
1
+ // constants.ts
2
+ // Constants for hardcoded text in the application, organized by file and purpose
3
+ export var ABOUT_PAGE = {
4
+ // UI Text for AboutPage.tsx
5
+ UI: {
6
+ // Main heading for the About page
7
+ MAIN_HEADING: "About DevVista Kit",
8
+ // Section heading for the client success story
9
+ SUCCESS_STORY_HEADING: "Client Success Story: Radio Host Ted Long’s Fitness Journey",
10
+ // Paragraph describing Ted Long's fitness journey
11
+ SUCCESS_STORY_TEXT: "\n Ted Long is a busy man, so creating the right workout plan for him was essential. I\n scheduled him to come to the gym five days per week just after his radio Co-hosting work at\n 93Q each day. Two days per week, Mondays and Fridays, we worked one on one for about 90\n minutes. Our workouts followed my philosophy of continuous cross training, so they included\n weight training, circuit training, interval training, core work and more. On Tuesdays,\n Wednesdays and Thursdays he joined in on my group exercise classes. On Tuesdays he joined\n Body Blast, where we worked on muscle strength and endurance from head to toe, and focused\n the first portion of that workout on the core of the body. On Wednesdays, Ted joined my\n Flex Fusion class, his favorite, which is a yoga-type class that focuses on flexibility,\n strength and balance. On Thursdays he came to my Core and Cardio X-train class. In that\n class, we first work the core of the body, often using stability balls, medicine balls and\n bosu\u2019s, we then do an intense cardio workout class. Thursday\u2019s class varies from step\n aerobics, cardio kickbox with jump ropes, to circuit or interval tyle workout classes. Ted was\n especially good on the step and not too shabby with a jump rope either! He was a pleasure\n to work with and we loved having him around!\n ",
12
+ },
13
+ // Error messages for AboutPage.tsx
14
+ ERRORS: {
15
+ // Error when bio data fetch fails with status code
16
+ FETCH_BIO_FAILED: "Failed to fetch bio data: ${response.status}",
17
+ // Error when bio data is not found in the response
18
+ BIO_NOT_FOUND: "Bio data not found",
19
+ // Generic error for bio data fetch failure
20
+ FETCH_BIO_ERROR: "An error occurred while fetching bio data",
21
+ // Error when user is not authorized to update bio
22
+ UNAUTHORIZED_UPDATE: "Unauthorized: Only admin can update bio data",
23
+ // Error when an invalid image type is uploaded
24
+ INVALID_IMAGE_TYPE: "Only JPEG, PNG, or GIF images are allowed",
25
+ // Error when no authentication token is available
26
+ NO_AUTH_TOKEN: "No authentication token available",
27
+ // Error when bio update fails with status code
28
+ UPDATE_BIO_FAILED: "Failed to update bio data: ${response.status}",
29
+ // Generic error for bio update failure
30
+ UPDATE_BIO_ERROR: "Failed to update bio data",
31
+ },
32
+ };
@@ -0,0 +1,113 @@
1
+ // app/constants/adRequest.ts
2
+ // Constants for hardcoded text in app/adRequest/page.tsx, organized by purpose
3
+ export var AD_REQUEST_PAGE = {
4
+ // UI Text for AdRequest page
5
+ UI: {
6
+ // Heading when user is not signed in
7
+ NOT_AUTHENTICATED_HEADING: "Not authenticated",
8
+ // Message when user is not signed in
9
+ NOT_AUTHENTICATED_MESSAGE: "You must be logged in to view this page.",
10
+ // Heading when user is not admin
11
+ UNAUTHORIZED_HEADING: "Unauthorized",
12
+ // Message when user is not admin
13
+ UNAUTHORIZED_MESSAGE: "Only admins can access the Ad Request dashboard.",
14
+ // Main dashboard heading
15
+ DASHBOARD_HEADING: "Ad Request Dashboard",
16
+ // Dashboard subheading
17
+ DASHBOARD_SUBHEADING: "Create and manage your advertising campaigns",
18
+ // Message indicating admin access
19
+ ADMIN_ACCESS_MESSAGE: "Admin access granted",
20
+ // Heading for credits section
21
+ CREDITS_HEADING: "Available Credits",
22
+ // Description for credits section
23
+ CREDITS_DESCRIPTION: "Use credits to create ad requests",
24
+ // Partial text for credits reset date
25
+ CREDITS_RESET_TEXT: "Credits reset to 3 on ",
26
+ // Heading for ad request form
27
+ CREATE_AD_REQUEST_HEADING: "Create Ad Request",
28
+ // Description for ad request form
29
+ CREATE_AD_REQUEST_DESCRIPTION: "Specify your ad campaign details",
30
+ // Label for platform select
31
+ PLATFORM_LABEL: "Select Platform *",
32
+ // Placeholder for platform select
33
+ PLATFORM_PLACEHOLDER: "Choose a platform",
34
+ // Platform option for Facebook
35
+ FACEBOOK_ADS: "Facebook Ads",
36
+ // Platform option for TikTok
37
+ TIKTOK_ADS: "TikTok Ads",
38
+ // Error message when platform is not selected
39
+ PLATFORM_REQUIRED: "Please select a platform",
40
+ // Label for ad type input
41
+ AD_TYPE_LABEL: "Ad Type *",
42
+ // Placeholder for ad type input
43
+ AD_TYPE_PLACEHOLDER: "e.g., Video ad, Carousel ad, Story ad",
44
+ // Error message when ad type is empty
45
+ AD_TYPE_REQUIRED: "Please enter an ad type",
46
+ // Label for description textarea
47
+ DESCRIPTION_LABEL: "Additional Details",
48
+ // Placeholder for description textarea
49
+ DESCRIPTION_PLACEHOLDER: "Describe your target audience, goals, or specific requirements...",
50
+ // Character count text for description
51
+ DESCRIPTION_CHAR_COUNT: "{description.length}/500 characters",
52
+ // Partial text for no credits alert
53
+ NO_CREDITS_MESSAGE: "No credits available. ",
54
+ // Message for admins when no credits
55
+ NO_CREDITS_ADMIN: "Reset to continue.",
56
+ // Message for non-admins when no credits
57
+ NO_CREDITS_NON_ADMIN: "Await next reset.",
58
+ // Heading for confirm popup
59
+ CONFIRM_POPUP_HEADING: "Confirm Ad Request",
60
+ // Partial message for confirm popup
61
+ CONFIRM_POPUP_MESSAGE: "Are you sure you want to submit this ad request? This action cannot be undone unless you contact support at ",
62
+ // Email for confirm popup
63
+ SUPPORT_EMAIL: "devvistainfo@gmail.com",
64
+ // Heading for request history
65
+ REQUEST_HISTORY_HEADING: "Request History",
66
+ // Description for request history
67
+ REQUEST_HISTORY_DESCRIPTION: "View your recent ad requests",
68
+ // Message when no requests exist
69
+ NO_REQUESTS_MESSAGE: "No requests yet",
70
+ // Message encouraging first request
71
+ FIRST_REQUEST_MESSAGE: "Submit your first ad request to get started",
72
+ // Footer text about credits
73
+ FOOTER_TEXT: "Each ad request costs 1 credit • Credits reset monthly • Admin manual reset available",
74
+ // Success message after submission
75
+ SUCCESS_MESSAGE: "Ad request submitted successfully! Credit deducted.",
76
+ // Badge text for Facebook platform
77
+ FACEBOOK_BADGE: "Facebook",
78
+ // Badge text for TikTok platform
79
+ TIKTOK_BADGE: "TikTok",
80
+ },
81
+ // Button Text for AdRequest page
82
+ BUTTONS: {
83
+ // Reset credits button
84
+ RESET_CREDITS: "Reset Credits",
85
+ // Cancel button in confirm popup
86
+ CANCEL: "Cancel",
87
+ // Confirm button in confirm popup
88
+ CONFIRM: "Confirm",
89
+ // Submit button in non-loading state
90
+ SUBMIT_REQUEST: "Submit Request (1 Credit)",
91
+ // Submit button in loading state
92
+ SUBMITTING: "Submitting...",
93
+ },
94
+ // Error Messages for AdRequest page
95
+ ERRORS: {
96
+ // Default error for fetch failure
97
+ FETCH_AD_REQUESTS_FAILED: "Failed to fetch ad requests",
98
+ // Generic error for fetch and submit failures
99
+ UNKNOWN_ERROR: "An unknown error occurred",
100
+ // Error when submitting without sign-in
101
+ NOT_SIGNED_IN: "You must be signed in to submit an ad request",
102
+ // Error when no credits available
103
+ CREDIT_LIMIT_REACHED: "Monthly ad request limit reached (3 requests)",
104
+ // Error when required fields are missing
105
+ REQUIRED_FIELDS_MISSING: "Please fill in all required fields",
106
+ // Default error for submit failure
107
+ SUBMIT_AD_REQUEST_FAILED: "Failed to submit ad request",
108
+ // Error when non-admin tries to reset credits
109
+ UNAUTHORIZED_RESET: "Unauthorized: Only admins can reset credits",
110
+ // Default error for reset credits failure
111
+ RESET_CREDITS_FAILED: "Failed to reset credits!!",
112
+ },
113
+ };
@@ -0,0 +1,40 @@
1
+ // app/constants/contact.ts
2
+ // Constants for hardcoded text in app/contact/page.tsx, organized by purpose
3
+ export var CONTACT_PAGE = {
4
+ // UI Text for ContactPage
5
+ UI: {
6
+ // Main heading for the Contact page
7
+ MAIN_HEADING: "Contact",
8
+ // Loading text for iframe
9
+ LOADING_TEXT: "Loading...",
10
+ // Section heading for contact info
11
+ CONTACT_INFO_HEADING: "Find Us",
12
+ // Address for contact info
13
+ ADDRESS: "215 W. Manlius St., East Syracuse, NY 13057",
14
+ // Phone number 1 for contact info
15
+ PHONE_1: "315-214-5466",
16
+ // Phone number 2 for contact info
17
+ PHONE_2: "315-415-4043",
18
+ // Email for contact info
19
+ SUPPORT_EMAIL: "devvistainfo@gmail.com",
20
+ // Heading for gym hours
21
+ HOURS_HEADING: "Hours of Gym",
22
+ // Text for gym hours
23
+ HOURS_TEXT: "Open 24/7—We Never Stop!",
24
+ // Title for map iframe
25
+ MAP_TITLE: "DevVista Kit Location",
26
+ },
27
+ // Error Messages and Toast Notifications for ContactPage
28
+ ERRORS: {
29
+ // Form validation error for name
30
+ NAME_VALIDATION_ERROR: "Name must be at least 2 characters.",
31
+ // Form validation error for email
32
+ EMAIL_VALIDATION_ERROR: "Please enter a valid email address.",
33
+ // Form validation error for message
34
+ MESSAGE_VALIDATION_ERROR: "Message must be at least 10 characters.",
35
+ // Toast title on successful form submission
36
+ TOAST_SUCCESS_TITLE: "Message Fired Off!",
37
+ // Toast description on successful form submission
38
+ TOAST_SUCCESS_DESCRIPTION: "We’ll hit you back ASAP—get ready!",
39
+ },
40
+ };
@@ -0,0 +1,36 @@
1
+ // app/constants/faq.ts
2
+ // Constants for hardcoded text in app/faq/page.tsx, organized by purpose
3
+ export var FAQ_PAGE = {
4
+ // UI Text for FAQPage
5
+ UI: {
6
+ // Main heading for the FAQ page
7
+ MAIN_HEADING: "Frequently Asked Questions",
8
+ // FAQ 1
9
+ FAQ_1_QUESTION: "Who should check with a doctor before starting an exercise program?",
10
+ FAQ_1_ANSWER: "You should check with your doctor before you start any exercise program if you are over 40, if you smoke, if you are being treated for any chronic illness or injury, if you lead a sedentary lifestyle, if you are on medications, have diabetes, high blood pressure, or high cholesterol, any history of heart disease, back pain or any other orthopedic problems.",
11
+ // FAQ 2
12
+ FAQ_2_QUESTION: "How many days per week should I exercise?",
13
+ FAQ_2_ANSWER: "The old government guidelines used to suggest that three days per week was all that was needed, but the new government guidelines suggest that persons should exercise most days per week. So if you aim to do some form of physical activity 6 to 7 times per week, and if you only get in 4 to 5 days, that’s not so bad!",
14
+ // FAQ 3
15
+ FAQ_3_QUESTION: "What is the best type of cardiovascular exercise a person can do?",
16
+ FAQ_3_ANSWER: "There are so many forms of cardiovascular exercise a person can choose from. Some of the more common forms are walking, running, cycling, swimming, cross country skiing, elliptical trainer, stair climber, any aerobics class (step, kickboxing, high/low dance etc…), jump rope, rebounding on a mini trampoline as well as sports such as soccer and basketball and many more. The best type of cardiovascular exercise for any person are the ones that the individual enjoys and will stick with over the long haul. Not every exercise is for every person, but each person can find something that suits their needs and abilities.",
17
+ // FAQ 4
18
+ FAQ_4_QUESTION: "What is my Target Heart Rate and how do I find it?",
19
+ FAQ_4_ANSWER: "Your target heart rate is where your heart rate should optimally be during an aerobic workout. Your target heart rate range is 50% – 90% of your maximum heart rate. Here’s how to calculate your target heart rate: 220 – your age = Maximum Heart Rate (MHR). MHR times 50% to 90% = Target Heart Rate (THR). These numbers serve as a guideline—an indicator of how hard you should be working. Newer exercisers should begin at the lower end of the % and experienced exercisers can go up toward the higher end of the % as their fitness levels increase and allow.",
20
+ // FAQ 5
21
+ FAQ_5_QUESTION: "How often should I lift weights?",
22
+ FAQ_5_ANSWER: "In general, strength training or weight lifting for each muscle group should be done 2 to 3 days per week on non-consecutive days. On the other hand, you don’t have to take the all or nothing approach either. It’s better to do a little strength training than none at all. So, even if you can only fit in one strength training routine in a week, you’ll still benefit from it.",
23
+ // FAQ 6
24
+ FAQ_6_QUESTION: "How long will it take before I see results?",
25
+ FAQ_6_ANSWER: "Seeing results usually varies with each individual. Generally, if a person is consistent with a balanced program, they should begin to feel a difference in their bodies in about three weeks and actually see some significant changes in about three months.",
26
+ // FAQ 7
27
+ FAQ_7_QUESTION: "When is the best time to stretch my muscles, before or after a workout?",
28
+ FAQ_7_ANSWER: "Stretching and flexibility are very important aspects of good physical fitness. Ideally it’s best to stretch before and after a workout. When stretching before a workout, be sure that the muscles are warmed up for at least 5 minutes. If you can’t do both, then make stretching after your workout a priority. Remember to start slowly, breathe into the stretch and don’t bounce!",
29
+ // FAQ 8
30
+ FAQ_8_QUESTION: "Should I eat before or after a workout?",
31
+ FAQ_8_ANSWER: "It’s okay to eat certain foods before and after exercise, but don’t overdo it. Consuming a heavy meal just before a workout can interfere with proper digestion. By the same token, don’t try to work out if you are starving. Your body needs fuel for the activity. Some quick carbohydrates from a piece of fruit or an energy bar should do the trick. The same goes for an early morning workout; maybe a piece of whole grain toast and some fruit juice. After exercise, allow your body to cool down before eating. Then be sure to include some carbs with your meal to replace the glycogen stores in the muscle that you used during your workout. And of course, be sure to drink plenty of water before, during and after your workouts.",
32
+ // FAQ 9
33
+ FAQ_9_QUESTION: "What can I do to stay motivated to work out?",
34
+ FAQ_9_ANSWER: "Staying motivated over the long haul can sometimes be a challenge. Get a friend/spouse or significant other to join you and help keep you accountable. You can also try changing your routine every few months. Maybe trying a new class at your health club or take your workouts outside for a change. You may also want to hire a qualified personal trainer for a few sessions to give you different ideas on how to change your current workouts to keep them fun and effective.",
35
+ },
36
+ };
@@ -0,0 +1,42 @@
1
+ // app/constants/gallery.ts
2
+ // Constants for hardcoded text in app/gallery/page.tsx, organized by purpose
3
+ export var GALLERY_PAGE = {
4
+ // UI Text for GalleryPage
5
+ UI: {
6
+ // Main heading for the Gallery page
7
+ MAIN_HEADING: "Gallery",
8
+ // Loading text for admin status feedback
9
+ LOADING_TEXT: "Loading...",
10
+ // Message when logged in as admin
11
+ ADMIN_LOGGED_IN_MESSAGE: "You are logged in as an admin.",
12
+ },
13
+ // Error Messages for GalleryPage
14
+ ERRORS: {
15
+ // Error when no authentication token is available
16
+ NO_AUTH_TOKEN: "No authentication token available",
17
+ // Error when fetching images fails with error text
18
+ FETCH_IMAGES_FAILED: "Failed to load images: ${errorText}",
19
+ // Warning when more than 100 images are available
20
+ PAGINATION_WARNING: "Warning: Only the first 100 images are displayed. Contact support to view all images.",
21
+ // Generic error for fetch failure
22
+ FETCH_ERROR: "An error occurred while fetching data",
23
+ // Error when no file is selected for upload
24
+ NO_FILE_SELECTED: "No file selected",
25
+ // Error when an invalid file type is uploaded
26
+ INVALID_FILE_TYPE: "Only JPEG, PNG, or GIF images are allowed",
27
+ // Error when non-admin tries to upload
28
+ UNAUTHORIZED_UPLOAD: "Unauthorized: Only admins can upload images",
29
+ // Error for authentication issues during upload or delete
30
+ AUTHENTICATION_ERROR: "Authentication error. Please log in again.",
31
+ // Error when upload fails with status code
32
+ UPLOAD_IMAGE_FAILED: "Failed to upload image: ${response.status}",
33
+ // Generic error for upload failure
34
+ UPLOAD_IMAGE_ERROR: "Failed to upload image",
35
+ // Error when non-admin tries to delete
36
+ UNAUTHORIZED_DELETE: "Unauthorized: Only admins can delete images",
37
+ // Error when delete fails with status code
38
+ DELETE_IMAGE_FAILED: "Failed to delete image: ${response.status}",
39
+ // Generic error for delete failure
40
+ DELETE_IMAGE_ERROR: "Failed to delete image",
41
+ },
42
+ };
@@ -0,0 +1,69 @@
1
+ // app/constants/home.ts
2
+ // Constants for hardcoded text in app/page.tsx, organized by purpose
3
+ export var HOME_PAGE = {
4
+ // UI Text for HomePage
5
+ UI: {
6
+ // HeroSection title
7
+ HERO_TITLE: "DevVista Kit",
8
+ // HeroSection subtitle
9
+ HERO_SUBTITLE: "Your 24/7 Fitness Destination",
10
+ // HeroSection video aria label
11
+ HERO_VIDEO_ARIA_LABEL: "Promotional video for DevVista Kit",
12
+ // FeaturesSection title
13
+ FEATURES_TITLE: "Zumba®",
14
+ // FeaturesSection description
15
+ FEATURES_DESCRIPTION: "Variety of Memberships Available",
16
+ // Features for FeaturesSection
17
+ FEATURE_1: "24 Hour Access",
18
+ FEATURE_2: "Locker Rooms",
19
+ FEATURE_3: "Strength, Cardio & Flexibility Classes",
20
+ FEATURE_4: "Personal Training",
21
+ FEATURE_5: "Partner and Small Group Training",
22
+ // Background images for ScheduleCarousel
23
+ BACKGROUND_IMAGE_1: "/images/classes/zoomba.jpg",
24
+ BACKGROUND_IMAGE_2: "/images/classes/cardioxtrain.jpg",
25
+ BACKGROUND_IMAGE_3: "/images/classes/seniorstretch.jpg",
26
+ BACKGROUND_IMAGE_4: "/images/classes/bodyblast.jpg",
27
+ BACKGROUND_IMAGE_5: "/images/classes/flexiblefriday.jpg",
28
+ BACKGROUND_IMAGE_6: "/images/classes/combo.jpg",
29
+ BACKGROUND_IMAGE_7: "/images/classes/noclasses.jpg",
30
+ // Video source for HeroSection
31
+ HERO_VIDEO_SRC: "/images/videos/FitStopLoopVideo.mp4",
32
+ },
33
+ // Button Text for HomePage
34
+ BUTTONS: {
35
+ // HeroSection call-to-action text
36
+ HERO_CTA_TEXT: "Check Our Rates",
37
+ // FeaturesSection call-to-action text
38
+ FEATURES_CTA_TEXT: "Explore Classes",
39
+ },
40
+ // Error Messages for HomePage
41
+ ERRORS: {
42
+ // Error when schedule fetch fails
43
+ FETCH_SCHEDULE_FAILED: "Failed to load schedule. Displaying empty schedule.",
44
+ // Warning when more than 100 files are available
45
+ PAGINATION_WARNING: "Warning: Only the first 100 files are displayed. Contact support to view all files.",
46
+ // Error when files fetch fails
47
+ FETCH_FILES_FAILED: "Failed to load files.",
48
+ // Generic error for fetch failure
49
+ FETCH_ERROR: "An error occurred while fetching data",
50
+ // Error when non-admin tries to upload
51
+ UNAUTHORIZED_UPLOAD: "Unauthorized: Only admin can upload files",
52
+ // Error when no file is selected for upload
53
+ NO_FILE_SELECTED: "No file selected",
54
+ // Error when an invalid file type is uploaded
55
+ INVALID_FILE_TYPE: "Only PDF files are allowed",
56
+ // Error when no authentication token is available
57
+ NO_AUTH_TOKEN: "No authentication token available",
58
+ // Error when upload fails with status code
59
+ UPLOAD_FILE_FAILED: "Failed to upload file: ${response.status}",
60
+ // Generic error for upload failure
61
+ UPLOAD_FILE_ERROR: "Failed to upload file",
62
+ // Error when non-admin tries to delete
63
+ UNAUTHORIZED_DELETE: "Unauthorized: Only admin can delete files",
64
+ // Error when delete fails with status code
65
+ DELETE_FILE_FAILED: "Failed to delete file: ${response.status}",
66
+ // Generic error for delete failure
67
+ DELETE_FILE_ERROR: "Failed to delete file",
68
+ },
69
+ };
@@ -0,0 +1,71 @@
1
+ // app/constants/schedule.ts
2
+ // Constants for hardcoded text in app/schedule/page.tsx, organized by purpose
3
+ export var SCHEDULE_PAGE = {
4
+ // UI Text for SchedulePage
5
+ UI: {
6
+ // Main heading for the Schedule page
7
+ MAIN_HEADING: "Rates & Classes",
8
+ // Section heading for membership plans
9
+ MEMBERSHIP_HEADING: "Membership & Training",
10
+ // Bold text for family rates
11
+ FAMILY_RATES_BOLD: "Family Rates:",
12
+ // Text for family rates
13
+ FAMILY_RATES_TEXT: "½ off Select or Basic 12-month programs for additional members living with you!",
14
+ // Bold text for membership note
15
+ NOTE_BOLD: "*Note:",
16
+ // Text for membership note
17
+ 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.",
18
+ // Section heading for class descriptions
19
+ CLASSES_HEADING: "Classes Available",
20
+ // Text when no class descriptions are available
21
+ NO_CLASS_DESCRIPTIONS: "No class descriptions available.",
22
+ // Message when logged in as admin
23
+ ADMIN_LOGGED_IN_MESSAGE: "You are logged in as an admin.",
24
+ // Membership Plans
25
+ MEMBERSHIP_1_NAME: "Select Membership",
26
+ MEMBERSHIP_1_DESC: "Includes 24-hour access to club and classes",
27
+ MEMBERSHIP_1_PRICING_1: "$599.00 (12 months) paid in full or $54.00/month for 12 months",
28
+ MEMBERSHIP_1_PRICING_2: "$399.00 (6 months) paid in full or $72.00/month for 6 months",
29
+ MEMBERSHIP_1_PRICING_3: "$199.00 (3 months) paid in full or $72.00/month for 3 months",
30
+ MEMBERSHIP_2_NAME: "Basic Membership",
31
+ MEMBERSHIP_2_DESC: "Available M-F 6:00 AM - 8:00 PM, Sat 7:00 AM - noon, no classes included",
32
+ MEMBERSHIP_2_PRICING_1: "$499.00 (12 months) paid in full or $45.00/month for 12 months",
33
+ MEMBERSHIP_2_PRICING_2: "$299.00 (6 months) paid in full or $54.00/month for 6 months",
34
+ MEMBERSHIP_2_PRICING_3: "$169.00 (3 months) paid in full or $62.00/month for 3 months",
35
+ MEMBERSHIP_3_NAME: "Super Senior",
36
+ MEMBERSHIP_3_DESC: "Includes classes and optional 24-hour access",
37
+ MEMBERSHIP_3_PRICING_1: "$499.00 (12 months) paid in full or $45.00/month for 12 months",
38
+ MEMBERSHIP_4_NAME: "Basic Senior Membership",
39
+ MEMBERSHIP_4_DESC: "No classes or 24-hour access",
40
+ MEMBERSHIP_4_PRICING_1: "$399.00 (12 months) paid in full or $37.00/month for 12 months",
41
+ MEMBERSHIP_4_PRICING_2: "$268.00 (6 months) paid in full or $47.00/month for 6 months",
42
+ MEMBERSHIP_4_PRICING_3: "$140.00 (3 months) paid in full or $52.00/month for 3 months",
43
+ MEMBERSHIP_5_NAME: "Senior Classes Only",
44
+ MEMBERSHIP_5_DESC: "For non-members and basic members",
45
+ MEMBERSHIP_5_PRICING_1: "$99.00 every 2 months (non-members)",
46
+ MEMBERSHIP_5_PRICING_2: "$59.00 every 2 months (basic membership members)",
47
+ MEMBERSHIP_5_PRICING_3: "$6.00 per class (all basic membership members)",
48
+ MEMBERSHIP_6_NAME: "Personal Training",
49
+ MEMBERSHIP_6_DESC: "One-on-one or up to three-on-one",
50
+ MEMBERSHIP_6_PRICING_1: "$60.00 per session per person",
51
+ MEMBERSHIP_6_PRICING_2: "$1000.00 for 20-session package per person",
52
+ MEMBERSHIP_6_PRICING_3: "Note: Train 2x/week for Basic Membership status; add $100.00 for 24-hour access",
53
+ },
54
+ // Error Messages for SchedulePage
55
+ ERRORS: {
56
+ // Error when fetching events fails with status code
57
+ FETCH_EVENTS_FAILED: "Failed to fetch events: ${response.status}",
58
+ // Generic error for fetch, submit, and delete failures
59
+ UNKNOWN_ERROR: "An unknown error occurred",
60
+ // Error when non-admin tries to modify classes
61
+ UNAUTHORIZED_MODIFY: "Unauthorized: Only admin can modify classes",
62
+ // Error when no token is provided
63
+ NO_TOKEN_PROVIDED: "Unauthorized: No token provided",
64
+ // Error when submit fails
65
+ SUBMIT_CLASS_FAILED: "Failed to ${formData.documentId ? 'update' : 'create'} class",
66
+ // Error when non-admin tries to delete classes
67
+ UNAUTHORIZED_DELETE: "Unauthorized: Only admin can delete classes",
68
+ // Error when delete fails with status code
69
+ DELETE_CLASS_FAILED: "Failed to delete class: ${response.status}",
70
+ },
71
+ };