mirror of
				https://github.com/mastodon/mastodon.git
				synced 2025-10-30 12:41:27 +00:00 
			
		
		
		
	Improve interaction modal error handling (#26795)
This commit is contained in:
		
							parent
							
								
									ea7de25de0
								
							
						
					
					
						commit
						548c032dbb
					
				|  | @ -41,5 +41,7 @@ class Api::V1::Peers::SearchController < Api::BaseController | ||||||
|       domain = TagManager.instance.normalize_domain(domain) |       domain = TagManager.instance.normalize_domain(domain) | ||||||
|       @domains = Instance.searchable.where(Instance.arel_table[:domain].matches("#{Instance.sanitize_sql_like(domain)}%", false, true)).limit(10).pluck(:domain) |       @domains = Instance.searchable.where(Instance.arel_table[:domain].matches("#{Instance.sanitize_sql_like(domain)}%", false, true)).limit(10).pluck(:domain) | ||||||
|     end |     end | ||||||
|  |   rescue Addressable::URI::InvalidURIError | ||||||
|  |     @domains = [] | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -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)) { | ||||||
|         if (localStorage) { |         try { | ||||||
|           localStorage.setItem(PERSISTENCE_KEY, event.data.uri_or_domain); |           const url = new URL(event.data.template.replace('{uri}', encodeURIComponent(resourceUrl))); | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         window.location.href = event.data.template.replace('{uri}', encodeURIComponent(resourceUrl)); |           if (localStorage) { | ||||||
|  |             localStorage.setItem(PERSISTENCE_KEY, event.data.uri_or_domain); | ||||||
|  |           } | ||||||
|  | 
 | ||||||
|  |           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 && ( | ||||||
|  |  | ||||||
|  | @ -140,7 +140,9 @@ const fromAcct = (acct: string) => { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const fetchInteractionURL = (uri_or_domain: string) => { | const fetchInteractionURL = (uri_or_domain: string) => { | ||||||
|   if (/^https?:\/\//.test(uri_or_domain)) { |   if (uri_or_domain === '') { | ||||||
|  |     fetchInteractionURLFailure(); | ||||||
|  |   } else if (/^https?:\/\//.test(uri_or_domain)) { | ||||||
|     fromURL(uri_or_domain); |     fromURL(uri_or_domain); | ||||||
|   } else if (uri_or_domain.includes('@')) { |   } else if (uri_or_domain.includes('@')) { | ||||||
|     fromAcct(uri_or_domain); |     fromAcct(uri_or_domain); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Claire
						Claire