🧑🏼🔧 Fixed the hostname regex
This commit is contained in:
@@ -1,7 +1,10 @@
|
|||||||
import React, { ReactElement, useCallback, useContext } from "react";
|
import React, { ReactElement, useCallback, useContext } from "react";
|
||||||
import { Form, Field } from "react-final-form";
|
import { Form, Field } from "react-final-form";
|
||||||
import { useDispatch } from "react-redux";
|
import { useDispatch } from "react-redux";
|
||||||
import { saveSettings, deleteSettings } from "../../../actions/settings.actions";
|
import {
|
||||||
|
saveSettings,
|
||||||
|
deleteSettings,
|
||||||
|
} from "../../../actions/settings.actions";
|
||||||
import { AirDCPPSettingsConfirmation } from "./AirDCPPSettingsConfirmation";
|
import { AirDCPPSettingsConfirmation } from "./AirDCPPSettingsConfirmation";
|
||||||
import { AirDCPPSocketContext } from "../../../context/AirDCPPSocket";
|
import { AirDCPPSocketContext } from "../../../context/AirDCPPSocket";
|
||||||
import { isUndefined, isEmpty, isNil } from "lodash";
|
import { isUndefined, isEmpty, isNil } from "lodash";
|
||||||
@@ -10,17 +13,16 @@ export const AirDCPPSettingsForm = (): ReactElement => {
|
|||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
const airDCPPSettings = useContext(AirDCPPSocketContext);
|
const airDCPPSettings = useContext(AirDCPPSocketContext);
|
||||||
|
|
||||||
const hostValidator = (hostname: string): string | null => {
|
const hostValidator = (hostname: string): string | undefined => {
|
||||||
const hostnameRegex = /[\W]+/gm;
|
const hostnameRegex =
|
||||||
try {
|
/^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$/;
|
||||||
if (!isUndefined(hostname)) {
|
|
||||||
const matches = hostname.match(hostnameRegex);
|
if (!isUndefined(hostname)) {
|
||||||
return isNil(matches) && matches.length !== 0
|
const matches = hostname.match(hostnameRegex);
|
||||||
? hostname
|
console.log(matches);
|
||||||
: "Invalid hostname; it should not contain special characters";
|
return !isNil(matches) && matches.length > 0
|
||||||
}
|
? undefined
|
||||||
} catch {
|
: "Enter a valid hostname";
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -96,9 +98,7 @@ export const AirDCPPSettingsForm = (): ReactElement => {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="field">
|
<div className="field">
|
||||||
<div className="is-clearfix">
|
<label className="label">Credentials</label>
|
||||||
<label className="label">Credentials</label>
|
|
||||||
</div>
|
|
||||||
<div className="field-body">
|
<div className="field-body">
|
||||||
<div className="field">
|
<div className="field">
|
||||||
<p className="control is-expanded has-icons-left">
|
<p className="control is-expanded has-icons-left">
|
||||||
|
|||||||
@@ -24,6 +24,81 @@ export const QbittorrentConnectionForm = (): ReactElement => {
|
|||||||
render={({ handleSubmit }) => (
|
render={({ handleSubmit }) => (
|
||||||
<form onSubmit={handleSubmit}>
|
<form onSubmit={handleSubmit}>
|
||||||
<h2>Configure Qbittorrent</h2>
|
<h2>Configure Qbittorrent</h2>
|
||||||
|
<label className="label">Qbittorrent Hostname</label>
|
||||||
|
<div className="field has-addons">
|
||||||
|
<p className="control">
|
||||||
|
<span className="select">
|
||||||
|
<Field name="protocol" component="select">
|
||||||
|
<option>Protocol</option>
|
||||||
|
<option value="http">http://</option>
|
||||||
|
<option value="https">https://</option>
|
||||||
|
</Field>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
<div className="control is-expanded">
|
||||||
|
<Field name="hostname">
|
||||||
|
{({ input, meta }) => (
|
||||||
|
<div>
|
||||||
|
<input
|
||||||
|
{...input}
|
||||||
|
type="text"
|
||||||
|
placeholder="Qbittorrent hostname"
|
||||||
|
className="input"
|
||||||
|
/>
|
||||||
|
{meta.error && meta.touched && (
|
||||||
|
<span className="is-size-7 has-text-danger">
|
||||||
|
{meta.error}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</Field>
|
||||||
|
</div>
|
||||||
|
<p className="control">
|
||||||
|
<Field
|
||||||
|
name="port"
|
||||||
|
component="input"
|
||||||
|
className="input"
|
||||||
|
placeholder="Qbittorrent port"
|
||||||
|
/>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="field">
|
||||||
|
<label className="label">Credentials</label>
|
||||||
|
<div className="field-body">
|
||||||
|
<div className="field">
|
||||||
|
<p className="control is-expanded has-icons-left">
|
||||||
|
<Field
|
||||||
|
name="username"
|
||||||
|
component="input"
|
||||||
|
className="input"
|
||||||
|
placeholder="Username"
|
||||||
|
/>
|
||||||
|
<span className="icon is-small is-left">
|
||||||
|
<i className="fa-solid fa-user-ninja"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className="field">
|
||||||
|
<p className="control is-expanded has-icons-left has-icons-right">
|
||||||
|
<Field
|
||||||
|
name="password"
|
||||||
|
component="input"
|
||||||
|
type="password"
|
||||||
|
className="input"
|
||||||
|
placeholder="Password"
|
||||||
|
/>
|
||||||
|
<span className="icon is-small is-left">
|
||||||
|
<i className="fa-solid fa-lock"></i>
|
||||||
|
</span>
|
||||||
|
<span className="icon is-small is-right">
|
||||||
|
<i className="fas fa-check"></i>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user