Browse Source

Add some basic validation logic for form. Closes https://github.com/owncast/owncast/issues/1847

pull/1886/head
Gabe Kangas 3 years ago
parent
commit
55ce0c0869
  1. 45
      web/components/config/notification/twitter.tsx
  2. 9
      web/pages/config-notify.tsx

45
web/components/config/notification/twitter.tsx

@ -26,15 +26,21 @@ export default function ConfigNotify() {
const { notifications } = serverConfig || {}; const { notifications } = serverConfig || {};
const { twitter } = notifications || {}; const { twitter } = notifications || {};
const { enabled, apiKey, apiSecret, accessToken, accessTokenSecret, bearerToken, goLiveMessage } =
twitter || {};
const [formDataValues, setFormDataValues] = useState<any>({}); const [formDataValues, setFormDataValues] = useState<any>({});
const [submitStatus, setSubmitStatus] = useState<StatusState>(null); const [submitStatus, setSubmitStatus] = useState<StatusState>(null);
const [enableSaveButton, setEnableSaveButton] = useState<boolean>(false); const [enableSaveButton, setEnableSaveButton] = useState<boolean>(false);
useEffect(() => { useEffect(() => {
const {
enabled,
apiKey,
apiSecret,
accessToken,
accessTokenSecret,
bearerToken,
goLiveMessage,
} = twitter || {};
setFormDataValues({ setFormDataValues({
enabled, enabled,
apiKey, apiKey,
@ -46,7 +52,27 @@ export default function ConfigNotify() {
}); });
}, [twitter]); }, [twitter]);
const canSave = (): boolean => true; const canSave = (): boolean => {
const {
enabled,
apiKey,
apiSecret,
accessToken,
accessTokenSecret,
bearerToken,
goLiveMessage,
} = formDataValues;
return (
enabled &&
!!apiKey &&
!!apiSecret &&
!!accessToken &&
!!accessTokenSecret &&
!!bearerToken &&
!!goLiveMessage
);
};
// update individual values in state // update individual values in state
const handleFieldChange = ({ fieldName, value }: UpdateArgs) => { const handleFieldChange = ({ fieldName, value }: UpdateArgs) => {
@ -60,7 +86,11 @@ export default function ConfigNotify() {
// toggle switch. // toggle switch.
const handleSwitchChange = (switchEnabled: boolean) => { const handleSwitchChange = (switchEnabled: boolean) => {
const previouslySaved = formDataValues.enabled;
handleFieldChange({ fieldName: 'enabled', value: switchEnabled }); handleFieldChange({ fieldName: 'enabled', value: switchEnabled });
return switchEnabled !== previouslySaved;
}; };
let resetTimer = null; let resetTimer = null;
@ -68,6 +98,7 @@ export default function ConfigNotify() {
setSubmitStatus(null); setSubmitStatus(null);
resetTimer = null; resetTimer = null;
clearTimeout(resetTimer); clearTimeout(resetTimer);
setEnableSaveButton(false);
}; };
const save = async () => { const save = async () => {
@ -100,11 +131,7 @@ export default function ConfigNotify() {
</p> </p>
<div style={{ display: formDataValues.enabled ? 'block' : 'none' }}> <div style={{ display: formDataValues.enabled ? 'block' : 'none' }}>
<p className="description reduced-margins"> <p className="description reduced-margins">
<a <a href="https://owncast.online/docs/notifications" target="_blank" rel="noreferrer">
href="https://developer.twitter.com/en/portal/dashboard"
target="_blank"
rel="noreferrer"
>
Read how to configure your Twitter account Read how to configure your Twitter account
</a>{' '} </a>{' '}
to support posting from Owncast. to support posting from Owncast.

9
web/pages/config-notify.tsx

@ -12,6 +12,7 @@ import TextFieldWithSubmit, {
import { TEXTFIELD_PROPS_FEDERATION_INSTANCE_URL } from '../utils/config-constants'; import { TEXTFIELD_PROPS_FEDERATION_INSTANCE_URL } from '../utils/config-constants';
import { ServerStatusContext } from '../utils/server-status-context'; import { ServerStatusContext } from '../utils/server-status-context';
import { UpdateArgs } from '../types/config-section'; import { UpdateArgs } from '../types/config-section';
import isValidUrl from '../utils/urls';
const { Title } = Typography; const { Title } = Typography;
@ -21,6 +22,7 @@ export default function ConfigNotify() {
const { serverConfig } = serverStatusData || {}; const { serverConfig } = serverStatusData || {};
const { yp } = serverConfig; const { yp } = serverConfig;
const { instanceUrl } = yp; const { instanceUrl } = yp;
const [urlValid, setUrlValid] = useState(false);
useEffect(() => { useEffect(() => {
setFormDataValues({ setFormDataValues({
@ -29,6 +31,10 @@ export default function ConfigNotify() {
}, [yp]); }, [yp]);
const handleSubmitInstanceUrl = () => { const handleSubmitInstanceUrl = () => {
if (!urlValid) {
return;
}
setFormDataValues({ setFormDataValues({
...formDataValues, ...formDataValues,
enabled: false, enabled: false,
@ -36,6 +42,8 @@ export default function ConfigNotify() {
}; };
const handleFieldChange = ({ fieldName, value }: UpdateArgs) => { const handleFieldChange = ({ fieldName, value }: UpdateArgs) => {
setUrlValid(isValidUrl(value));
setFormDataValues({ setFormDataValues({
...formDataValues, ...formDataValues,
[fieldName]: value, [fieldName]: value,
@ -43,7 +51,6 @@ export default function ConfigNotify() {
}; };
const enabled = instanceUrl !== ''; const enabled = instanceUrl !== '';
console.log(enabled);
const configurationWarning = !enabled && ( const configurationWarning = !enabled && (
<> <>
<Alert <Alert

Loading…
Cancel
Save