@churchapps/apphelper 0.4.12 → 0.4.18

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 (608) hide show
  1. package/dist/components/DisplayBox.js +12 -18
  2. package/dist/components/DisplayBox.js.map +1 -1
  3. package/dist/components/ErrorMessages.js +9 -46
  4. package/dist/components/ErrorMessages.js.map +1 -1
  5. package/dist/components/ExportLink.d.ts.map +1 -1
  6. package/dist/components/ExportLink.js +8 -10
  7. package/dist/components/ExportLink.js.map +1 -1
  8. package/dist/components/FloatingSupport.js +7 -14
  9. package/dist/components/FloatingSupport.js.map +1 -1
  10. package/dist/components/FormCardPayment.d.ts.map +1 -1
  11. package/dist/components/FormCardPayment.js +28 -64
  12. package/dist/components/FormCardPayment.js.map +1 -1
  13. package/dist/components/FormSubmissionEdit.d.ts.map +1 -1
  14. package/dist/components/FormSubmissionEdit.js +28 -66
  15. package/dist/components/FormSubmissionEdit.js.map +1 -1
  16. package/dist/components/HelpIcon.js +3 -7
  17. package/dist/components/HelpIcon.js.map +1 -1
  18. package/dist/components/ImageEditor.d.ts.map +1 -1
  19. package/dist/components/ImageEditor.js +13 -19
  20. package/dist/components/ImageEditor.js.map +1 -1
  21. package/dist/components/InputBox.d.ts.map +1 -1
  22. package/dist/components/InputBox.js +13 -15
  23. package/dist/components/InputBox.js.map +1 -1
  24. package/dist/components/Loading.d.ts +0 -1
  25. package/dist/components/Loading.d.ts.map +1 -1
  26. package/dist/components/Loading.js +52 -12
  27. package/dist/components/Loading.js.map +1 -1
  28. package/dist/components/PageHeader.d.ts +15 -0
  29. package/dist/components/PageHeader.d.ts.map +1 -0
  30. package/dist/components/PageHeader.js +41 -0
  31. package/dist/components/PageHeader.js.map +1 -0
  32. package/dist/components/PersonAvatar.d.ts +12 -0
  33. package/dist/components/PersonAvatar.d.ts.map +1 -0
  34. package/dist/components/PersonAvatar.js +55 -0
  35. package/dist/components/PersonAvatar.js.map +1 -0
  36. package/dist/components/QuestionEdit.js +20 -26
  37. package/dist/components/QuestionEdit.js.map +1 -1
  38. package/dist/components/SmallButton.js +9 -15
  39. package/dist/components/SmallButton.js.map +1 -1
  40. package/dist/components/SupportModal.d.ts.map +1 -1
  41. package/dist/components/SupportModal.js +5 -9
  42. package/dist/components/SupportModal.js.map +1 -1
  43. package/dist/components/TabPanel.js +5 -9
  44. package/dist/components/TabPanel.js.map +1 -1
  45. package/dist/components/header/Banner.js +3 -7
  46. package/dist/components/header/Banner.js.map +1 -1
  47. package/dist/components/header/PrimaryMenu.d.ts.map +1 -1
  48. package/dist/components/header/PrimaryMenu.js +30 -30
  49. package/dist/components/header/PrimaryMenu.js.map +1 -1
  50. package/dist/components/header/SecondaryMenu.js +6 -10
  51. package/dist/components/header/SecondaryMenu.js.map +1 -1
  52. package/dist/components/header/SecondaryMenuAlt.js +8 -15
  53. package/dist/components/header/SecondaryMenuAlt.js.map +1 -1
  54. package/dist/components/header/SiteHeader.d.ts +2 -1
  55. package/dist/components/header/SiteHeader.d.ts.map +1 -1
  56. package/dist/components/header/SiteHeader.js +109 -17
  57. package/dist/components/header/SiteHeader.js.map +1 -1
  58. package/dist/components/header/SupportDrawer.js +14 -18
  59. package/dist/components/header/SupportDrawer.js.map +1 -1
  60. package/dist/components/header/index.js +2 -7
  61. package/dist/components/header/index.js.map +1 -1
  62. package/dist/components/index.d.ts +2 -4
  63. package/dist/components/index.d.ts.map +1 -1
  64. package/dist/components/index.js +18 -52
  65. package/dist/components/index.js.map +1 -1
  66. package/dist/components/notes/AddNote.d.ts.map +1 -1
  67. package/dist/components/notes/AddNote.js +56 -54
  68. package/dist/components/notes/AddNote.js.map +1 -1
  69. package/dist/components/notes/Note.d.ts.map +1 -1
  70. package/dist/components/notes/Note.js +11 -15
  71. package/dist/components/notes/Note.js.map +1 -1
  72. package/dist/components/notes/Notes.d.ts.map +1 -1
  73. package/dist/components/notes/Notes.js +134 -40
  74. package/dist/components/notes/Notes.js.map +1 -1
  75. package/dist/components/notes/index.js +3 -9
  76. package/dist/components/notes/index.js.map +1 -1
  77. package/dist/components/wrapper/AppList.d.ts.map +1 -1
  78. package/dist/components/wrapper/AppList.js +7 -13
  79. package/dist/components/wrapper/AppList.js.map +1 -1
  80. package/dist/components/wrapper/ChurchList.d.ts.map +1 -1
  81. package/dist/components/wrapper/ChurchList.js +55 -21
  82. package/dist/components/wrapper/ChurchList.js.map +1 -1
  83. package/dist/components/wrapper/NavItem.js +11 -15
  84. package/dist/components/wrapper/NavItem.js.map +1 -1
  85. package/dist/components/wrapper/NewPrivateMessage.d.ts.map +1 -1
  86. package/dist/components/wrapper/NewPrivateMessage.js +38 -68
  87. package/dist/components/wrapper/NewPrivateMessage.js.map +1 -1
  88. package/dist/components/wrapper/Notifications.d.ts.map +1 -1
  89. package/dist/components/wrapper/Notifications.js +53 -57
  90. package/dist/components/wrapper/Notifications.js.map +1 -1
  91. package/dist/components/wrapper/PrivateMessageDetails.d.ts +1 -0
  92. package/dist/components/wrapper/PrivateMessageDetails.d.ts.map +1 -1
  93. package/dist/components/wrapper/PrivateMessageDetails.js +54 -9
  94. package/dist/components/wrapper/PrivateMessageDetails.js.map +1 -1
  95. package/dist/components/wrapper/PrivateMessages.d.ts.map +1 -1
  96. package/dist/components/wrapper/PrivateMessages.js +363 -78
  97. package/dist/components/wrapper/PrivateMessages.js.map +1 -1
  98. package/dist/components/wrapper/UserMenu.d.ts.map +1 -1
  99. package/dist/components/wrapper/UserMenu.js +182 -54
  100. package/dist/components/wrapper/UserMenu.js.map +1 -1
  101. package/dist/components/wrapper/index.d.ts +2 -1
  102. package/dist/components/wrapper/index.d.ts.map +1 -1
  103. package/dist/components/wrapper/index.js +8 -17
  104. package/dist/components/wrapper/index.js.map +1 -1
  105. package/dist/helpers/AnalyticsHelper.d.ts.map +1 -1
  106. package/dist/helpers/AnalyticsHelper.js +11 -19
  107. package/dist/helpers/AnalyticsHelper.js.map +1 -1
  108. package/dist/helpers/AppearanceHelper.js +1 -5
  109. package/dist/helpers/AppearanceHelper.js.map +1 -1
  110. package/dist/helpers/ArrayHelper.d.ts.map +1 -1
  111. package/dist/helpers/ArrayHelper.js +3 -8
  112. package/dist/helpers/ArrayHelper.js.map +1 -1
  113. package/dist/helpers/CurrencyHelper.js +1 -5
  114. package/dist/helpers/CurrencyHelper.js.map +1 -1
  115. package/dist/helpers/DateHelper.js +3 -7
  116. package/dist/helpers/DateHelper.js.map +1 -1
  117. package/dist/helpers/ErrorHelper.js +3 -7
  118. package/dist/helpers/ErrorHelper.js.map +1 -1
  119. package/dist/helpers/EventHelper.d.ts.map +1 -1
  120. package/dist/helpers/EventHelper.js +4 -11
  121. package/dist/helpers/EventHelper.js.map +1 -1
  122. package/dist/helpers/FileHelper.js +3 -10
  123. package/dist/helpers/FileHelper.js.map +1 -1
  124. package/dist/helpers/Locale.d.ts +1 -1
  125. package/dist/helpers/Locale.d.ts.map +1 -1
  126. package/dist/helpers/Locale.js +18 -20
  127. package/dist/helpers/Locale.js.map +1 -1
  128. package/dist/helpers/NotificationService.d.ts +56 -0
  129. package/dist/helpers/NotificationService.d.ts.map +1 -0
  130. package/dist/helpers/NotificationService.js +176 -0
  131. package/dist/helpers/NotificationService.js.map +1 -0
  132. package/dist/helpers/PersonHelper.d.ts.map +1 -1
  133. package/dist/helpers/PersonHelper.js +5 -9
  134. package/dist/helpers/PersonHelper.js.map +1 -1
  135. package/dist/helpers/SlugHelper.js +4 -11
  136. package/dist/helpers/SlugHelper.js.map +1 -1
  137. package/dist/helpers/SocketHelper.d.ts +12 -0
  138. package/dist/helpers/SocketHelper.d.ts.map +1 -1
  139. package/dist/helpers/SocketHelper.js +163 -44
  140. package/dist/helpers/SocketHelper.js.map +1 -1
  141. package/dist/helpers/UniqueIdHelper.js +1 -5
  142. package/dist/helpers/UniqueIdHelper.js.map +1 -1
  143. package/dist/helpers/UserHelper.js +8 -12
  144. package/dist/helpers/UserHelper.js.map +1 -1
  145. package/dist/helpers/createEmotionCache.js +3 -9
  146. package/dist/helpers/createEmotionCache.js.map +1 -1
  147. package/dist/helpers/index.d.ts +7 -16
  148. package/dist/helpers/index.d.ts.map +1 -1
  149. package/dist/helpers/index.js +10 -54
  150. package/dist/helpers/index.js.map +1 -1
  151. package/dist/hooks/index.d.ts +2 -0
  152. package/dist/hooks/index.d.ts.map +1 -1
  153. package/dist/hooks/index.js +2 -5
  154. package/dist/hooks/index.js.map +1 -1
  155. package/dist/hooks/useMountedState.js +5 -9
  156. package/dist/hooks/useMountedState.js.map +1 -1
  157. package/dist/hooks/useNotifications.d.ts +30 -0
  158. package/dist/hooks/useNotifications.d.ts.map +1 -0
  159. package/dist/hooks/useNotifications.js +79 -0
  160. package/dist/hooks/useNotifications.js.map +1 -0
  161. package/dist/index.d.ts +0 -3
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +3 -22
  164. package/dist/index.js.map +1 -1
  165. package/dist/public/css/styles.css +6 -2
  166. package/package.json +6 -28
  167. package/public/css/styles.css +6 -2
  168. package/src/components/ExportLink.tsx +12 -3
  169. package/src/components/FormCardPayment.tsx +4 -3
  170. package/src/components/FormSubmissionEdit.tsx +5 -6
  171. package/src/components/ImageEditor.tsx +15 -12
  172. package/src/components/InputBox.tsx +2 -1
  173. package/src/components/Loading.tsx +47 -1
  174. package/src/components/PageHeader.tsx +107 -0
  175. package/src/components/PersonAvatar.tsx +78 -0
  176. package/src/components/SupportModal.tsx +8 -3
  177. package/src/components/header/PrimaryMenu.tsx +85 -42
  178. package/src/components/header/SiteHeader.tsx +131 -8
  179. package/src/components/header/SupportDrawer.tsx +1 -1
  180. package/src/components/index.tsx +2 -5
  181. package/src/components/notes/AddNote.tsx +105 -19
  182. package/src/components/notes/Note.tsx +43 -22
  183. package/src/components/notes/Notes.tsx +160 -21
  184. package/src/components/wrapper/AppList.tsx +1 -4
  185. package/src/components/wrapper/ChurchList.tsx +45 -5
  186. package/src/components/wrapper/NewPrivateMessage.tsx +181 -44
  187. package/src/components/wrapper/Notifications.tsx +164 -29
  188. package/src/components/wrapper/PrivateMessageDetails.tsx +100 -13
  189. package/src/components/wrapper/PrivateMessages.tsx +539 -56
  190. package/src/components/wrapper/UserMenu.tsx +218 -38
  191. package/src/components/wrapper/index.tsx +3 -2
  192. package/src/helpers/AnalyticsHelper.ts +1 -2
  193. package/src/helpers/ArrayHelper.ts +0 -1
  194. package/src/helpers/ErrorHelper.ts +1 -1
  195. package/src/helpers/EventHelper.ts +0 -3
  196. package/src/helpers/Locale.ts +8 -3
  197. package/src/helpers/NotificationService.ts +211 -0
  198. package/src/helpers/PersonHelper.ts +1 -2
  199. package/src/helpers/SocketHelper.ts +184 -39
  200. package/src/helpers/UserHelper.ts +2 -2
  201. package/src/helpers/index.ts +46 -16
  202. package/src/hooks/index.ts +2 -0
  203. package/src/hooks/useNotifications.ts +94 -0
  204. package/src/index.ts +1 -4
  205. package/tsconfig.json +2 -2
  206. package/.eslintignore +0 -4
  207. package/.github/FUNDING.yml +0 -1
  208. package/.vscode/settings.json +0 -6
  209. package/CHUMS_COMPONENT_EXTRACTION_CANDIDATES.md +0 -210
  210. package/CLAUDE.md +0 -111
  211. package/COMPONENT_USAGE_REPORT.md +0 -322
  212. package/LICENSE +0 -21
  213. package/README.md +0 -24
  214. package/b1app-specific-components.md +0 -146
  215. package/component-usage-analysis.md +0 -169
  216. package/dist/components/markdownEditor/Editor.d.ts +0 -13
  217. package/dist/components/markdownEditor/Editor.d.ts.map +0 -1
  218. package/dist/components/markdownEditor/Editor.js +0 -92
  219. package/dist/components/markdownEditor/Editor.js.map +0 -1
  220. package/dist/components/markdownEditor/IconNamesList.d.ts +0 -3
  221. package/dist/components/markdownEditor/IconNamesList.d.ts.map +0 -1
  222. package/dist/components/markdownEditor/IconNamesList.js +0 -16
  223. package/dist/components/markdownEditor/IconNamesList.js.map +0 -1
  224. package/dist/components/markdownEditor/MarkdownEditor.d.ts +0 -10
  225. package/dist/components/markdownEditor/MarkdownEditor.d.ts.map +0 -1
  226. package/dist/components/markdownEditor/MarkdownEditor.js +0 -45
  227. package/dist/components/markdownEditor/MarkdownEditor.js.map +0 -1
  228. package/dist/components/markdownEditor/MarkdownModal.d.ts +0 -9
  229. package/dist/components/markdownEditor/MarkdownModal.d.ts.map +0 -1
  230. package/dist/components/markdownEditor/MarkdownModal.js +0 -24
  231. package/dist/components/markdownEditor/MarkdownModal.js.map +0 -1
  232. package/dist/components/markdownEditor/MarkdownPreview.d.ts +0 -9
  233. package/dist/components/markdownEditor/MarkdownPreview.d.ts.map +0 -1
  234. package/dist/components/markdownEditor/MarkdownPreview.js +0 -45
  235. package/dist/components/markdownEditor/MarkdownPreview.js.map +0 -1
  236. package/dist/components/markdownEditor/MarkdownPreviewLight.d.ts +0 -7
  237. package/dist/components/markdownEditor/MarkdownPreviewLight.d.ts.map +0 -1
  238. package/dist/components/markdownEditor/MarkdownPreviewLight.js +0 -53
  239. package/dist/components/markdownEditor/MarkdownPreviewLight.js.map +0 -1
  240. package/dist/components/markdownEditor/editor.css +0 -787
  241. package/dist/components/markdownEditor/images/emoji/1F600.png +0 -0
  242. package/dist/components/markdownEditor/images/emoji/1F641.png +0 -0
  243. package/dist/components/markdownEditor/images/emoji/1F642.png +0 -0
  244. package/dist/components/markdownEditor/images/emoji/2764.png +0 -0
  245. package/dist/components/markdownEditor/images/icons/arrow-clockwise.svg +0 -4
  246. package/dist/components/markdownEditor/images/icons/arrow-counterclockwise.svg +0 -4
  247. package/dist/components/markdownEditor/images/icons/chat-square-quote.svg +0 -4
  248. package/dist/components/markdownEditor/images/icons/chevron-down.svg +0 -3
  249. package/dist/components/markdownEditor/images/icons/code.svg +0 -3
  250. package/dist/components/markdownEditor/images/icons/journal-code.svg +0 -5
  251. package/dist/components/markdownEditor/images/icons/journal-text.svg +0 -5
  252. package/dist/components/markdownEditor/images/icons/justify.svg +0 -3
  253. package/dist/components/markdownEditor/images/icons/link.svg +0 -4
  254. package/dist/components/markdownEditor/images/icons/list-ol.svg +0 -4
  255. package/dist/components/markdownEditor/images/icons/list-ul.svg +0 -3
  256. package/dist/components/markdownEditor/images/icons/pencil-fill.svg +0 -3
  257. package/dist/components/markdownEditor/images/icons/text-center.svg +0 -3
  258. package/dist/components/markdownEditor/images/icons/text-left.svg +0 -3
  259. package/dist/components/markdownEditor/images/icons/text-paragraph.svg +0 -3
  260. package/dist/components/markdownEditor/images/icons/text-right.svg +0 -3
  261. package/dist/components/markdownEditor/images/icons/type-bold.svg +0 -3
  262. package/dist/components/markdownEditor/images/icons/type-h1.svg +0 -3
  263. package/dist/components/markdownEditor/images/icons/type-h2.svg +0 -3
  264. package/dist/components/markdownEditor/images/icons/type-h3.svg +0 -3
  265. package/dist/components/markdownEditor/images/icons/type-h4.svg +0 -13
  266. package/dist/components/markdownEditor/images/icons/type-italic.svg +0 -3
  267. package/dist/components/markdownEditor/images/icons/type-strikethrough.svg +0 -3
  268. package/dist/components/markdownEditor/images/icons/type-underline.svg +0 -3
  269. package/dist/components/markdownEditor/index.d.ts +0 -4
  270. package/dist/components/markdownEditor/index.d.ts.map +0 -1
  271. package/dist/components/markdownEditor/index.js +0 -10
  272. package/dist/components/markdownEditor/index.js.map +0 -1
  273. package/dist/components/markdownEditor/plugins/AutoLinkPlugin.d.ts +0 -2
  274. package/dist/components/markdownEditor/plugins/AutoLinkPlugin.d.ts.map +0 -1
  275. package/dist/components/markdownEditor/plugins/AutoLinkPlugin.js +0 -31
  276. package/dist/components/markdownEditor/plugins/AutoLinkPlugin.js.map +0 -1
  277. package/dist/components/markdownEditor/plugins/ControlledEditorPlugin.d.ts +0 -8
  278. package/dist/components/markdownEditor/plugins/ControlledEditorPlugin.d.ts.map +0 -1
  279. package/dist/components/markdownEditor/plugins/ControlledEditorPlugin.js +0 -19
  280. package/dist/components/markdownEditor/plugins/ControlledEditorPlugin.js.map +0 -1
  281. package/dist/components/markdownEditor/plugins/FloatingTextMenu/FloatingTextFormatToolbarPlugin.d.ts +0 -6
  282. package/dist/components/markdownEditor/plugins/FloatingTextMenu/FloatingTextFormatToolbarPlugin.d.ts.map +0 -1
  283. package/dist/components/markdownEditor/plugins/FloatingTextMenu/FloatingTextFormatToolbarPlugin.js +0 -310
  284. package/dist/components/markdownEditor/plugins/FloatingTextMenu/FloatingTextFormatToolbarPlugin.js.map +0 -1
  285. package/dist/components/markdownEditor/plugins/FloatingTextMenu/getDOMRangeRect.d.ts +0 -2
  286. package/dist/components/markdownEditor/plugins/FloatingTextMenu/getDOMRangeRect.d.ts.map +0 -1
  287. package/dist/components/markdownEditor/plugins/FloatingTextMenu/getDOMRangeRect.js +0 -19
  288. package/dist/components/markdownEditor/plugins/FloatingTextMenu/getDOMRangeRect.js.map +0 -1
  289. package/dist/components/markdownEditor/plugins/FloatingTextMenu/getSelectNode.d.ts +0 -2
  290. package/dist/components/markdownEditor/plugins/FloatingTextMenu/getSelectNode.d.ts.map +0 -1
  291. package/dist/components/markdownEditor/plugins/FloatingTextMenu/getSelectNode.js +0 -21
  292. package/dist/components/markdownEditor/plugins/FloatingTextMenu/getSelectNode.js.map +0 -1
  293. package/dist/components/markdownEditor/plugins/FloatingTextMenu/setFloatingElemPosition.d.ts +0 -2
  294. package/dist/components/markdownEditor/plugins/FloatingTextMenu/setFloatingElemPosition.d.ts.map +0 -1
  295. package/dist/components/markdownEditor/plugins/FloatingTextMenu/setFloatingElemPosition.js +0 -29
  296. package/dist/components/markdownEditor/plugins/FloatingTextMenu/setFloatingElemPosition.js.map +0 -1
  297. package/dist/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.d.ts +0 -2
  298. package/dist/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.d.ts.map +0 -1
  299. package/dist/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.js +0 -45
  300. package/dist/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.js.map +0 -1
  301. package/dist/components/markdownEditor/plugins/MarkdownTransformers.d.ts +0 -12
  302. package/dist/components/markdownEditor/plugins/MarkdownTransformers.d.ts.map +0 -1
  303. package/dist/components/markdownEditor/plugins/MarkdownTransformers.js +0 -85
  304. package/dist/components/markdownEditor/plugins/MarkdownTransformers.js.map +0 -1
  305. package/dist/components/markdownEditor/plugins/ReadOnlyPlugin.d.ts +0 -6
  306. package/dist/components/markdownEditor/plugins/ReadOnlyPlugin.d.ts.map +0 -1
  307. package/dist/components/markdownEditor/plugins/ReadOnlyPlugin.js +0 -12
  308. package/dist/components/markdownEditor/plugins/ReadOnlyPlugin.js.map +0 -1
  309. package/dist/components/markdownEditor/plugins/ToolbarPlugin.d.ts +0 -7
  310. package/dist/components/markdownEditor/plugins/ToolbarPlugin.d.ts.map +0 -1
  311. package/dist/components/markdownEditor/plugins/ToolbarPlugin.js +0 -282
  312. package/dist/components/markdownEditor/plugins/ToolbarPlugin.js.map +0 -1
  313. package/dist/components/markdownEditor/plugins/customLink/CustomLinkNode.d.ts +0 -27
  314. package/dist/components/markdownEditor/plugins/customLink/CustomLinkNode.d.ts.map +0 -1
  315. package/dist/components/markdownEditor/plugins/customLink/CustomLinkNode.js +0 -158
  316. package/dist/components/markdownEditor/plugins/customLink/CustomLinkNode.js.map +0 -1
  317. package/dist/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.d.ts +0 -4
  318. package/dist/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.d.ts.map +0 -1
  319. package/dist/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.js +0 -21
  320. package/dist/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.js.map +0 -1
  321. package/dist/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.d.ts +0 -3
  322. package/dist/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.d.ts.map +0 -1
  323. package/dist/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.js +0 -71
  324. package/dist/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.js.map +0 -1
  325. package/dist/components/markdownEditor/plugins/customLink/FloatingLinkEditor.d.ts +0 -5
  326. package/dist/components/markdownEditor/plugins/customLink/FloatingLinkEditor.d.ts.map +0 -1
  327. package/dist/components/markdownEditor/plugins/customLink/FloatingLinkEditor.js +0 -190
  328. package/dist/components/markdownEditor/plugins/customLink/FloatingLinkEditor.js.map +0 -1
  329. package/dist/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.d.ts +0 -11
  330. package/dist/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.d.ts.map +0 -1
  331. package/dist/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.js +0 -3
  332. package/dist/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.js.map +0 -1
  333. package/dist/components/markdownEditor/plugins/emoji/EmojiNode.d.ts +0 -24
  334. package/dist/components/markdownEditor/plugins/emoji/EmojiNode.d.ts.map +0 -1
  335. package/dist/components/markdownEditor/plugins/emoji/EmojiNode.js +0 -66
  336. package/dist/components/markdownEditor/plugins/emoji/EmojiNode.js.map +0 -1
  337. package/dist/components/markdownEditor/plugins/emoji/EmojiNodeTransform.d.ts +0 -4
  338. package/dist/components/markdownEditor/plugins/emoji/EmojiNodeTransform.d.ts.map +0 -1
  339. package/dist/components/markdownEditor/plugins/emoji/EmojiNodeTransform.js +0 -35
  340. package/dist/components/markdownEditor/plugins/emoji/EmojiNodeTransform.js.map +0 -1
  341. package/dist/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.d.ts +0 -9
  342. package/dist/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.d.ts.map +0 -1
  343. package/dist/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.js +0 -103
  344. package/dist/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.js.map +0 -1
  345. package/dist/components/markdownEditor/plugins/emoji/EmojisPlugin.d.ts +0 -10
  346. package/dist/components/markdownEditor/plugins/emoji/EmojisPlugin.d.ts.map +0 -1
  347. package/dist/components/markdownEditor/plugins/emoji/EmojisPlugin.js +0 -59
  348. package/dist/components/markdownEditor/plugins/emoji/EmojisPlugin.js.map +0 -1
  349. package/dist/components/markdownEditor/plugins/index.d.ts +0 -7
  350. package/dist/components/markdownEditor/plugins/index.d.ts.map +0 -1
  351. package/dist/components/markdownEditor/plugins/index.js +0 -16
  352. package/dist/components/markdownEditor/plugins/index.js.map +0 -1
  353. package/dist/components/markdownEditor/theme.d.ts +0 -66
  354. package/dist/components/markdownEditor/theme.d.ts.map +0 -1
  355. package/dist/components/markdownEditor/theme.js +0 -69
  356. package/dist/components/markdownEditor/theme.js.map +0 -1
  357. package/dist/components/reporting/ChartReport.d.ts +0 -8
  358. package/dist/components/reporting/ChartReport.d.ts.map +0 -1
  359. package/dist/components/reporting/ChartReport.js +0 -81
  360. package/dist/components/reporting/ChartReport.js.map +0 -1
  361. package/dist/components/reporting/ReportFilter.d.ts +0 -9
  362. package/dist/components/reporting/ReportFilter.d.ts.map +0 -1
  363. package/dist/components/reporting/ReportFilter.js +0 -52
  364. package/dist/components/reporting/ReportFilter.js.map +0 -1
  365. package/dist/components/reporting/ReportFilterField.d.ts +0 -9
  366. package/dist/components/reporting/ReportFilterField.d.ts.map +0 -1
  367. package/dist/components/reporting/ReportFilterField.js +0 -156
  368. package/dist/components/reporting/ReportFilterField.js.map +0 -1
  369. package/dist/components/reporting/ReportOutput.d.ts +0 -8
  370. package/dist/components/reporting/ReportOutput.d.ts.map +0 -1
  371. package/dist/components/reporting/ReportOutput.js +0 -177
  372. package/dist/components/reporting/ReportOutput.js.map +0 -1
  373. package/dist/components/reporting/ReportWithFilter.d.ts +0 -7
  374. package/dist/components/reporting/ReportWithFilter.d.ts.map +0 -1
  375. package/dist/components/reporting/ReportWithFilter.js +0 -65
  376. package/dist/components/reporting/ReportWithFilter.js.map +0 -1
  377. package/dist/components/reporting/TableReport.d.ts +0 -8
  378. package/dist/components/reporting/TableReport.d.ts.map +0 -1
  379. package/dist/components/reporting/TableReport.js +0 -30
  380. package/dist/components/reporting/TableReport.js.map +0 -1
  381. package/dist/components/reporting/TreeReport.d.ts +0 -8
  382. package/dist/components/reporting/TreeReport.d.ts.map +0 -1
  383. package/dist/components/reporting/TreeReport.js +0 -89
  384. package/dist/components/reporting/TreeReport.js.map +0 -1
  385. package/dist/components/reporting/index.d.ts +0 -5
  386. package/dist/components/reporting/index.d.ts.map +0 -1
  387. package/dist/components/reporting/index.js +0 -12
  388. package/dist/components/reporting/index.js.map +0 -1
  389. package/dist/components/wrapper/Drawers.d.ts +0 -5
  390. package/dist/components/wrapper/Drawers.d.ts.map +0 -1
  391. package/dist/components/wrapper/Drawers.js +0 -54
  392. package/dist/components/wrapper/Drawers.js.map +0 -1
  393. package/dist/components/wrapper/SiteWrapper.d.ts +0 -15
  394. package/dist/components/wrapper/SiteWrapper.d.ts.map +0 -1
  395. package/dist/components/wrapper/SiteWrapper.js +0 -60
  396. package/dist/components/wrapper/SiteWrapper.js.map +0 -1
  397. package/dist/components/wrapper/TabPanel.d.ts +0 -9
  398. package/dist/components/wrapper/TabPanel.d.ts.map +0 -1
  399. package/dist/components/wrapper/TabPanel.js +0 -20
  400. package/dist/components/wrapper/TabPanel.js.map +0 -1
  401. package/dist/donationComponents/components/BankForm.d.ts +0 -14
  402. package/dist/donationComponents/components/BankForm.d.ts.map +0 -1
  403. package/dist/donationComponents/components/BankForm.js +0 -126
  404. package/dist/donationComponents/components/BankForm.js.map +0 -1
  405. package/dist/donationComponents/components/CardForm.d.ts +0 -13
  406. package/dist/donationComponents/components/CardForm.d.ts.map +0 -1
  407. package/dist/donationComponents/components/CardForm.js +0 -122
  408. package/dist/donationComponents/components/CardForm.js.map +0 -1
  409. package/dist/donationComponents/components/DonationForm.d.ts +0 -15
  410. package/dist/donationComponents/components/DonationForm.d.ts.map +0 -1
  411. package/dist/donationComponents/components/DonationForm.js +0 -199
  412. package/dist/donationComponents/components/DonationForm.js.map +0 -1
  413. package/dist/donationComponents/components/FundDonation.d.ts +0 -12
  414. package/dist/donationComponents/components/FundDonation.d.ts.map +0 -1
  415. package/dist/donationComponents/components/FundDonation.js +0 -32
  416. package/dist/donationComponents/components/FundDonation.js.map +0 -1
  417. package/dist/donationComponents/components/FundDonations.d.ts +0 -11
  418. package/dist/donationComponents/components/FundDonations.d.ts.map +0 -1
  419. package/dist/donationComponents/components/FundDonations.js +0 -33
  420. package/dist/donationComponents/components/FundDonations.js.map +0 -1
  421. package/dist/donationComponents/components/NonAuthDonation.d.ts +0 -12
  422. package/dist/donationComponents/components/NonAuthDonation.d.ts.map +0 -1
  423. package/dist/donationComponents/components/NonAuthDonation.js +0 -27
  424. package/dist/donationComponents/components/NonAuthDonation.js.map +0 -1
  425. package/dist/donationComponents/components/NonAuthDonationInner.d.ts +0 -12
  426. package/dist/donationComponents/components/NonAuthDonationInner.d.ts.map +0 -1
  427. package/dist/donationComponents/components/NonAuthDonationInner.js +0 -277
  428. package/dist/donationComponents/components/NonAuthDonationInner.js.map +0 -1
  429. package/dist/donationComponents/components/PaymentMethods.d.ts +0 -14
  430. package/dist/donationComponents/components/PaymentMethods.d.ts.map +0 -1
  431. package/dist/donationComponents/components/PaymentMethods.js +0 -84
  432. package/dist/donationComponents/components/PaymentMethods.js.map +0 -1
  433. package/dist/donationComponents/components/RecurringDonations.d.ts +0 -10
  434. package/dist/donationComponents/components/RecurringDonations.d.ts.map +0 -1
  435. package/dist/donationComponents/components/RecurringDonations.js +0 -93
  436. package/dist/donationComponents/components/RecurringDonations.js.map +0 -1
  437. package/dist/donationComponents/components/RecurringDonationsEdit.d.ts +0 -11
  438. package/dist/donationComponents/components/RecurringDonationsEdit.d.ts.map +0 -1
  439. package/dist/donationComponents/components/RecurringDonationsEdit.js +0 -66
  440. package/dist/donationComponents/components/RecurringDonationsEdit.js.map +0 -1
  441. package/dist/donationComponents/components/index.d.ts +0 -11
  442. package/dist/donationComponents/components/index.d.ts.map +0 -1
  443. package/dist/donationComponents/components/index.js +0 -24
  444. package/dist/donationComponents/components/index.js.map +0 -1
  445. package/dist/donationComponents/index.d.ts +0 -3
  446. package/dist/donationComponents/index.d.ts.map +0 -1
  447. package/dist/donationComponents/index.js +0 -21
  448. package/dist/donationComponents/index.js.map +0 -1
  449. package/dist/donationComponents/modals/DonationPreviewModal.d.ts +0 -15
  450. package/dist/donationComponents/modals/DonationPreviewModal.d.ts.map +0 -1
  451. package/dist/donationComponents/modals/DonationPreviewModal.js +0 -33
  452. package/dist/donationComponents/modals/DonationPreviewModal.js.map +0 -1
  453. package/dist/helpers/ApiHelper.d.ts +0 -18
  454. package/dist/helpers/ApiHelper.d.ts.map +0 -1
  455. package/dist/helpers/ApiHelper.js +0 -123
  456. package/dist/helpers/ApiHelper.js.map +0 -1
  457. package/dist/helpers/CommonEnvironmentHelper.d.ts +0 -21
  458. package/dist/helpers/CommonEnvironmentHelper.d.ts.map +0 -1
  459. package/dist/helpers/CommonEnvironmentHelper.js +0 -100
  460. package/dist/helpers/CommonEnvironmentHelper.js.map +0 -1
  461. package/dist/helpers/DonationHelper.d.ts +0 -8
  462. package/dist/helpers/DonationHelper.d.ts.map +0 -1
  463. package/dist/helpers/DonationHelper.js +0 -33
  464. package/dist/helpers/DonationHelper.js.map +0 -1
  465. package/dist/helpers/ReportHelper.d.ts +0 -5
  466. package/dist/helpers/ReportHelper.d.ts.map +0 -1
  467. package/dist/helpers/ReportHelper.js +0 -37
  468. package/dist/helpers/ReportHelper.js.map +0 -1
  469. package/dist/pageComponents/LoginPage.d.ts +0 -25
  470. package/dist/pageComponents/LoginPage.d.ts.map +0 -1
  471. package/dist/pageComponents/LoginPage.js +0 -288
  472. package/dist/pageComponents/LoginPage.js.map +0 -1
  473. package/dist/pageComponents/LogoutPage.d.ts +0 -9
  474. package/dist/pageComponents/LogoutPage.d.ts.map +0 -1
  475. package/dist/pageComponents/LogoutPage.js +0 -37
  476. package/dist/pageComponents/LogoutPage.js.map +0 -1
  477. package/dist/pageComponents/components/Forgot.d.ts +0 -8
  478. package/dist/pageComponents/components/Forgot.d.ts.map +0 -1
  479. package/dist/pageComponents/components/Forgot.js +0 -53
  480. package/dist/pageComponents/components/Forgot.js.map +0 -1
  481. package/dist/pageComponents/components/Login.d.ts +0 -15
  482. package/dist/pageComponents/components/Login.d.ts.map +0 -1
  483. package/dist/pageComponents/components/Login.js +0 -73
  484. package/dist/pageComponents/components/Login.js.map +0 -1
  485. package/dist/pageComponents/components/LoginSetPassword.d.ts +0 -13
  486. package/dist/pageComponents/components/LoginSetPassword.d.ts.map +0 -1
  487. package/dist/pageComponents/components/LoginSetPassword.js +0 -112
  488. package/dist/pageComponents/components/LoginSetPassword.js.map +0 -1
  489. package/dist/pageComponents/components/Register.d.ts +0 -12
  490. package/dist/pageComponents/components/Register.d.ts.map +0 -1
  491. package/dist/pageComponents/components/Register.js +0 -95
  492. package/dist/pageComponents/components/Register.js.map +0 -1
  493. package/dist/pageComponents/components/SelectChurchModal.d.ts +0 -14
  494. package/dist/pageComponents/components/SelectChurchModal.d.ts.map +0 -1
  495. package/dist/pageComponents/components/SelectChurchModal.js +0 -37
  496. package/dist/pageComponents/components/SelectChurchModal.js.map +0 -1
  497. package/dist/pageComponents/components/SelectChurchRegister.d.ts +0 -11
  498. package/dist/pageComponents/components/SelectChurchRegister.d.ts.map +0 -1
  499. package/dist/pageComponents/components/SelectChurchRegister.js +0 -89
  500. package/dist/pageComponents/components/SelectChurchRegister.js.map +0 -1
  501. package/dist/pageComponents/components/SelectChurchSearch.d.ts +0 -10
  502. package/dist/pageComponents/components/SelectChurchSearch.d.ts.map +0 -1
  503. package/dist/pageComponents/components/SelectChurchSearch.js +0 -58
  504. package/dist/pageComponents/components/SelectChurchSearch.js.map +0 -1
  505. package/dist/pageComponents/components/SelectableChurch.d.ts +0 -9
  506. package/dist/pageComponents/components/SelectableChurch.d.ts.map +0 -1
  507. package/dist/pageComponents/components/SelectableChurch.js +0 -18
  508. package/dist/pageComponents/components/SelectableChurch.js.map +0 -1
  509. package/dist/pageComponents/index.d.ts +0 -4
  510. package/dist/pageComponents/index.d.ts.map +0 -1
  511. package/dist/pageComponents/index.js +0 -10
  512. package/dist/pageComponents/index.js.map +0 -1
  513. package/src/components/markdownEditor/Editor.tsx +0 -150
  514. package/src/components/markdownEditor/IconNamesList.ts +0 -14
  515. package/src/components/markdownEditor/MarkdownEditor.tsx +0 -18
  516. package/src/components/markdownEditor/MarkdownModal.tsx +0 -49
  517. package/src/components/markdownEditor/MarkdownPreview.tsx +0 -18
  518. package/src/components/markdownEditor/MarkdownPreviewLight.tsx +0 -53
  519. package/src/components/markdownEditor/editor.css +0 -787
  520. package/src/components/markdownEditor/images/emoji/1F600.png +0 -0
  521. package/src/components/markdownEditor/images/emoji/1F641.png +0 -0
  522. package/src/components/markdownEditor/images/emoji/1F642.png +0 -0
  523. package/src/components/markdownEditor/images/emoji/2764.png +0 -0
  524. package/src/components/markdownEditor/images/icons/arrow-clockwise.svg +0 -4
  525. package/src/components/markdownEditor/images/icons/arrow-counterclockwise.svg +0 -4
  526. package/src/components/markdownEditor/images/icons/chat-square-quote.svg +0 -4
  527. package/src/components/markdownEditor/images/icons/chevron-down.svg +0 -3
  528. package/src/components/markdownEditor/images/icons/code.svg +0 -3
  529. package/src/components/markdownEditor/images/icons/journal-code.svg +0 -5
  530. package/src/components/markdownEditor/images/icons/journal-text.svg +0 -5
  531. package/src/components/markdownEditor/images/icons/justify.svg +0 -3
  532. package/src/components/markdownEditor/images/icons/link.svg +0 -4
  533. package/src/components/markdownEditor/images/icons/list-ol.svg +0 -4
  534. package/src/components/markdownEditor/images/icons/list-ul.svg +0 -3
  535. package/src/components/markdownEditor/images/icons/pencil-fill.svg +0 -3
  536. package/src/components/markdownEditor/images/icons/text-center.svg +0 -3
  537. package/src/components/markdownEditor/images/icons/text-left.svg +0 -3
  538. package/src/components/markdownEditor/images/icons/text-paragraph.svg +0 -3
  539. package/src/components/markdownEditor/images/icons/text-right.svg +0 -3
  540. package/src/components/markdownEditor/images/icons/type-bold.svg +0 -3
  541. package/src/components/markdownEditor/images/icons/type-h1.svg +0 -3
  542. package/src/components/markdownEditor/images/icons/type-h2.svg +0 -3
  543. package/src/components/markdownEditor/images/icons/type-h3.svg +0 -3
  544. package/src/components/markdownEditor/images/icons/type-h4.svg +0 -13
  545. package/src/components/markdownEditor/images/icons/type-italic.svg +0 -3
  546. package/src/components/markdownEditor/images/icons/type-strikethrough.svg +0 -3
  547. package/src/components/markdownEditor/images/icons/type-underline.svg +0 -3
  548. package/src/components/markdownEditor/index.ts +0 -3
  549. package/src/components/markdownEditor/plugins/AutoLinkPlugin.tsx +0 -35
  550. package/src/components/markdownEditor/plugins/ControlledEditorPlugin.tsx +0 -24
  551. package/src/components/markdownEditor/plugins/FloatingTextMenu/FloatingTextFormatToolbarPlugin.tsx +0 -445
  552. package/src/components/markdownEditor/plugins/FloatingTextMenu/getDOMRangeRect.tsx +0 -17
  553. package/src/components/markdownEditor/plugins/FloatingTextMenu/getSelectNode.tsx +0 -17
  554. package/src/components/markdownEditor/plugins/FloatingTextMenu/setFloatingElemPosition.tsx +0 -33
  555. package/src/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.tsx +0 -68
  556. package/src/components/markdownEditor/plugins/MarkdownTransformers.ts +0 -106
  557. package/src/components/markdownEditor/plugins/ReadOnlyPlugin.tsx +0 -15
  558. package/src/components/markdownEditor/plugins/ToolbarPlugin.tsx +0 -424
  559. package/src/components/markdownEditor/plugins/customLink/CustomLinkNode.tsx +0 -224
  560. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.tsx +0 -32
  561. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.tsx +0 -102
  562. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.tsx +0 -270
  563. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.ts +0 -11
  564. package/src/components/markdownEditor/plugins/emoji/EmojiNode.tsx +0 -95
  565. package/src/components/markdownEditor/plugins/emoji/EmojiNodeTransform.ts +0 -41
  566. package/src/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.tsx +0 -152
  567. package/src/components/markdownEditor/plugins/emoji/EmojisPlugin.tsx +0 -70
  568. package/src/components/markdownEditor/plugins/index.ts +0 -6
  569. package/src/components/markdownEditor/theme.ts +0 -65
  570. package/src/components/reporting/ChartReport.tsx +0 -89
  571. package/src/components/reporting/ReportFilter.tsx +0 -56
  572. package/src/components/reporting/ReportFilterField.tsx +0 -163
  573. package/src/components/reporting/ReportOutput.tsx +0 -168
  574. package/src/components/reporting/ReportWithFilter.tsx +0 -72
  575. package/src/components/reporting/TableReport.tsx +0 -44
  576. package/src/components/reporting/TreeReport.tsx +0 -103
  577. package/src/components/reporting/index.ts +0 -4
  578. package/src/components/wrapper/Drawers.tsx +0 -62
  579. package/src/components/wrapper/SiteWrapper.tsx +0 -99
  580. package/src/components/wrapper/TabPanel.tsx +0 -32
  581. package/src/donationComponents/components/BankForm.tsx +0 -163
  582. package/src/donationComponents/components/CardForm.tsx +0 -104
  583. package/src/donationComponents/components/DonationForm.tsx +0 -260
  584. package/src/donationComponents/components/FundDonation.tsx +0 -59
  585. package/src/donationComponents/components/FundDonations.tsx +0 -44
  586. package/src/donationComponents/components/NonAuthDonation.tsx +0 -34
  587. package/src/donationComponents/components/NonAuthDonationInner.tsx +0 -300
  588. package/src/donationComponents/components/PaymentMethods.tsx +0 -133
  589. package/src/donationComponents/components/RecurringDonations.tsx +0 -117
  590. package/src/donationComponents/components/RecurringDonationsEdit.tsx +0 -96
  591. package/src/donationComponents/components/index.tsx +0 -10
  592. package/src/donationComponents/index.ts +0 -2
  593. package/src/donationComponents/modals/DonationPreviewModal.tsx +0 -70
  594. package/src/helpers/ApiHelper.ts +0 -127
  595. package/src/helpers/CommonEnvironmentHelper.ts +0 -98
  596. package/src/helpers/DonationHelper.ts +0 -26
  597. package/src/helpers/ReportHelper.ts +0 -34
  598. package/src/pageComponents/LoginPage.tsx +0 -284
  599. package/src/pageComponents/LogoutPage.tsx +0 -43
  600. package/src/pageComponents/components/Forgot.tsx +0 -81
  601. package/src/pageComponents/components/Login.tsx +0 -62
  602. package/src/pageComponents/components/LoginSetPassword.tsx +0 -98
  603. package/src/pageComponents/components/Register.tsx +0 -103
  604. package/src/pageComponents/components/SelectChurchModal.tsx +0 -58
  605. package/src/pageComponents/components/SelectChurchRegister.tsx +0 -87
  606. package/src/pageComponents/components/SelectChurchSearch.tsx +0 -71
  607. package/src/pageComponents/components/SelectableChurch.tsx +0 -40
  608. package/src/pageComponents/index.ts +0 -3
