this repo has no description

common: error boundary component

Changed files
+92 -5
packages
core-extensions
src
common
types
+4 -5
packages/core-extensions/src/common/index.ts
···
export const webpackModules: ExtensionWebExports["webpackModules"] = {
stores: {
-
dependencies: [
-
{
-
id: "discord/packages/flux"
-
}
-
]
+
dependencies: [{ id: "discord/packages/flux" }]
+
},
+
ErrorBoundary: {
+
dependencies: [{ id: "react" }]
}
};
+27
packages/core-extensions/src/common/style.css
···
+
.moonlight-error-boundary {
+
margin: 0 0 15px;
+
padding: 10px;
+
border-radius: 5px;
+
font-size: 1rem;
+
font-weight: 300;
+
line-height: 22px;
+
color: var(--text-normal, white);
+
background: hsl(var(--red-400-hsl) / 0.1);
+
border: 2px solid hsl(var(--red-400-hsl) / 0.5);
+
+
.theme-light & {
+
color: var(--text-normal, black) !important;
+
}
+
+
& > h3 {
+
margin-bottom: 0.25rem;
+
}
+
+
& > .hljs {
+
background: var(--background-secondary);
+
border: 1px solid var(--background-tertiary);
+
white-space: pre-wrap;
+
font-family: var(--font-code);
+
user-select: text;
+
}
+
}
+48
packages/core-extensions/src/common/webpackModules/ErrorBoundary.tsx
···
+
import React from "@moonlight-mod/wp/react";
+
import { ErrorBoundaryProps, ErrorBoundaryState } from "@moonlight-mod/types/coreExtensions/common";
+
+
const logger = moonlight.getLogger("ErrorBoundary");
+
+
class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {
+
constructor(props: ErrorBoundaryProps) {
+
super(props);
+
this.state = {
+
errored: false,
+
error: undefined,
+
componentStack: undefined
+
};
+
}
+
+
static getDerivedStateFromError(error: Error) {
+
return {
+
errored: true,
+
error
+
};
+
}
+
+
componentDidCatch(error: Error, { componentStack }: { componentStack: string }) {
+
logger.error(`${error}\n\nComponent stack:\n${componentStack}`);
+
this.setState({ error, componentStack });
+
}
+
+
render() {
+
const { noop, fallback: FallbackComponent, children, message } = this.props;
+
const { errored, error, componentStack } = this.state;
+
+
if (noop) return null;
+
if (FallbackComponent) return <FallbackComponent children={children} {...this.state} />;
+
+
if (errored) {
+
return (
+
<div className={`moonlight-error-boundary`}>
+
<h3>{message ?? "An error occurred rendering this component:"}</h3>
+
<code className="hljs">{`${error}\n\nComponent stack:\n${componentStack}`}</code>
+
</div>
+
);
+
}
+
+
return children;
+
}
+
}
+
+
export default ErrorBoundary;
+1
packages/types/src/coreExtensions.ts
···
export * as AppPanels from "./coreExtensions/appPanels";
export * as Commands from "./coreExtensions/commands";
export * as ComponentEditor from "./coreExtensions/componentEditor";
+
export * as Common from "./coreExtensions/common";
+11
packages/types/src/coreExtensions/common.ts
···
+
export type ErrorBoundaryProps = React.PropsWithChildren<{
+
noop?: boolean;
+
fallback?: React.FC<any>;
+
message?: string;
+
}>;
+
+
export type ErrorBoundaryState = {
+
errored: boolean;
+
error?: Error;
+
componentStack?: string;
+
};
+1
packages/types/src/import.d.ts
···
export default commands;
}
+
declare module "@moonlight-mod/wp/common_ErrorBoundary";
declare module "@moonlight-mod/wp/common_stores";
declare module "@moonlight-mod/wp/componentEditor_dmList" {