@burdenoff/microfe-timecampus 2026.510.104

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 (282) hide show
  1. package/README.md +12 -0
  2. package/dist/generated/global-operations.d.ts +2 -0
  3. package/dist/generated/global-operations.d.ts.map +1 -0
  4. package/dist/generated/global-types.d.ts +20716 -0
  5. package/dist/generated/global-types.d.ts.map +1 -0
  6. package/dist/generated/wspace-operations.d.ts +8527 -0
  7. package/dist/generated/wspace-operations.d.ts.map +1 -0
  8. package/dist/generated/wspace-operations.js +3913 -0
  9. package/dist/generated/wspace-operations.js.map +1 -0
  10. package/dist/generated/wspace-types.d.ts +53363 -0
  11. package/dist/generated/wspace-types.d.ts.map +1 -0
  12. package/dist/index.d.ts +6 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +6 -0
  15. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js +24 -0
  16. package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +1 -0
  17. package/dist/node_modules/@apollo/client/errors/utils.js +16 -0
  18. package/dist/node_modules/@apollo/client/errors/utils.js.map +1 -0
  19. package/dist/node_modules/clsx/dist/clsx.js +18 -0
  20. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  21. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1674 -0
  22. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  23. package/dist/timecampus/TimeCampusRoot.d.ts +5 -0
  24. package/dist/timecampus/TimeCampusRoot.d.ts.map +1 -0
  25. package/dist/timecampus/TimeCampusRoot.js +344 -0
  26. package/dist/timecampus/TimeCampusRoot.js.map +1 -0
  27. package/dist/timecampus/TimeCampusRoutes.d.ts +7 -0
  28. package/dist/timecampus/TimeCampusRoutes.d.ts.map +1 -0
  29. package/dist/timecampus/TimeCampusRoutes.js +227 -0
  30. package/dist/timecampus/TimeCampusRoutes.js.map +1 -0
  31. package/dist/timecampus/components/ChartCard.d.ts +19 -0
  32. package/dist/timecampus/components/ChartCard.d.ts.map +1 -0
  33. package/dist/timecampus/components/DataTable.d.ts +26 -0
  34. package/dist/timecampus/components/DataTable.d.ts.map +1 -0
  35. package/dist/timecampus/components/EmptyState.d.ts +12 -0
  36. package/dist/timecampus/components/EmptyState.d.ts.map +1 -0
  37. package/dist/timecampus/components/ErrorBoundary.d.ts +19 -0
  38. package/dist/timecampus/components/ErrorBoundary.d.ts.map +1 -0
  39. package/dist/timecampus/components/ErrorBoundary.js +52 -0
  40. package/dist/timecampus/components/ErrorBoundary.js.map +1 -0
  41. package/dist/timecampus/components/FilterBar.d.ts +26 -0
  42. package/dist/timecampus/components/FilterBar.d.ts.map +1 -0
  43. package/dist/timecampus/components/LoadingSkeleton.d.ts +10 -0
  44. package/dist/timecampus/components/LoadingSkeleton.d.ts.map +1 -0
  45. package/dist/timecampus/components/LoadingSkeleton.js +76 -0
  46. package/dist/timecampus/components/LoadingSkeleton.js.map +1 -0
  47. package/dist/timecampus/components/Modal.d.ts +14 -0
  48. package/dist/timecampus/components/Modal.d.ts.map +1 -0
  49. package/dist/timecampus/components/PageLayout.d.ts +12 -0
  50. package/dist/timecampus/components/PageLayout.d.ts.map +1 -0
  51. package/dist/timecampus/components/PageLayout.js +23 -0
  52. package/dist/timecampus/components/PageLayout.js.map +1 -0
  53. package/dist/timecampus/components/StatCard.d.ts +17 -0
  54. package/dist/timecampus/components/StatCard.d.ts.map +1 -0
  55. package/dist/timecampus/components/StatCard.js +48 -0
  56. package/dist/timecampus/components/StatCard.js.map +1 -0
  57. package/dist/timecampus/components/StatusBadge.d.ts +16 -0
  58. package/dist/timecampus/components/StatusBadge.d.ts.map +1 -0
  59. package/dist/timecampus/components/Toast.d.ts +28 -0
  60. package/dist/timecampus/components/Toast.d.ts.map +1 -0
  61. package/dist/timecampus/components/index.d.ts +14 -0
  62. package/dist/timecampus/components/index.d.ts.map +1 -0
  63. package/dist/timecampus/hooks/index.d.ts +7 -0
  64. package/dist/timecampus/hooks/index.d.ts.map +1 -0
  65. package/dist/timecampus/hooks/useToast.d.ts +17 -0
  66. package/dist/timecampus/hooks/useToast.d.ts.map +1 -0
  67. package/dist/timecampus/index.d.ts +10 -0
  68. package/dist/timecampus/index.d.ts.map +1 -0
  69. package/dist/timecampus/index.js +4 -0
  70. package/dist/timecampus/pages/HomePage.d.ts +4 -0
  71. package/dist/timecampus/pages/HomePage.d.ts.map +1 -0
  72. package/dist/timecampus/pages/HomePage.js +239 -0
  73. package/dist/timecampus/pages/HomePage.js.map +1 -0
  74. package/dist/timecampus/pages/applets/AppletStorePage.d.ts +2 -0
  75. package/dist/timecampus/pages/applets/AppletStorePage.d.ts.map +1 -0
  76. package/dist/timecampus/pages/applets/AppletStorePage.js +77 -0
  77. package/dist/timecampus/pages/applets/AppletStorePage.js.map +1 -0
  78. package/dist/timecampus/pages/applets/InstalledAppletsPage.d.ts +2 -0
  79. package/dist/timecampus/pages/applets/InstalledAppletsPage.d.ts.map +1 -0
  80. package/dist/timecampus/pages/applets/InstalledAppletsPage.js +83 -0
  81. package/dist/timecampus/pages/applets/InstalledAppletsPage.js.map +1 -0
  82. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.d.ts +2 -0
  83. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.d.ts.map +1 -0
  84. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js +118 -0
  85. package/dist/timecampus/pages/application-usage/ApplicationUsagePage.js.map +1 -0
  86. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.d.ts +2 -0
  87. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.d.ts.map +1 -0
  88. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js +129 -0
  89. package/dist/timecampus/pages/application-usage/ApplicationUsageSettingsPage.js.map +1 -0
  90. package/dist/timecampus/pages/channels/ChannelsPage.d.ts +2 -0
  91. package/dist/timecampus/pages/channels/ChannelsPage.d.ts.map +1 -0
  92. package/dist/timecampus/pages/channels/ChannelsPage.js +64 -0
  93. package/dist/timecampus/pages/channels/ChannelsPage.js.map +1 -0
  94. package/dist/timecampus/pages/client-portal/ClientPortalPage.d.ts +2 -0
  95. package/dist/timecampus/pages/client-portal/ClientPortalPage.d.ts.map +1 -0
  96. package/dist/timecampus/pages/client-portal/ClientPortalPage.js +108 -0
  97. package/dist/timecampus/pages/client-portal/ClientPortalPage.js.map +1 -0
  98. package/dist/timecampus/pages/dashboard/AnalyticsPage.d.ts +2 -0
  99. package/dist/timecampus/pages/dashboard/AnalyticsPage.d.ts.map +1 -0
  100. package/dist/timecampus/pages/dashboard/AnalyticsPage.js +91 -0
  101. package/dist/timecampus/pages/dashboard/AnalyticsPage.js.map +1 -0
  102. package/dist/timecampus/pages/dashboard/ReportsPage.d.ts +2 -0
  103. package/dist/timecampus/pages/dashboard/ReportsPage.d.ts.map +1 -0
  104. package/dist/timecampus/pages/dashboard/ReportsPage.js +102 -0
  105. package/dist/timecampus/pages/dashboard/ReportsPage.js.map +1 -0
  106. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.d.ts +2 -0
  107. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.d.ts.map +1 -0
  108. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js +73 -0
  109. package/dist/timecampus/pages/email-tracking/EmailAnalyticsPage.js.map +1 -0
  110. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.d.ts +2 -0
  111. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.d.ts.map +1 -0
  112. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js +138 -0
  113. package/dist/timecampus/pages/email-tracking/EmailSettingsPage.js.map +1 -0
  114. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.d.ts +2 -0
  115. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.d.ts.map +1 -0
  116. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js +71 -0
  117. package/dist/timecampus/pages/email-tracking/EmailTrackingPage.js.map +1 -0
  118. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.d.ts +2 -0
  119. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.d.ts.map +1 -0
  120. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +102 -0
  121. package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -0
  122. package/dist/timecampus/pages/focus-score/FocusScorePage.d.ts +2 -0
  123. package/dist/timecampus/pages/focus-score/FocusScorePage.d.ts.map +1 -0
  124. package/dist/timecampus/pages/focus-score/FocusScorePage.js +131 -0
  125. package/dist/timecampus/pages/focus-score/FocusScorePage.js.map +1 -0
  126. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.d.ts +2 -0
  127. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.d.ts.map +1 -0
  128. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js +115 -0
  129. package/dist/timecampus/pages/focus-score/FocusScoreSettingsPage.js.map +1 -0
  130. package/dist/timecampus/pages/geofencing/GeofencingPage.d.ts +2 -0
  131. package/dist/timecampus/pages/geofencing/GeofencingPage.d.ts.map +1 -0
  132. package/dist/timecampus/pages/geofencing/GeofencingPage.js +70 -0
  133. package/dist/timecampus/pages/geofencing/GeofencingPage.js.map +1 -0
  134. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.d.ts +2 -0
  135. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.d.ts.map +1 -0
  136. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js +106 -0
  137. package/dist/timecampus/pages/geofencing/GeofencingSettingsPage.js.map +1 -0
  138. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.d.ts +2 -0
  139. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.d.ts.map +1 -0
  140. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js +77 -0
  141. package/dist/timecampus/pages/industry-solutions/IndustrySolutionsPage.js.map +1 -0
  142. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.d.ts +2 -0
  143. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.d.ts.map +1 -0
  144. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js +115 -0
  145. package/dist/timecampus/pages/location-tracking/LocationPrivacySettingsPage.js.map +1 -0
  146. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.d.ts +2 -0
  147. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.d.ts.map +1 -0
  148. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js +97 -0
  149. package/dist/timecampus/pages/location-tracking/LocationTrackingPage.js.map +1 -0
  150. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.d.ts +2 -0
  151. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.d.ts.map +1 -0
  152. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js +89 -0
  153. package/dist/timecampus/pages/meetings/MeetingAnalyticsPage.js.map +1 -0
  154. package/dist/timecampus/pages/meetings/MeetingCreatePage.d.ts +2 -0
  155. package/dist/timecampus/pages/meetings/MeetingCreatePage.d.ts.map +1 -0
  156. package/dist/timecampus/pages/meetings/MeetingCreatePage.js +101 -0
  157. package/dist/timecampus/pages/meetings/MeetingCreatePage.js.map +1 -0
  158. package/dist/timecampus/pages/meetings/MeetingDetailPage.d.ts +2 -0
  159. package/dist/timecampus/pages/meetings/MeetingDetailPage.d.ts.map +1 -0
  160. package/dist/timecampus/pages/meetings/MeetingDetailPage.js +123 -0
  161. package/dist/timecampus/pages/meetings/MeetingDetailPage.js.map +1 -0
  162. package/dist/timecampus/pages/meetings/MeetingsPage.d.ts +2 -0
  163. package/dist/timecampus/pages/meetings/MeetingsPage.d.ts.map +1 -0
  164. package/dist/timecampus/pages/meetings/MeetingsPage.js +90 -0
  165. package/dist/timecampus/pages/meetings/MeetingsPage.js.map +1 -0
  166. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.d.ts +2 -0
  167. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.d.ts.map +1 -0
  168. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js +113 -0
  169. package/dist/timecampus/pages/pomodoro/PomodoroAnalyticsPage.js.map +1 -0
  170. package/dist/timecampus/pages/pomodoro/PomodoroPage.d.ts +2 -0
  171. package/dist/timecampus/pages/pomodoro/PomodoroPage.d.ts.map +1 -0
  172. package/dist/timecampus/pages/pomodoro/PomodoroPage.js +160 -0
  173. package/dist/timecampus/pages/pomodoro/PomodoroPage.js.map +1 -0
  174. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.d.ts +2 -0
  175. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.d.ts.map +1 -0
  176. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js +176 -0
  177. package/dist/timecampus/pages/pomodoro/PomodoroSettingsPage.js.map +1 -0
  178. package/dist/timecampus/pages/projects/ProjectCreatePage.d.ts +2 -0
  179. package/dist/timecampus/pages/projects/ProjectCreatePage.d.ts.map +1 -0
  180. package/dist/timecampus/pages/projects/ProjectCreatePage.js +104 -0
  181. package/dist/timecampus/pages/projects/ProjectCreatePage.js.map +1 -0
  182. package/dist/timecampus/pages/projects/ProjectDetailPage.d.ts +2 -0
  183. package/dist/timecampus/pages/projects/ProjectDetailPage.d.ts.map +1 -0
  184. package/dist/timecampus/pages/projects/ProjectDetailPage.js +91 -0
  185. package/dist/timecampus/pages/projects/ProjectDetailPage.js.map +1 -0
  186. package/dist/timecampus/pages/projects/ProjectsPage.d.ts +2 -0
  187. package/dist/timecampus/pages/projects/ProjectsPage.d.ts.map +1 -0
  188. package/dist/timecampus/pages/projects/ProjectsPage.js +95 -0
  189. package/dist/timecampus/pages/projects/ProjectsPage.js.map +1 -0
  190. package/dist/timecampus/pages/projects/TasksPage.d.ts +2 -0
  191. package/dist/timecampus/pages/projects/TasksPage.d.ts.map +1 -0
  192. package/dist/timecampus/pages/projects/TasksPage.js +73 -0
  193. package/dist/timecampus/pages/projects/TasksPage.js.map +1 -0
  194. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.d.ts +2 -0
  195. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.d.ts.map +1 -0
  196. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js +129 -0
  197. package/dist/timecampus/pages/resource-planning/ResourcePlanningPage.js.map +1 -0
  198. package/dist/timecampus/pages/team/TeamAnalyticsPage.d.ts +2 -0
  199. package/dist/timecampus/pages/team/TeamAnalyticsPage.d.ts.map +1 -0
  200. package/dist/timecampus/pages/team/TeamAnalyticsPage.js +78 -0
  201. package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -0
  202. package/dist/timecampus/pages/team/TeamMembersPage.d.ts +2 -0
  203. package/dist/timecampus/pages/team/TeamMembersPage.d.ts.map +1 -0
  204. package/dist/timecampus/pages/team/TeamMembersPage.js +97 -0
  205. package/dist/timecampus/pages/team/TeamMembersPage.js.map +1 -0
  206. package/dist/timecampus/pages/team/TeamPage.d.ts +2 -0
  207. package/dist/timecampus/pages/team/TeamPage.d.ts.map +1 -0
  208. package/dist/timecampus/pages/team/TeamPage.js +82 -0
  209. package/dist/timecampus/pages/team/TeamPage.js.map +1 -0
  210. package/dist/timecampus/pages/team-activity/TeamActivityPage.d.ts +2 -0
  211. package/dist/timecampus/pages/team-activity/TeamActivityPage.d.ts.map +1 -0
  212. package/dist/timecampus/pages/team-activity/TeamActivityPage.js +107 -0
  213. package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -0
  214. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.d.ts +2 -0
  215. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.d.ts.map +1 -0
  216. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js +120 -0
  217. package/dist/timecampus/pages/team-activity/TeamActivitySettingsPage.js.map +1 -0
  218. package/dist/timecampus/pages/templates/TemplateApplicationPage.d.ts +2 -0
  219. package/dist/timecampus/pages/templates/TemplateApplicationPage.d.ts.map +1 -0
  220. package/dist/timecampus/pages/templates/TemplateApplicationPage.js +84 -0
  221. package/dist/timecampus/pages/templates/TemplateApplicationPage.js.map +1 -0
  222. package/dist/timecampus/pages/templates/TemplateDetailPage.d.ts +2 -0
  223. package/dist/timecampus/pages/templates/TemplateDetailPage.d.ts.map +1 -0
  224. package/dist/timecampus/pages/templates/TemplateDetailPage.js +98 -0
  225. package/dist/timecampus/pages/templates/TemplateDetailPage.js.map +1 -0
  226. package/dist/timecampus/pages/templates/TemplatesPage.d.ts +2 -0
  227. package/dist/timecampus/pages/templates/TemplatesPage.d.ts.map +1 -0
  228. package/dist/timecampus/pages/templates/TemplatesPage.js +76 -0
  229. package/dist/timecampus/pages/templates/TemplatesPage.js.map +1 -0
  230. package/dist/timecampus/pages/time/TimeEntriesPage.d.ts +2 -0
  231. package/dist/timecampus/pages/time/TimeEntriesPage.d.ts.map +1 -0
  232. package/dist/timecampus/pages/time/TimeEntriesPage.js +117 -0
  233. package/dist/timecampus/pages/time/TimeEntriesPage.js.map +1 -0
  234. package/dist/timecampus/pages/time/TimeTrackingPage.d.ts +2 -0
  235. package/dist/timecampus/pages/time/TimeTrackingPage.d.ts.map +1 -0
  236. package/dist/timecampus/pages/time/TimeTrackingPage.js +112 -0
  237. package/dist/timecampus/pages/time/TimeTrackingPage.js.map +1 -0
  238. package/dist/timecampus/pages/time/TimerPage.d.ts +2 -0
  239. package/dist/timecampus/pages/time/TimerPage.d.ts.map +1 -0
  240. package/dist/timecampus/pages/time/TimerPage.js +80 -0
  241. package/dist/timecampus/pages/time/TimerPage.js.map +1 -0
  242. package/dist/timecampus/pages/time-approval/TimeApprovalPage.d.ts +2 -0
  243. package/dist/timecampus/pages/time-approval/TimeApprovalPage.d.ts.map +1 -0
  244. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js +130 -0
  245. package/dist/timecampus/pages/time-approval/TimeApprovalPage.js.map +1 -0
  246. package/dist/timecampus/pages/widgets/WidgetDetailPage.d.ts +2 -0
  247. package/dist/timecampus/pages/widgets/WidgetDetailPage.d.ts.map +1 -0
  248. package/dist/timecampus/pages/widgets/WidgetDetailPage.js +96 -0
  249. package/dist/timecampus/pages/widgets/WidgetDetailPage.js.map +1 -0
  250. package/dist/timecampus/pages/widgets/WidgetsPage.d.ts +2 -0
  251. package/dist/timecampus/pages/widgets/WidgetsPage.d.ts.map +1 -0
  252. package/dist/timecampus/pages/widgets/WidgetsPage.js +77 -0
  253. package/dist/timecampus/pages/widgets/WidgetsPage.js.map +1 -0
  254. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.d.ts +2 -0
  255. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.d.ts.map +1 -0
  256. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js +95 -0
  257. package/dist/timecampus/pages/work-patterns/WorkPatternsPage.js.map +1 -0
  258. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.d.ts +2 -0
  259. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.d.ts.map +1 -0
  260. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js +129 -0
  261. package/dist/timecampus/pages/work-patterns/WorkPatternsSettingsPage.js.map +1 -0
  262. package/dist/timecampus/pages/workflows/WorkflowsPage.d.ts +2 -0
  263. package/dist/timecampus/pages/workflows/WorkflowsPage.d.ts.map +1 -0
  264. package/dist/timecampus/pages/workflows/WorkflowsPage.js +80 -0
  265. package/dist/timecampus/pages/workflows/WorkflowsPage.js.map +1 -0
  266. package/dist/timecampus/providers/TimeCampusProvider.d.ts +29 -0
  267. package/dist/timecampus/providers/TimeCampusProvider.d.ts.map +1 -0
  268. package/dist/timecampus/providers/TimeCampusProvider.js +92 -0
  269. package/dist/timecampus/providers/TimeCampusProvider.js.map +1 -0
  270. package/dist/timecampus/store/timecampusStore.d.ts +71 -0
  271. package/dist/timecampus/store/timecampusStore.d.ts.map +1 -0
  272. package/dist/timecampus/store/timecampusStore.js +33 -0
  273. package/dist/timecampus/store/timecampusStore.js.map +1 -0
  274. package/dist/timecampus/types/index.d.ts +615 -0
  275. package/dist/timecampus/types/index.d.ts.map +1 -0
  276. package/dist/timecampus/utils/helpers.d.ts +19 -0
  277. package/dist/timecampus/utils/helpers.d.ts.map +1 -0
  278. package/dist/timecampus/utils/helpers.js +73 -0
  279. package/dist/timecampus/utils/helpers.js.map +1 -0
  280. package/dist/timecampus/utils/index.d.ts +2 -0
  281. package/dist/timecampus/utils/index.d.ts.map +1 -0
  282. package/package.json +110 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MeetingDetailPage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingDetailPage.tsx"],"sourcesContent":["import { useParams } from \"react-router-dom\";\nimport { CalendarDays, Users, Clock, Video } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetMeetingQuery,\n type MeetingParticipantFieldsFragment,\n type MeetingActionItemFieldsFragment,\n} from \"@/generated/wspace-operations\";\nimport { formatCurrency } from \"../../utils/helpers\";\n\nexport function MeetingDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useGetMeetingQuery({\n variables: { id: id ?? \"\", workspaceId },\n skip: !workspaceId || !id,\n });\n\n const meeting = data?.meeting;\n\n if (loading) {\n return (\n <PageLayout title=\"Meeting Details\" description={`Meeting ID: ${id}`}>\n <LoadingSkeleton variant=\"detail\" />\n </PageLayout>\n );\n }\n\n if (error || !meeting) {\n return (\n <PageLayout title=\"Meeting Details\" description={`Meeting ID: ${id}`}>\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n {error\n ? \"Failed to load meeting details. Please try again later.\"\n : \"Meeting not found.\"}\n </div>\n </PageLayout>\n );\n }\n\n const pendingActions = meeting.actionItems.filter(\n (a: MeetingActionItemFieldsFragment) => a.status !== \"COMPLETED\",\n ).length;\n\n return (\n <PageLayout title=\"Meeting Details\" description={meeting.title}>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Duration\"\n value={`${meeting.duration ?? 0} min`}\n icon={<Clock className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Participants\"\n value={String(meeting.participants.length)}\n icon={<Users className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Cost\"\n value={meeting.cost != null ? formatCurrency(meeting.cost) : \"N/A\"}\n description=\"Based on participant rates\"\n />\n <StatCard\n title=\"Action Items\"\n value={String(meeting.actionItems.length)}\n description={`${pendingActions} pending`}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-foreground\">\n Participants\n </h3>\n {meeting.participants.length > 0 ? (\n <div className=\"space-y-2\">\n {meeting.participants.map(\n (p: MeetingParticipantFieldsFragment) => (\n <div\n key={p.id}\n className=\"flex items-center justify-between rounded-lg border border-border px-3 py-2\"\n >\n <span className=\"text-sm text-foreground\">{p.userId}</span>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">\n {p.role}\n </span>\n <span className=\"inline-flex rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground\">\n {p.status}\n </span>\n </div>\n </div>\n ),\n )}\n </div>\n ) : (\n <div className=\"flex h-32 items-center justify-center rounded-lg border border-dashed border-border\">\n <p className=\"text-sm text-muted-foreground\">\n No participants added\n </p>\n </div>\n )}\n </div>\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <h3 className=\"mb-4 text-sm font-semibold text-foreground\">\n Action Items\n </h3>\n {meeting.actionItems.length > 0 ? (\n <div className=\"space-y-2\">\n {meeting.actionItems.map(\n (item: MeetingActionItemFieldsFragment) => (\n <div\n key={item.id}\n className=\"flex items-center justify-between rounded-lg border border-border px-3 py-2\"\n >\n <span className=\"text-sm text-foreground\">\n {item.title}\n </span>\n <span className=\"inline-flex rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground\">\n {item.status}\n </span>\n </div>\n ),\n )}\n </div>\n ) : (\n <div className=\"flex h-32 items-center justify-center rounded-lg border border-dashed border-border\">\n <p className=\"text-sm text-muted-foreground\">No action items</p>\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAgB,IAAoB;CAClC,IAAM,EAAE,UAAO,GAA2B,EACpC,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAAmB;EAClD,WAAW;GAAE,IAAI,KAAM;GAAI;GAAa;EACxC,MAAM,CAAC,KAAe,CAAC;EACxB,CAAC,EAEI,IAAU,GAAM;AAEtB,KAAI,EACF,QACE,kBAAC,GAAD;EAAY,OAAM;EAAkB,aAAa,eAAe;YAC9D,kBAAC,GAAD,EAAiB,SAAQ,UAAW,CAAA;EACzB,CAAA;AAIjB,KAAI,KAAS,CAAC,EACZ,QACE,kBAAC,GAAD;EAAY,OAAM;EAAkB,aAAa,eAAe;YAC9D,kBAAC,OAAD;GAAK,WAAU;aACZ,IACG,4DACA;GACA,CAAA;EACK,CAAA;CAIjB,IAAM,IAAiB,EAAQ,YAAY,QACxC,MAAuC,EAAE,WAAW,YACtD,CAAC;AAEF,QACE,kBAAC,GAAD;EAAY,OAAM;EAAkB,aAAa,EAAQ;YAAzD,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAQ,YAAY,EAAE;KAChC,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,EAAQ,aAAa,OAAO;KAC1C,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,EAAQ,QAAQ,OAAsC,QAA/B,EAAe,EAAQ,KAAK;KAC1D,aAAY;KACZ,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,EAAQ,YAAY,OAAO;KACzC,aAAa,GAAG,EAAe;KAC/B,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA6C;KAEtD,CAAA,EACJ,EAAQ,aAAa,SAAS,IAC7B,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAQ,aAAa,KACnB,MACC,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,QAAD;OAAM,WAAU;iBAA2B,EAAE;OAAc,CAAA,EAC3D,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAE;QACE,CAAA,EACP,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAE;QACE,CAAA,CACH;SACF;QAZC,EAAE,GAYH,CAET;KACG,CAAA,GAEN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,KAAD;MAAG,WAAU;gBAAgC;MAEzC,CAAA;KACA,CAAA,CAEJ;OACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA6C;KAEtD,CAAA,EACJ,EAAQ,YAAY,SAAS,IAC5B,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAQ,YAAY,KAClB,MACC,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAK;OACD,CAAA,EACP,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAK;OACD,CAAA,CACH;QATC,EAAK,GASN,CAET;KACG,CAAA,GAEN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,KAAD;MAAG,WAAU;gBAAgC;MAAmB,CAAA;KAC5D,CAAA,CAEJ;MACF;KACK"}
