dce-reactkit 2.0.2 → 2.0.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dce-reactkit",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "scripts": {
@@ -0,0 +1,127 @@
1
+ /**
2
+ * A wrapper for the entire React app that adds global functionality like
3
+ * handling for fatal error messages
4
+ * @author Gabe Abrams
5
+ */
6
+
7
+ // Import React
8
+ import React, { useState } from 'react';
9
+
10
+ // Import shared components
11
+ import ErrorBox from './ErrorBox';
12
+
13
+ // Import shared types
14
+ import ReactKitErrorCode from '../types/ReactKitErrorCode';
15
+
16
+ // Import custom errors
17
+ import ErrorWithCode from '../errors/ErrorWithCode';
18
+
19
+ /*------------------------------------------------------------------------*/
20
+ /* Props */
21
+ /*------------------------------------------------------------------------*/
22
+
23
+ type Props = {
24
+ // The entire app
25
+ children: React.ReactNode,
26
+ // True if this app is a dark-themed app
27
+ dark?: boolean,
28
+ };
29
+
30
+ /*------------------------------------------------------------------------*/
31
+ /* Static Helpers */
32
+ /*------------------------------------------------------------------------*/
33
+
34
+ // Stored copies of setters
35
+ let setFatalErrorMessage: (message: string) => void;
36
+ let setFatalErrorCode: (code: string) => void;
37
+
38
+ /**
39
+ * Show a fatal error message
40
+ * @author Gabe Abrams
41
+ * @param error the error to show
42
+ */
43
+ export const showFatalError = (error: any) => {
44
+ // Determine message and code
45
+ const message: string = (
46
+ typeof error === 'string'
47
+ ? error.trim()
48
+ : String(error.message ?? 'An unknown error occurred.')
49
+ );
50
+ const code: string = (
51
+ typeof error === 'string'
52
+ ? ReactKitErrorCode.NoCode
53
+ : String(error.code ?? ReactKitErrorCode.NoCode)
54
+ );
55
+
56
+ // Handle case where app hasn't loaded
57
+ if (!setFatalErrorMessage || !setFatalErrorCode) {
58
+ return alert(`An error has occurred: ${message} (code: ${code}). Please contact support.`);
59
+ }
60
+
61
+ // Use setters
62
+ setFatalErrorMessage(message);
63
+ setFatalErrorCode(code);
64
+ };
65
+
66
+ /*------------------------------------------------------------------------*/
67
+ /* Component */
68
+ /*------------------------------------------------------------------------*/
69
+
70
+ const AppWrapper = (props: Props) => {
71
+ /*------------------------------------------------------------------------*/
72
+ /* Setup */
73
+ /*------------------------------------------------------------------------*/
74
+
75
+ /* -------------- Props ------------- */
76
+
77
+ const {
78
+ children,
79
+ dark,
80
+ } = props;
81
+
82
+ /* -------------- State ------------- */
83
+
84
+ // Fatal error
85
+ const [fatalErrorMessage, setFatalErrorMessageInner] = useState(null);
86
+ setFatalErrorMessage = setFatalErrorMessageInner;
87
+ const [fatalErrorCode, setFatalErrorCodeInner] = useState(null);
88
+ setFatalErrorCode = setFatalErrorCodeInner;
89
+
90
+ /*----------------------------------------*/
91
+ /* Main UI */
92
+ /*----------------------------------------*/
93
+
94
+ // Show error
95
+ if (fatalErrorMessage || fatalErrorCode) {
96
+ // Re-encapsulate in an error
97
+ const error = new ErrorWithCode(
98
+ fatalErrorMessage,
99
+ fatalErrorCode,
100
+ );
101
+
102
+ return (
103
+ <div
104
+ style={{
105
+ display: 'block',
106
+ width: '100vw',
107
+ minHeight: '100vh',
108
+ paddingTop: '10rem',
109
+ }}
110
+ >
111
+ <ErrorBox
112
+ error={error}
113
+ />
114
+ </div>
115
+ );
116
+ }
117
+
118
+ // Show the app itself
119
+ return children;
120
+ };
121
+
122
+ /*------------------------------------------------------------------------*/
123
+ /* Wrap Up */
124
+ /*------------------------------------------------------------------------*/
125
+
126
+ // Export component
127
+ export default AppWrapper;
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Displays an error
3
+ * @author Gabe Abrams
4
+ */
5
+
6
+ // Import React
7
+ import React from 'react';
8
+
9
+ // Import FontAwesome Icons
10
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
11
+ import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
12
+
13
+ // Import shared types
14
+ import ReactKitErrorCode from '../types/ReactKitErrorCode';
15
+
16
+ /*------------------------------------------------------------------------*/
17
+ /* Types */
18
+ /*------------------------------------------------------------------------*/
19
+
20
+ type Props = {
21
+ // Error to display
22
+ error: any,
23
+ // Handler for close,
24
+ onClose?: () => void,
25
+ };
26
+
27
+ /*------------------------------------------------------------------------*/
28
+ /* Component */
29
+ /*------------------------------------------------------------------------*/
30
+
31
+ const ErrorBox: React.FC<Props> = (props) => {
32
+ /*------------------------------------------------------------------------*/
33
+ /* Setup */
34
+ /*------------------------------------------------------------------------*/
35
+
36
+ /* -------------- Props ------------- */
37
+
38
+ const {
39
+ error,
40
+ onClose,
41
+ } = props;
42
+
43
+ /*------------------------------------------------------------------------*/
44
+ /* Render */
45
+ /*------------------------------------------------------------------------*/
46
+
47
+ // Determine error text
48
+ const errorText: string = (
49
+ typeof error === 'string'
50
+ ? error.trim()
51
+ : String(error.message || 'An unknown error occurred. Please contact support.')
52
+ );
53
+
54
+ // Error code box
55
+ let errorCodeBox;
56
+ if (error && (error as any).code) {
57
+ errorCodeBox = (
58
+ <span>
59
+ {' '}
60
+ <span
61
+ style={{
62
+ backgroundColor: 'white',
63
+ borderRadius: '5px',
64
+ paddingLeft: '3px',
65
+ paddingRight: '3px',
66
+ color: '#DC4150',
67
+ fontVariant: 'small-caps',
68
+ fontSize: '80%',
69
+ whiteSpace: 'nowrap',
70
+ }}
71
+ >
72
+ code:
73
+ {' '}
74
+ {String((error as any).code ?? ReactKitErrorCode.NoCode).toUpperCase()}
75
+ </span>
76
+ </span>
77
+ );
78
+ }
79
+
80
+ // Main UI
81
+ return (
82
+ <div
83
+ className="alert alert-danger text-center"
84
+ style={{
85
+ maxWidth: '650px',
86
+ margin: 'auto',
87
+ }}
88
+ >
89
+ <h4 className="mb-1">
90
+ <FontAwesomeIcon
91
+ icon={faExclamationTriangle}
92
+ className="me-2"
93
+ />
94
+ An Error Occurred
95
+ </h4>
96
+ <div>
97
+ {errorText}
98
+ {errorCodeBox}
99
+ </div>
100
+ {onClose && (
101
+ <div className="mt-2">
102
+ <button
103
+ type="button"
104
+ className="btn btn-light"
105
+ aria-label="dismiss error and close this activity or view"
106
+ onClick={onClose}
107
+ >
108
+ Close
109
+ </button>
110
+ </div>
111
+ )}
112
+ </div>
113
+ );
114
+ };
115
+
116
+ /*------------------------------------------------------------------------*/
117
+ /* Wrap Up */
118
+ /*------------------------------------------------------------------------*/
119
+
120
+ // Export component
121
+ export default ErrorBox;
@@ -0,0 +1,3 @@
1
+ import { showFatalError } from '../components/AppWrapper';
2
+
3
+ export default showFatalError;