@churchapps/apphelper 0.4.17 → 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 (137) hide show
  1. package/dist/components/FormCardPayment.js +2 -2
  2. package/dist/components/FormCardPayment.js.map +1 -1
  3. package/dist/components/FormSubmissionEdit.d.ts.map +1 -1
  4. package/dist/components/FormSubmissionEdit.js +4 -5
  5. package/dist/components/FormSubmissionEdit.js.map +1 -1
  6. package/dist/components/PageHeader.d.ts +15 -0
  7. package/dist/components/PageHeader.d.ts.map +1 -0
  8. package/dist/components/PageHeader.js +41 -0
  9. package/dist/components/PageHeader.js.map +1 -0
  10. package/dist/components/PersonAvatar.d.ts +12 -0
  11. package/dist/components/PersonAvatar.d.ts.map +1 -0
  12. package/dist/components/PersonAvatar.js +55 -0
  13. package/dist/components/PersonAvatar.js.map +1 -0
  14. package/dist/components/header/SiteHeader.d.ts +2 -1
  15. package/dist/components/header/SiteHeader.d.ts.map +1 -1
  16. package/dist/components/header/SiteHeader.js +100 -4
  17. package/dist/components/header/SiteHeader.js.map +1 -1
  18. package/dist/components/header/SupportDrawer.js.map +1 -1
  19. package/dist/components/index.d.ts +2 -0
  20. package/dist/components/index.d.ts.map +1 -1
  21. package/dist/components/index.js +2 -0
  22. package/dist/components/index.js.map +1 -1
  23. package/dist/components/notes/AddNote.d.ts.map +1 -1
  24. package/dist/components/notes/AddNote.js +45 -7
  25. package/dist/components/notes/AddNote.js.map +1 -1
  26. package/dist/components/notes/Note.d.ts.map +1 -1
  27. package/dist/components/notes/Note.js +6 -6
  28. package/dist/components/notes/Note.js.map +1 -1
  29. package/dist/components/notes/Notes.d.ts.map +1 -1
  30. package/dist/components/notes/Notes.js +120 -20
  31. package/dist/components/notes/Notes.js.map +1 -1
  32. package/dist/components/wrapper/ChurchList.d.ts.map +1 -1
  33. package/dist/components/wrapper/ChurchList.js +44 -6
  34. package/dist/components/wrapper/ChurchList.js.map +1 -1
  35. package/dist/components/wrapper/NewPrivateMessage.d.ts.map +1 -1
  36. package/dist/components/wrapper/NewPrivateMessage.js +28 -21
  37. package/dist/components/wrapper/NewPrivateMessage.js.map +1 -1
  38. package/dist/components/wrapper/Notifications.d.ts.map +1 -1
  39. package/dist/components/wrapper/Notifications.js +47 -20
  40. package/dist/components/wrapper/Notifications.js.map +1 -1
  41. package/dist/components/wrapper/PrivateMessageDetails.d.ts +1 -0
  42. package/dist/components/wrapper/PrivateMessageDetails.d.ts.map +1 -1
  43. package/dist/components/wrapper/PrivateMessageDetails.js +53 -4
  44. package/dist/components/wrapper/PrivateMessageDetails.js.map +1 -1
  45. package/dist/components/wrapper/PrivateMessages.d.ts.map +1 -1
  46. package/dist/components/wrapper/PrivateMessages.js +360 -41
  47. package/dist/components/wrapper/PrivateMessages.js.map +1 -1
  48. package/dist/components/wrapper/UserMenu.d.ts.map +1 -1
  49. package/dist/components/wrapper/UserMenu.js +163 -26
  50. package/dist/components/wrapper/UserMenu.js.map +1 -1
  51. package/dist/components/wrapper/index.d.ts +2 -1
  52. package/dist/components/wrapper/index.d.ts.map +1 -1
  53. package/dist/components/wrapper/index.js +2 -1
  54. package/dist/components/wrapper/index.js.map +1 -1
  55. package/dist/helpers/ArrayHelper.d.ts.map +1 -1
  56. package/dist/helpers/ArrayHelper.js +0 -1
  57. package/dist/helpers/ArrayHelper.js.map +1 -1
  58. package/dist/helpers/ErrorHelper.js +1 -1
  59. package/dist/helpers/ErrorHelper.js.map +1 -1
  60. package/dist/helpers/EventHelper.d.ts.map +1 -1
  61. package/dist/helpers/EventHelper.js +0 -3
  62. package/dist/helpers/EventHelper.js.map +1 -1
  63. package/dist/helpers/Locale.d.ts +1 -1
  64. package/dist/helpers/Locale.d.ts.map +1 -1
  65. package/dist/helpers/Locale.js +7 -2
  66. package/dist/helpers/Locale.js.map +1 -1
  67. package/dist/helpers/NotificationService.d.ts +56 -0
  68. package/dist/helpers/NotificationService.d.ts.map +1 -0
  69. package/dist/helpers/NotificationService.js +176 -0
  70. package/dist/helpers/NotificationService.js.map +1 -0
  71. package/dist/helpers/SocketHelper.d.ts.map +1 -1
  72. package/dist/helpers/SocketHelper.js +22 -17
  73. package/dist/helpers/SocketHelper.js.map +1 -1
  74. package/dist/helpers/UserHelper.js +2 -2
  75. package/dist/helpers/UserHelper.js.map +1 -1
  76. package/dist/helpers/index.d.ts +2 -0
  77. package/dist/helpers/index.d.ts.map +1 -1
  78. package/dist/helpers/index.js +1 -0
  79. package/dist/helpers/index.js.map +1 -1
  80. package/dist/hooks/index.d.ts +2 -0
  81. package/dist/hooks/index.d.ts.map +1 -1
  82. package/dist/hooks/index.js +1 -0
  83. package/dist/hooks/index.js.map +1 -1
  84. package/dist/hooks/useNotifications.d.ts +30 -0
  85. package/dist/hooks/useNotifications.d.ts.map +1 -0
  86. package/dist/hooks/useNotifications.js +79 -0
  87. package/dist/hooks/useNotifications.js.map +1 -0
  88. package/dist/public/css/styles.css +6 -2
  89. package/package.json +1 -1
  90. package/public/css/styles.css +6 -2
  91. package/src/components/FormCardPayment.tsx +2 -2
  92. package/src/components/FormSubmissionEdit.tsx +5 -6
  93. package/src/components/PageHeader.tsx +107 -0
  94. package/src/components/PersonAvatar.tsx +78 -0
  95. package/src/components/header/SiteHeader.tsx +131 -8
  96. package/src/components/header/SupportDrawer.tsx +1 -1
  97. package/src/components/index.tsx +2 -0
  98. package/src/components/notes/AddNote.tsx +105 -19
  99. package/src/components/notes/Note.tsx +43 -22
  100. package/src/components/notes/Notes.tsx +160 -21
  101. package/src/components/wrapper/ChurchList.tsx +45 -5
  102. package/src/components/wrapper/NewPrivateMessage.tsx +181 -44
  103. package/src/components/wrapper/Notifications.tsx +164 -29
  104. package/src/components/wrapper/PrivateMessageDetails.tsx +100 -13
  105. package/src/components/wrapper/PrivateMessages.tsx +539 -65
  106. package/src/components/wrapper/UserMenu.tsx +217 -34
  107. package/src/components/wrapper/index.tsx +3 -2
  108. package/src/helpers/ArrayHelper.ts +0 -1
  109. package/src/helpers/ErrorHelper.ts +1 -1
  110. package/src/helpers/EventHelper.ts +0 -3
  111. package/src/helpers/Locale.ts +7 -2
  112. package/src/helpers/NotificationService.ts +211 -0
  113. package/src/helpers/SocketHelper.ts +23 -17
  114. package/src/helpers/UserHelper.ts +2 -2
  115. package/src/helpers/index.ts +2 -0
  116. package/src/hooks/index.ts +2 -0
  117. package/src/hooks/useNotifications.ts +94 -0
  118. package/dist/components/wrapper/Drawers.d.ts +0 -5
  119. package/dist/components/wrapper/Drawers.d.ts.map +0 -1
  120. package/dist/components/wrapper/Drawers.js +0 -49
  121. package/dist/components/wrapper/Drawers.js.map +0 -1
  122. package/dist/components/wrapper/SiteWrapper.d.ts +0 -15
  123. package/dist/components/wrapper/SiteWrapper.d.ts.map +0 -1
  124. package/dist/components/wrapper/SiteWrapper.js +0 -60
  125. package/dist/components/wrapper/SiteWrapper.js.map +0 -1
  126. package/dist/components/wrapper/TabPanel.d.ts +0 -9
  127. package/dist/components/wrapper/TabPanel.d.ts.map +0 -1
  128. package/dist/components/wrapper/TabPanel.js +0 -17
  129. package/dist/components/wrapper/TabPanel.js.map +0 -1
  130. package/dist/helpers/ApiHelper.d.ts +0 -18
  131. package/dist/helpers/ApiHelper.d.ts.map +0 -1
  132. package/dist/helpers/ApiHelper.js +0 -119
  133. package/dist/helpers/ApiHelper.js.map +0 -1
  134. package/src/components/wrapper/Drawers.tsx +0 -62
  135. package/src/components/wrapper/SiteWrapper.tsx +0 -110
  136. package/src/components/wrapper/TabPanel.tsx +0 -32
  137. package/src/helpers/ApiHelper.ts +0 -127
