@churchapps/apphelper 0.0.8 → 0.0.10
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.
- package/.eslintignore +3 -3
- package/.eslintrc.json +22 -22
- package/LICENSE +21 -21
- package/README.md +16 -16
- package/dist/components/ExportLink.d.ts.map +1 -1
- package/dist/components/ExportLink.js +10 -7
- package/dist/components/ExportLink.js.map +1 -1
- package/dist/components/markdownEditor/editor.css +787 -787
- package/dist/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
- package/dist/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
- package/dist/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
- package/dist/components/markdownEditor/images/icons/chevron-down.svg +2 -2
- package/dist/components/markdownEditor/images/icons/code.svg +2 -2
- package/dist/components/markdownEditor/images/icons/journal-code.svg +4 -4
- package/dist/components/markdownEditor/images/icons/journal-text.svg +4 -4
- package/dist/components/markdownEditor/images/icons/justify.svg +2 -2
- package/dist/components/markdownEditor/images/icons/link.svg +3 -3
- package/dist/components/markdownEditor/images/icons/list-ol.svg +3 -3
- package/dist/components/markdownEditor/images/icons/list-ul.svg +2 -2
- package/dist/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
- package/dist/components/markdownEditor/images/icons/text-center.svg +2 -2
- package/dist/components/markdownEditor/images/icons/text-left.svg +2 -2
- package/dist/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
- package/dist/components/markdownEditor/images/icons/text-right.svg +2 -2
- package/dist/components/markdownEditor/images/icons/type-bold.svg +2 -2
- package/dist/components/markdownEditor/images/icons/type-h1.svg +2 -2
- package/dist/components/markdownEditor/images/icons/type-h2.svg +2 -2
- package/dist/components/markdownEditor/images/icons/type-h3.svg +2 -2
- package/dist/components/markdownEditor/images/icons/type-h4.svg +12 -12
- package/dist/components/markdownEditor/images/icons/type-italic.svg +2 -2
- package/dist/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
- package/dist/components/markdownEditor/images/icons/type-underline.svg +2 -2
- package/package.json +84 -84
- package/src/components/CreatePerson.tsx +80 -80
- package/src/components/DisplayBox.tsx +68 -68
- package/src/components/ErrorMessages.tsx +26 -26
- package/src/components/ExportLink.tsx +67 -61
- package/src/components/FloatingSupport.tsx +16 -16
- package/src/components/FormSubmissionEdit.tsx +120 -120
- package/src/components/HelpIcon.tsx +10 -10
- package/src/components/ImageEditor.tsx +126 -126
- package/src/components/InputBox.tsx +73 -73
- package/src/components/Loading.tsx +29 -29
- package/src/components/PersonAdd.tsx +75 -75
- package/src/components/QuestionEdit.tsx +62 -62
- package/src/components/SmallButton.tsx +39 -39
- package/src/components/SupportModal.tsx +26 -26
- package/src/components/TabPanel.tsx +34 -34
- package/src/components/gallery/GalleryModal.tsx +102 -102
- package/src/components/gallery/StockPhotos.tsx +74 -74
- package/src/components/gallery/index.ts +1 -1
- package/src/components/index.tsx +23 -23
- package/src/components/markdownEditor/Editor.tsx +132 -132
- package/src/components/markdownEditor/MarkdownEditor.tsx +16 -16
- package/src/components/markdownEditor/MarkdownModal.tsx +46 -46
- package/src/components/markdownEditor/MarkdownPreview.tsx +14 -14
- package/src/components/markdownEditor/editor.css +787 -787
- package/src/components/markdownEditor/images/icons/arrow-clockwise.svg +3 -3
- package/src/components/markdownEditor/images/icons/arrow-counterclockwise.svg +3 -3
- package/src/components/markdownEditor/images/icons/chat-square-quote.svg +3 -3
- package/src/components/markdownEditor/images/icons/chevron-down.svg +2 -2
- package/src/components/markdownEditor/images/icons/code.svg +2 -2
- package/src/components/markdownEditor/images/icons/journal-code.svg +4 -4
- package/src/components/markdownEditor/images/icons/journal-text.svg +4 -4
- package/src/components/markdownEditor/images/icons/justify.svg +2 -2
- package/src/components/markdownEditor/images/icons/link.svg +3 -3
- package/src/components/markdownEditor/images/icons/list-ol.svg +3 -3
- package/src/components/markdownEditor/images/icons/list-ul.svg +2 -2
- package/src/components/markdownEditor/images/icons/pencil-fill.svg +2 -2
- package/src/components/markdownEditor/images/icons/text-center.svg +2 -2
- package/src/components/markdownEditor/images/icons/text-left.svg +2 -2
- package/src/components/markdownEditor/images/icons/text-paragraph.svg +2 -2
- package/src/components/markdownEditor/images/icons/text-right.svg +2 -2
- package/src/components/markdownEditor/images/icons/type-bold.svg +2 -2
- package/src/components/markdownEditor/images/icons/type-h1.svg +2 -2
- package/src/components/markdownEditor/images/icons/type-h2.svg +2 -2
- package/src/components/markdownEditor/images/icons/type-h3.svg +2 -2
- package/src/components/markdownEditor/images/icons/type-h4.svg +12 -12
- package/src/components/markdownEditor/images/icons/type-italic.svg +2 -2
- package/src/components/markdownEditor/images/icons/type-strikethrough.svg +2 -2
- package/src/components/markdownEditor/images/icons/type-underline.svg +2 -2
- package/src/components/markdownEditor/index.ts +2 -2
- package/src/components/markdownEditor/plugins/AutoLinkPlugin.tsx +35 -35
- package/src/components/markdownEditor/plugins/ControlledEditorPlugin.tsx +24 -24
- package/src/components/markdownEditor/plugins/ListMaxIndentLevelPlugin.tsx +68 -68
- package/src/components/markdownEditor/plugins/MarkdownTransformers.ts +106 -106
- package/src/components/markdownEditor/plugins/ReadOnlyPlugin.tsx +15 -15
- package/src/components/markdownEditor/plugins/ToolbarPlugin.tsx +401 -401
- package/src/components/markdownEditor/plugins/customLink/CustomLinkNode.tsx +224 -224
- package/src/components/markdownEditor/plugins/customLink/CustomLinkNodePlugin.tsx +32 -32
- package/src/components/markdownEditor/plugins/customLink/CustomLinkNodeTransformer.tsx +102 -102
- package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.tsx +243 -243
- package/src/components/markdownEditor/plugins/customLink/FloatingLinkEditor.types.ts +11 -11
- package/src/components/markdownEditor/plugins/emoji/EmojiNode.tsx +95 -95
- package/src/components/markdownEditor/plugins/emoji/EmojiNodeTransform.ts +41 -41
- package/src/components/markdownEditor/plugins/emoji/EmojiPickerPlugin.tsx +152 -152
- package/src/components/markdownEditor/plugins/emoji/EmojisPlugin.tsx +65 -65
- package/src/components/markdownEditor/plugins/index.ts +6 -6
- package/src/components/markdownEditor/theme.ts +65 -65
- package/src/components/material/AppList.tsx +20 -20
- package/src/components/material/ChurchList.tsx +22 -22
- package/src/components/material/NavItem.tsx +41 -41
- package/src/components/material/NewPrivateMessage.tsx +103 -103
- package/src/components/material/PrivateMessageDetails.tsx +23 -23
- package/src/components/material/PrivateMessages.tsx +87 -87
- package/src/components/material/SiteWrapper.tsx +140 -140
- package/src/components/material/UserMenu.tsx +141 -141
- package/src/components/material/iconPicker/IconNamesList.ts +2240 -2240
- package/src/components/material/iconPicker/IconPicker.tsx +153 -153
- package/src/components/material/index.tsx +6 -6
- package/src/components/notes/AddNote.tsx +90 -90
- package/src/components/notes/Conversation.tsx +82 -82
- package/src/components/notes/Conversations.tsx +58 -58
- package/src/components/notes/NewConversation.tsx +78 -78
- package/src/components/notes/Note.tsx +44 -44
- package/src/components/notes/Notes.tsx +52 -52
- package/src/components/notes/index.ts +5 -5
- package/src/components/reporting/ChartReport.tsx +98 -98
- package/src/components/reporting/ReportFilter.tsx +54 -54
- package/src/components/reporting/ReportFilterField.tsx +160 -160
- package/src/components/reporting/ReportOutput.tsx +79 -79
- package/src/components/reporting/ReportWithFilter.tsx +70 -70
- package/src/components/reporting/TableReport.tsx +57 -57
- package/src/components/reporting/TreeReport.tsx +111 -111
- package/src/components/reporting/index.ts +4 -4
- package/src/donationComponents/DonationPage.tsx +136 -136
- package/src/donationComponents/components/BankForm.tsx +159 -159
- package/src/donationComponents/components/CardForm.tsx +104 -104
- package/src/donationComponents/components/DonationForm.tsx +235 -235
- package/src/donationComponents/components/FundDonation.tsx +49 -49
- package/src/donationComponents/components/FundDonations.tsx +39 -39
- package/src/donationComponents/components/NonAuthDonation.tsx +31 -31
- package/src/donationComponents/components/NonAuthDonationInner.tsx +259 -259
- package/src/donationComponents/components/PaymentMethods.tsx +135 -135
- package/src/donationComponents/components/RecurringDonations.tsx +121 -121
- package/src/donationComponents/components/RecurringDonationsEdit.tsx +93 -93
- package/src/donationComponents/components/index.tsx +9 -9
- package/src/donationComponents/index.ts +3 -3
- package/src/donationComponents/modals/DonationPreviewModal.tsx +66 -66
- package/src/helpers/AnalyticsHelper.ts +33 -33
- package/src/helpers/ApiHelper.ts +125 -125
- package/src/helpers/AppearanceHelper.ts +69 -69
- package/src/helpers/ArrayHelper.ts +81 -81
- package/src/helpers/CommonEnvironmentHelper.ts +80 -80
- package/src/helpers/CurrencyHelper.ts +10 -10
- package/src/helpers/DateHelper.ts +108 -108
- package/src/helpers/DonationHelper.ts +26 -26
- package/src/helpers/ErrorHelper.ts +36 -36
- package/src/helpers/EventHelper.ts +52 -52
- package/src/helpers/FileHelper.ts +31 -31
- package/src/helpers/PersonHelper.ts +60 -60
- package/src/helpers/SocketHelper.ts +76 -76
- package/src/helpers/Themes.ts +14 -14
- package/src/helpers/UniqueIdHelper.ts +36 -36
- package/src/helpers/UserHelper.ts +59 -59
- package/src/helpers/createEmotionCache.ts +17 -17
- package/src/helpers/index.ts +18 -18
- package/src/hooks/index.ts +1 -1
- package/src/hooks/useMountedState.ts +16 -16
- package/src/index.ts +6 -6
- package/src/interfaces/Access.ts +24 -24
- package/src/interfaces/Attendance.ts +8 -8
- package/src/interfaces/Content.ts +10 -10
- package/src/interfaces/Doing.ts +24 -24
- package/src/interfaces/Donation.ts +45 -45
- package/src/interfaces/Error.ts +17 -17
- package/src/interfaces/Membership.ts +51 -51
- package/src/interfaces/Messaging.ts +20 -20
- package/src/interfaces/Permissions.ts +68 -68
- package/src/interfaces/Reporting.ts +7 -7
- package/src/interfaces/UserContextInterface.ts +13 -13
- package/src/interfaces/index.ts +13 -13
- package/src/pageComponents/LoginPage.tsx +244 -244
- package/src/pageComponents/LogoutPage.tsx +28 -28
- package/src/pageComponents/components/Forgot.tsx +79 -79
- package/src/pageComponents/components/Login.tsx +54 -54
- package/src/pageComponents/components/LoginSetPassword.tsx +63 -63
- package/src/pageComponents/components/Register.tsx +107 -107
- package/src/pageComponents/components/SelectChurchModal.tsx +41 -41
- package/src/pageComponents/components/SelectChurchRegister.tsx +88 -88
- package/src/pageComponents/components/SelectChurchSearch.tsx +69 -69
- package/src/pageComponents/components/SelectableChurch.tsx +38 -38
- package/src/pageComponents/index.ts +3 -3
- package/tsconfig.json +34 -34
- package/tslint.json +14 -14
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { LoginUserChurchInterface, UserInterface } from "./Access";
|
|
2
|
-
import { PersonInterface } from "./Membership";
|
|
3
|
-
|
|
4
|
-
export interface UserContextInterface {
|
|
5
|
-
user: UserInterface,
|
|
6
|
-
setUser: (user: UserInterface) => void,
|
|
7
|
-
person: PersonInterface,
|
|
8
|
-
setPerson: (person: PersonInterface) => void,
|
|
9
|
-
userChurch: LoginUserChurchInterface,
|
|
10
|
-
setUserChurch: (userChurch: LoginUserChurchInterface) => void,
|
|
11
|
-
userChurches: LoginUserChurchInterface[],
|
|
12
|
-
setUserChurches: (userChurches: LoginUserChurchInterface[]) => void,
|
|
13
|
-
}
|
|
1
|
+
import { LoginUserChurchInterface, UserInterface } from "./Access";
|
|
2
|
+
import { PersonInterface } from "./Membership";
|
|
3
|
+
|
|
4
|
+
export interface UserContextInterface {
|
|
5
|
+
user: UserInterface,
|
|
6
|
+
setUser: (user: UserInterface) => void,
|
|
7
|
+
person: PersonInterface,
|
|
8
|
+
setPerson: (person: PersonInterface) => void,
|
|
9
|
+
userChurch: LoginUserChurchInterface,
|
|
10
|
+
setUserChurch: (userChurch: LoginUserChurchInterface) => void,
|
|
11
|
+
userChurches: LoginUserChurchInterface[],
|
|
12
|
+
setUserChurches: (userChurches: LoginUserChurchInterface[]) => void,
|
|
13
|
+
}
|
package/src/interfaces/index.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export * from "./Error";
|
|
2
|
-
export * from "./UserContextInterface";
|
|
3
|
-
export * from "./Permissions"
|
|
4
|
-
|
|
5
|
-
// API interfaces
|
|
6
|
-
export * from "./Access";
|
|
7
|
-
export * from "./Attendance";
|
|
8
|
-
export * from "./Content";
|
|
9
|
-
export * from "./Doing";
|
|
10
|
-
export * from "./Donation";
|
|
11
|
-
export * from "./Membership";
|
|
12
|
-
export * from "./Messaging";
|
|
13
|
-
export * from "./Reporting";
|
|
1
|
+
export * from "./Error";
|
|
2
|
+
export * from "./UserContextInterface";
|
|
3
|
+
export * from "./Permissions"
|
|
4
|
+
|
|
5
|
+
// API interfaces
|
|
6
|
+
export * from "./Access";
|
|
7
|
+
export * from "./Attendance";
|
|
8
|
+
export * from "./Content";
|
|
9
|
+
export * from "./Doing";
|
|
10
|
+
export * from "./Donation";
|
|
11
|
+
export * from "./Membership";
|
|
12
|
+
export * from "./Messaging";
|
|
13
|
+
export * from "./Reporting";
|
|
@@ -1,244 +1,244 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
import { ErrorMessages, FloatingSupport, Loading } from "../components";
|
|
3
|
-
import { LoginResponseInterface, UserContextInterface, ChurchInterface, UserInterface, LoginUserChurchInterface } from "../interfaces";
|
|
4
|
-
import { AnalyticsHelper, ApiHelper, ArrayHelper, UserHelper } from "../helpers";
|
|
5
|
-
import { useCookies } from "react-cookie"
|
|
6
|
-
import jwt_decode from "jwt-decode"
|
|
7
|
-
import { Register } from "./components/Register"
|
|
8
|
-
import { SelectChurchModal } from "./components/SelectChurchModal"
|
|
9
|
-
import { Forgot } from "./components/Forgot";
|
|
10
|
-
import { Alert, Box, PaperProps, Typography } from "@mui/material";
|
|
11
|
-
import { Login } from "./components/Login";
|
|
12
|
-
import { LoginSetPassword } from "./components/LoginSetPassword";
|
|
13
|
-
import { CommonEnvironmentHelper } from "../helpers/CommonEnvironmentHelper";
|
|
14
|
-
import ga4 from "react-ga4";
|
|
15
|
-
|
|
16
|
-
interface Props {
|
|
17
|
-
context: UserContextInterface,
|
|
18
|
-
jwt: string,
|
|
19
|
-
auth: string,
|
|
20
|
-
keyName?: string,
|
|
21
|
-
logo?: string,
|
|
22
|
-
appName?: string,
|
|
23
|
-
appUrl?: string,
|
|
24
|
-
returnUrl?: string,
|
|
25
|
-
loginSuccessOverride?: () => void,
|
|
26
|
-
userRegisteredCallback?: (user: UserInterface) => Promise<void>;
|
|
27
|
-
churchRegisteredCallback?: (church: ChurchInterface) => Promise<void>;
|
|
28
|
-
callbackErrors?: string[];
|
|
29
|
-
showLogo?: boolean;
|
|
30
|
-
loginContainerCssProps?: PaperProps;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export const LoginPage: React.FC<Props> = ({ showLogo = true, loginContainerCssProps, ...props }) => {
|
|
34
|
-
const [welcomeBackName, setWelcomeBackName] = React.useState("");
|
|
35
|
-
const [pendingAutoLogin, setPendingAutoLogin] = React.useState(false);
|
|
36
|
-
const [errors, setErrors] = React.useState([]);
|
|
37
|
-
const [cookies, setCookie] = useCookies(["jwt", "name", "email"]);
|
|
38
|
-
const [showForgot, setShowForgot] = React.useState(false);
|
|
39
|
-
const [showRegister, setShowRegister] = React.useState(false);
|
|
40
|
-
const [showSelectModal, setShowSelectModal] = React.useState(false);
|
|
41
|
-
const [loginResponse, setLoginResponse] = React.useState<LoginResponseInterface>(null)
|
|
42
|
-
const [userJwt, setUserJwt] = React.useState("");
|
|
43
|
-
const [isSubmitting, setIsSubmitting] = React.useState(false);
|
|
44
|
-
|
|
45
|
-
const loginFormRef = React.useRef(null);
|
|
46
|
-
const location = typeof window !== "undefined" && window.location;
|
|
47
|
-
let selectedChurchId = "";
|
|
48
|
-
let registeredChurch: ChurchInterface = null;
|
|
49
|
-
let userJwtBackup = ""; //use state copy for storing between page updates. This copy for instant availability.
|
|
50
|
-
|
|
51
|
-
const cleanAppUrl = () => {
|
|
52
|
-
if (!props.appUrl) return null;
|
|
53
|
-
else {
|
|
54
|
-
const index = props.appUrl.indexOf("/", 9);
|
|
55
|
-
if (index === -1) return props.appUrl;
|
|
56
|
-
else return props.appUrl.substring(0, index);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
React.useEffect(() => {
|
|
61
|
-
if (props.callbackErrors?.length > 0) {
|
|
62
|
-
setErrors(props.callbackErrors)
|
|
63
|
-
}
|
|
64
|
-
}, [props.callbackErrors])
|
|
65
|
-
|
|
66
|
-
const init = () => {
|
|
67
|
-
const search = new URLSearchParams(location?.search);
|
|
68
|
-
const action = search.get("action");
|
|
69
|
-
if (action === "forgot") setShowForgot(true);
|
|
70
|
-
else if (action === "register") setShowRegister(true);
|
|
71
|
-
else {
|
|
72
|
-
if (!props.auth && props.jwt) {
|
|
73
|
-
setWelcomeBackName(cookies.name);
|
|
74
|
-
login({ jwt: props.jwt });
|
|
75
|
-
setPendingAutoLogin(true);
|
|
76
|
-
} else {
|
|
77
|
-
setPendingAutoLogin(false);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
const handleLoginSuccess = async (resp: LoginResponseInterface) => {
|
|
83
|
-
userJwtBackup = resp.user.jwt;
|
|
84
|
-
setUserJwt(userJwtBackup);
|
|
85
|
-
ApiHelper.setDefaultPermissions(resp.user.jwt);
|
|
86
|
-
setLoginResponse(resp)
|
|
87
|
-
resp.userChurches.forEach(uc => { if (!uc.apis) uc.apis = []; });
|
|
88
|
-
UserHelper.userChurches = resp.userChurches;
|
|
89
|
-
|
|
90
|
-
setCookie("name", `${resp.user.firstName} ${resp.user.lastName}`, { path: "/" });
|
|
91
|
-
setCookie("email", resp.user.email, { path: "/" });
|
|
92
|
-
UserHelper.user = resp.user;
|
|
93
|
-
|
|
94
|
-
if (props.jwt) {
|
|
95
|
-
const decoded: any = jwt_decode(userJwtBackup)
|
|
96
|
-
selectedChurchId = decoded.churchId
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const search = new URLSearchParams(location?.search);
|
|
100
|
-
const churchIdInParams = search.get("churchId");
|
|
101
|
-
|
|
102
|
-
if (props.keyName) selectChurchByKeyName();
|
|
103
|
-
else if (selectedChurchId) selectChurchById();
|
|
104
|
-
else if (churchIdInParams) selectChurch(churchIdInParams);
|
|
105
|
-
else setShowSelectModal(true);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const selectChurchById = async () => {
|
|
109
|
-
await UserHelper.selectChurch(props.context, selectedChurchId, undefined);
|
|
110
|
-
|
|
111
|
-
if (registeredChurch) {
|
|
112
|
-
AnalyticsHelper.logEvent("Church", "Register", UserHelper.currentUserChurch.church.name);
|
|
113
|
-
try {
|
|
114
|
-
if (CommonEnvironmentHelper.GoogleAnalyticsTag && typeof(window)!=="undefined") {
|
|
115
|
-
ga4.gtag("event", "conversion", { send_to: "AW-427967381/Ba2qCLrXgJoYEJWHicwB" });
|
|
116
|
-
}
|
|
117
|
-
} catch {}
|
|
118
|
-
}
|
|
119
|
-
else AnalyticsHelper.logEvent("Church", "Select", UserHelper.currentUserChurch.church.name);
|
|
120
|
-
|
|
121
|
-
if (props.churchRegisteredCallback && registeredChurch) {
|
|
122
|
-
await props.churchRegisteredCallback(registeredChurch)
|
|
123
|
-
registeredChurch = null;
|
|
124
|
-
login({ jwt: userJwt || userJwtBackup });
|
|
125
|
-
} else await continueLoginProcess();
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const selectChurchByKeyName = async () => {
|
|
129
|
-
if (!ArrayHelper.getOne(UserHelper.userChurches, "church.subDomain", props.keyName)) {
|
|
130
|
-
const userChurch: LoginUserChurchInterface = await ApiHelper.post("/churches/select", { subDomain: props.keyName }, "MembershipApi");
|
|
131
|
-
UserHelper.setupApiHelper(userChurch);
|
|
132
|
-
//create/claim the person record and relogin
|
|
133
|
-
await ApiHelper.get("/people/claim/" + userChurch.church.id, "MembershipApi");
|
|
134
|
-
login({ jwt: userJwt || userJwtBackup });
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
await UserHelper.selectChurch(props.context, undefined, props.keyName);
|
|
138
|
-
await continueLoginProcess()
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
async function continueLoginProcess() {
|
|
143
|
-
if (UserHelper.currentUserChurch) {
|
|
144
|
-
UserHelper.currentUserChurch.apis.forEach(api => {
|
|
145
|
-
if (api.keyName === "MembershipApi") setCookie("jwt", api.jwt, { path: "/" });
|
|
146
|
-
})
|
|
147
|
-
try {
|
|
148
|
-
if (UserHelper.currentUserChurch.church.id) ApiHelper.patch(`/userChurch/${UserHelper.user.id}`, { churchId: UserHelper.currentUserChurch.church.id, appName: props.appName, lastAccessed: new Date() }, "MembershipApi")
|
|
149
|
-
} catch (e) {
|
|
150
|
-
console.log("Could not update user church accessed date")
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
if (props.loginSuccessOverride !== undefined) props.loginSuccessOverride();
|
|
155
|
-
else {
|
|
156
|
-
props.context.setUser(UserHelper.user);
|
|
157
|
-
props.context.setUserChurches(UserHelper.userChurches)
|
|
158
|
-
props.context.setUserChurch(UserHelper.currentUserChurch)
|
|
159
|
-
try {
|
|
160
|
-
const p = await ApiHelper.get(`/people/${UserHelper.currentUserChurch.person?.id}`, "MembershipApi");
|
|
161
|
-
if (p) props.context.setPerson(p);
|
|
162
|
-
} catch {
|
|
163
|
-
console.log("claiming person");
|
|
164
|
-
const personClaim = await ApiHelper.get("/people/claim/" + UserHelper.currentUserChurch.church.id, "MembershipApi");
|
|
165
|
-
props.context.setPerson(personClaim);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
async function selectChurch(churchId: string) {
|
|
171
|
-
try {
|
|
172
|
-
setErrors([])
|
|
173
|
-
selectedChurchId = churchId;
|
|
174
|
-
if (!ArrayHelper.getOne(UserHelper.userChurches, "church.id", churchId)) {
|
|
175
|
-
const userChurch: LoginUserChurchInterface = await ApiHelper.post("/churches/select", { churchId: churchId }, "MembershipApi");
|
|
176
|
-
UserHelper.setupApiHelper(userChurch);
|
|
177
|
-
|
|
178
|
-
//create/claim the person record and relogin
|
|
179
|
-
await ApiHelper.get("/people/claim/" + churchId, "MembershipApi");
|
|
180
|
-
login({ jwt: userJwt || userJwtBackup });
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
UserHelper.selectChurch(props.context, churchId, null).then(() => { continueLoginProcess() });
|
|
184
|
-
} catch (err) {
|
|
185
|
-
console.log("Error in selecting church: ", err)
|
|
186
|
-
setErrors(["Error in selecting church. Please verify and try again"])
|
|
187
|
-
loginFormRef?.current?.setSubmitting(false);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
const handleLoginErrors = (errors: string[]) => {
|
|
193
|
-
setWelcomeBackName("");
|
|
194
|
-
console.log(errors);
|
|
195
|
-
setErrors(["Invalid login. Please check your email or password."]);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
const login = async (data: any) => {
|
|
199
|
-
setErrors([])
|
|
200
|
-
setIsSubmitting(true);
|
|
201
|
-
try {
|
|
202
|
-
const resp: LoginResponseInterface = await ApiHelper.postAnonymous("/users/login", data, "MembershipApi");
|
|
203
|
-
setIsSubmitting(false);
|
|
204
|
-
handleLoginSuccess(resp);
|
|
205
|
-
} catch (e: any) {
|
|
206
|
-
setPendingAutoLogin(false);
|
|
207
|
-
handleLoginErrors([e.toString()]);
|
|
208
|
-
setIsSubmitting(false);
|
|
209
|
-
}
|
|
210
|
-
};
|
|
211
|
-
|
|
212
|
-
const getWelcomeBack = () => { if (welcomeBackName !== "") return (<><Alert severity="info">Welcome back, <b>{welcomeBackName}</b>! Please wait while we load your data.</Alert><Loading /></>); }
|
|
213
|
-
const getCheckEmail = () => { if (new URLSearchParams(location?.search).get("checkEmail") === "1") return <Alert severity="info"> Thank you for registering. Please check your email to continue.</Alert> }
|
|
214
|
-
const handleRegisterCallback = () => { setShowForgot(false); setShowRegister(true); }
|
|
215
|
-
const handleLoginCallback = () => { setShowForgot(false); setShowRegister(false); }
|
|
216
|
-
const handleChurchRegistered = (church: ChurchInterface) => { registeredChurch = church; }
|
|
217
|
-
|
|
218
|
-
const getInputBox = () => {
|
|
219
|
-
if (showRegister) return (
|
|
220
|
-
<Box id="loginBox" sx={{ backgroundColor: "#FFF", border: "1px solid #CCC", borderRadius: "5px", padding: "20px" }}>
|
|
221
|
-
<Typography component="h2" sx={{ fontSize: "32px", fontWeight: 500, lineHeight: 1.2, margin: "0 0 8px 0" }}>Create an Account</Typography>
|
|
222
|
-
<Register updateErrors={setErrors} appName={props.appName} appUrl={cleanAppUrl()} loginCallback={handleLoginCallback} userRegisteredCallback={props.userRegisteredCallback} />
|
|
223
|
-
</Box>
|
|
224
|
-
);
|
|
225
|
-
else if (showForgot) return (<Forgot registerCallback={handleRegisterCallback} loginCallback={handleLoginCallback} />);
|
|
226
|
-
else if (props.auth) return (<LoginSetPassword setErrors={setErrors} setShowForgot={setShowForgot} isSubmitting={isSubmitting} auth={props.auth} login={login} appName={props.appName} appUrl={cleanAppUrl()} />)
|
|
227
|
-
else return <Login setShowRegister={setShowRegister} setShowForgot={setShowForgot} setErrors={setErrors} isSubmitting={isSubmitting} login={login} mainContainerCssProps={loginContainerCssProps} />;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
React.useEffect(init, []); //eslint-disable-line
|
|
231
|
-
|
|
232
|
-
return (
|
|
233
|
-
<Box sx={{ maxWidth: "382px" }} px="16px" mx="auto">
|
|
234
|
-
{showLogo && <img src={props.logo || "/images/logo-login.png"} alt="logo" style={{ width: "100%", marginTop: 100, marginBottom: 60 }} />}
|
|
235
|
-
<ErrorMessages errors={errors} />
|
|
236
|
-
{getWelcomeBack()}
|
|
237
|
-
{getCheckEmail()}
|
|
238
|
-
{!pendingAutoLogin && getInputBox()}
|
|
239
|
-
<SelectChurchModal show={showSelectModal} userChurches={loginResponse?.userChurches} selectChurch={selectChurch} registeredChurchCallback={handleChurchRegistered} errors={errors} appName={props.appName} />
|
|
240
|
-
<FloatingSupport appName={props.appName} />
|
|
241
|
-
</Box>
|
|
242
|
-
);
|
|
243
|
-
|
|
244
|
-
};
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { ErrorMessages, FloatingSupport, Loading } from "../components";
|
|
3
|
+
import { LoginResponseInterface, UserContextInterface, ChurchInterface, UserInterface, LoginUserChurchInterface } from "../interfaces";
|
|
4
|
+
import { AnalyticsHelper, ApiHelper, ArrayHelper, UserHelper } from "../helpers";
|
|
5
|
+
import { useCookies } from "react-cookie"
|
|
6
|
+
import jwt_decode from "jwt-decode"
|
|
7
|
+
import { Register } from "./components/Register"
|
|
8
|
+
import { SelectChurchModal } from "./components/SelectChurchModal"
|
|
9
|
+
import { Forgot } from "./components/Forgot";
|
|
10
|
+
import { Alert, Box, PaperProps, Typography } from "@mui/material";
|
|
11
|
+
import { Login } from "./components/Login";
|
|
12
|
+
import { LoginSetPassword } from "./components/LoginSetPassword";
|
|
13
|
+
import { CommonEnvironmentHelper } from "../helpers/CommonEnvironmentHelper";
|
|
14
|
+
import ga4 from "react-ga4";
|
|
15
|
+
|
|
16
|
+
interface Props {
|
|
17
|
+
context: UserContextInterface,
|
|
18
|
+
jwt: string,
|
|
19
|
+
auth: string,
|
|
20
|
+
keyName?: string,
|
|
21
|
+
logo?: string,
|
|
22
|
+
appName?: string,
|
|
23
|
+
appUrl?: string,
|
|
24
|
+
returnUrl?: string,
|
|
25
|
+
loginSuccessOverride?: () => void,
|
|
26
|
+
userRegisteredCallback?: (user: UserInterface) => Promise<void>;
|
|
27
|
+
churchRegisteredCallback?: (church: ChurchInterface) => Promise<void>;
|
|
28
|
+
callbackErrors?: string[];
|
|
29
|
+
showLogo?: boolean;
|
|
30
|
+
loginContainerCssProps?: PaperProps;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const LoginPage: React.FC<Props> = ({ showLogo = true, loginContainerCssProps, ...props }) => {
|
|
34
|
+
const [welcomeBackName, setWelcomeBackName] = React.useState("");
|
|
35
|
+
const [pendingAutoLogin, setPendingAutoLogin] = React.useState(false);
|
|
36
|
+
const [errors, setErrors] = React.useState([]);
|
|
37
|
+
const [cookies, setCookie] = useCookies(["jwt", "name", "email"]);
|
|
38
|
+
const [showForgot, setShowForgot] = React.useState(false);
|
|
39
|
+
const [showRegister, setShowRegister] = React.useState(false);
|
|
40
|
+
const [showSelectModal, setShowSelectModal] = React.useState(false);
|
|
41
|
+
const [loginResponse, setLoginResponse] = React.useState<LoginResponseInterface>(null)
|
|
42
|
+
const [userJwt, setUserJwt] = React.useState("");
|
|
43
|
+
const [isSubmitting, setIsSubmitting] = React.useState(false);
|
|
44
|
+
|
|
45
|
+
const loginFormRef = React.useRef(null);
|
|
46
|
+
const location = typeof window !== "undefined" && window.location;
|
|
47
|
+
let selectedChurchId = "";
|
|
48
|
+
let registeredChurch: ChurchInterface = null;
|
|
49
|
+
let userJwtBackup = ""; //use state copy for storing between page updates. This copy for instant availability.
|
|
50
|
+
|
|
51
|
+
const cleanAppUrl = () => {
|
|
52
|
+
if (!props.appUrl) return null;
|
|
53
|
+
else {
|
|
54
|
+
const index = props.appUrl.indexOf("/", 9);
|
|
55
|
+
if (index === -1) return props.appUrl;
|
|
56
|
+
else return props.appUrl.substring(0, index);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
React.useEffect(() => {
|
|
61
|
+
if (props.callbackErrors?.length > 0) {
|
|
62
|
+
setErrors(props.callbackErrors)
|
|
63
|
+
}
|
|
64
|
+
}, [props.callbackErrors])
|
|
65
|
+
|
|
66
|
+
const init = () => {
|
|
67
|
+
const search = new URLSearchParams(location?.search);
|
|
68
|
+
const action = search.get("action");
|
|
69
|
+
if (action === "forgot") setShowForgot(true);
|
|
70
|
+
else if (action === "register") setShowRegister(true);
|
|
71
|
+
else {
|
|
72
|
+
if (!props.auth && props.jwt) {
|
|
73
|
+
setWelcomeBackName(cookies.name);
|
|
74
|
+
login({ jwt: props.jwt });
|
|
75
|
+
setPendingAutoLogin(true);
|
|
76
|
+
} else {
|
|
77
|
+
setPendingAutoLogin(false);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const handleLoginSuccess = async (resp: LoginResponseInterface) => {
|
|
83
|
+
userJwtBackup = resp.user.jwt;
|
|
84
|
+
setUserJwt(userJwtBackup);
|
|
85
|
+
ApiHelper.setDefaultPermissions(resp.user.jwt);
|
|
86
|
+
setLoginResponse(resp)
|
|
87
|
+
resp.userChurches.forEach(uc => { if (!uc.apis) uc.apis = []; });
|
|
88
|
+
UserHelper.userChurches = resp.userChurches;
|
|
89
|
+
|
|
90
|
+
setCookie("name", `${resp.user.firstName} ${resp.user.lastName}`, { path: "/" });
|
|
91
|
+
setCookie("email", resp.user.email, { path: "/" });
|
|
92
|
+
UserHelper.user = resp.user;
|
|
93
|
+
|
|
94
|
+
if (props.jwt) {
|
|
95
|
+
const decoded: any = jwt_decode(userJwtBackup)
|
|
96
|
+
selectedChurchId = decoded.churchId
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const search = new URLSearchParams(location?.search);
|
|
100
|
+
const churchIdInParams = search.get("churchId");
|
|
101
|
+
|
|
102
|
+
if (props.keyName) selectChurchByKeyName();
|
|
103
|
+
else if (selectedChurchId) selectChurchById();
|
|
104
|
+
else if (churchIdInParams) selectChurch(churchIdInParams);
|
|
105
|
+
else setShowSelectModal(true);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const selectChurchById = async () => {
|
|
109
|
+
await UserHelper.selectChurch(props.context, selectedChurchId, undefined);
|
|
110
|
+
|
|
111
|
+
if (registeredChurch) {
|
|
112
|
+
AnalyticsHelper.logEvent("Church", "Register", UserHelper.currentUserChurch.church.name);
|
|
113
|
+
try {
|
|
114
|
+
if (CommonEnvironmentHelper.GoogleAnalyticsTag && typeof(window)!=="undefined") {
|
|
115
|
+
ga4.gtag("event", "conversion", { send_to: "AW-427967381/Ba2qCLrXgJoYEJWHicwB" });
|
|
116
|
+
}
|
|
117
|
+
} catch {}
|
|
118
|
+
}
|
|
119
|
+
else AnalyticsHelper.logEvent("Church", "Select", UserHelper.currentUserChurch.church.name);
|
|
120
|
+
|
|
121
|
+
if (props.churchRegisteredCallback && registeredChurch) {
|
|
122
|
+
await props.churchRegisteredCallback(registeredChurch)
|
|
123
|
+
registeredChurch = null;
|
|
124
|
+
login({ jwt: userJwt || userJwtBackup });
|
|
125
|
+
} else await continueLoginProcess();
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const selectChurchByKeyName = async () => {
|
|
129
|
+
if (!ArrayHelper.getOne(UserHelper.userChurches, "church.subDomain", props.keyName)) {
|
|
130
|
+
const userChurch: LoginUserChurchInterface = await ApiHelper.post("/churches/select", { subDomain: props.keyName }, "MembershipApi");
|
|
131
|
+
UserHelper.setupApiHelper(userChurch);
|
|
132
|
+
//create/claim the person record and relogin
|
|
133
|
+
await ApiHelper.get("/people/claim/" + userChurch.church.id, "MembershipApi");
|
|
134
|
+
login({ jwt: userJwt || userJwtBackup });
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
await UserHelper.selectChurch(props.context, undefined, props.keyName);
|
|
138
|
+
await continueLoginProcess()
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function continueLoginProcess() {
|
|
143
|
+
if (UserHelper.currentUserChurch) {
|
|
144
|
+
UserHelper.currentUserChurch.apis.forEach(api => {
|
|
145
|
+
if (api.keyName === "MembershipApi") setCookie("jwt", api.jwt, { path: "/" });
|
|
146
|
+
})
|
|
147
|
+
try {
|
|
148
|
+
if (UserHelper.currentUserChurch.church.id) ApiHelper.patch(`/userChurch/${UserHelper.user.id}`, { churchId: UserHelper.currentUserChurch.church.id, appName: props.appName, lastAccessed: new Date() }, "MembershipApi")
|
|
149
|
+
} catch (e) {
|
|
150
|
+
console.log("Could not update user church accessed date")
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (props.loginSuccessOverride !== undefined) props.loginSuccessOverride();
|
|
155
|
+
else {
|
|
156
|
+
props.context.setUser(UserHelper.user);
|
|
157
|
+
props.context.setUserChurches(UserHelper.userChurches)
|
|
158
|
+
props.context.setUserChurch(UserHelper.currentUserChurch)
|
|
159
|
+
try {
|
|
160
|
+
const p = await ApiHelper.get(`/people/${UserHelper.currentUserChurch.person?.id}`, "MembershipApi");
|
|
161
|
+
if (p) props.context.setPerson(p);
|
|
162
|
+
} catch {
|
|
163
|
+
console.log("claiming person");
|
|
164
|
+
const personClaim = await ApiHelper.get("/people/claim/" + UserHelper.currentUserChurch.church.id, "MembershipApi");
|
|
165
|
+
props.context.setPerson(personClaim);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
async function selectChurch(churchId: string) {
|
|
171
|
+
try {
|
|
172
|
+
setErrors([])
|
|
173
|
+
selectedChurchId = churchId;
|
|
174
|
+
if (!ArrayHelper.getOne(UserHelper.userChurches, "church.id", churchId)) {
|
|
175
|
+
const userChurch: LoginUserChurchInterface = await ApiHelper.post("/churches/select", { churchId: churchId }, "MembershipApi");
|
|
176
|
+
UserHelper.setupApiHelper(userChurch);
|
|
177
|
+
|
|
178
|
+
//create/claim the person record and relogin
|
|
179
|
+
await ApiHelper.get("/people/claim/" + churchId, "MembershipApi");
|
|
180
|
+
login({ jwt: userJwt || userJwtBackup });
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
UserHelper.selectChurch(props.context, churchId, null).then(() => { continueLoginProcess() });
|
|
184
|
+
} catch (err) {
|
|
185
|
+
console.log("Error in selecting church: ", err)
|
|
186
|
+
setErrors(["Error in selecting church. Please verify and try again"])
|
|
187
|
+
loginFormRef?.current?.setSubmitting(false);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const handleLoginErrors = (errors: string[]) => {
|
|
193
|
+
setWelcomeBackName("");
|
|
194
|
+
console.log(errors);
|
|
195
|
+
setErrors(["Invalid login. Please check your email or password."]);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const login = async (data: any) => {
|
|
199
|
+
setErrors([])
|
|
200
|
+
setIsSubmitting(true);
|
|
201
|
+
try {
|
|
202
|
+
const resp: LoginResponseInterface = await ApiHelper.postAnonymous("/users/login", data, "MembershipApi");
|
|
203
|
+
setIsSubmitting(false);
|
|
204
|
+
handleLoginSuccess(resp);
|
|
205
|
+
} catch (e: any) {
|
|
206
|
+
setPendingAutoLogin(false);
|
|
207
|
+
handleLoginErrors([e.toString()]);
|
|
208
|
+
setIsSubmitting(false);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
const getWelcomeBack = () => { if (welcomeBackName !== "") return (<><Alert severity="info">Welcome back, <b>{welcomeBackName}</b>! Please wait while we load your data.</Alert><Loading /></>); }
|
|
213
|
+
const getCheckEmail = () => { if (new URLSearchParams(location?.search).get("checkEmail") === "1") return <Alert severity="info"> Thank you for registering. Please check your email to continue.</Alert> }
|
|
214
|
+
const handleRegisterCallback = () => { setShowForgot(false); setShowRegister(true); }
|
|
215
|
+
const handleLoginCallback = () => { setShowForgot(false); setShowRegister(false); }
|
|
216
|
+
const handleChurchRegistered = (church: ChurchInterface) => { registeredChurch = church; }
|
|
217
|
+
|
|
218
|
+
const getInputBox = () => {
|
|
219
|
+
if (showRegister) return (
|
|
220
|
+
<Box id="loginBox" sx={{ backgroundColor: "#FFF", border: "1px solid #CCC", borderRadius: "5px", padding: "20px" }}>
|
|
221
|
+
<Typography component="h2" sx={{ fontSize: "32px", fontWeight: 500, lineHeight: 1.2, margin: "0 0 8px 0" }}>Create an Account</Typography>
|
|
222
|
+
<Register updateErrors={setErrors} appName={props.appName} appUrl={cleanAppUrl()} loginCallback={handleLoginCallback} userRegisteredCallback={props.userRegisteredCallback} />
|
|
223
|
+
</Box>
|
|
224
|
+
);
|
|
225
|
+
else if (showForgot) return (<Forgot registerCallback={handleRegisterCallback} loginCallback={handleLoginCallback} />);
|
|
226
|
+
else if (props.auth) return (<LoginSetPassword setErrors={setErrors} setShowForgot={setShowForgot} isSubmitting={isSubmitting} auth={props.auth} login={login} appName={props.appName} appUrl={cleanAppUrl()} />)
|
|
227
|
+
else return <Login setShowRegister={setShowRegister} setShowForgot={setShowForgot} setErrors={setErrors} isSubmitting={isSubmitting} login={login} mainContainerCssProps={loginContainerCssProps} />;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
React.useEffect(init, []); //eslint-disable-line
|
|
231
|
+
|
|
232
|
+
return (
|
|
233
|
+
<Box sx={{ maxWidth: "382px" }} px="16px" mx="auto">
|
|
234
|
+
{showLogo && <img src={props.logo || "/images/logo-login.png"} alt="logo" style={{ width: "100%", marginTop: 100, marginBottom: 60 }} />}
|
|
235
|
+
<ErrorMessages errors={errors} />
|
|
236
|
+
{getWelcomeBack()}
|
|
237
|
+
{getCheckEmail()}
|
|
238
|
+
{!pendingAutoLogin && getInputBox()}
|
|
239
|
+
<SelectChurchModal show={showSelectModal} userChurches={loginResponse?.userChurches} selectChurch={selectChurch} registeredChurchCallback={handleChurchRegistered} errors={errors} appName={props.appName} />
|
|
240
|
+
<FloatingSupport appName={props.appName} />
|
|
241
|
+
</Box>
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
};
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { useCookies } from "react-cookie"
|
|
3
|
-
import { ApiHelper } from "../helpers";
|
|
4
|
-
import { UserContextInterface } from "../interfaces";
|
|
5
|
-
|
|
6
|
-
interface Props { context?: UserContextInterface, }
|
|
7
|
-
|
|
8
|
-
export const LogoutPage: React.FC<Props> = (props) => {
|
|
9
|
-
const [, , removeCookie] = useCookies(["jwt", "email", "name"]);
|
|
10
|
-
|
|
11
|
-
removeCookie("jwt");
|
|
12
|
-
removeCookie("email");
|
|
13
|
-
removeCookie("name");
|
|
14
|
-
|
|
15
|
-
ApiHelper.clearPermissions();
|
|
16
|
-
props.context?.setUser(null);
|
|
17
|
-
props.context?.setPerson(null);
|
|
18
|
-
props.context?.setUserChurches(null);
|
|
19
|
-
props.context?.setUserChurch(null);
|
|
20
|
-
|
|
21
|
-
setTimeout(() => {
|
|
22
|
-
// a must check for Nextjs
|
|
23
|
-
if (typeof window !== "undefined") {
|
|
24
|
-
window.location.href = "/";
|
|
25
|
-
}
|
|
26
|
-
}, 300);
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { useCookies } from "react-cookie"
|
|
3
|
+
import { ApiHelper } from "../helpers";
|
|
4
|
+
import { UserContextInterface } from "../interfaces";
|
|
5
|
+
|
|
6
|
+
interface Props { context?: UserContextInterface, }
|
|
7
|
+
|
|
8
|
+
export const LogoutPage: React.FC<Props> = (props) => {
|
|
9
|
+
const [, , removeCookie] = useCookies(["jwt", "email", "name"]);
|
|
10
|
+
|
|
11
|
+
removeCookie("jwt");
|
|
12
|
+
removeCookie("email");
|
|
13
|
+
removeCookie("name");
|
|
14
|
+
|
|
15
|
+
ApiHelper.clearPermissions();
|
|
16
|
+
props.context?.setUser(null);
|
|
17
|
+
props.context?.setPerson(null);
|
|
18
|
+
props.context?.setUserChurches(null);
|
|
19
|
+
props.context?.setUserChurch(null);
|
|
20
|
+
|
|
21
|
+
setTimeout(() => {
|
|
22
|
+
// a must check for Nextjs
|
|
23
|
+
if (typeof window !== "undefined") {
|
|
24
|
+
window.location.href = "/";
|
|
25
|
+
}
|
|
26
|
+
}, 300);
|
|
27
|
+
return null;
|
|
28
|
+
}
|