Merge pull request #553 from SatsAllDay/autocomplete-ln-addr

Add auto-complete support when withdrawing to ln addr
This commit is contained in:
Keyan 2023-10-12 13:18:29 -05:00 committed by GitHub
commit a37c0ef14a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 9 deletions

View File

@ -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>

View File

@ -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'