[Glitch] Improve interaction modal error handling
Port a8a25dcbdb
to glitch-soc
Signed-off-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
parent
9bb5ff5a62
commit
e55eb73623
1 changed files with 46 additions and 6 deletions
|
@ -100,8 +100,41 @@ class LoginForm extends React.PureComponent {
|
||||||
this.input = c;
|
this.input = c;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
isValueValid = (value) => {
|
||||||
|
let likelyAcct = false;
|
||||||
|
let url = null;
|
||||||
|
|
||||||
|
if (value.startsWith('/')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value.startsWith('@')) {
|
||||||
|
value = value.slice(1);
|
||||||
|
likelyAcct = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The user is in the middle of typing something, do not error out
|
||||||
|
if (value === '') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/^https?:\/\//.test(value) && !likelyAcct) {
|
||||||
|
url = value;
|
||||||
|
} else {
|
||||||
|
url = `https://${value}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
new URL(url);
|
||||||
|
return true;
|
||||||
|
} catch(_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
handleChange = ({ target }) => {
|
handleChange = ({ target }) => {
|
||||||
this.setState(state => ({ value: target.value, isLoading: true, error: false, options: addInputToOptions(target.value, state.networkOptions) }), () => this._loadOptions());
|
const error = !this.isValueValid(target.value);
|
||||||
|
this.setState(state => ({ error, value: target.value, isLoading: true, options: addInputToOptions(target.value, state.networkOptions) }), () => this._loadOptions());
|
||||||
};
|
};
|
||||||
|
|
||||||
handleMessage = (event) => {
|
handleMessage = (event) => {
|
||||||
|
@ -115,11 +148,18 @@ class LoginForm extends React.PureComponent {
|
||||||
this.setState({ isSubmitting: false, error: true });
|
this.setState({ isSubmitting: false, error: true });
|
||||||
} else if (event.data?.type === 'fetchInteractionURL-success') {
|
} else if (event.data?.type === 'fetchInteractionURL-success') {
|
||||||
if (/^https?:\/\//.test(event.data.template)) {
|
if (/^https?:\/\//.test(event.data.template)) {
|
||||||
|
try {
|
||||||
|
const url = new URL(event.data.template.replace('{uri}', encodeURIComponent(resourceUrl)));
|
||||||
|
|
||||||
if (localStorage) {
|
if (localStorage) {
|
||||||
localStorage.setItem(PERSISTENCE_KEY, event.data.uri_or_domain);
|
localStorage.setItem(PERSISTENCE_KEY, event.data.uri_or_domain);
|
||||||
}
|
}
|
||||||
|
|
||||||
window.location.href = event.data.template.replace('{uri}', encodeURIComponent(resourceUrl));
|
window.location.href = url;
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
this.setState({ isSubmitting: false, error: true });
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
this.setState({ isSubmitting: false, error: true });
|
this.setState({ isSubmitting: false, error: true });
|
||||||
}
|
}
|
||||||
|
@ -259,7 +299,7 @@ class LoginForm extends React.PureComponent {
|
||||||
spellcheck='false'
|
spellcheck='false'
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Button onClick={this.handleSubmit} disabled={isSubmitting}><FormattedMessage id='interaction_modal.login.action' defaultMessage='Take me home' /></Button>
|
<Button onClick={this.handleSubmit} disabled={isSubmitting || error}><FormattedMessage id='interaction_modal.login.action' defaultMessage='Take me home' /></Button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{hasPopOut && (
|
{hasPopOut && (
|
||||||
|
|
Loading…
Reference in a new issue