Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import {
Button,
Link,
Modal,
ModalBody,
ModalContent,
ModalFooter,
ModalHeader,
} from "@nextui-org/react";
import { useEffect, useState } from "react";
const Params = {
TYPE: "auth_type",
ERROR: "auth_error",
ERROR_DESC: "auth_error_desc",
CAN_RETRY: "auth_retry",
};
/**
* Show popups that detail auth error messages
* @returns
*/
export const AuthErrors = () => {
const [params, setParams] = useState(
new URLSearchParams(window.location.search)
);
const onClose = () => {
const url = new URL(window.location.href);
url.search = "";
// window.history.replaceState({}, "", url.toString());
setParams(new URLSearchParams(window.location.search));
};
return (
<>
<RPError
isOpen={params.get(Params.TYPE) === "rp"}
onClose={onClose}
params={params}
/>
<OPError
isOpen={params.get(Params.TYPE) === "op"}
onClose={onClose}
params={params}
/>
</>
);
};
/**
* This is for RP errors, which can be triggered by modifying data sent in callbacks
*
* These errors can typically be retried
*
* @param param0
* @returns
*/
const RPError = ({
isOpen,
onClose,
params,
}: {
isOpen: boolean;
onClose: () => void;
params: URLSearchParams;
}) => {
return (
<Modal isOpen={isOpen} onOpenChange={onClose} isDismissable={false}>
<ModalContent>
{(onClose) => (
<>
<ModalHeader>Login Error</ModalHeader>
<ModalBody>
<b>Error:</b> {params.get(Params.ERROR)}
<br />
<br />
<b>Error Description:</b> {params.get(Params.ERROR_DESC)}
</ModalBody>
<ModalFooter>
<Button color="primary" href="/api/login" as={Link}>
Login
</Button>
</ModalFooter>
</>
)}
</ModalContent>
</Modal>
);
};
/**
* This is for OP errors, these might not be retryable
* @param param0
* @returns
*/
const OPError = ({
isOpen,
onClose,
params,
}: {
isOpen: boolean;
onClose: () => void;
params: URLSearchParams;
}) => {
const canRetry = params.has(Params.CAN_RETRY);
const [error, setError] = useState(params.get(Params.ERROR));
const [errorDesc, setErrorDesc] = useState(params.get(Params.ERROR_DESC));
useEffect(() => {
switch (params.get(Params.ERROR)) {
case "invalid_grant":
setErrorDesc("Invalid token, try logging in again");
break;
}
}, [params]);
return (
<Modal isOpen={isOpen} onOpenChange={onClose} isDismissable={false}>
<ModalContent>
{(onClose) => (
<>
<ModalHeader>Login Error</ModalHeader>
<ModalBody>
<b>Error:</b> {error}
<br />
<br />
<b>Error Description:</b> {errorDesc}
</ModalBody>
<ModalFooter>
{canRetry && (
<Button color="primary" href="/api/login" as={Link}>
Login
</Button>
)}
</ModalFooter>
</>
)}
</ModalContent>
</Modal>
);
};