@@ -1,62 +0,0 @@
1
- "use client";
2
-
3
- import { AppBar, Drawer, styled } from "@mui/material";
4
-
5
- export const OpenDrawer = (styles:any) => styled(Drawer)(
6
- ({ theme }) => ({
7
- "& .MuiDrawer-paper": {
8
- position: "relative",
9
- backgroundColor: styles.backgroundColor || theme.palette.primary.main,
10
- color: "#FFFFFF",
11
- whiteSpace: "nowrap",
12
- width: "100vw",
13
- zIndex: 9999,
14
- [theme.breakpoints.up("md")]: { width: 220 },
15
- transition: theme.transitions.create("width", {
16
- easing: theme.transitions.easing.sharp,
17
- duration: theme.transitions.duration.enteringScreen
18
- }),
19
- boxSizing: "border-box"
20
- },
21
- "& .MuiListItemButton-root, & .MuiListItemIcon-root": { color: "#FFFFFF" }
22
- })
23
- );
24
-
25
- export const ClosedDrawer = (styles:any) => styled(OpenDrawer(styles))(
26
- ({ theme }) => ({
27
- overflowX: "hidden",
28
- transition: theme.transitions.create("width", {
29
- easing: theme.transitions.easing.sharp,
30
- duration: theme.transitions.duration.leavingScreen
31
- }),
32
- zIndex: 1,
33
- width: theme.spacing(7),
34
- [theme.breakpoints.up("sm")]: { width: theme.spacing(7) },
35
- "& .MuiListSubheader-root": {
36
- opacity: 0
37
- }
38
- })
39
- );
40
-
41
- export const ClosedDrawerAppBar = styled(AppBar)(
42
- ({ theme }) => ({
43
- zIndex: theme.zIndex.drawer + 1,
44
- transition: theme.transitions.create(["width", "margin"], {
45
- easing: theme.transitions.easing.sharp,
46
- duration: theme.transitions.duration.leavingScreen
47
- }),
48
- "& .MuiIcon-root": { color: "#FFFFFF" }
49
- })
50
- );
51
-
52
- export const OpenDrawerAppBar = styled(ClosedDrawerAppBar)(
53
- ({ theme }) => ({
54
- marginLeft: 220,
55
- width: `calc(100% - ${220}px)`,
56
- transition: theme.transitions.create(["width", "margin"], {
57
- easing: theme.transitions.easing.sharp,
58
- duration: theme.transitions.duration.enteringScreen
59
- })
60
- })
61
- );
62
-
@@ -1,110 +0,0 @@
1
- "use client";
2
-
3
- import React, { CSSProperties, useCallback, useMemo } from "react";
4
- import { IconButton, Toolbar, Icon, Typography, Box, Container, Link } from "@mui/material";
5
- import { UserHelper, AppearanceHelper, PersonHelper, AppearanceInterface, ApiHelper } from "../../helpers";
6
- import { UserMenu } from "./UserMenu";
7
- import { UserContextInterface } from "@churchapps/helpers";
8
- import { useMountedState } from "../../hooks/useMountedState";
9
- import { SocketHelper } from "../../helpers/SocketHelper";
10
- import { ClosedDrawer, ClosedDrawerAppBar, OpenDrawer, OpenDrawerAppBar } from "./Drawers";
11
-
12
- interface Props {
13
- navContent: React.ReactElement,
14
- context: UserContextInterface,
15
- children: React.ReactNode,
16
- appName: string,
17
- onNavigate: (url: string) => void,
18
- appearance?: AppearanceInterface,
19
- omitOverflow?: boolean
20
- }
21
-
22
- export const SiteWrapper: React.FC<Props> = props => {
23
- const [churchLogo, setChurchLogo] = React.useState<string>();
24
- const [open, setOpen] = React.useState(false);
25
- const [notificationCounts, setNotificationCounts] = React.useState({notificationCount:0, pmCount:0});
26
- const toggleDrawer = useCallback(() => { setOpen(!open); }, [open]);
27
- const isMounted = useMountedState();
28
-
29
- const CustomDrawer = useMemo(() =>
30
- (open) ? OpenDrawer({backgroundColor:props.appearance?.wrapperBackground}) : ClosedDrawer({backgroundColor:props.appearance?.wrapperBackground}),
31
- [open, props.appearance?.wrapperBackground]
32
- );
33
- const CustomAppBar = useMemo(() => (open) ? OpenDrawerAppBar : ClosedDrawerAppBar, [open]);
34
-
35
- const loadCounts = useCallback(() => {
36
- ApiHelper.get("/notifications/unreadCount", "MessagingApi").then(data => {
37
- if (!notificationCounts || JSON.stringify(notificationCounts) !== JSON.stringify(data)) setNotificationCounts(data);
38
- });
39
- }, [notificationCounts]);
40
-
41
- const handleNotification = useCallback(() => {
42
- loadCounts();
43
- }, [loadCounts]);
44
-
45
-
46
-
47
- React.useEffect(() => {
48
- const getChurchLogo = async () => {
49
- if (UserHelper.currentUserChurch) {
50
- setChurchLogo(AppearanceHelper.getLogoDark(props.appearance, "/images/logo-wrapper.png"));
51
- }
52
- }
53
-
54
- if (!isMounted()) {
55
- getChurchLogo();
56
- }
57
- }, [isMounted, props.appearance]);
58
-
59
-
60
- React.useEffect(() => {
61
- if (!props.context.userChurch) SocketHelper.setPersonChurch({personId:null, churchId:null});
62
- else SocketHelper.setPersonChurch({personId:props.context.userChurch?.person?.id, churchId:props.context.userChurch?.church?.id});
63
- }, [props.context.userChurch]);
64
-
65
- React.useEffect(() => {
66
- SocketHelper.addHandler("notification", "notificationBell", handleNotification);
67
- SocketHelper.init();
68
- loadCounts();
69
-
70
- // Cleanup function to remove handlers and disconnect socket
71
- return () => {
72
- SocketHelper.removeHandler("notificationBell");
73
- };
74
- }, [handleNotification, loadCounts]);
75
-
76
- const boxStyle: CSSProperties = useMemo(() => {
77
- const style: CSSProperties = { flexGrow: 1, marginTop: 8, minHeight: "90vh" };
78
- if (!props.omitOverflow) style.overflow = "auto";
79
- return style;
80
- }, [props.omitOverflow]);
81
-
82
- return <>
83
- <CustomAppBar position="absolute">
84
- <Toolbar sx={{ pr: "24px", backgroundColor: props.appearance?.wrapperBackground }}>
85
- <IconButton edge="start" color="inherit" aria-label="open drawer" onClick={toggleDrawer} sx={{ marginRight: "36px", ...(open && { display: "none" }) }} data-testid="open-navigation-drawer">
86
- <Icon>menu</Icon>
87
- </IconButton>
88
- <Typography variant="h6" noWrap>{UserHelper.currentUserChurch?.church?.name || ""}</Typography>
89
- <div style={{ flex: 1 }}></div>
90
- {UserHelper.user && <UserMenu profilePicture={PersonHelper.getPhotoUrl(props.context?.person)} userName={`${UserHelper.user?.firstName} ${UserHelper.user?.lastName}`} userChurches={UserHelper.userChurches} currentUserChurch={UserHelper.currentUserChurch} context={props.context} appName={props.appName} onNavigate={props.onNavigate} loadCounts={loadCounts} notificationCounts={notificationCounts} />}
91
- {!UserHelper.user && <Link href="/login" color="inherit" style={{ textDecoration: "none" }}>Login</Link>}
92
- </Toolbar>
93
- </CustomAppBar>
94
-
95
- <CustomDrawer style={{ backgroundColor: props.appearance?.wrapperBackground }} variant="permanent" open={open} onMouseOver={useCallback(() => setOpen(true), [])} onMouseLeave={useCallback(() => setOpen(false), [])}>
96
- <Toolbar sx={{ display: "flex", alignItems: "center", width: "100%", px: [1] }}>
97
- <img src={churchLogo || "/images/logo-wrapper.png"} alt="logo" style={{ maxWidth: 170 }} />
98
- <div style={{ justifyContent: "flex-end", flex: 1, display: "flex" }}>
99
- <IconButton onClick={toggleDrawer} aria-label="close navigation drawer" data-testid="close-navigation-drawer"><Icon style={{ color: "#FFFFFF" }}>chevron_left</Icon></IconButton>
100
- </div>
101
- </Toolbar>
102
- {props.navContent}
103
- </CustomDrawer>
104
- <Box component="main" sx={boxStyle}>
105
- <Container maxWidth={false} sx={{ mt: 4, mb: 4 }}>
106
- {props.children}
107
- </Container>
108
- </Box>
109
- </>
110
- };
@@ -1,32 +0,0 @@
1
- "use client";
2
-
3
- import React from "react";
4
- import { Box, styled } from "@mui/material";
5
-
6
- interface TabPanelProps { children?: React.ReactNode; index: number; value: number; }
7
-
8
- const StyledMenuBox = styled(Box)(
9
- ({ theme }) => ({
10
- paddingTop: 10,
11
- "& .MuiListItemButton-root": { paddingLeft: 30 },
12
- "& .MuiListItemIcon-root": {
13
- color: theme.palette.primary.main
14
- },
15
- "& .MuiListItemText-root": { color: theme.palette.text.primary },
16
- "& .selected .MuiListItemText-root span": { fontWeight: "bold" }
17
- })
18
- );
19
-
20
- export function TabPanel(props: TabPanelProps) {
21
- const { children, value, index } = props;
22
-
23
- return (
24
- <div role="tabpanel" hidden={value !== index} id={`userMenuPanel-${index}`}>
25
- {value === index && (
26
- <StyledMenuBox>
27
- <Box>{children}</Box>
28
- </StyledMenuBox>
29
- )}
30
- </div>
31
- );
32
- }
@@ -1,127 +0,0 @@
1
- import { ApiConfig, RolePermissionInterface, ApiListType } from "@churchapps/helpers";
2
- import { ErrorHelper } from "./ErrorHelper";
3
-
4
- export class ApiHelper {
5
-
6
- static apiConfigs: ApiConfig[] = [];
7
- static isAuthenticated = false;
8
-
9
- static getConfig(keyName: string) {
10
- let result: ApiConfig;
11
- this.apiConfigs.forEach(config => { if (config.keyName === keyName) result = config });
12
- //if (result === null) throw new Error("Unconfigured API: " + keyName);
13
- return result;
14
- }
15
-
16
- static setDefaultPermissions(jwt: string) {
17
- this.apiConfigs.forEach(config => {
18
- config.jwt = jwt;
19
- config.permissions = [];
20
- });
21
- this.isAuthenticated = true;
22
- }
23
-
24
- static setPermissions(keyName: string, jwt: string, permissions: RolePermissionInterface[]) {
25
- this.apiConfigs.forEach(config => {
26
- if (config.keyName === keyName) {
27
- config.jwt = jwt;
28
- config.permissions = permissions;
29
- }
30
- });
31
- this.isAuthenticated = true;
32
- }
33
-
34
- static clearPermissions() {
35
- this.apiConfigs.forEach(config => { config.jwt = ""; config.permissions = []; });
36
- this.isAuthenticated = false;
37
- }
38
-
39
- static async get(path: string, apiName: ApiListType) {
40
- const config = this.getConfig(apiName);
41
- const requestOptions = {
42
- method: "GET",
43
- headers: { Authorization: "Bearer " + config.jwt },
44
- cache: "no-store"
45
- };
46
-
47
- return await this.fetchWithErrorHandling(config.url + path, requestOptions);
48
- }
49
-
50
- static async getAnonymous(path: string, apiName: ApiListType, tags?: string[]) {
51
- const config = this.getConfig(apiName);
52
- const requestOptions: RequestInit = { method: "GET" };
53
- if (tags?.length > 0) (requestOptions as any).next = { tags: tags };
54
- else requestOptions.cache = "no-store";
55
- return await this.fetchWithErrorHandling(config.url + path, requestOptions);
56
- }
57
-
58
- static async post(path: string, data: any[] | {}, apiName: ApiListType) {
59
- const config = this.getConfig(apiName);
60
- const requestOptions = {
61
- method: "POST",
62
- headers: { Authorization: "Bearer " + config.jwt, "Content-Type": "application/json" },
63
- body: JSON.stringify(data)
64
- };
65
- return await this.fetchWithErrorHandling(config.url + path, requestOptions);
66
- }
67
-
68
- static async patch(path: string, data: any[] | {}, apiName: ApiListType) {
69
- const config = this.getConfig(apiName);
70
- const requestOptions = {
71
- method: "PATCH",
72
- headers: { Authorization: "Bearer " + config.jwt, "Content-Type": "application/json" },
73
- body: JSON.stringify(data)
74
- };
75
- return await this.fetchWithErrorHandling(config.url + path, requestOptions);
76
- }
77
-
78
- static async delete(path: string, apiName: ApiListType) {
79
- const config = this.getConfig(apiName);
80
- const requestOptions = {
81
- method: "DELETE",
82
- headers: { Authorization: "Bearer " + config.jwt }
83
- };
84
- try {
85
- const response = await fetch(config.url + path, requestOptions);
86
- if (!response.ok) await this.throwApiError(response);
87
- } catch (e) {
88
- throw (e);
89
- }
90
- }
91
-
92
- static async postAnonymous(path: string, data: any[] | {}, apiName: ApiListType) {
93
- const config = this.getConfig(apiName);
94
- const requestOptions = {
95
- method: "POST",
96
- headers: { "Content-Type": "application/json" },
97
- body: JSON.stringify(data)
98
- };
99
- return await this.fetchWithErrorHandling(config.url + path, requestOptions);
100
- }
101
-
102
- static async fetchWithErrorHandling(url: string, requestOptions: any) {
103
- try {
104
- const response = await fetch(url, requestOptions);
105
- if (!response.ok) await this.throwApiError(response);
106
- else {
107
- if (response.status !== 204) {
108
- return response.json();
109
- }
110
- }
111
- } catch (e) {
112
- console.log("Failed to fetch from " + url);
113
- throw (e);
114
- }
115
- }
116
-
117
- private static async throwApiError(response: Response) {
118
- let msg = response.statusText;
119
- try {
120
- const json = await response.json();
121
- msg = json.errors[0];
122
- } catch { }
123
- ErrorHelper.logError(response.status.toString(), response.url, msg);
124
- throw new Error(msg || "Error");
125
- }
126
-
127
- }