Merge pull request #553 from SatsAllDay/autocomplete-ln-addr
Add auto-complete support when withdrawing to ln addr
This commit is contained in:
		
						commit
						a37c0ef14a
					
				| @ -230,12 +230,13 @@ export function MarkdownInput ({ label, topLevel, groupClassName, onChange, setH | |||||||
|             query={mentionQuery} |             query={mentionQuery} | ||||||
|             onSelect={insertMention} |             onSelect={insertMention} | ||||||
|             dropdownStyle={userSuggestDropdownStyle} |             dropdownStyle={userSuggestDropdownStyle} | ||||||
|           >{({ onKeyDown: userSuggestOnKeyDown }) => ( |           >{({ onKeyDown: userSuggestOnKeyDown, resetSuggestions }) => ( | ||||||
|             <InputInner |             <InputInner | ||||||
|               innerRef={innerRef} |               innerRef={innerRef} | ||||||
|               {...props} |               {...props} | ||||||
|               onChange={onChangeInner} |               onChange={onChangeInner} | ||||||
|               onKeyDown={onKeyDownInner(userSuggestOnKeyDown)} |               onKeyDown={onKeyDownInner(userSuggestOnKeyDown)} | ||||||
|  |               onBlur={resetSuggestions} | ||||||
|             />)} |             />)} | ||||||
|           </UserSuggest> |           </UserSuggest> | ||||||
|         </div> |         </div> | ||||||
| @ -408,15 +409,28 @@ function InputInner ({ | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const INITIAL_SUGGESTIONS = { array: [], index: 0 } | const INITIAL_SUGGESTIONS = { array: [], index: 0 } | ||||||
| export function UserSuggest ({ query, onSelect, dropdownStyle, children }) { | export function UserSuggest ({ | ||||||
|  |   query, onSelect, dropdownStyle, children, | ||||||
|  |   transformUser = user => user, selectWithTab = true, filterUsers = () => true | ||||||
|  | }) { | ||||||
|   const [getUsers] = useLazyQuery(TOP_USERS, { |   const [getUsers] = useLazyQuery(TOP_USERS, { | ||||||
|     onCompleted: data => { |     onCompleted: data => { | ||||||
|       setSuggestions({ array: data.topUsers.users, index: 0 }) |       setSuggestions({ | ||||||
|  |         array: data.topUsers.users | ||||||
|  |           .filter((...args) => filterUsers(query, ...args)) | ||||||
|  |           .map(transformUser), | ||||||
|  |         index: 0 | ||||||
|  |       }) | ||||||
|     } |     } | ||||||
|   }) |   }) | ||||||
|   const [getSuggestions] = useLazyQuery(USER_SEARCH, { |   const [getSuggestions] = useLazyQuery(USER_SEARCH, { | ||||||
|     onCompleted: data => { |     onCompleted: data => { | ||||||
|       setSuggestions({ array: data.searchUsers, index: 0 }) |       setSuggestions({ | ||||||
|  |         array: data.searchUsers | ||||||
|  |           .filter((...args) => filterUsers(query, ...args)) | ||||||
|  |           .map(transformUser), | ||||||
|  |         index: 0 | ||||||
|  |       }) | ||||||
|     } |     } | ||||||
|   }) |   }) | ||||||
| 
 | 
 | ||||||
| @ -462,6 +476,9 @@ export function UserSuggest ({ query, onSelect, dropdownStyle, children }) { | |||||||
|         break |         break | ||||||
|       case 'Tab': |       case 'Tab': | ||||||
|       case 'Enter': |       case 'Enter': | ||||||
|  |         if (e.code === 'Tab' && !selectWithTab) { | ||||||
|  |           break | ||||||
|  |         } | ||||||
|         if (suggestions.array?.length === 0) { |         if (suggestions.array?.length === 0) { | ||||||
|           break |           break | ||||||
|         } |         } | ||||||
| @ -479,7 +496,7 @@ export function UserSuggest ({ query, onSelect, dropdownStyle, children }) { | |||||||
|   }, [onSelect, resetSuggestions, suggestions]) |   }, [onSelect, resetSuggestions, suggestions]) | ||||||
|   return ( |   return ( | ||||||
|     <> |     <> | ||||||
|       {children?.({ onKeyDown })} |       {children?.({ onKeyDown, resetSuggestions })} | ||||||
|       <Dropdown show={suggestions.array.length > 0} style={dropdownStyle}> |       <Dropdown show={suggestions.array.length > 0} style={dropdownStyle}> | ||||||
|         <Dropdown.Menu className={styles.suggestionsMenu}> |         <Dropdown.Menu className={styles.suggestionsMenu}> | ||||||
|           {suggestions.array.map((v, i) => |           {suggestions.array.map((v, i) => | ||||||
| @ -499,16 +516,19 @@ export function UserSuggest ({ query, onSelect, dropdownStyle, children }) { | |||||||
|   ) |   ) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export function InputUserSuggest ({ label, groupClassName, ...props }) { | export function InputUserSuggest ({ label, groupClassName, transformUser, filterUsers, selectWithTab, ...props }) { | ||||||
|   const [ovalue, setOValue] = useState() |   const [ovalue, setOValue] = useState() | ||||||
|   const [query, setQuery] = useState() |   const [query, setQuery] = useState() | ||||||
|   return ( |   return ( | ||||||
|     <FormGroup label={label} className={groupClassName}> |     <FormGroup label={label} className={groupClassName}> | ||||||
|       <UserSuggest |       <UserSuggest | ||||||
|  |         transformUser={transformUser} | ||||||
|  |         filterUsers={filterUsers} | ||||||
|  |         selectWithTab={selectWithTab} | ||||||
|         onSelect={setOValue} |         onSelect={setOValue} | ||||||
|         query={query} |         query={query} | ||||||
|       > |       > | ||||||
|         {({ onKeyDown }) => ( |         {({ onKeyDown, resetSuggestions }) => ( | ||||||
|           <InputInner |           <InputInner | ||||||
|             {...props} |             {...props} | ||||||
|             autoComplete='off' |             autoComplete='off' | ||||||
| @ -518,6 +538,7 @@ export function InputUserSuggest ({ label, groupClassName, ...props }) { | |||||||
|             }} |             }} | ||||||
|             overrideValue={ovalue} |             overrideValue={ovalue} | ||||||
|             onKeyDown={onKeyDown} |             onKeyDown={onKeyDown} | ||||||
|  |             onBlur={resetSuggestions} | ||||||
|           /> |           /> | ||||||
|         )} |         )} | ||||||
|       </UserSuggest> |       </UserSuggest> | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| import { useRouter } from 'next/router' | import { useRouter } from 'next/router' | ||||||
| import { Checkbox, Form, Input, SubmitButton } from '../components/form' | import { Checkbox, Form, Input, InputUserSuggest, SubmitButton } from '../components/form' | ||||||
| import Link from 'next/link' | import Link from 'next/link' | ||||||
| import Button from 'react-bootstrap/Button' | import Button from 'react-bootstrap/Button' | ||||||
| import { gql, useMutation, useQuery } from '@apollo/client' | import { gql, useMutation, useQuery } from '@apollo/client' | ||||||
| @ -349,12 +349,21 @@ export function LnAddrWithdrawal () { | |||||||
|           router.push(`/withdrawals/${data.sendToLnAddr.id}`) |           router.push(`/withdrawals/${data.sendToLnAddr.id}`) | ||||||
|         }} |         }} | ||||||
|       > |       > | ||||||
|         <Input |         <InputUserSuggest | ||||||
|           label='lightning address' |           label='lightning address' | ||||||
|           name='addr' |           name='addr' | ||||||
|           required |           required | ||||||
|           autoFocus |           autoFocus | ||||||
|           onChange={onAddrChange} |           onChange={onAddrChange} | ||||||
|  |           transformUser={user => ({ ...user, name: `${user.name}@stacker.news` })} | ||||||
|  |           selectWithTab={false} | ||||||
|  |           filterUsers={(query) => { | ||||||
|  |             if (!query.includes('@')) { | ||||||
|  |               return true | ||||||
|  |             } | ||||||
|  |             const [, domain] = query.split('@') | ||||||
|  |             return 'stacker.news'.startsWith(domain) | ||||||
|  |           }} | ||||||
|         /> |         /> | ||||||
|         <Input |         <Input | ||||||
|           label='amount' |           label='amount' | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user