+
+
+
+ {error instanceof Error ? (
+ error.message
+ ) : typeof error === 'object' ? (
+
+ `${Format.camelCase(Format.enumeration.get(v))}: ${
+ error[v]
+ }`,
+ )
+ .join(' '),
+ }}
+ />
+ ) : (
+ error
+ )}
+ {enabledButton && (
+ {
+ document.location.replace(Constants.getUpgradeUrl())
+ }}
+ >
+ Upgrade plan
+
+ )}
+
+ )
+}
+
+export default ErrorMessage
diff --git a/frontend/web/components/PasswordRequirements.js b/frontend/web/components/PasswordRequirements.tsx
similarity index 83%
rename from frontend/web/components/PasswordRequirements.js
rename to frontend/web/components/PasswordRequirements.tsx
index f63535aa5864..f11808f9aacd 100644
--- a/frontend/web/components/PasswordRequirements.js
+++ b/frontend/web/components/PasswordRequirements.tsx
@@ -1,9 +1,16 @@
-import React, { useEffect } from 'react'
-import PropTypes from 'prop-types'
+import React, { FC, useEffect } from 'react'
import { close, checkmark } from 'ionicons/icons'
import { IonIcon } from '@ionic/react'
-const PasswordRequirements = ({ onRequirementsMet, password }) => {
+type PasswordRequirementsProps = {
+ onRequirementsMet: (met: boolean) => void
+ password: string
+}
+
+const PasswordRequirements: FC
= ({
+ onRequirementsMet,
+ password,
+}) => {
const requirements = [
{ label: 'At least 8 characters', test: password.length >= 8 },
{ label: 'Contains a number', test: /\d/.test(password) },
@@ -48,9 +55,4 @@ const PasswordRequirements = ({ onRequirementsMet, password }) => {
)
}
-PasswordRequirements.propTypes = {
- onRequirementsMet: PropTypes.func.isRequired,
- password: PropTypes.string.isRequired,
-}
-
export default PasswordRequirements
diff --git a/frontend/web/components/base/forms/Radio.tsx b/frontend/web/components/base/forms/Radio.tsx
index f4ebffe7390a..5b6a259bfae0 100644
--- a/frontend/web/components/base/forms/Radio.tsx
+++ b/frontend/web/components/base/forms/Radio.tsx
@@ -1,7 +1,4 @@
import React from 'react'
-import classNames from 'classnames'
-import ReactMarkdown from 'react-markdown'
-import className = ReactMarkdown.propTypes.className
interface RadioProps {
label: string
@@ -20,7 +17,7 @@ const Radio: React.FC = ({ checked, label, onChange }) => {
className='relative cursor-pointer flex-row align-items-center'
>
{checked && } {!checked && }
- {{label} }
+ {{label} }
)
}
diff --git a/frontend/web/components/base/grid/Column.js b/frontend/web/components/base/grid/Column.js
deleted file mode 100644
index adbb5512faf3..000000000000
--- a/frontend/web/components/base/grid/Column.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// propTypes: value: OptionalNumber
-import { PureComponent } from 'react'
-const Column = class extends PureComponent {
- static displayName = 'Column'
-
- render() {
- return (
-
- {this.props.children}
-
- )
- }
-}
-
-Column.defaultProps = {}
-
-Column.propTypes = {
- children: OptionalNode,
- className: OptionalString,
- style: propTypes.any,
- value: OptionalNumber,
-}
-
-export default Column
diff --git a/frontend/web/components/base/grid/Column.tsx b/frontend/web/components/base/grid/Column.tsx
new file mode 100644
index 000000000000..819146a105a0
--- /dev/null
+++ b/frontend/web/components/base/grid/Column.tsx
@@ -0,0 +1,9 @@
+import React, { FC } from 'react'
+
+type ColumnProps = React.HTMLAttributes
+
+const Column: FC = ({ className, ...rest }) => (
+
+)
+
+export default Column
diff --git a/frontend/web/components/base/grid/Flex.js b/frontend/web/components/base/grid/Flex.js
deleted file mode 100644
index 990d4ff4b02e..000000000000
--- a/frontend/web/components/base/grid/Flex.js
+++ /dev/null
@@ -1,27 +0,0 @@
-const Flex = class extends React.Component {
- static displayName = 'Flex'
-
- render() {
- return (
-
- {this.props.children}
-
- )
- }
-}
-
-Flex.defaultProps = {
- value: 1,
-}
-
-Flex.propTypes = {
- children: OptionalNode,
- className: OptionalString,
- style: propTypes.any,
- value: OptionalNumber,
-}
-
-export default Flex
diff --git a/frontend/web/components/base/grid/Flex.tsx b/frontend/web/components/base/grid/Flex.tsx
new file mode 100644
index 000000000000..4b2d3bf886e9
--- /dev/null
+++ b/frontend/web/components/base/grid/Flex.tsx
@@ -0,0 +1,9 @@
+import React, { FC } from 'react'
+
+type FlexProps = React.HTMLAttributes
+
+const Flex: FC = ({ className, ...rest }) => (
+
+)
+
+export default Flex
diff --git a/frontend/web/components/pages/NotFoundErrorPage.js b/frontend/web/components/pages/NotFoundErrorPage.js
deleted file mode 100644
index b1d74cc4d4dd..000000000000
--- a/frontend/web/components/pages/NotFoundErrorPage.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import React, { Component } from 'react'
-import Constants from 'common/constants'
-
-const ComingSoon = class extends Component {
- static displayName = 'ComingSoon'
-
- componentDidMount() {
- API.trackPage(Constants.pages.COMING_SOON)
- }
-
- render() {
- return (
-
-
Oops!
-
- It looks like you do not have permission to view this{' '}
- {Utils.fromParam().entity || 'page'}. Please contact a member with
- administrator privileges.
-
-
- )
- }
-}
-
-ComingSoon.propTypes = {}
-
-export default ComingSoon
diff --git a/frontend/web/components/pages/NotFoundErrorPage.tsx b/frontend/web/components/pages/NotFoundErrorPage.tsx
new file mode 100644
index 000000000000..827b2649c9da
--- /dev/null
+++ b/frontend/web/components/pages/NotFoundErrorPage.tsx
@@ -0,0 +1,21 @@
+import React, { FC, useEffect } from 'react'
+import Constants from 'common/constants'
+
+const NotFoundErrorPage: FC = () => {
+ useEffect(() => {
+ API.trackPage(Constants.pages.COMING_SOON)
+ }, [])
+
+ return (
+
+
Oops!
+
+ It looks like you do not have permission to view this{' '}
+ {Utils.fromParam().entity || 'page'}. Please contact a member with
+ administrator privileges.
+
+
+ )
+}
+
+export default NotFoundErrorPage