diff --git a/package-lock.json b/package-lock.json index 0ef80846..24fa6919 100644 --- a/package-lock.json +++ b/package-lock.json @@ -78,6 +78,7 @@ "@types/react-autocomplete": "^1.8.9", "@types/react-color": "^3.0.10", "@types/react-dom": "^16.9.24", + "@types/react-file-reader-input": "^2.0.4", "@types/react-icon-base": "^2.1.6", "@types/uuid": "^9.0.7", "@vitejs/plugin-react": "^4.2.0", @@ -4917,6 +4918,15 @@ "@types/react": "^16" } }, + "node_modules/@types/react-file-reader-input": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/react-file-reader-input/-/react-file-reader-input-2.0.4.tgz", + "integrity": "sha512-Jqrfn+w42j8t8Q3npMXXKPdk+reIM0UHLKVc3ykrA7q7bN3Z62SGhsClZX0+Edlqm66lcKwmDQl+WMm+Xor7Xg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-icon-base": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/@types/react-icon-base/-/react-icon-base-2.1.6.tgz", diff --git a/package.json b/package.json index a217705d..fd9e9624 100644 --- a/package.json +++ b/package.json @@ -107,6 +107,7 @@ "@types/react-autocomplete": "^1.8.9", "@types/react-color": "^3.0.10", "@types/react-dom": "^16.9.24", + "@types/react-file-reader-input": "^2.0.4", "@types/react-icon-base": "^2.1.6", "@types/uuid": "^9.0.7", "@vitejs/plugin-react": "^4.2.0", diff --git a/src/components/InputUrl.tsx b/src/components/InputUrl.tsx index 2e22712a..e8a9196f 100644 --- a/src/components/InputUrl.tsx +++ b/src/components/InputUrl.tsx @@ -57,6 +57,8 @@ export type FieldUrlProps = { multi?: boolean required?: boolean 'aria-label'?: string + type?: string + className?: string }; type FieldUrlState = { diff --git a/src/components/ModalLoading.jsx b/src/components/ModalLoading.tsx similarity index 64% rename from src/components/ModalLoading.jsx rename to src/components/ModalLoading.tsx index 07303c3c..f6f132e7 100644 --- a/src/components/ModalLoading.jsx +++ b/src/components/ModalLoading.tsx @@ -1,19 +1,19 @@ import React from 'react' -import PropTypes from 'prop-types' import InputButton from './InputButton' import Modal from './Modal' -export default class ModalLoading extends React.Component { - static propTypes = { - isOpen: PropTypes.bool.isRequired, - onCancel: PropTypes.func.isRequired, - title: PropTypes.string.isRequired, - message: PropTypes.node.isRequired, - } +type ModalLoadingProps = { + isOpen: boolean + onCancel(...args: unknown[]): unknown + title: string + message: React.ReactNode +}; - underlayOnClick(e) { + +export default class ModalLoading extends React.Component { + underlayOnClick(e: Event) { // This stops click events falling through to underlying modals. e.stopPropagation(); } @@ -24,9 +24,9 @@ export default class ModalLoading extends React.Component { isOpen={this.props.isOpen} underlayClickExits={false} underlayProps={{ - onClick: (e) => underlayProps(e) + // @ts-ignore + onClick: (e: Event) => underlayProps(e) }} - closeable={false} title={this.props.title} onOpenToggle={() => this.props.onCancel()} > diff --git a/src/components/ModalOpen.jsx b/src/components/ModalOpen.tsx similarity index 82% rename from src/components/ModalOpen.jsx rename to src/components/ModalOpen.tsx index 6b542941..da7aaeeb 100644 --- a/src/components/ModalOpen.jsx +++ b/src/components/ModalOpen.tsx @@ -1,25 +1,24 @@ -import React from 'react' -import PropTypes from 'prop-types' +import React, { FormEvent } from 'react' +import {MdFileUpload} from 'react-icons/md' +import {MdAddCircleOutline} from 'react-icons/md' +import FileReaderInput, { Result } from 'react-file-reader-input' + import ModalLoading from './ModalLoading' import Modal from './Modal' import InputButton from './InputButton' -import FileReaderInput from 'react-file-reader-input' import InputUrl from './InputUrl' -import {MdFileUpload} from 'react-icons/md' -import {MdAddCircleOutline} from 'react-icons/md' - import style from '../libs/style' import publicStyles from '../config/styles.json' -class PublicStyle extends React.Component { - static propTypes = { - url: PropTypes.string.isRequired, - thumbnailUrl: PropTypes.string.isRequired, - title: PropTypes.string.isRequired, - onSelect: PropTypes.func.isRequired, - } +type PublicStyleProps = { + url: string + thumbnailUrl: string + title: string + onSelect(...args: unknown[]): unknown +}; +class PublicStyle extends React.Component { render() { return
{ + constructor(props: ModalOpenProps) { super(props); this.state = { styleUrl: "" @@ -63,7 +69,7 @@ export default class ModalOpen extends React.Component { }) } - onCancelActiveRequest(e) { + onCancelActiveRequest(e: Event) { // Else the click propagates to the underlying modal if(e) e.stopPropagation(); @@ -76,12 +82,12 @@ export default class ModalOpen extends React.Component { } } - onStyleSelect = (styleUrl) => { + onStyleSelect = (styleUrl: string) => { this.clearError(); - let canceled; + let canceled: boolean = false; - const activeRequest = fetch(styleUrl, { + fetch(styleUrl, { mode: 'cors', credentials: "same-origin" }) @@ -123,13 +129,13 @@ export default class ModalOpen extends React.Component { }) } - onSubmitUrl = (e) => { + onSubmitUrl = (e: FormEvent) => { e.preventDefault(); this.onStyleSelect(this.state.styleUrl); } - onUpload = (_, files) => { - const [e, file] = files[0]; + onUpload = (_: any, files: Result[]) => { + const [_e, file] = files[0]; const reader = new FileReader(); this.clearError(); @@ -138,11 +144,11 @@ export default class ModalOpen extends React.Component { reader.onload = e => { let mapStyle; try { - mapStyle = JSON.parse(e.target.result) + mapStyle = JSON.parse(e.target?.result as string) } catch(err) { this.setState({ - error: err.toString() + error: (err as Error).toString() }); return; } @@ -161,7 +167,7 @@ export default class ModalOpen extends React.Component { this.props.onOpenToggle(); } - onChangeUrl = (url) => { + onChangeUrl = (url: string) => { this.setState({ styleUrl: url, }); @@ -200,7 +206,7 @@ export default class ModalOpen extends React.Component {

Upload Style

Upload a JSON style from your computer.

- + Upload
@@ -246,7 +252,7 @@ export default class ModalOpen extends React.Component { this.onCancelActiveRequest(e)} + onCancel={(e: Event) => this.onCancelActiveRequest(e)} message={"Loading: "+this.state.activeRequestUrl} />