@churchapps/apphelper 0.0.9 → 0.0.11

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 (193) hide show
  1. package/.eslintignore +3 -3
  2. package/.eslintrc.json +22 -22
  3. package/LICENSE +21 -21
  4. package/README.md +16 -16
  5. package/dist/components/ExportLink.d.ts.map +1 -1
  6. package/dist/components/ExportLink.js +3 -2
  7. package/dist/components/ExportLink.js.map +1 -1
  8. package/dist/components/markdownEditor/editor.css +787 -787
  9. package/dist/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  10. package/dist/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  11. package/dist/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  12. package/dist/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  13. package/dist/components/markdownEditor/images/icons/code.svg +2 -2
  14. package/dist/components/markdownEditor/images/icons/journal-code.svg +4 -4
  15. package/dist/components/markdownEditor/images/icons/journal-text.svg +4 -4
  16. package/dist/components/markdownEditor/images/icons/justify.svg +2 -2
  17. package/dist/components/markdownEditor/images/icons/link.svg +3 -3
  18. package/dist/components/markdownEditor/images/icons/list-ol.svg +3 -3
  19. package/dist/components/markdownEditor/images/icons/list-ul.svg +2 -2
  20. package/dist/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  21. package/dist/components/markdownEditor/images/icons/text-center.svg +2 -2
  22. package/dist/components/markdownEditor/images/icons/text-left.svg +2 -2
  23. package/dist/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  24. package/dist/components/markdownEditor/images/icons/text-right.svg +2 -2
  25. package/dist/components/markdownEditor/images/icons/type-bold.svg +2 -2
  26. package/dist/components/markdownEditor/images/icons/type-h1.svg +2 -2
  27. package/dist/components/markdownEditor/images/icons/type-h2.svg +2 -2
  28. package/dist/components/markdownEditor/images/icons/type-h3.svg +2 -2
  29. package/dist/components/markdownEditor/images/icons/type-h4.svg +12 -12
  30. package/dist/components/markdownEditor/images/icons/type-italic.svg +2 -2
  31. package/dist/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  32. package/dist/components/markdownEditor/images/icons/type-underline.svg +2 -2
  33. package/dist/components/material/SiteWrapper.js +2 -2
  34. package/dist/components/material/SiteWrapper.js.map +1 -1
  35. package/dist/helpers/SocketHelper.d.ts +3 -3
  36. package/dist/helpers/SocketHelper.d.ts.map +1 -1
  37. package/dist/helpers/SocketHelper.js +6 -6
  38. package/dist/helpers/SocketHelper.js.map +1 -1
  39. package/dist/interfaces/Messaging.d.ts +1 -2
  40. package/dist/interfaces/Messaging.d.ts.map +1 -1
  41. package/package.json +84 -84
  42. package/src/components/CreatePerson.tsx +80 -80
  43. package/src/components/DisplayBox.tsx +68 -68
  44. package/src/components/ErrorMessages.tsx +26 -26
  45. package/src/components/ExportLink.tsx +67 -66
  46. package/src/components/FloatingSupport.tsx +16 -16
  47. package/src/components/FormSubmissionEdit.tsx +120 -120
  48. package/src/components/HelpIcon.tsx +10 -10
  49. package/src/components/ImageEditor.tsx +126 -126
  50. package/src/components/InputBox.tsx +73 -73
  51. package/src/components/Loading.tsx +29 -29
  52. package/src/components/PersonAdd.tsx +75 -75
  53. package/src/components/QuestionEdit.tsx +62 -62
  54. package/src/components/SmallButton.tsx +39 -39
  55. package/src/components/SupportModal.tsx +26 -26
  56. package/src/components/TabPanel.tsx +34 -34
  57. package/src/components/gallery/GalleryModal.tsx +102 -102
  58. package/src/components/gallery/StockPhotos.tsx +74 -74
  59. package/src/components/gallery/index.ts +1 -1
  60. package/src/components/index.tsx +23 -23
  61. package/src/components/markdownEditor/Editor.tsx +132 -132
  62. package/src/components/markdownEditor/MarkdownEditor.tsx +16 -16
  63. package/src/components/markdownEditor/MarkdownModal.tsx +46 -46
  64. package/src/components/markdownEditor/MarkdownPreview.tsx +14 -14
  65. package/src/components/markdownEditor/editor.css +787 -787
  66. package/src/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
  67. package/src/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
  68. package/src/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
  69. package/src/components/markdownEditor/images/icons/chevron-down.svg +2 -2
  70. package/src/components/markdownEditor/images/icons/code.svg +2 -2
  71. package/src/components/markdownEditor/images/icons/journal-code.svg +4 -4
  72. package/src/components/markdownEditor/images/icons/journal-text.svg +4 -4
  73. package/src/components/markdownEditor/images/icons/justify.svg +2 -2
  74. package/src/components/markdownEditor/images/icons/link.svg +3 -3
  75. package/src/components/markdownEditor/images/icons/list-ol.svg +3 -3
  76. package/src/components/markdownEditor/images/icons/list-ul.svg +2 -2
  77. package/src/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
  78. package/src/components/markdownEditor/images/icons/text-center.svg +2 -2
  79. package/src/components/markdownEditor/images/icons/text-left.svg +2 -2
  80. package/src/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
  81. package/src/components/markdownEditor/images/icons/text-right.svg +2 -2
  82. package/src/components/markdownEditor/images/icons/type-bold.svg +2 -2
  83. package/src/components/markdownEditor/images/icons/type-h1.svg +2 -2
  84. package/src/components/markdownEditor/images/icons/type-h2.svg +2 -2
  85. package/src/components/markdownEditor/images/icons/type-h3.svg +2 -2
  86. package/src/components/markdownEditor/images/icons/type-h4.svg +12 -12
  87. package/src/components/markdownEditor/images/icons/type-italic.svg +2 -2
  88. package/src/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
  89. package/src/components/markdownEditor/images/icons/type-underline.svg +2 -2
  90. package/src/components/markdownEditor/index.ts +2 -2
  91. package/src/components/markdownEditor/plugins/AutoLinkPlugin.tsx +35 -35
  92. package/src/components/markdownEditor/plugins/ControlledEditorPlugin.tsx +24 -24
  93. package/src/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.tsx +68 -68
  94. package/src/components/markdownEditor/plugins/MarkdownTransformers.ts +106 -106
  95. package/src/components/markdownEditor/plugins/ReadOnlyPlugin.tsx +15 -15
  96. package/src/components/markdownEditor/plugins/ToolbarPlugin.tsx +401 -401
  97. package/src/components/markdownEditor/plugins/customLink/CustomLinkNode.tsx +224 -224
  98. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.tsx +32 -32
  99. package/src/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.tsx +102 -102
  100. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.tsx +243 -243
  101. package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.ts +11 -11
  102. package/src/components/markdownEditor/plugins/emoji/EmojiNode.tsx +95 -95
  103. package/src/components/markdownEditor/plugins/emoji/EmojiNodeTransform.ts +41 -41
  104. package/src/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.tsx +152 -152
  105. package/src/components/markdownEditor/plugins/emoji/EmojisPlugin.tsx +65 -65
  106. package/src/components/markdownEditor/plugins/index.ts +6 -6
  107. package/src/components/markdownEditor/theme.ts +65 -65
  108. package/src/components/material/AppList.tsx +20 -20
  109. package/src/components/material/ChurchList.tsx +22 -22
  110. package/src/components/material/NavItem.tsx +41 -41
  111. package/src/components/material/NewPrivateMessage.tsx +103 -103
  112. package/src/components/material/PrivateMessageDetails.tsx +23 -23
  113. package/src/components/material/PrivateMessages.tsx +87 -87
  114. package/src/components/material/SiteWrapper.tsx +140 -140
  115. package/src/components/material/UserMenu.tsx +141 -141
  116. package/src/components/material/iconPicker/IconNamesList.ts +2240 -2240
  117. package/src/components/material/iconPicker/IconPicker.tsx +153 -153
  118. package/src/components/material/index.tsx +6 -6
  119. package/src/components/notes/AddNote.tsx +90 -90
  120. package/src/components/notes/Conversation.tsx +82 -82
  121. package/src/components/notes/Conversations.tsx +58 -58
  122. package/src/components/notes/NewConversation.tsx +78 -78
  123. package/src/components/notes/Note.tsx +44 -44
  124. package/src/components/notes/Notes.tsx +52 -52
  125. package/src/components/notes/index.ts +5 -5
  126. package/src/components/reporting/ChartReport.tsx +98 -98
  127. package/src/components/reporting/ReportFilter.tsx +54 -54
  128. package/src/components/reporting/ReportFilterField.tsx +160 -160
  129. package/src/components/reporting/ReportOutput.tsx +79 -79
  130. package/src/components/reporting/ReportWithFilter.tsx +70 -70
  131. package/src/components/reporting/TableReport.tsx +57 -57
  132. package/src/components/reporting/TreeReport.tsx +111 -111
  133. package/src/components/reporting/index.ts +4 -4
  134. package/src/donationComponents/DonationPage.tsx +136 -136
  135. package/src/donationComponents/components/BankForm.tsx +159 -159
  136. package/src/donationComponents/components/CardForm.tsx +104 -104
  137. package/src/donationComponents/components/DonationForm.tsx +235 -235
  138. package/src/donationComponents/components/FundDonation.tsx +49 -49
  139. package/src/donationComponents/components/FundDonations.tsx +39 -39
  140. package/src/donationComponents/components/NonAuthDonation.tsx +31 -31
  141. package/src/donationComponents/components/NonAuthDonationInner.tsx +259 -259
  142. package/src/donationComponents/components/PaymentMethods.tsx +135 -135
  143. package/src/donationComponents/components/RecurringDonations.tsx +121 -121
  144. package/src/donationComponents/components/RecurringDonationsEdit.tsx +93 -93
  145. package/src/donationComponents/components/index.tsx +9 -9
  146. package/src/donationComponents/index.ts +3 -3
  147. package/src/donationComponents/modals/DonationPreviewModal.tsx +66 -66
  148. package/src/helpers/AnalyticsHelper.ts +33 -33
  149. package/src/helpers/ApiHelper.ts +125 -125
  150. package/src/helpers/AppearanceHelper.ts +69 -69
  151. package/src/helpers/ArrayHelper.ts +81 -81
  152. package/src/helpers/CommonEnvironmentHelper.ts +80 -80
  153. package/src/helpers/CurrencyHelper.ts +10 -10
  154. package/src/helpers/DateHelper.ts +108 -108
  155. package/src/helpers/DonationHelper.ts +26 -26
  156. package/src/helpers/ErrorHelper.ts +36 -36
  157. package/src/helpers/EventHelper.ts +52 -52
  158. package/src/helpers/FileHelper.ts +31 -31
  159. package/src/helpers/PersonHelper.ts +60 -60
  160. package/src/helpers/SocketHelper.ts +76 -76
  161. package/src/helpers/Themes.ts +14 -14
  162. package/src/helpers/UniqueIdHelper.ts +36 -36
  163. package/src/helpers/UserHelper.ts +59 -59
  164. package/src/helpers/createEmotionCache.ts +17 -17
  165. package/src/helpers/index.ts +18 -18
  166. package/src/hooks/index.ts +1 -1
  167. package/src/hooks/useMountedState.ts +16 -16
  168. package/src/index.ts +6 -6
  169. package/src/interfaces/Access.ts +24 -24
  170. package/src/interfaces/Attendance.ts +8 -8
  171. package/src/interfaces/Content.ts +10 -10
  172. package/src/interfaces/Doing.ts +24 -24
  173. package/src/interfaces/Donation.ts +45 -45
  174. package/src/interfaces/Error.ts +17 -17
  175. package/src/interfaces/Membership.ts +51 -51
  176. package/src/interfaces/Messaging.ts +20 -20
  177. package/src/interfaces/Permissions.ts +68 -68
  178. package/src/interfaces/Reporting.ts +7 -7
  179. package/src/interfaces/UserContextInterface.ts +13 -13
  180. package/src/interfaces/index.ts +13 -13
  181. package/src/pageComponents/LoginPage.tsx +244 -244
  182. package/src/pageComponents/LogoutPage.tsx +28 -28
  183. package/src/pageComponents/components/Forgot.tsx +79 -79
  184. package/src/pageComponents/components/Login.tsx +54 -54
  185. package/src/pageComponents/components/LoginSetPassword.tsx +63 -63
  186. package/src/pageComponents/components/Register.tsx +107 -107
  187. package/src/pageComponents/components/SelectChurchModal.tsx +41 -41
  188. package/src/pageComponents/components/SelectChurchRegister.tsx +88 -88
  189. package/src/pageComponents/components/SelectChurchSearch.tsx +69 -69
  190. package/src/pageComponents/components/SelectableChurch.tsx +38 -38
  191. package/src/pageComponents/index.ts +3 -3
  192. package/tsconfig.json +34 -34
  193. package/tslint.json +14 -14
