mirror of
https://github.com/maputnik/editor.git
synced 2026-01-07 14:00:01 +00:00
See maplibre/maputnik#910 As per the issue, test the hostname of the for a localhost URL, by 1. Domain - localhost 2. IPv4 localhost subnet - 127.0.0.1/8 3. IPv6 localhost - [::1] ## Launch Checklist <!-- Thanks for the PR! Feel free to add or remove items from the checklist. --> - [x] Briefly describe the changes in this PR. - [x] Link to related issues. - [x] Include before/after visuals or gifs if this PR includes visual changes. - [x] Write tests for all new functionality. - [x] Add an entry to `CHANGELOG.md` under the `## main` section. --------- Co-authored-by: zstadler <zeev.stadler@gmail.com> Co-authored-by: Harel M <harel.mazor@gmail.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
96 lines
2.4 KiB
TypeScript
96 lines
2.4 KiB
TypeScript
import React, { type JSX } from "react";
|
|
import InputString from "./InputString";
|
|
import SmallError from "./SmallError";
|
|
import { Trans, type WithTranslation, withTranslation } from "react-i18next";
|
|
import { type TFunction } from "i18next";
|
|
import { ErrorType, validate } from "../libs/urlopen";
|
|
|
|
function errorTypeToJsx(errorType: ErrorType | undefined, t: TFunction): JSX.Element | undefined {
|
|
switch (errorType) {
|
|
case ErrorType.EmptyHttpsProtocol:
|
|
return (
|
|
<SmallError>
|
|
<Trans t={t}>Must provide protocol: <code>https://</code></Trans>
|
|
</SmallError>
|
|
);
|
|
case ErrorType.EmptyHttpOrHttpsProtocol:
|
|
return (
|
|
<SmallError>
|
|
<Trans t={t}>Must provide protocol: <code>http://</code> or <code>https://</code></Trans>
|
|
</SmallError>
|
|
);
|
|
case ErrorType.CorsError:
|
|
return (
|
|
<SmallError>
|
|
<Trans t={t}>CORS policy won't allow fetching resources served over http from https, use a <code>https://</code> domain</Trans>
|
|
</SmallError>
|
|
);
|
|
default:
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
export type FieldUrlProps = {
|
|
"data-wd-key"?: string
|
|
value: string
|
|
style?: object
|
|
default?: string
|
|
onChange(...args: unknown[]): unknown
|
|
onInput?(...args: unknown[]): unknown
|
|
multi?: boolean
|
|
required?: boolean
|
|
"aria-label"?: string
|
|
type?: string
|
|
className?: string
|
|
};
|
|
|
|
type InputUrlInternalProps = FieldUrlProps & WithTranslation;
|
|
|
|
type InputUrlState = {
|
|
error?: ErrorType
|
|
};
|
|
|
|
class InputUrlInternal extends React.Component<InputUrlInternalProps, InputUrlState> {
|
|
static defaultProps = {
|
|
onInput: () => {},
|
|
};
|
|
|
|
constructor (props: InputUrlInternalProps) {
|
|
super(props);
|
|
this.state = {
|
|
error: validate(props.value),
|
|
};
|
|
}
|
|
|
|
onInput = (url: string) => {
|
|
this.setState({
|
|
error: validate(url),
|
|
});
|
|
if (this.props.onInput) this.props.onInput(url);
|
|
};
|
|
|
|
onChange = (url: string) => {
|
|
this.setState({
|
|
error: validate(url),
|
|
});
|
|
this.props.onChange(url);
|
|
};
|
|
|
|
render () {
|
|
return (
|
|
<div>
|
|
<InputString
|
|
{...this.props}
|
|
onInput={this.onInput}
|
|
onChange={this.onChange}
|
|
aria-label={this.props["aria-label"]}
|
|
/>
|
|
{errorTypeToJsx(this.state.error, this.props.t)}
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
const InputUrl = withTranslation()(InputUrlInternal);
|
|
export default InputUrl;
|