@@ -1,9 +1,25 @@
1
1
  "use client";
2
2
 
3
- import React, { useState } from "react";
4
- import { ApiHelper } from "../../helpers/ApiHelper";
5
- import { Box, Stack } from "@mui/material";
3
+ import React, { useState, useEffect } from "react";
4
+ import { ApiHelper } from "@churchapps/helpers";
5
+ import {
6
+ Box,
7
+ Stack,
8
+ List,
9
+ ListItem,
10
+ ListItemAvatar,
11
+ ListItemText,
12
+ Typography,
13
+ IconButton,
14
+ Chip,
15
+ Divider,
16
+ Paper,
17
+ Skeleton,
18
+ useTheme
19
+ } from "@mui/material";
20
+ import { Add as AddIcon, ChatBubbleOutline as ChatIcon } from "@mui/icons-material";
6
21
  import { SmallButton } from "../SmallButton";
22
+ import { PersonAvatar } from "../PersonAvatar";
7
23
  import { PrivateMessageInterface, UserContextInterface } from "@churchapps/helpers";
8
24
  import { ArrayHelper, DateHelper, PersonHelper } from "../../helpers";
9
25
  import { PrivateMessageDetails } from "./PrivateMessageDetails";
@@ -15,80 +31,547 @@ interface Props {
15
31
  onUpdate: () => void;
16
32
  }
