Hey is a decentralized and permissionless social media app built with Lens Protocol 🌿

feat: implement ENS username creation flow with validation and transaction handling

yoginth.com e05b8088 fe05ac4b

verified
+303 -2
+197 -2
apps/web/src/components/ENS/Mint.tsx
··· 1 + import { 2 + ExclamationTriangleIcon, 3 + MagnifyingGlassIcon 4 + } from "@heroicons/react/24/outline"; 5 + import { 6 + HEY_ENS_NAMESPACE, 7 + NATIVE_TOKEN_SYMBOL, 8 + STATIC_IMAGES_URL 9 + } from "@hey/data/constants"; 10 + import { Regex } from "@hey/data/regex"; 11 + import { useCreateUsernameMutation, useUsernameQuery } from "@hey/indexer"; 12 + import { useCallback, useState } from "react"; 13 + import z from "zod"; 1 14 import NotLoggedIn from "@/components/Shared/NotLoggedIn"; 15 + import errorToast from "@/helpers/errorToast"; 16 + import getTokenImage from "@/helpers/getTokenImage"; 17 + import useHandleWrongNetwork from "@/hooks/useHandleWrongNetwork"; 18 + import useTransactionLifecycle from "@/hooks/useTransactionLifecycle"; 2 19 import { useAccountStore } from "@/store/persisted/useAccountStore"; 3 - import { Card } from "../Shared/UI"; 20 + import { 21 + Button, 22 + Card, 23 + Form, 24 + Image, 25 + Input, 26 + Tooltip, 27 + useZodForm 28 + } from "../Shared/UI"; 29 + import { useENSCreateStore } from "."; 30 + 31 + const ValidationSchema = z.object({ 32 + username: z 33 + .string() 34 + .min(3, { message: "Username must be at least 3 characters long" }) 35 + .max(50, { message: "Username must be at most 26 characters long" }) 36 + .regex(Regex.username, { 37 + message: 38 + "Username must start with a letter/number, only _ allowed in between" 39 + }) 40 + }); 4 41 5 42 const Mint = () => { 6 43 const { currentAccount } = useAccountStore(); 44 + const { setChosenUsername, setTransactionHash, setScreen } = 45 + useENSCreateStore(); 46 + const [isSubmitting, setIsSubmitting] = useState(false); 47 + const [isAvailable, setIsAvailable] = useState<boolean | null>(null); 48 + const handleWrongNetwork = useHandleWrongNetwork(); 49 + const handleTransactionLifecycle = useTransactionLifecycle(); 50 + const form = useZodForm({ mode: "onChange", schema: ValidationSchema }); 51 + 52 + const onCompleted = (hash: string) => { 53 + setIsSubmitting(false); 54 + setChosenUsername(username); 55 + setTransactionHash(hash); 56 + setScreen("minting"); 57 + }; 58 + 59 + const onError = useCallback((error?: any) => { 60 + setIsSubmitting(false); 61 + errorToast(error); 62 + }, []); 63 + 64 + const [createUsername] = useCreateUsernameMutation({ 65 + onCompleted: async ({ createUsername }) => { 66 + if (createUsername.__typename === "CreateUsernameResponse") { 67 + return onCompleted(createUsername.hash); 68 + } 69 + 70 + if (createUsername.__typename === "UsernameTaken") { 71 + return onError({ message: createUsername.reason }); 72 + } 73 + 74 + return await handleTransactionLifecycle({ 75 + onCompleted, 76 + onError, 77 + transactionData: createUsername 78 + }); 79 + }, 80 + onError 81 + }); 82 + 83 + const username = form.watch("username"); 84 + const canCheck = Boolean(username && username.length > 2); 85 + const isInvalid = !form.formState.isValid; 86 + const price = 87 + username && username.length > 2 88 + ? username.length === 3 89 + ? 50 90 + : username.length === 4 91 + ? 20 92 + : 5 93 + : 0; 94 + 95 + useUsernameQuery({ 96 + fetchPolicy: "no-cache", 97 + onCompleted: (data) => setIsAvailable(!data.username), 98 + skip: !canCheck, 99 + variables: { 100 + request: { 101 + username: { 102 + localName: username?.toLowerCase(), 103 + namespace: HEY_ENS_NAMESPACE 104 + } 105 + } 106 + } 107 + }); 108 + 109 + const handleCreate = async ({ 110 + username 111 + }: z.infer<typeof ValidationSchema>) => { 112 + try { 113 + setIsSubmitting(true); 114 + await handleWrongNetwork(); 115 + 116 + return await createUsername({ 117 + variables: { 118 + request: { 119 + username: { 120 + localName: username.toLowerCase(), 121 + namespace: HEY_ENS_NAMESPACE 122 + } 123 + } 124 + } 125 + }); 126 + } catch { 127 + onError(); 128 + } finally { 129 + setIsSubmitting(false); 130 + } 131 + }; 132 + 133 + const disabled = !canCheck || !isAvailable || isSubmitting || isInvalid; 7 134 8 135 if (!currentAccount) { 9 136 return <NotLoggedIn />; 10 137 } 11 138 12 - return <Card className="p-5">Gm</Card>; 139 + return ( 140 + <Card className="p-5"> 141 + <div className="flex items-center justify-between"> 142 + <div className="flex items-center gap-2"> 143 + <Image 144 + alt="Logo" 145 + className="size-4" 146 + height={16} 147 + src={`${STATIC_IMAGES_URL}/app-icon/0.png`} 148 + width={16} 149 + /> 150 + <div className="font-black">Heynames</div> 151 + </div> 152 + <div className="text-gray-500 text-sm">Powered by ENS</div> 153 + </div> 154 + <Form 155 + className="space-y-5 pt-2" 156 + form={form} 157 + onSubmit={async ({ username }) => 158 + await handleCreate({ username: username.toLowerCase() }) 159 + } 160 + > 161 + <Input 162 + iconLeft={<MagnifyingGlassIcon />} 163 + iconRight={<span>hey.xyz</span>} 164 + placeholder="Search for a name" 165 + {...form.register("username")} 166 + hideError 167 + /> 168 + {canCheck && !isInvalid ? ( 169 + isAvailable === false ? ( 170 + <Card className="p-5"> 171 + <b>{username}.hey.xyz</b> is already taken. 172 + </Card> 173 + ) : isAvailable === true ? ( 174 + <Card className="space-y-5 p-5"> 175 + <div> 176 + Register <b>{username}.hey.xyz</b> for{" "} 177 + <span className="inline-flex items-center gap-x-1"> 178 + {price}{" "} 179 + <Tooltip content={NATIVE_TOKEN_SYMBOL} placement="top"> 180 + <img 181 + alt={NATIVE_TOKEN_SYMBOL} 182 + className="size-5" 183 + src={getTokenImage(NATIVE_TOKEN_SYMBOL)} 184 + /> 185 + </Tooltip> 186 + / once 187 + </span> 188 + </div> 189 + <Button 190 + className="w-full" 191 + disabled={disabled} 192 + loading={isSubmitting} 193 + type="submit" 194 + > 195 + Register Name 196 + </Button> 197 + </Card> 198 + ) : null 199 + ) : canCheck && isInvalid ? ( 200 + <Card className="flex items-center space-x-1 p-5 text-red-500 text-sm"> 201 + <ExclamationTriangleIcon className="size-4" /> 202 + <b>{form.formState.errors.username?.message?.toString()}</b> 203 + </Card> 204 + ) : null} 205 + </Form> 206 + </Card> 207 + ); 13 208 }; 14 209 15 210 export default Mint;
+22
apps/web/src/components/ENS/index.tsx
··· 1 + import { createTrackedSelector } from "react-tracked"; 2 + import { create } from "zustand"; 1 3 import NotLoggedIn from "@/components/Shared/NotLoggedIn"; 2 4 import PageLayout from "@/components/Shared/PageLayout"; 3 5 import { useAccountStore } from "@/store/persisted/useAccountStore"; 4 6 import Mint from "./Mint"; 7 + 8 + interface ENSCreateState { 9 + chosenUsername: string; 10 + screen: "choose" | "minting" | "success"; 11 + transactionHash: string; 12 + setChosenUsername: (username: string) => void; 13 + setScreen: (screen: "choose" | "minting" | "success") => void; 14 + setTransactionHash: (hash: string) => void; 15 + } 16 + 17 + const store = create<ENSCreateState>((set) => ({ 18 + chosenUsername: "", 19 + screen: "choose", 20 + setChosenUsername: (username) => set({ chosenUsername: username }), 21 + setScreen: (screen) => set({ screen }), 22 + setTransactionHash: (hash) => set({ transactionHash: hash }), 23 + transactionHash: "" 24 + })); 25 + 26 + export const useENSCreateStore = createTrackedSelector(store); 5 27 6 28 const ENS = () => { 7 29 const { currentAccount } = useAccountStore();
+2
packages/data/constants.ts
··· 72 72 SUBSCRIPTION: "0x4BE5b4519814A57E6f9AaFC6afBB37eAEeE35aA3" 73 73 } as const; 74 74 75 + export const HEY_ENS_NAMESPACE = "0x6821262a0e15ed3b4bfd54c1b4fe558c093a103b"; 76 + 75 77 export const MeVariables = { 76 78 betaBannerId: BANNER_IDS.BETA, 77 79 proBannerId: BANNER_IDS.PRO
+22
packages/indexer/documents/mutations/account/CreateUsername.graphql
··· 1 + mutation CreateUsername($request: CreateUsernameRequest!) { 2 + createUsername(request: $request) { 3 + ... on CreateUsernameResponse { 4 + hash 5 + } 6 + ... on NamespaceOperationValidationFailed { 7 + reason 8 + } 9 + ... on UsernameTaken { 10 + reason 11 + } 12 + ... on SelfFundedTransactionRequest { 13 + ...SelfFundedTransactionRequest 14 + } 15 + ... on SponsoredTransactionRequest { 16 + ...SponsoredTransactionRequest 17 + } 18 + ... on TransactionWillFail { 19 + ...TransactionWillFail 20 + } 21 + } 22 + }
+5
packages/indexer/documents/queries/account/Username.graphql
··· 1 + query Username($request: UsernameRequest!) { 2 + username(request: $request) { 3 + ...Username 4 + } 5 + }
+55
packages/indexer/generated.ts
··· 7857 7857 | { __typename?: 'UsernameTaken', reason: string } 7858 7858 }; 7859 7859 7860 + export type CreateUsernameMutationVariables = Exact<{ 7861 + request: CreateUsernameRequest; 7862 + }>; 7863 + 7864 + 7865 + export type CreateUsernameMutation = { __typename?: 'Mutation', createUsername: 7866 + | { __typename?: 'CreateUsernameResponse', hash: any } 7867 + | { __typename?: 'NamespaceOperationValidationFailed', reason: string } 7868 + | ( 7869 + { __typename?: 'SelfFundedTransactionRequest' } 7870 + & SelfFundedTransactionRequestFragment 7871 + ) 7872 + | ( 7873 + { __typename?: 'SponsoredTransactionRequest' } 7874 + & SponsoredTransactionRequestFragment 7875 + ) 7876 + | ( 7877 + { __typename?: 'TransactionWillFail' } 7878 + & TransactionWillFailFragment 7879 + ) 7880 + | { __typename?: 'UsernameTaken', reason: string } 7881 + }; 7882 + 7860 7883 export type ExecuteAccountActionMutationVariables = Exact<{ 7861 7884 request: ExecuteAccountActionRequest; 7862 7885 }>; ··· 8828 8851 & PaginatedResultInfoFragment 8829 8852 ) } }; 8830 8853 8854 + export type UsernameQueryVariables = Exact<{ 8855 + request: UsernameRequest; 8856 + }>; 8857 + 8858 + 8859 + export type UsernameQuery = { __typename?: 'Query', username?: ( 8860 + { __typename?: 'Username' } 8861 + & UsernameFragment 8862 + ) | null }; 8863 + 8831 8864 export type UsernamesQueryVariables = Exact<{ 8832 8865 request: UsernamesRequest; 8833 8866 }>; ··· 9213 9246 return Apollo.useMutation<CreateAccountWithUsernameMutation, CreateAccountWithUsernameMutationVariables>(CreateAccountWithUsernameDocument, options); 9214 9247 } 9215 9248 export type CreateAccountWithUsernameMutationHookResult = ReturnType<typeof useCreateAccountWithUsernameMutation>; 9249 + export const CreateUsernameDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateUsername"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"request"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateUsernameRequest"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createUsername"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"request"},"value":{"kind":"Variable","name":{"kind":"Name","value":"request"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"CreateUsernameResponse"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hash"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"NamespaceOperationValidationFailed"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reason"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"UsernameTaken"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reason"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SelfFundedTransactionRequest"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SelfFundedTransactionRequest"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SponsoredTransactionRequest"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SponsoredTransactionRequest"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TransactionWillFail"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"TransactionWillFail"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SelfFundedTransactionRequest"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SelfFundedTransactionRequest"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"raw"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"chainId"}},{"kind":"Field","name":{"kind":"Name","value":"data"}},{"kind":"Field","name":{"kind":"Name","value":"from"}},{"kind":"Field","name":{"kind":"Name","value":"gasLimit"}},{"kind":"Field","name":{"kind":"Name","value":"maxFeePerGas"}},{"kind":"Field","name":{"kind":"Name","value":"maxPriorityFeePerGas"}},{"kind":"Field","name":{"kind":"Name","value":"nonce"}},{"kind":"Field","name":{"kind":"Name","value":"to"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SponsoredTransactionRequest"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SponsoredTransactionRequest"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"raw"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"chainId"}},{"kind":"Field","name":{"kind":"Name","value":"data"}},{"kind":"Field","name":{"kind":"Name","value":"from"}},{"kind":"Field","name":{"kind":"Name","value":"gasLimit"}},{"kind":"Field","name":{"kind":"Name","value":"maxFeePerGas"}},{"kind":"Field","name":{"kind":"Name","value":"maxPriorityFeePerGas"}},{"kind":"Field","name":{"kind":"Name","value":"nonce"}},{"kind":"Field","name":{"kind":"Name","value":"to"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"value"}},{"kind":"Field","name":{"kind":"Name","value":"customData"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"customSignature"}},{"kind":"Field","name":{"kind":"Name","value":"factoryDeps"}},{"kind":"Field","name":{"kind":"Name","value":"gasPerPubdata"}},{"kind":"Field","name":{"kind":"Name","value":"paymasterParams"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"paymaster"}},{"kind":"Field","name":{"kind":"Name","value":"paymasterInput"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"TransactionWillFail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TransactionWillFail"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reason"}}]}}]} as unknown as DocumentNode; 9250 + export function useCreateUsernameMutation(baseOptions?: Apollo.MutationHookOptions<CreateUsernameMutation, CreateUsernameMutationVariables>) { 9251 + const options = {...defaultOptions, ...baseOptions} 9252 + return Apollo.useMutation<CreateUsernameMutation, CreateUsernameMutationVariables>(CreateUsernameDocument, options); 9253 + } 9254 + export type CreateUsernameMutationHookResult = ReturnType<typeof useCreateUsernameMutation>; 9216 9255 export const ExecuteAccountActionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ExecuteAccountAction"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"request"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ExecuteAccountActionRequest"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"executeAccountAction"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"request"},"value":{"kind":"Variable","name":{"kind":"Name","value":"request"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ExecuteAccountActionResponse"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hash"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SelfFundedTransactionRequest"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SelfFundedTransactionRequest"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SponsoredTransactionRequest"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"SponsoredTransactionRequest"}}]}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TransactionWillFail"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"TransactionWillFail"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SelfFundedTransactionRequest"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SelfFundedTransactionRequest"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"raw"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"chainId"}},{"kind":"Field","name":{"kind":"Name","value":"data"}},{"kind":"Field","name":{"kind":"Name","value":"from"}},{"kind":"Field","name":{"kind":"Name","value":"gasLimit"}},{"kind":"Field","name":{"kind":"Name","value":"maxFeePerGas"}},{"kind":"Field","name":{"kind":"Name","value":"maxPriorityFeePerGas"}},{"kind":"Field","name":{"kind":"Name","value":"nonce"}},{"kind":"Field","name":{"kind":"Name","value":"to"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"SponsoredTransactionRequest"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"SponsoredTransactionRequest"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"raw"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"chainId"}},{"kind":"Field","name":{"kind":"Name","value":"data"}},{"kind":"Field","name":{"kind":"Name","value":"from"}},{"kind":"Field","name":{"kind":"Name","value":"gasLimit"}},{"kind":"Field","name":{"kind":"Name","value":"maxFeePerGas"}},{"kind":"Field","name":{"kind":"Name","value":"maxPriorityFeePerGas"}},{"kind":"Field","name":{"kind":"Name","value":"nonce"}},{"kind":"Field","name":{"kind":"Name","value":"to"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"value"}},{"kind":"Field","name":{"kind":"Name","value":"customData"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"customSignature"}},{"kind":"Field","name":{"kind":"Name","value":"factoryDeps"}},{"kind":"Field","name":{"kind":"Name","value":"gasPerPubdata"}},{"kind":"Field","name":{"kind":"Name","value":"paymasterParams"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"paymaster"}},{"kind":"Field","name":{"kind":"Name","value":"paymasterInput"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"TransactionWillFail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"TransactionWillFail"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"reason"}}]}}]} as unknown as DocumentNode; 9217 9256 export function useExecuteAccountActionMutation(baseOptions?: Apollo.MutationHookOptions<ExecuteAccountActionMutation, ExecuteAccountActionMutationVariables>) { 9218 9257 const options = {...defaultOptions, ...baseOptions} ··· 9755 9794 export type TokenDistributionsQueryHookResult = ReturnType<typeof useTokenDistributionsQuery>; 9756 9795 export type TokenDistributionsLazyQueryHookResult = ReturnType<typeof useTokenDistributionsLazyQuery>; 9757 9796 export type TokenDistributionsSuspenseQueryHookResult = ReturnType<typeof useTokenDistributionsSuspenseQuery>; 9797 + export const UsernameDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Username"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"request"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UsernameRequest"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"username"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"request"},"value":{"kind":"Variable","name":{"kind":"Name","value":"request"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"Username"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"Username"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Username"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"namespace"}},{"kind":"Field","name":{"kind":"Name","value":"localName"}},{"kind":"Field","name":{"kind":"Name","value":"linkedTo"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}}]} as unknown as DocumentNode; 9798 + export function useUsernameQuery(baseOptions: Apollo.QueryHookOptions<UsernameQuery, UsernameQueryVariables> & ({ variables: UsernameQueryVariables; skip?: boolean; } | { skip: boolean; }) ) { 9799 + const options = {...defaultOptions, ...baseOptions} 9800 + return Apollo.useQuery<UsernameQuery, UsernameQueryVariables>(UsernameDocument, options); 9801 + } 9802 + export function useUsernameLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<UsernameQuery, UsernameQueryVariables>) { 9803 + const options = {...defaultOptions, ...baseOptions} 9804 + return Apollo.useLazyQuery<UsernameQuery, UsernameQueryVariables>(UsernameDocument, options); 9805 + } 9806 + export function useUsernameSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions<UsernameQuery, UsernameQueryVariables>) { 9807 + const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} 9808 + return Apollo.useSuspenseQuery<UsernameQuery, UsernameQueryVariables>(UsernameDocument, options); 9809 + } 9810 + export type UsernameQueryHookResult = ReturnType<typeof useUsernameQuery>; 9811 + export type UsernameLazyQueryHookResult = ReturnType<typeof useUsernameLazyQuery>; 9812 + export type UsernameSuspenseQueryHookResult = ReturnType<typeof useUsernameSuspenseQuery>; 9758 9813 export const UsernamesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"Usernames"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"request"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UsernamesRequest"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"usernames"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"request"},"value":{"kind":"Variable","name":{"kind":"Name","value":"request"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"items"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"Username"}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"PaginatedResultInfo"}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PaginatedResultInfo"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"PaginatedResultInfo"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"prev"}},{"kind":"Field","name":{"kind":"Name","value":"next"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"Username"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Username"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"namespace"}},{"kind":"Field","name":{"kind":"Name","value":"localName"}},{"kind":"Field","name":{"kind":"Name","value":"linkedTo"}},{"kind":"Field","name":{"kind":"Name","value":"value"}}]}}]} as unknown as DocumentNode; 9759 9814 export function useUsernamesQuery(baseOptions: Apollo.QueryHookOptions<UsernamesQuery, UsernamesQueryVariables> & ({ variables: UsernamesQueryVariables; skip?: boolean; } | { skip: boolean; }) ) { 9760 9815 const options = {...defaultOptions, ...baseOptions}