@@ -1,103 +1,103 @@
1
- import { Button, TextField, TableRow, TableCell, Table, TableBody } from "@mui/material";
2
- import React from "react";
3
- import { ApiHelper, PersonHelper } from "../../helpers";
4
- import { ConversationInterface, PersonInterface, PrivateMessageInterface, UserContextInterface } from "../../interfaces";
5
- import { AddNote } from "../notes/AddNote";
6
- import { SmallButton } from "../SmallButton";
7
-
8
- interface Props {
9
- context: UserContextInterface;
10
- onSelectMessage: (pm: PrivateMessageInterface) => void
11
- onBack: () => void
12
- }
13
-
14
- export const NewPrivateMessage: React.FC<Props> = (props) => {
15
-
16
- const [searchText, setSearchText] = React.useState("");
17
- const [searchResults, setSearchResults] = React.useState([]);
18
- const [selectedPerson, setSelectedPerson] = React.useState<PersonInterface>(null);
19
-
20
- const handleSubmit = (e: React.MouseEvent) => {
21
- if (e !== null) e.preventDefault();
22
- let term = escape(searchText.trim());
23
- ApiHelper.get("/people/search?term=" + term, "MembershipApi").then(data => setSearchResults(data));
24
- }
25
-
26
- const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
27
- setSearchText(e.currentTarget.value);
28
- }
29
-
30
- /*
31
- const handleKeyDown = (e: React.KeyboardEvent<any>) => {
32
- //if (e.key === "Enter") { e.preventDefault(); handleSubmit(null); }
33
- }
34
- */
35
-
36
- const handlePersonSelected = async (person: PersonInterface) => {
37
- const existing: PrivateMessageInterface = await ApiHelper.get("/privateMessages/existing/" + person.id, "MessagingApi");
38
- if (existing.id) {
39
- existing.person = person;
40
- props.onSelectMessage(existing);
41
- }
42
- else setSelectedPerson(person);
43
- }
44
-
45
- const getPeople = () => {
46
- let result = [];
47
- for (let i = 0; i < searchResults.length; i++) {
48
- const p = searchResults[i];
49
- result.push(<TableRow key={p.id}>
50
- <TableCell><img src={PersonHelper.getPhotoUrl(p)} alt="avatar" /></TableCell>
51
- <TableCell><a href="about:blank" onClick={(e) => { e.preventDefault(); handlePersonSelected(p) }}>{p.name.display}</a></TableCell>
52
- </TableRow>);
53
- }
54
- return result;
55
- }
56
-
57
- const handleNoteAdded = () => {
58
- handlePersonSelected(selectedPerson);
59
- }
60
-
61
- const createConversation = async () => {
62
- const conv: ConversationInterface = { allowAnonymousPosts: false, contentType: "privateMessage", contentId: props.context.person.id, title: props.context.person.name.display + " Private Message", visibility: "hidden" }
63
- const result: ConversationInterface[] = await ApiHelper.post("/conversations", [conv], "MessagingApi");
64
-
65
- const pm: PrivateMessageInterface = {
66
- fromPersonId: props.context.person.id,
67
- toPersonId: selectedPerson.id,
68
- conversationId: result[0].id
69
- }
70
- const privateMessages: PrivateMessageInterface[] = await ApiHelper.post("/privateMessages", [pm], "MessagingApi");
71
- return privateMessages[0].conversationId;
72
- }
73
-
74
- if (!selectedPerson) return (
75
- <div style={{ paddingLeft: 10, paddingRight: 10 }}>
76
- <span style={{ float: "right" }}>
77
- <SmallButton icon="chevron_left" text="Back" onClick={props.onBack} />
78
- </span>
79
- <b>New Private Message</b>
80
- <div>Search for a person</div>
81
-
82
- <TextField fullWidth label="Name" id="searchText" data-cy="search-input" name="searchText" type="text" placeholder="Name" value={searchText} onChange={handleChange}
83
- InputProps={{ endAdornment: <Button variant="contained" id="searchButton" data-cy="search-button" onClick={handleSubmit}>Search</Button> }}
84
- />
85
- <br />
86
- <Table id="smallPeopleTable" size="small">
87
- <TableBody>{getPeople()}</TableBody>
88
- </Table>
89
- </div>
90
- );
91
- else {
92
- return (
93
- <div style={{ paddingLeft: 10, paddingRight: 10 }}>
94
- <span style={{ float: "right" }}>
95
- <SmallButton icon="chevron_left" text="Back" onClick={props.onBack} />
96
- </span>
97
- <b>New Private Message</b>
98
- <div>To: {selectedPerson.name.display}</div>
99
- <AddNote context={props.context} conversationId={null} onUpdate={handleNoteAdded} createConversation={createConversation} />
100
- </div>
101
- )
102
- }
103
- }
1
+ import { Button, TextField, TableRow, TableCell, Table, TableBody } from "@mui/material";
2
+ import React from "react";
3
+ import { ApiHelper, PersonHelper } from "../../helpers";
4
+ import { ConversationInterface, PersonInterface, PrivateMessageInterface, UserContextInterface } from "../../interfaces";
5
+ import { AddNote } from "../notes/AddNote";
6
+ import { SmallButton } from "../SmallButton";
7
+
8
+ interface Props {
9
+ context: UserContextInterface;
10
+ onSelectMessage: (pm: PrivateMessageInterface) => void
11
+ onBack: () => void
12
+ }
13
+
14
+ export const NewPrivateMessage: React.FC<Props> = (props) => {
15
+
16
+ const [searchText, setSearchText] = React.useState("");
17
+ const [searchResults, setSearchResults] = React.useState([]);
18
+ const [selectedPerson, setSelectedPerson] = React.useState<PersonInterface>(null);
19
+
20
+ const handleSubmit = (e: React.MouseEvent) => {
21
+ if (e !== null) e.preventDefault();
22
+ let term = escape(searchText.trim());
23
+ ApiHelper.get("/people/search?term=" + term, "MembershipApi").then(data => setSearchResults(data));
24
+ }
25
+
26
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
27
+ setSearchText(e.currentTarget.value);
28
+ }
29
+
30
+ /*
31
+ const handleKeyDown = (e: React.KeyboardEvent<any>) => {
32
+ //if (e.key === "Enter") { e.preventDefault(); handleSubmit(null); }
33
+ }
34
+ */
35
+
36
+ const handlePersonSelected = async (person: PersonInterface) => {
37
+ const existing: PrivateMessageInterface = await ApiHelper.get("/privateMessages/existing/" + person.id, "MessagingApi");
38
+ if (existing.id) {
39
+ existing.person = person;
40
+ props.onSelectMessage(existing);
41
+ }
42
+ else setSelectedPerson(person);
43
+ }
44
+
45
+ const getPeople = () => {
46
+ let result = [];
47
+ for (let i = 0; i < searchResults.length; i++) {
48
+ const p = searchResults[i];
49
+ result.push(<TableRow key={p.id}>
50
+ <TableCell><img src={PersonHelper.getPhotoUrl(p)} alt="avatar" /></TableCell>
51
+ <TableCell><a href="about:blank" onClick={(e) => { e.preventDefault(); handlePersonSelected(p) }}>{p.name.display}</a></TableCell>
52
+ </TableRow>);
53
+ }
54
+ return result;
55
+ }
56
+
57
+ const handleNoteAdded = () => {
58
+ handlePersonSelected(selectedPerson);
59
+ }
60
+
61
+ const createConversation = async () => {
62
+ const conv: ConversationInterface = { allowAnonymousPosts: false, contentType: "privateMessage", contentId: props.context.person.id, title: props.context.person.name.display + " Private Message", visibility: "hidden" }
63
+ const result: ConversationInterface[] = await ApiHelper.post("/conversations", [conv], "MessagingApi");
64
+
65
+ const pm: PrivateMessageInterface = {
66
+ fromPersonId: props.context.person.id,
67
+ toPersonId: selectedPerson.id,
68
+ conversationId: result[0].id
69
+ }
70
+ const privateMessages: PrivateMessageInterface[] = await ApiHelper.post("/privateMessages", [pm], "MessagingApi");
71
+ return privateMessages[0].conversationId;
72
+ }
73
+
74
+ if (!selectedPerson) return (
75
+ <div style={{ paddingLeft: 10, paddingRight: 10 }}>
76
+ <span style={{ float: "right" }}>
77
+ <SmallButton icon="chevron_left" text="Back" onClick={props.onBack} />
78
+ </span>
79
+ <b>New Private Message</b>
80
+ <div>Search for a person</div>
81
+
82
+ <TextField fullWidth label="Name" id="searchText" data-cy="search-input" name="searchText" type="text" placeholder="Name" value={searchText} onChange={handleChange}
83
+ InputProps={{ endAdornment: <Button variant="contained" id="searchButton" data-cy="search-button" onClick={handleSubmit}>Search</Button> }}
84
+ />
85
+ <br />
86
+ <Table id="smallPeopleTable" size="small">
87
+ <TableBody>{getPeople()}</TableBody>
88
+ </Table>
89
+ </div>
90
+ );
91
+ else {
92
+ return (
93
+ <div style={{ paddingLeft: 10, paddingRight: 10 }}>
94
+ <span style={{ float: "right" }}>
95
+ <SmallButton icon="chevron_left" text="Back" onClick={props.onBack} />
96
+ </span>
97
+ <b>New Private Message</b>
98
+ <div>To: {selectedPerson.name.display}</div>
99
+ <AddNote context={props.context} conversationId={null} onUpdate={handleNoteAdded} createConversation={createConversation} />
100
+ </div>
101
+ )
102
+ }
103
+ }
@@ -1,23 +1,23 @@
1
- import React from "react";
2
- import { SmallButton } from "../SmallButton";
3
- import { PrivateMessageInterface, UserContextInterface } from "../../interfaces";
4
- import { Notes } from "../notes/Notes";
5
-
6
- interface Props {
7
- context: UserContextInterface;
8
- privateMessage: PrivateMessageInterface;
9
- onBack: () => void
10
- }
11
-
12
- export const PrivateMessageDetails: React.FC<Props> = (props) => (
13
- <>
14
- <div style={{ paddingLeft: 10, paddingRight: 10, paddingBottom: 10 }}>
15
- <span style={{ float: "right" }}>
16
- <SmallButton icon="chevron_left" text="Back" onClick={props.onBack} />
17
- </span>
18
- Chat with {props.privateMessage.person.name.display}
19
- </div>
20
- <Notes context={props.context} conversationId={props.privateMessage.conversationId} noDisplayBox={true} />
21
- </>
22
- );
23
-
1
+ import React from "react";
2
+ import { SmallButton } from "../SmallButton";
3
+ import { PrivateMessageInterface, UserContextInterface } from "../../interfaces";
4
+ import { Notes } from "../notes/Notes";
5
+
6
+ interface Props {
7
+ context: UserContextInterface;
8
+ privateMessage: PrivateMessageInterface;
9
+ onBack: () => void
10
+ }
11
+
12
+ export const PrivateMessageDetails: React.FC<Props> = (props) => (
13
+ <>
14
+ <div style={{ paddingLeft: 10, paddingRight: 10, paddingBottom: 10 }}>
15
+ <span style={{ float: "right" }}>
16
+ <SmallButton icon="chevron_left" text="Back" onClick={props.onBack} />
17
+ </span>
18
+ Chat with {props.privateMessage.person.name.display}
19
+ </div>
20
+ <Notes context={props.context} conversationId={props.privateMessage.conversationId} noDisplayBox={true} />
21
+ </>
22
+ );
23
+
@@ -1,87 +1,87 @@
1
- import React, { useState } from "react";
2
- import { ApiHelper } from "../../helpers/ApiHelper";
3
- import { Box, Stack } from "@mui/material";
4
- import { SmallButton } from "../SmallButton";
5
- import { PrivateMessageInterface, UserContextInterface } from "../../interfaces";
6
- import { ArrayHelper, DateHelper, PersonHelper } from "../../helpers";
7
- import { PrivateMessageDetails } from "./PrivateMessageDetails";
8
- import { NewPrivateMessage } from "./NewPrivateMessage";
9
-
10
- interface Props {
11
- context: UserContextInterface;
12
- }
13
-
14
- export const PrivateMessages: React.FC<Props> = (props) => {
15
-
16
- const [privateMessages, setPrivateMessages] = useState<PrivateMessageInterface[]>([]);
17
- const [selectedMessage, setSelectedMessage] = useState<PrivateMessageInterface>(null);
18
- const [inAddMode, setInAddMode] = useState(false);
19
-
20
- const loadData = async () => {
21
- const pms: PrivateMessageInterface[] = await ApiHelper.get("/privateMessages", "MessagingApi");
22
- const peopleIds: string[] = [];
23
- pms.forEach(pm => {
24
- const personId = (pm.fromPersonId === props.context.person.id) ? pm.toPersonId : pm.fromPersonId;
25
- if (peopleIds.indexOf(personId) === -1) peopleIds.push(personId);
26
- });
27
- if (peopleIds.length > 0) {
28
- const people = await ApiHelper.get("/people/ids?ids=" + peopleIds.join(","), "MembershipApi");
29
- pms.forEach(pm => {
30
- const personId = (pm.fromPersonId === props.context.person.id) ? pm.toPersonId : pm.fromPersonId;
31
- pm.person = ArrayHelper.getOne(people, "id", personId);
32
- })
33
- }
34
- setPrivateMessages(pms);
35
- }
36
-
37
- React.useEffect(() => { loadData(); }, []); //eslint-disable-line
38
-
39
- const getMainLinks = () => {
40
- let result: JSX.Element[] = [];
41
- privateMessages.forEach(pm => {
42
-
43
- const person = pm.person;
44
- const message = pm.conversation.messages[0];
45
- const photoUrl = PersonHelper.getPhotoUrl(person);
46
-
47
- let datePosted = new Date(message.timeUpdated || message.timeSent);
48
- const displayDuration = DateHelper.getDisplayDuration(datePosted);
49
- const contents = message.content?.split("\n")[0];
50
- const privateMessage = pm;
51
- result.push(
52
- <div className="note" style={{ cursor: "pointer" }} onClick={(e) => { e.preventDefault(); setSelectedMessage(privateMessage) }}>
53
- <div className="postedBy">
54
- <img src={photoUrl} alt="avatar" />
55
- </div>
56
- <Box sx={{ width: "100%" }} className="note-contents">
57
- <Stack direction="row" justifyContent="space-between">
58
- <div>
59
- <b>{person.name?.display}</b> · <span className="text-grey">{displayDuration}</span>
60
- <p style={{ maxHeight: 20, overflowY: "hidden" }}>{contents}</p>
61
- </div>
62
- </Stack>
63
- </Box>
64
- </div>
65
- );
66
- })
67
- return result;
68
- }
69
-
70
- const handleBack = () => {
71
- setInAddMode(false);
72
- setSelectedMessage(null);
73
- loadData();
74
- }
75
-
76
- if (inAddMode) return <NewPrivateMessage context={props.context} onSelectMessage={(pm: PrivateMessageInterface) => { setSelectedMessage(pm); setInAddMode(false); }} onBack={handleBack} />
77
- if (selectedMessage) return <PrivateMessageDetails privateMessage={selectedMessage} context={props.context} onBack={handleBack} />
78
- else return (
79
- <>
80
- <span style={{ float: "right" }}>
81
- <SmallButton icon="add" onClick={() => { setInAddMode(true) }} />
82
- </span>
83
-
84
- {getMainLinks()}
85
- </>
86
- );
87
- };
1
+ import React, { useState } from "react";
2
+ import { ApiHelper } from "../../helpers/ApiHelper";
3
+ import { Box, Stack } from "@mui/material";
4
+ import { SmallButton } from "../SmallButton";
5
+ import { PrivateMessageInterface, UserContextInterface } from "../../interfaces";
6
+ import { ArrayHelper, DateHelper, PersonHelper } from "../../helpers";
7
+ import { PrivateMessageDetails } from "./PrivateMessageDetails";
8
+ import { NewPrivateMessage } from "./NewPrivateMessage";
9
+
10
+ interface Props {
11
+ context: UserContextInterface;
12
+ }
13
+
14
+ export const PrivateMessages: React.FC<Props> = (props) => {
15
+
16
+ const [privateMessages, setPrivateMessages] = useState<PrivateMessageInterface[]>([]);
17
+ const [selectedMessage, setSelectedMessage] = useState<PrivateMessageInterface>(null);
18
+ const [inAddMode, setInAddMode] = useState(false);
19
+
20
+ const loadData = async () => {
21
+ const pms: PrivateMessageInterface[] = await ApiHelper.get("/privateMessages", "MessagingApi");
22
+ const peopleIds: string[] = [];
23
+ pms.forEach(pm => {
24
+ const personId = (pm.fromPersonId === props.context.person.id) ? pm.toPersonId : pm.fromPersonId;
25
+ if (peopleIds.indexOf(personId) === -1) peopleIds.push(personId);
26
+ });
27
+ if (peopleIds.length > 0) {
28
+ const people = await ApiHelper.get("/people/ids?ids=" + peopleIds.join(","), "MembershipApi");
29
+ pms.forEach(pm => {
30
+ const personId = (pm.fromPersonId === props.context.person.id) ? pm.toPersonId : pm.fromPersonId;
31
+ pm.person = ArrayHelper.getOne(people, "id", personId);
32
+ })
33
+ }
34
+ setPrivateMessages(pms);
35
+ }
36
+
37
+ React.useEffect(() => { loadData(); }, []); //eslint-disable-line
38
+
39
+ const getMainLinks = () => {
40
+ let result: JSX.Element[] = [];
41
+ privateMessages.forEach(pm => {
42
+
43
+ const person = pm.person;
44
+ const message = pm.conversation.messages[0];
45
+ const photoUrl = PersonHelper.getPhotoUrl(person);
46
+
47
+ let datePosted = new Date(message.timeUpdated || message.timeSent);
48
+ const displayDuration = DateHelper.getDisplayDuration(datePosted);
49
+ const contents = message.content?.split("\n")[0];
50
+ const privateMessage = pm;
51
+ result.push(
52
+ <div className="note" style={{ cursor: "pointer" }} onClick={(e) => { e.preventDefault(); setSelectedMessage(privateMessage) }}>
53
+ <div className="postedBy">
54
+ <img src={photoUrl} alt="avatar" />
55
+ </div>
56
+ <Box sx={{ width: "100%" }} className="note-contents">
57
+ <Stack direction="row" justifyContent="space-between">
58
+ <div>
59
+ <b>{person.name?.display}</b> · <span className="text-grey">{displayDuration}</span>
60
+ <p style={{ maxHeight: 20, overflowY: "hidden" }}>{contents}</p>
61
+ </div>
62
+ </Stack>
63
+ </Box>
64
+ </div>
65
+ );
66
+ })
67
+ return result;
68
+ }
69
+
70
+ const handleBack = () => {
71
+ setInAddMode(false);
72
+ setSelectedMessage(null);
73
+ loadData();
74
+ }
75
+
76
+ if (inAddMode) return <NewPrivateMessage context={props.context} onSelectMessage={(pm: PrivateMessageInterface) => { setSelectedMessage(pm); setInAddMode(false); }} onBack={handleBack} />
77
+ if (selectedMessage) return <PrivateMessageDetails privateMessage={selectedMessage} context={props.context} onBack={handleBack} />
78
+ else return (
79
+ <>
80
+ <span style={{ float: "right" }}>
81
+ <SmallButton icon="add" onClick={() => { setInAddMode(true) }} />
82
+ </span>
83
+
84
+ {getMainLinks()}
85
+ </>
86
+ );
87
+ };