17
33
 
18
- export const PrivateMessages: React.FC<Props> = (props) => {
34
+ // Create a persistent store for PrivateMessages state that survives component re-renders
35
+ const privateMessagesStateStore = {
36
+ selectedMessage: null as PrivateMessageInterface | null,
37
+ inAddMode: false,
38
+ listeners: new Set<() => void>(),
39
+
40
+ setSelectedMessage(value: PrivateMessageInterface | null) {
41
+ this.selectedMessage = value;
42
+ this.listeners.forEach((listener: () => void) => listener());
43
+ },
44
+
45
+ setInAddMode(value: boolean) {
46
+ this.inAddMode = value;
47
+ this.listeners.forEach((listener: () => void) => listener());
48
+ },
49
+
50
+ subscribe(listener: () => void) {
51
+ this.listeners.add(listener);
52
+ return () => this.listeners.delete(listener);
53
+ }
54
+ };
55
+
56
+ export const PrivateMessages: React.FC<Props> = React.memo((props) => {
19
57
 
20
58
  const [privateMessages, setPrivateMessages] = useState<PrivateMessageInterface[]>([]);
21
- const [selectedMessage, setSelectedMessage] = useState<PrivateMessageInterface>(null);
22
- const [inAddMode, setInAddMode] = useState(false);
59
+ const [, forceUpdate] = React.useReducer(x => x + 1, 0);
60
+ const [isLoading, setIsLoading] = useState(true);
61
+
62
+ // Subscribe to state changes
63
+ React.useEffect(() => {
64
+ return privateMessagesStateStore.subscribe(forceUpdate);
65
+ }, [forceUpdate]);
66
+
67
+ const selectedMessage = privateMessagesStateStore.selectedMessage;
68
+ const inAddMode = privateMessagesStateStore.inAddMode;
69
+
23
70
 
24
71
  const loadData = async () => {
25
- console.log("loading data");
72
+ setIsLoading(true);
26
73
  const pms: PrivateMessageInterface[] = await ApiHelper.get("/privateMessages", "MessagingApi");
74
+
75
+ // Store the current selected conversation ID if dialog is open
76
+ const currentSelectedPersonId = selectedMessage ?
77
+ (selectedMessage.fromPersonId === props.context.person.id) ?
78
+ selectedMessage.toPersonId : selectedMessage.fromPersonId
79
+ : null;
80
+
81
+
82
+ // Group messages by person (conversation)
83
+ const conversationMap = new Map<string, PrivateMessageInterface>();
27
84
  const peopleIds: string[] = [];
28
- pms.forEach(pm => {
85
+
86
+ pms.forEach((pm) => {
29
87
  const personId = (pm.fromPersonId === props.context.person.id) ? pm.toPersonId : pm.fromPersonId;
30
88
  if (peopleIds.indexOf(personId) === -1) peopleIds.push(personId);
89
+
90
+ // Keep only the most recent message per conversation
91
+ const currentMessage = pm.conversation?.messages?.[0];
92
+ const existingPm = conversationMap.get(personId);
93
+ const existingMessage = existingPm?.conversation?.messages?.[0];
94
+
95
+ if (!conversationMap.has(personId)) {
96
+ // First message for this person
97
+ conversationMap.set(personId, pm);
98
+ } else if (currentMessage && existingMessage) {
99
+ // Compare timestamps to keep the most recent
100
+ const currentTime = new Date(currentMessage.timeUpdated || currentMessage.timeSent);
101
+ const existingTime = new Date(existingMessage.timeUpdated || existingMessage.timeSent);
102
+ if (currentTime > existingTime) {
103
+ conversationMap.set(personId, pm);
104
+ }
105
+ } else if (currentMessage && !existingMessage) {
106
+ // Current has message but existing doesn't, use current
107
+ conversationMap.set(personId, pm);
108
+ }
109
+ // If !currentMessage but existingMessage, keep existing (do nothing)
31
110
  });
32
- if (peopleIds.length > 0) {
33
- const people = await ApiHelper.get("/people/basic?ids=" + peopleIds.join(","), "MembershipApi");
34
- pms.forEach(pm => {
111
+
112
+ // Convert map back to array (one message per conversation)
113
+ let conversations = Array.from(conversationMap.values());
114
+
115
+ // Filter out conversations without messages first
116
+ conversations = conversations.filter(pm => pm.conversation?.messages?.[0]);
117
+
118
+ // Get the filtered people IDs (only for conversations with messages)
119
+ const filteredPeopleIds = conversations.map(pm =>
120
+ (pm.fromPersonId === props.context.person.id) ? pm.toPersonId : pm.fromPersonId
121
+ ).filter((id, index, arr) => arr.indexOf(id) === index); // Remove duplicates
122
+
123
+ if (filteredPeopleIds.length > 0) {
124
+ try {
125
+ const people = await ApiHelper.get("/people/basic?ids=" + filteredPeopleIds.join(","), "MembershipApi");
126
+
127
+ conversations.forEach(pm => {
128
+ const personId = (pm.fromPersonId === props.context.person.id) ? pm.toPersonId : pm.fromPersonId;
129
+ pm.person = ArrayHelper.getOne(people, "id", personId);
130
+ });
131
+ } catch (error) {
132
+ console.error("❌ Failed to load people data:", error);
133
+ }
134
+ }
135
+
136
+ // Sort by most recent message (same logic as displayed in UI)
137
+ conversations.sort((a, b) => {
138
+ const aMessage = a.conversation?.messages?.[0];
139
+ const bMessage = b.conversation?.messages?.[0];
140
+
141
+ if (!aMessage && !bMessage) return 0;
142
+ if (!aMessage) return 1; // b comes first
143
+ if (!bMessage) return -1; // a comes first
144
+
145
+ const aTime = new Date(aMessage.timeUpdated || aMessage.timeSent).getTime();
146
+ const bTime = new Date(bMessage.timeUpdated || bMessage.timeSent).getTime();
147
+
148
+ // Most recent first (descending order)
149
+ return bTime - aTime;
150
+ });
151
+
152
+ setPrivateMessages(conversations);
153
+
154
+ // If a conversation is currently selected, update the selectedMessage to the new data
155
+ // This prevents the dialog from closing when new messages arrive
156
+ if (currentSelectedPersonId) {
157
+ const updatedSelectedMessage = conversations.find(pm => {
35
158
  const personId = (pm.fromPersonId === props.context.person.id) ? pm.toPersonId : pm.fromPersonId;
36
- pm.person = ArrayHelper.getOne(people, "id", personId);
37
- })
159
+ return personId === currentSelectedPersonId;
160
+ });
161
+
162
+ if (updatedSelectedMessage) {
163
+ privateMessagesStateStore.setSelectedMessage(updatedSelectedMessage);
164
+ } else {
165
+ privateMessagesStateStore.setSelectedMessage(null);
166
+ }
38
167
  }
39
- setPrivateMessages(pms);
168
+
169
+ setIsLoading(false);
40
170
  props.onUpdate();
41
171
  }
42
172
 
43
- React.useEffect(() => { loadData(); }, [props.refreshKey]); //eslint-disable-line
44
- React.useEffect(() => { console.log("RELOADED PMS") }, []);
45
-
46
- const getMainLinks = () => {
47
- let result: React.ReactElement[] = [];
48
- privateMessages.forEach(pm => {
49
-
50
- const person = pm.person;
51
- const message = pm.conversation.messages[0];
52
- const photoUrl = PersonHelper.getPhotoUrl(person);
53
-
54
- let datePosted = new Date(message.timeUpdated || message.timeSent);
55
- const displayDuration = DateHelper.getDisplayDuration(datePosted);
56
- const contents = message.content?.split("\n")[0];
57
- const privateMessage = pm;
58
- result.push(
59
- <div key={pm.id} className="note" style={{ cursor: "pointer" }} onClick={(e) => { e.preventDefault(); setSelectedMessage(privateMessage) }}>
60
- <div className="postedBy">
61
- <img src={photoUrl} alt="avatar" />
62
- </div>
63
- <Box sx={{ width: "100%" }} className="note-contents">
64
- <Stack direction="row" justifyContent="space-between">
65
- <div>
66
- <b>{person.name?.display}</b> · <span className="text-grey">{displayDuration}</span>
67
- <p style={{ maxHeight: 20, overflowY: "hidden" }}>{contents}</p>
68
- </div>
69
- </Stack>
173
+ // Initialize data on mount
174
+ useEffect(() => {
175
+ loadData();
176
+ }, []); //eslint-disable-line
177
+
178
+ // Reload data when refreshKey changes
179
+ useEffect(() => {
180
+ loadData();
181
+ }, [props.refreshKey]); //eslint-disable-line
182
+
183
+ const getMessageList = () => {
184
+ if (privateMessages.length === 0) {
185
+ return (
186
+ <Box sx={{
187
+ textAlign: 'center',
188
+ py: 8,
189
+ px: 4,
190
+ height: '100%',
191
+ display: 'flex',
192
+ flexDirection: 'column',
193
+ justifyContent: 'center',
194
+ alignItems: 'center'
195
+ }}>
196
+ <Box sx={{
197
+ width: 120,
198
+ height: 120,
199
+ borderRadius: '50%',
200
+ bgcolor: 'rgba(25, 118, 210, 0.08)',
201
+ display: 'flex',
202
+ alignItems: 'center',
203
+ justifyContent: 'center',
204
+ mb: 3,
205
+ position: 'relative',
206
+ '&::before': {
207
+ content: '""',
208
+ position: 'absolute',
209
+ width: '100%',
210
+ height: '100%',
211
+ borderRadius: '50%',
212
+ border: '1px solid rgba(25, 118, 210, 0.12)',
213
+ animation: 'pulse 2s infinite'
214
+ },
215
+ '@keyframes pulse': {
216
+ '0%': {
217
+ transform: 'scale(1)',
218
+ opacity: 1
219
+ },
220
+ '50%': {
221
+ transform: 'scale(1.05)',
222
+ opacity: 0.7
223
+ },
224
+ '100%': {
225
+ transform: 'scale(1)',
226
+ opacity: 1
227
+ }
228
+ }
229
+ }}>
230
+ <ChatIcon sx={{
231
+ fontSize: 56,
232
+ color: 'primary.main',
233
+ opacity: 0.8
234
+ }} />
235
+ </Box>
236
+ <Typography variant="h5" sx={{
237
+ color: 'text.primary',
238
+ fontWeight: 600,
239
+ mb: 1.5,
240
+ letterSpacing: '-0.02em'
241
+ }}>
242
+ No conversations yet
243
+ </Typography>
244
+ <Typography variant="body1" sx={{
245
+ color: 'text.secondary',
246
+ maxWidth: 280,
247
+ lineHeight: 1.6,
248
+ mb: 3
249
+ }}>
250
+ Start meaningful conversations with your community members. Your messages will appear here.
251
+ </Typography>
252
+ <Box sx={{
253
+ p: 2,
254
+ borderRadius: 2,
255
+ bgcolor: 'rgba(25, 118, 210, 0.04)',
256
+ border: '1px solid rgba(25, 118, 210, 0.12)',
257
+ display: 'flex',
258
+ alignItems: 'center',
259
+ gap: 1.5
260
+ }}>
261
+ <AddIcon sx={{ color: 'primary.main', fontSize: 20 }} />
262
+ <Typography variant="body2" sx={{
263
+ color: 'primary.main',
264
+ fontWeight: 500
265
+ }}>
266
+ Click the + button above to start your first conversation
267
+ </Typography>
70
268
  </Box>
71
- </div>
269
+ </Box>
72
270
  );
73
- })
74
- return result;
271
+ }
272
+
273
+ return (
274
+ <List sx={{
275
+ width: '100%',
276
+ p: 0,
277
+ '& .MuiListItem-root': {
278
+ transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)'
279
+ }
280
+ }}>
281
+ {privateMessages.map((pm, index) => {
282
+ const person = pm.person;
283
+ const message = pm.conversation?.messages?.[0];
284
+
285
+ // Only filter out if there's no message - show conversations even without person data
286
+ if (!message) {
287
+ return null;
288
+ }
289
+ const contents = message.content?.split("\n")[0];
290
+ let datePosted = new Date(message.timeUpdated || message.timeSent);
291
+ const displayDuration = DateHelper.getDisplayDuration(datePosted);
292
+ // Check if this conversation has unread messages
293
+ const isUnread = pm.notifyPersonId === props.context.person.id;
294
+
295
+ // Determine who sent the last message for better context
296
+ const isLastMessageFromMe = message.personId === props.context.person.id;
297
+ const isFromOtherPerson = pm.fromPersonId !== props.context.person.id;
298
+
299
+ return (
300
+ <Box key={pm.id} sx={{ px: 2, py: 0.5 }}>
301
+ <ListItem
302
+ component="button"
303
+ onClick={() => privateMessagesStateStore.setSelectedMessage(pm)}
304
+ sx={{
305
+ alignItems: 'flex-start',
306
+ p: 3,
307
+ cursor: 'pointer',
308
+ bgcolor: isUnread
309
+ ? 'rgba(25, 118, 210, 0.04)'
310
+ : 'background.paper',
311
+ border: isUnread
312
+ ? '1px solid rgba(25, 118, 210, 0.12)'
313
+ : '1px solid transparent',
314
+ borderRadius: 3,
315
+ boxShadow: '0 1px 3px rgba(0, 0, 0, 0.02)',
316
+ transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',
317
+ transform: 'translateY(0)',
318
+ '&:hover': {
319
+ bgcolor: isUnread
320
+ ? 'rgba(25, 118, 210, 0.06)'
321
+ : 'rgba(0, 0, 0, 0.02)',
322
+ boxShadow: '0 4px 12px rgba(0, 0, 0, 0.08)',
323
+ transform: 'translateY(-1px)',
324
+ borderColor: 'rgba(0, 0, 0, 0.06)'
325
+ },
326
+ '&:active': {
327
+ transform: 'translateY(0)',
328
+ boxShadow: '0 2px 6px rgba(0, 0, 0, 0.06)'
329
+ },
330
+ position: 'relative',
331
+ overflow: 'hidden',
332
+ '&::before': isUnread ? {
333
+ content: '""',
334
+ position: 'absolute',
335
+ left: 0,
336
+ top: 0,
337
+ bottom: 0,
338
+ width: 4,
339
+ bgcolor: 'primary.main',
340
+ borderRadius: '0 2px 2px 0'
341
+ } : {}
342
+ }}
343
+ >
344
+ <ListItemAvatar sx={{ mr: 2 }}>
345
+ <Box sx={{ position: 'relative' }}>
346
+ <PersonAvatar person={person || { name: { display: "Unknown User" } } as any} size="medium" />
347
+ {isUnread && (
348
+ <Box
349
+ sx={{
350
+ position: 'absolute',
351
+ top: -2,
352
+ right: -2,
353
+ width: 14,
354
+ height: 14,
355
+ bgcolor: 'primary.main',
356
+ borderRadius: '50%',
357
+ border: '2px solid white',
358
+ boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)'
359
+ }}
360
+ />
361
+ )}
362
+ </Box>
363
+ </ListItemAvatar>
364
+
365
+ <ListItemText
366
+ sx={{ m: 0, flex: 1 }}
367
+ primary={
368
+ <Stack direction="row" justifyContent="space-between" alignItems="flex-start" sx={{ mb: 0.5 }}>
369
+ <Typography
370
+ variant="h6"
371
+ sx={{
372
+ fontWeight: isUnread ? 600 : 500,
373
+ fontSize: '1rem',
374
+ color: 'text.primary',
375
+ lineHeight: 1.3
376
+ }}
377
+ >
378
+ {person?.name?.display || "Unknown User"}
379
+ </Typography>
380
+ <Typography
381
+ variant="caption"
382
+ sx={{
383
+ color: 'text.secondary',
384
+ fontSize: '0.75rem',
385
+ fontWeight: 500,
386
+ letterSpacing: '0.02em',
387
+ ml: 2,
388
+ flexShrink: 0
389
+ }}
390
+ >
391
+ {displayDuration}
392
+ </Typography>
393
+ </Stack>
394
+ }
395
+ secondary={
396
+ <Typography
397
+ variant="body2"
398
+ sx={{
399
+ color: 'text.secondary',
400
+ fontSize: '0.875rem',
401
+ fontWeight: isUnread ? 500 : 400,
402
+ lineHeight: 1.4,
403
+ overflow: 'hidden',
404
+ textOverflow: 'ellipsis',
405
+ display: '-webkit-box',
406
+ WebkitLineClamp: 2,
407
+ WebkitBoxOrient: 'vertical',
408
+ opacity: contents ? 1 : 0.6,
409
+ fontStyle: contents ? 'normal' : 'italic'
410
+ }}
411
+ >
412
+ {isLastMessageFromMe && contents && (
413
+ <Typography
414
+ component="span"
415
+ sx={{
416
+ fontWeight: 600,
417
+ color: 'text.primary',
418
+ opacity: 0.8
419
+ }}
420
+ >
421
+ You:{" "}
422
+ </Typography>
423
+ )}
424
+ {contents || 'No message preview available'}
425
+ </Typography>
426
+ }
427
+ />
428
+
429
+ {isUnread && (
430
+ <Box sx={{ ml: 1, display: 'flex', alignItems: 'flex-start', pt: 0.5 }}>
431
+ <Chip
432
+ size="small"
433
+ label="New"
434
+ sx={{
435
+ height: 22,
436
+ fontSize: '0.7rem',
437
+ fontWeight: 600,
438
+ bgcolor: 'primary.main',
439
+ color: 'white',
440
+ '& .MuiChip-label': {
441
+ px: 1
442
+ }
443
+ }}
444
+ />
445
+ </Box>
446
+ )}
447
+ </ListItem>
448
+ </Box>
449
+ );
450
+ })}
451
+ </List>
452
+ );
75
453
  }
76
454
 
77
455
  const handleBack = () => {
78
- setInAddMode(false);
79
- setSelectedMessage(null);
456
+ privateMessagesStateStore.setInAddMode(false);
457
+ privateMessagesStateStore.setSelectedMessage(null);
80
458
  loadData();
81
459
  }
82
460
 
83
- if (inAddMode) return <NewPrivateMessage context={props.context} onSelectMessage={(pm: PrivateMessageInterface) => { setSelectedMessage(pm); setInAddMode(false); }} onBack={handleBack} />
84
- if (selectedMessage) return <PrivateMessageDetails privateMessage={selectedMessage} context={props.context} onBack={handleBack} refreshKey={props.refreshKey} />
85
- else return (
86
- <>
87
- <span style={{ float: "right" }}>
88
- <SmallButton icon="edit_square" onClick={() => { setInAddMode(true) }} />
89
- </span>
461
+ const theme = useTheme();
90
462
 
91
- {getMainLinks()}
92
- </>
463
+ if (inAddMode) return <NewPrivateMessage context={props.context} onSelectMessage={(pm: PrivateMessageInterface) => { privateMessagesStateStore.setSelectedMessage(pm); privateMessagesStateStore.setInAddMode(false); }} onBack={handleBack} />
464
+ if (selectedMessage) return <PrivateMessageDetails privateMessage={selectedMessage} context={props.context} onBack={handleBack} refreshKey={props.refreshKey} onMessageRead={loadData} />
465
+
466
+ return (
467
+ <Paper elevation={0} sx={{
468
+ height: '100%',
469
+ display: 'flex',
470
+ flexDirection: 'column',
471
+ bgcolor: 'background.default',
472
+ borderRadius: 0
473
+ }}>
474
+ <Box sx={{
475
+ p: 3,
476
+ borderBottom: '1px solid',
477
+ borderColor: 'divider',
478
+ bgcolor: 'background.paper',
479
+ backdropFilter: 'blur(10px)'
480
+ }}>
481
+ <Stack direction="row" justifyContent="space-between" alignItems="center">
482
+ <Box>
483
+ <Typography variant="h5" component="h1" sx={{
484
+ fontWeight: 700,
485
+ color: 'text.primary',
486
+ letterSpacing: '-0.02em',
487
+ mb: 0.5
488
+ }}>
489
+ Messages
490
+ </Typography>
491
+ <Typography variant="body2" sx={{
492
+ color: 'text.secondary',
493
+ fontWeight: 500
494
+ }}>
495
+ {privateMessages.length === 0
496
+ ? 'No conversations'
497
+ : `${privateMessages.length} conversation${privateMessages.length === 1 ? '' : 's'}`
498
+ }
499
+ </Typography>
500
+ </Box>
501
+ <IconButton
502
+ onClick={() => privateMessagesStateStore.setInAddMode(true)}
503
+ sx={{
504
+ bgcolor: 'primary.main',
505
+ color: 'white',
506
+ width: 48,
507
+ height: 48,
508
+ boxShadow: '0 4px 12px rgba(25, 118, 210, 0.3)',
509
+ transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',
510
+ '&:hover': {
511
+ bgcolor: 'primary.dark',
512
+ boxShadow: '0 6px 16px rgba(25, 118, 210, 0.4)',
513
+ transform: 'translateY(-1px)'
514
+ },
515
+ '&:active': {
516
+ transform: 'translateY(0)',
517
+ boxShadow: '0 2px 8px rgba(25, 118, 210, 0.3)'
518
+ }
519
+ }}
520
+ >
521
+ <AddIcon sx={{ fontSize: 24 }} />
522
+ </IconButton>
523
+ </Stack>
524
+ </Box>
525
+
526
+ <Box sx={{ flex: 1, overflow: 'auto' }}>
527
+ {isLoading ? (
528
+ <Box sx={{ p: 2 }}>
529
+ {[...Array(3)].map((_, index) => (
530
+ <Box key={index} sx={{ px: 2, py: 0.5, mb: 1 }}>
531
+ <Box sx={{
532
+ p: 3,
533
+ borderRadius: 3,
534
+ bgcolor: 'background.paper',
535
+ boxShadow: '0 1px 3px rgba(0, 0, 0, 0.02)',
536
+ display: 'flex',
537
+ alignItems: 'flex-start'
538
+ }}>
539
+ <Skeleton
540
+ variant="circular"
541
+ width={56}
542
+ height={56}
543
+ sx={{ mr: 2, flexShrink: 0 }}
544
+ />
545
+ <Box sx={{ flex: 1 }}>
546
+ <Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 1 }}>
547
+ <Skeleton variant="text" width="45%" height={24} sx={{ borderRadius: 1 }} />
548
+ <Skeleton variant="text" width="20%" height={18} sx={{ borderRadius: 1 }} />
549
+ </Box>
550
+ <Skeleton variant="text" width="85%" height={20} sx={{ borderRadius: 1 }} />
551
+ <Skeleton variant="text" width="65%" height={20} sx={{ borderRadius: 1, mt: 0.5 }} />
552
+ </Box>
553
+ </Box>
554
+ </Box>
555
+ ))}
556
+ </Box>
557
+ ) : (
558
+ getMessageList()
559
+ )}
560
+ </Box>
561
+ </Paper>
93
562
  );
94
- };
563
+ }, (prevProps, nextProps) => {
564
+ // Only re-render if context.person.id changes or if we're explicitly forcing with refreshKey
565
+ const personChanged = prevProps.context?.person?.id !== nextProps.context?.person?.id;
566
+ const refreshKeyChanged = prevProps.refreshKey !== nextProps.refreshKey;
567
+
568
+ if (personChanged) {
569
+ return false; // Re-render
570
+ }
571
+
572
+ if (refreshKeyChanged) {
573
+ return false; // Re-render
574
+ }
575
+
576
+ return true; // Skip re-render
577
+ });