@@ -0,0 +1,2 @@
1
+ export declare function MeetingsPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=MeetingsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MeetingsPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/meetings/MeetingsPage.tsx"],"names":[],"mappings":"AAUA,wBAAgB,YAAY,4CA6F3B"}
@@ -0,0 +1,90 @@
1
+ import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
+ import { formatDate as t } from "../../utils/helpers.js";
3
+ import { PageLayout as n } from "../../components/PageLayout.js";
4
+ import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
5
+ import { useListMeetingsQuery as i } from "../../../generated/wspace-operations.js";
6
+ import { CalendarDays as a, Plus as o, Video as s } from "lucide-react";
7
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
+ //#region src/timecampus/pages/meetings/MeetingsPage.tsx
9
+ function u() {
10
+ let { workspaceId: u = "" } = e(), { data: d, loading: f, error: p } = i({
11
+ variables: {
12
+ workspaceId: u,
13
+ limit: 20
14
+ },
15
+ skip: !u
16
+ }), m = d?.meetings ?? [];
17
+ return f ? /* @__PURE__ */ c(n, {
18
+ title: "Meetings",
19
+ description: "Schedule and track meetings",
20
+ actions: /* @__PURE__ */ l("button", {
21
+ className: "inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90",
22
+ children: [/* @__PURE__ */ c(o, { className: "h-4 w-4" }), "Schedule Meeting"]
23
+ }),
24
+ children: /* @__PURE__ */ c(r, {
25
+ variant: "list",
26
+ count: 5
27
+ })
28
+ }) : p ? /* @__PURE__ */ c(n, {
29
+ title: "Meetings",
30
+ description: "Schedule and track meetings",
31
+ children: /* @__PURE__ */ c("div", {
32
+ className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
33
+ children: "Failed to load meetings. Please try again later."
34
+ })
35
+ }) : /* @__PURE__ */ c(n, {
36
+ title: "Meetings",
37
+ description: "Schedule and track meetings",
38
+ actions: /* @__PURE__ */ l("button", {
39
+ className: "inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90",
40
+ children: [/* @__PURE__ */ c(o, { className: "h-4 w-4" }), "Schedule Meeting"]
41
+ }),
42
+ children: /* @__PURE__ */ c("div", {
43
+ className: "rounded-xl border border-border bg-card",
44
+ children: /* @__PURE__ */ c("div", {
45
+ className: "divide-y divide-border",
46
+ children: m.length === 0 ? /* @__PURE__ */ c("div", {
47
+ className: "p-8 text-center text-sm text-muted-foreground",
48
+ children: "No meetings found."
49
+ }) : m.map((e) => /* @__PURE__ */ l("div", {
50
+ className: "flex items-center justify-between p-4 hover:bg-muted/50 transition-colors cursor-pointer",
51
+ children: [/* @__PURE__ */ l("div", {
52
+ className: "flex items-center gap-3",
53
+ children: [/* @__PURE__ */ c(a, { className: "h-5 w-5 text-muted-foreground" }), /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ l("div", {
54
+ className: "flex items-center gap-2",
55
+ children: [/* @__PURE__ */ c("p", {
56
+ className: "text-sm font-medium text-foreground",
57
+ children: e.title
58
+ }), e.recordingUrl && /* @__PURE__ */ c(s, { className: "h-3.5 w-3.5 text-muted-foreground" })]
59
+ }), /* @__PURE__ */ l("p", {
60
+ className: "text-xs text-muted-foreground",
61
+ children: [
62
+ t(e.startTime),
63
+ " ·",
64
+ " ",
65
+ e.duration ?? 0,
66
+ "min ·",
67
+ " ",
68
+ e.participants.length,
69
+ " participants"
70
+ ]
71
+ })] })]
72
+ }), /* @__PURE__ */ l("div", {
73
+ className: "flex items-center gap-2",
74
+ children: [/* @__PURE__ */ c("span", {
75
+ className: "inline-flex rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground",
76
+ children: e.meetingType
77
+ }), /* @__PURE__ */ c("span", {
78
+ className: "inline-flex rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground",
79
+ children: e.endTime ? "completed" : "scheduled"
80
+ })]
81
+ })]
82
+ }, e.id))
83
+ })
84
+ })
85
+ });
86
+ }
87
+ //#endregion
88
+ export { u as MeetingsPage };
89
+
90
+ //# sourceMappingURL=MeetingsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MeetingsPage.js","names":[],"sources":["../../../../src/timecampus/pages/meetings/MeetingsPage.tsx"],"sourcesContent":["import { CalendarDays, Plus, Video } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { formatDate } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListMeetingsQuery,\n type MeetingFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function MeetingsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const { data, loading, error } = useListMeetingsQuery({\n variables: { workspaceId, limit: 20 },\n skip: !workspaceId,\n });\n\n const meetings = data?.meetings ?? [];\n\n if (loading) {\n return (\n <PageLayout\n title=\"Meetings\"\n description=\"Schedule and track meetings\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90\">\n <Plus className=\"h-4 w-4\" />\n Schedule Meeting\n </button>\n }\n >\n <LoadingSkeleton variant=\"list\" count={5} />\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout title=\"Meetings\" description=\"Schedule and track meetings\">\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load meetings. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Meetings\"\n description=\"Schedule and track meetings\"\n actions={\n <button className=\"inline-flex items-center gap-1.5 rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90\">\n <Plus className=\"h-4 w-4\" />\n Schedule Meeting\n </button>\n }\n >\n <div className=\"rounded-xl border border-border bg-card\">\n <div className=\"divide-y divide-border\">\n {meetings.length === 0 ? (\n <div className=\"p-8 text-center text-sm text-muted-foreground\">\n No meetings found.\n </div>\n ) : (\n meetings.map((meeting: MeetingFieldsFragment) => (\n <div\n key={meeting.id}\n className=\"flex items-center justify-between p-4 hover:bg-muted/50 transition-colors cursor-pointer\"\n >\n <div className=\"flex items-center gap-3\">\n <CalendarDays className=\"h-5 w-5 text-muted-foreground\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-foreground\">\n {meeting.title}\n </p>\n {meeting.recordingUrl && (\n <Video className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {formatDate(meeting.startTime)} &middot;{\" \"}\n {meeting.duration ?? 0}min &middot;{\" \"}\n {meeting.participants.length} participants\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"inline-flex rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground\">\n {meeting.meetingType}\n </span>\n <span className=\"inline-flex rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-muted-foreground\">\n {meeting.endTime ? \"completed\" : \"scheduled\"}\n </span>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,IAAe;CAC7B,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EAAE,SAAM,YAAS,aAAU,EAAqB;EACpD,WAAW;GAAE;GAAa,OAAO;GAAI;EACrC,MAAM,CAAC;EACR,CAAC,EAEI,IAAW,GAAM,YAAY,EAAE;AA6BrC,QA3BI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,mBAErB;;YAGX,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA,GAIb,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAW,aAAY;YACvC,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,mBAErB;;YAGX,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAS,WAAW,IACnB,kBAAC,OAAD;KAAK,WAAU;eAAgD;KAEzD,CAAA,GAEN,EAAS,KAAK,MACZ,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAc,WAAU,iCAAkC,CAAA,EAC1D,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAQ;QACP,CAAA,EACH,EAAQ,gBACP,kBAAC,GAAD,EAAO,WAAU,qCAAsC,CAAA,CAErD;UACN,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAW,EAAQ,UAAU;QAAC;QAAU;QACxC,EAAQ,YAAY;QAAE;QAAa;QACnC,EAAQ,aAAa;QAAO;QAC3B;SACA,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAQ;OACJ,CAAA,EACP,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAQ,UAAU,cAAc;OAC5B,CAAA,CACH;QACF;OA7BC,EAAQ,GA6BT,CACN;IAEA,CAAA;GACF,CAAA;EACK,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function PomodoroAnalyticsPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=PomodoroAnalyticsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PomodoroAnalyticsPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/pomodoro/PomodoroAnalyticsPage.tsx"],"names":[],"mappings":"AAWA,wBAAgB,qBAAqB,4CA2HpC"}
@@ -0,0 +1,113 @@
1
+ import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
+ import { PageLayout as t } from "../../components/PageLayout.js";
3
+ import { StatCard as n } from "../../components/StatCard.js";
4
+ import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
5
+ import { useGetPomodoroStatsQuery as i, useListPomodoroSessionsQuery as a } from "../../../generated/wspace-operations.js";
6
+ import { BarChart3 as o, Target as s } from "lucide-react";
7
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
+ //#region src/timecampus/pages/pomodoro/PomodoroAnalyticsPage.tsx
9
+ function u() {
10
+ let { workspaceId: u = "" } = e(), { data: d, loading: f, error: p } = i({
11
+ variables: { workspaceId: u },
12
+ skip: !u
13
+ }), { data: m, loading: h } = a({
14
+ variables: {
15
+ workspaceId: u,
16
+ limit: 50
17
+ },
18
+ skip: !u
19
+ }), g = d?.pomodoroStats, _ = m?.pomodoroSessions ?? [];
20
+ if (f || h) return /* @__PURE__ */ c(t, {
21
+ title: "Pomodoro Analytics",
22
+ description: "Track your focus sessions and productivity",
23
+ children: /* @__PURE__ */ c(r, {
24
+ variant: "card",
25
+ count: 4
26
+ })
27
+ });
28
+ if (p) return /* @__PURE__ */ c(t, {
29
+ title: "Pomodoro Analytics",
30
+ description: "Track your focus sessions and productivity",
31
+ children: /* @__PURE__ */ c("div", {
32
+ className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
33
+ children: "Failed to load pomodoro analytics. Please try again later."
34
+ })
35
+ });
36
+ let v = Math.floor((g?.totalFocusMinutes ?? 0) / 60), y = (g?.totalFocusMinutes ?? 0) % 60, b = g?.totalSessions ? (g.totalSessions / 30).toFixed(1) : "0", x = _.filter((e) => e.completed).length;
37
+ return /* @__PURE__ */ l(t, {
38
+ title: "Pomodoro Analytics",
39
+ description: "Track your focus sessions and productivity",
40
+ children: [/* @__PURE__ */ l("div", {
41
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
42
+ children: [
43
+ /* @__PURE__ */ c(n, {
44
+ title: "Total Sessions",
45
+ value: String(g?.totalSessions ?? 0),
46
+ trend: {
47
+ value: g?.completionRate ?? 0,
48
+ label: "completion rate"
49
+ }
50
+ }),
51
+ /* @__PURE__ */ c(n, {
52
+ title: "Total Focus Time",
53
+ value: `${v}h ${y}m`,
54
+ trend: {
55
+ value: g?.averageSessionMinutes ?? 0,
56
+ label: "avg min/session"
57
+ }
58
+ }),
59
+ /* @__PURE__ */ c(n, {
60
+ title: "Avg. Sessions/Day",
61
+ value: b,
62
+ description: `Target: ${g?.totalSessions ?? 0} total`
63
+ }),
64
+ /* @__PURE__ */ c(n, {
65
+ title: "Completion Rate",
66
+ value: `${g?.completionRate ?? 0}%`,
67
+ icon: /* @__PURE__ */ c(s, { className: "h-5 w-5" }),
68
+ trend: {
69
+ value: g?.streakDays ?? 0,
70
+ label: "day streak"
71
+ }
72
+ })
73
+ ]
74
+ }), /* @__PURE__ */ l("div", {
75
+ className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
76
+ children: [/* @__PURE__ */ l("div", {
77
+ className: "rounded-xl border border-border bg-card p-6",
78
+ children: [/* @__PURE__ */ l("div", {
79
+ className: "mb-4 flex items-center gap-2",
80
+ children: [/* @__PURE__ */ c(o, { className: "h-5 w-5 text-primary" }), /* @__PURE__ */ c("h3", {
81
+ className: "text-sm font-semibold text-foreground",
82
+ children: "Sessions per Day"
83
+ })]
84
+ }), /* @__PURE__ */ c("div", {
85
+ className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border",
86
+ children: /* @__PURE__ */ c("p", {
87
+ className: "text-sm text-muted-foreground",
88
+ children: _.length > 0 ? `${x} completed out of ${_.length} sessions` : "No session data available"
89
+ })
90
+ })]
91
+ }), /* @__PURE__ */ l("div", {
92
+ className: "rounded-xl border border-border bg-card p-6",
93
+ children: [/* @__PURE__ */ l("div", {
94
+ className: "mb-4 flex items-center gap-2",
95
+ children: [/* @__PURE__ */ c(o, { className: "h-5 w-5 text-primary" }), /* @__PURE__ */ c("h3", {
96
+ className: "text-sm font-semibold text-foreground",
97
+ children: "Focus Distribution"
98
+ })]
99
+ }), /* @__PURE__ */ c("div", {
100
+ className: "flex h-48 items-center justify-center rounded-lg border border-dashed border-border",
101
+ children: /* @__PURE__ */ c("p", {
102
+ className: "text-sm text-muted-foreground",
103
+ children: g ? `${g.streakDays} day streak · ${g.averageSessionMinutes}m avg session` : "No data available"
104
+ })
105
+ })]
106
+ })]
107
+ })]
108
+ });
109
+ }
110
+ //#endregion
111
+ export { u as PomodoroAnalyticsPage };
112
+
113
+ //# sourceMappingURL=PomodoroAnalyticsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PomodoroAnalyticsPage.js","names":[],"sources":["../../../../src/timecampus/pages/pomodoro/PomodoroAnalyticsPage.tsx"],"sourcesContent":["import { BarChart3, Target } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetPomodoroStatsQuery,\n useListPomodoroSessionsQuery,\n type PomodoroSessionFieldsFragment,\n} from \"@/generated/wspace-operations\";\n\nexport function PomodoroAnalyticsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetPomodoroStatsQuery({\n variables: { workspaceId },\n skip: !workspaceId,\n });\n\n const { data: sessionsData, loading: sessionsLoading } =\n useListPomodoroSessionsQuery({\n variables: { workspaceId, limit: 50 },\n skip: !workspaceId,\n });\n\n const stats = statsData?.pomodoroStats;\n const sessions = sessionsData?.pomodoroSessions ?? [];\n\n if (statsLoading || sessionsLoading) {\n return (\n <PageLayout\n title=\"Pomodoro Analytics\"\n description=\"Track your focus sessions and productivity\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (statsError) {\n return (\n <PageLayout\n title=\"Pomodoro Analytics\"\n description=\"Track your focus sessions and productivity\"\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load pomodoro analytics. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const totalFocusH = Math.floor((stats?.totalFocusMinutes ?? 0) / 60);\n const totalFocusM = (stats?.totalFocusMinutes ?? 0) % 60;\n const avgSessions = stats?.totalSessions\n ? (stats.totalSessions / 30).toFixed(1)\n : \"0\";\n const completedCount = sessions.filter(\n (s: PomodoroSessionFieldsFragment) => s.completed,\n ).length;\n\n return (\n <PageLayout\n title=\"Pomodoro Analytics\"\n description=\"Track your focus sessions and productivity\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n title=\"Total Sessions\"\n value={String(stats?.totalSessions ?? 0)}\n trend={{\n value: stats?.completionRate ?? 0,\n label: \"completion rate\",\n }}\n />\n <StatCard\n title=\"Total Focus Time\"\n value={`${totalFocusH}h ${totalFocusM}m`}\n trend={{\n value: stats?.averageSessionMinutes ?? 0,\n label: \"avg min/session\",\n }}\n />\n <StatCard\n title=\"Avg. Sessions/Day\"\n value={avgSessions}\n description={`Target: ${stats?.totalSessions ?? 0} total`}\n />\n <StatCard\n title=\"Completion Rate\"\n value={`${stats?.completionRate ?? 0}%`}\n icon={<Target className=\"h-5 w-5\" />}\n trend={{ value: stats?.streakDays ?? 0, label: \"day streak\" }}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <div className=\"mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5 text-primary\" />\n <h3 className=\"text-sm font-semibold text-foreground\">\n Sessions per Day\n </h3>\n </div>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border\">\n <p className=\"text-sm text-muted-foreground\">\n {sessions.length > 0\n ? `${completedCount} completed out of ${sessions.length} sessions`\n : \"No session data available\"}\n </p>\n </div>\n </div>\n <div className=\"rounded-xl border border-border bg-card p-6\">\n <div className=\"mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-5 w-5 text-primary\" />\n <h3 className=\"text-sm font-semibold text-foreground\">\n Focus Distribution\n </h3>\n </div>\n <div className=\"flex h-48 items-center justify-center rounded-lg border border-dashed border-border\">\n <p className=\"text-sm text-muted-foreground\">\n {stats\n ? `${stats.streakDays} day streak · ${stats.averageSessionMinutes}m avg session`\n : \"No data available\"}\n </p>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAWA,SAAgB,IAAwB;CACtC,IAAM,EAAE,iBAAc,OAAO,GAAe,EAEtC,EACJ,MAAM,GACN,SAAS,GACT,OAAO,MACL,EAAyB;EAC3B,WAAW,EAAE,gBAAa;EAC1B,MAAM,CAAC;EACR,CAAC,EAEI,EAAE,MAAM,GAAc,SAAS,MACnC,EAA6B;EAC3B,WAAW;GAAE;GAAa,OAAO;GAAI;EACrC,MAAM,CAAC;EACR,CAAC,EAEE,IAAQ,GAAW,eACnB,IAAW,GAAc,oBAAoB,EAAE;AAErD,KAAI,KAAgB,EAClB,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA;EACjC,CAAA;AAIjB,KAAI,EACF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aAA+H;GAExI,CAAA;EACK,CAAA;CAIjB,IAAM,IAAc,KAAK,OAAO,GAAO,qBAAqB,KAAK,GAAG,EAC9D,KAAe,GAAO,qBAAqB,KAAK,IAChD,IAAc,GAAO,iBACtB,EAAM,gBAAgB,IAAI,QAAQ,EAAE,GACrC,KACE,IAAiB,EAAS,QAC7B,MAAqC,EAAE,UACzC,CAAC;AAEF,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;YAFd,CAIE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,OAAO,GAAO,iBAAiB,EAAE;KACxC,OAAO;MACL,OAAO,GAAO,kBAAkB;MAChC,OAAO;MACR;KACD,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,EAAY,IAAI,EAAY;KACtC,OAAO;MACL,OAAO,GAAO,yBAAyB;MACvC,OAAO;MACR;KACD,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO;KACP,aAAa,WAAW,GAAO,iBAAiB,EAAE;KAClD,CAAA;IACF,kBAAC,GAAD;KACE,OAAM;KACN,OAAO,GAAG,GAAO,kBAAkB,EAAE;KACrC,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;KACpC,OAAO;MAAE,OAAO,GAAO,cAAc;MAAG,OAAO;MAAc;KAC7D,CAAA;IACE;MAEN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAW,WAAU,wBAAyB,CAAA,EAC9C,kBAAC,MAAD;MAAI,WAAU;gBAAwC;MAEjD,CAAA,CACD;QACN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAS,SAAS,IACf,GAAG,EAAe,oBAAoB,EAAS,OAAO,aACtD;MACF,CAAA;KACA,CAAA,CACF;OACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAW,WAAU,wBAAyB,CAAA,EAC9C,kBAAC,MAAD;MAAI,WAAU;gBAAwC;MAEjD,CAAA,CACD;QACN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,KAAD;MAAG,WAAU;gBACV,IACG,GAAG,EAAM,WAAW,gBAAgB,EAAM,sBAAsB,iBAChE;MACF,CAAA;KACA,CAAA,CACF;MACF;KACK"}
@@ -0,0 +1,2 @@
1
+ export declare function PomodoroPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=PomodoroPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PomodoroPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/pomodoro/PomodoroPage.tsx"],"names":[],"mappings":"AAaA,wBAAgB,YAAY,4CAoM3B"}
@@ -0,0 +1,160 @@
1
+ import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
+ import { PageLayout as t } from "../../components/PageLayout.js";
3
+ import { StatCard as n } from "../../components/StatCard.js";
4
+ import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
5
+ import { useCompletePomodoroSessionMutation as i, useGetActivePomodoroSessionQuery as a, useGetPomodoroStatsQuery as o, useStartPomodoroSessionMutation as s } from "../../../generated/wspace-operations.js";
6
+ import { useCallback as c, useEffect as l, useState as u } from "react";
7
+ import { Pause as d, Play as f, RotateCcw as p, SkipForward as m } from "lucide-react";
8
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
9
+ //#region src/timecampus/pages/pomodoro/PomodoroPage.tsx
10
+ function _() {
11
+ let { workspaceId: _ = "" } = e(), { data: v, loading: y, error: b } = o({
12
+ variables: { workspaceId: _ },
13
+ skip: !_
14
+ }), { data: x, loading: S, error: C } = a({
15
+ variables: { workspaceId: _ },
16
+ skip: !_
17
+ }), [w] = s(), [T] = i(), E = v?.pomodoroStats, D = x?.activePomodoroSession, [O, k] = u(1500), [A, j] = u(!1);
18
+ l(() => {
19
+ if (D && !D.completed) {
20
+ let e = Math.floor((Date.now() - new Date(D.startTime).getTime()) / 1e3), t = D.duration ?? 1500, n = Math.max(0, t - e);
21
+ k(n), j(n > 0);
22
+ }
23
+ }, [D]), l(() => {
24
+ if (!A || O <= 0) return;
25
+ let e = setInterval(() => {
26
+ k((e) => e <= 1 ? (j(!1), 0) : e - 1);
27
+ }, 1e3);
28
+ return () => clearInterval(e);
29
+ }, [A, O]);
30
+ let M = (e) => {
31
+ let t = Math.floor(e / 60), n = e % 60;
32
+ return `${String(t).padStart(2, "0")}:${String(n).padStart(2, "0")}`;
33
+ }, N = c(async () => {
34
+ if (_) {
35
+ if (D && !D.completed) {
36
+ j(!0);
37
+ return;
38
+ }
39
+ await w({
40
+ variables: { input: {
41
+ workspaceId: _,
42
+ type: "FOCUS"
43
+ } },
44
+ refetchQueries: ["GetActivePomodoroSession", "GetPomodoroStats"]
45
+ }), k(1500), j(!0);
46
+ }
47
+ }, [
48
+ _,
49
+ D,
50
+ w
51
+ ]), P = c(async () => {
52
+ !D || !_ || (await T({
53
+ variables: {
54
+ id: D.id,
55
+ workspaceId: _
56
+ },
57
+ refetchQueries: ["GetActivePomodoroSession", "GetPomodoroStats"]
58
+ }), j(!1), k(1500));
59
+ }, [
60
+ D,
61
+ _,
62
+ T
63
+ ]), F = () => {
64
+ j(!1), k(1500);
65
+ };
66
+ if (y || S) return /* @__PURE__ */ h(t, {
67
+ title: "Pomodoro Timer",
68
+ description: "Focus with the Pomodoro Technique",
69
+ children: /* @__PURE__ */ h(r, {
70
+ variant: "card",
71
+ count: 3
72
+ })
73
+ });
74
+ if (b || C) return /* @__PURE__ */ h(t, {
75
+ title: "Pomodoro Timer",
76
+ description: "Focus with the Pomodoro Technique",
77
+ children: /* @__PURE__ */ h("div", {
78
+ className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
79
+ children: "Failed to load pomodoro data. Please try again later."
80
+ })
81
+ });
82
+ let I = Math.floor((E?.totalFocusMinutes ?? 0) / 60), L = (E?.totalFocusMinutes ?? 0) % 60;
83
+ return /* @__PURE__ */ g(t, {
84
+ title: "Pomodoro Timer",
85
+ description: "Focus with the Pomodoro Technique",
86
+ children: [/* @__PURE__ */ g("div", {
87
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-3",
88
+ children: [
89
+ /* @__PURE__ */ h(n, {
90
+ title: "Sessions Today",
91
+ value: String(E?.completedSessions ?? 0),
92
+ description: `Total: ${E?.totalSessions ?? 0} sessions`
93
+ }),
94
+ /* @__PURE__ */ h(n, {
95
+ title: "Focus Time",
96
+ value: `${I}h ${L}m`,
97
+ trend: {
98
+ value: E?.completionRate ?? 0,
99
+ label: "completion rate"
100
+ }
101
+ }),
102
+ /* @__PURE__ */ h(n, {
103
+ title: "Current Streak",
104
+ value: `${E?.streakDays ?? 0} days`,
105
+ description: `Avg: ${E?.averageSessionMinutes ?? 0}m per session`
106
+ })
107
+ ]
108
+ }), /* @__PURE__ */ h("div", {
109
+ className: "mx-auto max-w-md",
110
+ children: /* @__PURE__ */ g("div", {
111
+ className: "rounded-xl border border-border bg-card p-8 text-center",
112
+ children: [
113
+ /* @__PURE__ */ h("div", {
114
+ className: "mb-2",
115
+ children: /* @__PURE__ */ h("span", {
116
+ className: "inline-flex rounded-full bg-primary/10 px-3 py-1 text-xs font-medium text-primary",
117
+ children: D ? "Focus Session" : "Ready"
118
+ })
119
+ }),
120
+ /* @__PURE__ */ h("p", {
121
+ className: "text-7xl font-mono font-bold text-foreground",
122
+ children: M(O)
123
+ }),
124
+ /* @__PURE__ */ h("p", {
125
+ className: "mt-2 text-sm text-muted-foreground",
126
+ children: E ? `${E.completedSessions} of ${E.totalSessions} sessions` : "No sessions yet"
127
+ }),
128
+ /* @__PURE__ */ g("div", {
129
+ className: "mt-6 flex items-center justify-center gap-3",
130
+ children: [
131
+ A ? /* @__PURE__ */ g("button", {
132
+ onClick: () => j(!1),
133
+ className: "inline-flex items-center gap-2 rounded-md bg-primary px-6 py-3 text-sm font-medium text-primary-foreground hover:bg-primary/90",
134
+ children: [/* @__PURE__ */ h(d, { className: "h-4 w-4" }), "Pause"]
135
+ }) : /* @__PURE__ */ g("button", {
136
+ onClick: N,
137
+ className: "inline-flex items-center gap-2 rounded-md bg-primary px-6 py-3 text-sm font-medium text-primary-foreground hover:bg-primary/90",
138
+ children: [/* @__PURE__ */ h(f, { className: "h-4 w-4" }), "Start"]
139
+ }),
140
+ /* @__PURE__ */ g("button", {
141
+ onClick: P,
142
+ className: "inline-flex items-center gap-2 rounded-md border border-border px-4 py-3 text-sm font-medium text-foreground hover:bg-muted/50",
143
+ children: [/* @__PURE__ */ h(m, { className: "h-4 w-4" }), "Skip"]
144
+ }),
145
+ /* @__PURE__ */ g("button", {
146
+ onClick: F,
147
+ className: "inline-flex items-center gap-2 rounded-md border border-border px-4 py-3 text-sm font-medium text-foreground hover:bg-muted/50",
148
+ children: [/* @__PURE__ */ h(p, { className: "h-4 w-4" }), "Reset"]
149
+ })
150
+ ]
151
+ })
152
+ ]
153
+ })
154
+ })]
155
+ });
156
+ }
157
+ //#endregion
158
+ export { _ as PomodoroPage };
159
+
160
+ //# sourceMappingURL=PomodoroPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PomodoroPage.js","names":[],"sources":["../../../../src/timecampus/pages/pomodoro/PomodoroPage.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport { Play, Pause, SkipForward, RotateCcw } from \"lucide-react\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useGetActivePomodoroSessionQuery,\n useGetPomodoroStatsQuery,\n useStartPomodoroSessionMutation,\n useCompletePomodoroSessionMutation,\n} from \"@/generated/wspace-operations\";\n\nexport function PomodoroPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetPomodoroStatsQuery({\n variables: { workspaceId },\n skip: !workspaceId,\n });\n\n const {\n data: activeData,\n loading: activeLoading,\n error: activeError,\n } = useGetActivePomodoroSessionQuery({\n variables: { workspaceId },\n skip: !workspaceId,\n });\n\n const [startSession] = useStartPomodoroSessionMutation();\n const [completeSession] = useCompletePomodoroSessionMutation();\n\n const stats = statsData?.pomodoroStats;\n const activeSession = activeData?.activePomodoroSession;\n\n const [timerSeconds, setTimerSeconds] = useState(25 * 60);\n const [isRunning, setIsRunning] = useState(false);\n\n useEffect(() => {\n if (activeSession && !activeSession.completed) {\n const elapsed = Math.floor(\n (Date.now() - new Date(activeSession.startTime).getTime()) / 1000,\n );\n const duration = activeSession.duration ?? 25 * 60;\n const remaining = Math.max(0, duration - elapsed);\n setTimerSeconds(remaining);\n setIsRunning(remaining > 0);\n }\n }, [activeSession]);\n\n useEffect(() => {\n if (!isRunning || timerSeconds <= 0) return;\n const interval = setInterval(() => {\n setTimerSeconds((prev) => {\n if (prev <= 1) {\n setIsRunning(false);\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n return () => clearInterval(interval);\n }, [isRunning, timerSeconds]);\n\n const formatTimer = (seconds: number) => {\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${String(m).padStart(2, \"0\")}:${String(s).padStart(2, \"0\")}`;\n };\n\n const handleStart = useCallback(async () => {\n if (!workspaceId) return;\n if (activeSession && !activeSession.completed) {\n setIsRunning(true);\n return;\n }\n await startSession({\n variables: { input: { workspaceId, type: \"FOCUS\" as never } },\n refetchQueries: [\"GetActivePomodoroSession\", \"GetPomodoroStats\"],\n });\n setTimerSeconds(25 * 60);\n setIsRunning(true);\n }, [workspaceId, activeSession, startSession]);\n\n const handleComplete = useCallback(async () => {\n if (!activeSession || !workspaceId) return;\n await completeSession({\n variables: { id: activeSession.id, workspaceId },\n refetchQueries: [\"GetActivePomodoroSession\", \"GetPomodoroStats\"],\n });\n setIsRunning(false);\n setTimerSeconds(25 * 60);\n }, [activeSession, workspaceId, completeSession]);\n\n const handleReset = () => {\n setIsRunning(false);\n setTimerSeconds(25 * 60);\n };\n\n if (statsLoading || activeLoading) {\n return (\n <PageLayout\n title=\"Pomodoro Timer\"\n description=\"Focus with the Pomodoro Technique\"\n >\n <LoadingSkeleton variant=\"card\" count={3} />\n </PageLayout>\n );\n }\n\n if (statsError || activeError) {\n return (\n <PageLayout\n title=\"Pomodoro Timer\"\n description=\"Focus with the Pomodoro Technique\"\n >\n <div className=\"rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400\">\n Failed to load pomodoro data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const totalFocusH = Math.floor((stats?.totalFocusMinutes ?? 0) / 60);\n const totalFocusM = (stats?.totalFocusMinutes ?? 0) % 60;\n\n return (\n <PageLayout\n title=\"Pomodoro Timer\"\n description=\"Focus with the Pomodoro Technique\"\n >\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <StatCard\n title=\"Sessions Today\"\n value={String(stats?.completedSessions ?? 0)}\n description={`Total: ${stats?.totalSessions ?? 0} sessions`}\n />\n <StatCard\n title=\"Focus Time\"\n value={`${totalFocusH}h ${totalFocusM}m`}\n trend={{\n value: stats?.completionRate ?? 0,\n label: \"completion rate\",\n }}\n />\n <StatCard\n title=\"Current Streak\"\n value={`${stats?.streakDays ?? 0} days`}\n description={`Avg: ${stats?.averageSessionMinutes ?? 0}m per session`}\n />\n </div>\n\n <div className=\"mx-auto max-w-md\">\n <div className=\"rounded-xl border border-border bg-card p-8 text-center\">\n <div className=\"mb-2\">\n <span className=\"inline-flex rounded-full bg-primary/10 px-3 py-1 text-xs font-medium text-primary\">\n {activeSession ? \"Focus Session\" : \"Ready\"}\n </span>\n </div>\n <p className=\"text-7xl font-mono font-bold text-foreground\">\n {formatTimer(timerSeconds)}\n </p>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n {stats\n ? `${stats.completedSessions} of ${stats.totalSessions} sessions`\n : \"No sessions yet\"}\n </p>\n <div className=\"mt-6 flex items-center justify-center gap-3\">\n {!isRunning ? (\n <button\n onClick={handleStart}\n className=\"inline-flex items-center gap-2 rounded-md bg-primary px-6 py-3 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n <Play className=\"h-4 w-4\" />\n Start\n </button>\n ) : (\n <button\n onClick={() => setIsRunning(false)}\n className=\"inline-flex items-center gap-2 rounded-md bg-primary px-6 py-3 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n <Pause className=\"h-4 w-4\" />\n Pause\n </button>\n )}\n <button\n onClick={handleComplete}\n className=\"inline-flex items-center gap-2 rounded-md border border-border px-4 py-3 text-sm font-medium text-foreground hover:bg-muted/50\"\n >\n <SkipForward className=\"h-4 w-4\" />\n Skip\n </button>\n <button\n onClick={handleReset}\n className=\"inline-flex items-center gap-2 rounded-md border border-border px-4 py-3 text-sm font-medium text-foreground hover:bg-muted/50\"\n >\n <RotateCcw className=\"h-4 w-4\" />\n Reset\n </button>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function PomodoroSettingsPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=PomodoroSettingsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PomodoroSettingsPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/pomodoro/PomodoroSettingsPage.tsx"],"names":[],"mappings":"AAUA,wBAAgB,oBAAoB,4CAkMnC"}
@@ -0,0 +1,176 @@
1
+ import { useTimeCampus as e } from "../../providers/TimeCampusProvider.js";
2
+ import { PageLayout as t } from "../../components/PageLayout.js";
3
+ import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
4
+ import { useGetPomodoroSettingsQuery as r, useUpdatePomodoroSettingsMutation as i } from "../../../generated/wspace-operations.js";
5
+ import { useCallback as a, useEffect as o, useState as s } from "react";
6
+ import { Settings as c } from "lucide-react";
7
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
+ //#region src/timecampus/pages/pomodoro/PomodoroSettingsPage.tsx
9
+ function d() {
10
+ let { workspaceId: d = "" } = e(), { data: f, loading: p, error: m } = r({
11
+ variables: { workspaceId: d },
12
+ skip: !d
13
+ }), [h, { loading: g }] = i(), _ = f?.pomodoroSettings, [v, y] = s(25), [b, x] = s(5), [S, C] = s(15), [w, T] = s(!0), [E, D] = s(!0), [O, k] = s(!1);
14
+ o(() => {
15
+ _ && (y(_.focusDuration), x(_.shortBreakDuration), C(_.longBreakDuration), T(_.soundEnabled), D(_.notificationsEnabled), k(_.autoStartBreaks));
16
+ }, [_]);
17
+ let A = a(async () => {
18
+ d && await h({
19
+ variables: { input: {
20
+ workspaceId: d,
21
+ focusDuration: v,
22
+ shortBreakDuration: b,
23
+ longBreakDuration: S,
24
+ soundEnabled: w,
25
+ notificationsEnabled: E,
26
+ autoStartBreaks: O
27
+ } },
28
+ refetchQueries: ["GetPomodoroSettings"]
29
+ });
30
+ }, [
31
+ d,
32
+ v,
33
+ b,
34
+ S,
35
+ w,
36
+ E,
37
+ O,
38
+ h
39
+ ]);
40
+ return p ? /* @__PURE__ */ l(t, {
41
+ title: "Pomodoro Settings",
42
+ description: "Configure your Pomodoro timer preferences",
43
+ children: /* @__PURE__ */ l(n, { variant: "detail" })
44
+ }) : m ? /* @__PURE__ */ l(t, {
45
+ title: "Pomodoro Settings",
46
+ description: "Configure your Pomodoro timer preferences",
47
+ children: /* @__PURE__ */ l("div", {
48
+ className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-600 dark:border-red-800 dark:bg-red-900/20 dark:text-red-400",
49
+ children: "Failed to load settings. Please try again later."
50
+ })
51
+ }) : /* @__PURE__ */ l(t, {
52
+ title: "Pomodoro Settings",
53
+ description: "Configure your Pomodoro timer preferences",
54
+ children: /* @__PURE__ */ u("div", {
55
+ className: "mx-auto max-w-2xl space-y-6",
56
+ children: [
57
+ /* @__PURE__ */ u("div", {
58
+ className: "rounded-xl border border-border bg-card p-6",
59
+ children: [/* @__PURE__ */ u("h3", {
60
+ className: "mb-4 flex items-center gap-2 text-sm font-semibold text-foreground",
61
+ children: [/* @__PURE__ */ l(c, { className: "h-4 w-4" }), "Timer Durations"]
62
+ }), /* @__PURE__ */ u("div", {
63
+ className: "space-y-4",
64
+ children: [
65
+ /* @__PURE__ */ u("div", {
66
+ className: "flex items-center justify-between",
67
+ children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
68
+ className: "text-sm font-medium text-foreground",
69
+ children: "Focus Duration"
70
+ }), /* @__PURE__ */ l("p", {
71
+ className: "text-xs text-muted-foreground",
72
+ children: "Length of each focus session"
73
+ })] }), /* @__PURE__ */ l("input", {
74
+ type: "number",
75
+ value: v,
76
+ onChange: (e) => y(Number(e.target.value)),
77
+ className: "w-20 rounded-md border border-border bg-background px-3 py-1.5 text-sm text-foreground text-right"
78
+ })]
79
+ }),
80
+ /* @__PURE__ */ u("div", {
81
+ className: "flex items-center justify-between",
82
+ children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
83
+ className: "text-sm font-medium text-foreground",
84
+ children: "Short Break"
85
+ }), /* @__PURE__ */ l("p", {
86
+ className: "text-xs text-muted-foreground",
87
+ children: "Break between focus sessions"
88
+ })] }), /* @__PURE__ */ l("input", {
89
+ type: "number",
90
+ value: b,
91
+ onChange: (e) => x(Number(e.target.value)),
92
+ className: "w-20 rounded-md border border-border bg-background px-3 py-1.5 text-sm text-foreground text-right"
93
+ })]
94
+ }),
95
+ /* @__PURE__ */ u("div", {
96
+ className: "flex items-center justify-between",
97
+ children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
98
+ className: "text-sm font-medium text-foreground",
99
+ children: "Long Break"
100
+ }), /* @__PURE__ */ l("p", {
101
+ className: "text-xs text-muted-foreground",
102
+ children: "After every 4 focus sessions"
103
+ })] }), /* @__PURE__ */ l("input", {
104
+ type: "number",
105
+ value: S,
106
+ onChange: (e) => C(Number(e.target.value)),
107
+ className: "w-20 rounded-md border border-border bg-background px-3 py-1.5 text-sm text-foreground text-right"
108
+ })]
109
+ })
110
+ ]
111
+ })]
112
+ }),
113
+ /* @__PURE__ */ u("div", {
114
+ className: "rounded-xl border border-border bg-card p-6",
115
+ children: [/* @__PURE__ */ l("h3", {
116
+ className: "mb-4 text-sm font-semibold text-foreground",
117
+ children: "Notifications"
118
+ }), /* @__PURE__ */ u("div", {
119
+ className: "space-y-3",
120
+ children: [
121
+ /* @__PURE__ */ u("label", {
122
+ className: "flex items-center justify-between",
123
+ children: [/* @__PURE__ */ l("span", {
124
+ className: "text-sm text-foreground",
125
+ children: "Sound alerts"
126
+ }), /* @__PURE__ */ l("input", {
127
+ type: "checkbox",
128
+ checked: w,
129
+ onChange: (e) => T(e.target.checked),
130
+ className: "h-4 w-4 rounded border-border"
131
+ })]
132
+ }),
133
+ /* @__PURE__ */ u("label", {
134
+ className: "flex items-center justify-between",
135
+ children: [/* @__PURE__ */ l("span", {
136
+ className: "text-sm text-foreground",
137
+ children: "Desktop notifications"
138
+ }), /* @__PURE__ */ l("input", {
139
+ type: "checkbox",
140
+ checked: E,
141
+ onChange: (e) => D(e.target.checked),
142
+ className: "h-4 w-4 rounded border-border"
143
+ })]
144
+ }),
145
+ /* @__PURE__ */ u("label", {
146
+ className: "flex items-center justify-between",
147
+ children: [/* @__PURE__ */ l("span", {
148
+ className: "text-sm text-foreground",
149
+ children: "Auto-start breaks"
150
+ }), /* @__PURE__ */ l("input", {
151
+ type: "checkbox",
152
+ checked: O,
153
+ onChange: (e) => k(e.target.checked),
154
+ className: "h-4 w-4 rounded border-border"
155
+ })]
156
+ })
157
+ ]
158
+ })]
159
+ }),
160
+ /* @__PURE__ */ l("div", {
161
+ className: "flex justify-end",
162
+ children: /* @__PURE__ */ l("button", {
163
+ onClick: A,
164
+ disabled: g,
165
+ className: "rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50",
166
+ children: g ? "Saving..." : "Save Settings"
167
+ })
168
+ })
169
+ ]
170
+ })
171
+ });
172
+ }
173
+ //#endregion
174
+ export { d as PomodoroSettingsPage };
175
+
176
+ //# sourceMappingURL=PomodoroSettingsPage.js.map