Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: supports handleToAddress query #791

Merged
merged 4 commits into from
Dec 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/flat-boxes-work.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@lens-protocol/client": minor
---

**feat:** support `handleToAddress` query
8 changes: 8 additions & 0 deletions .changeset/sour-tables-impress.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@lens-protocol/react-native": patch
"@lens-protocol/react-web": patch
"@lens-protocol/client": patch
"@lens-protocol/react": patch
---

**fixed:** issue #777
8 changes: 8 additions & 0 deletions .changeset/stupid-taxis-move.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@lens-protocol/react-native": patch
"@lens-protocol/react-web": patch
"@lens-protocol/client": patch
"@lens-protocol/react": patch
---

**fixed:** TSDocs typos/mistakes
13 changes: 13 additions & 0 deletions examples/node/scripts/handle/resolveAddress.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { LensClient, development } from '@lens-protocol/client';

async function main() {
const client = new LensClient({
environment: development,
});

const address = await client.handle.resolveAddress({ handle: 'test/wagmi' });

console.log(`Address: `, address);
}

main();
2 changes: 2 additions & 0 deletions examples/web/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import {
UseCurrencies,
UseInviteWallets,
UseNotifications,
UseResolveAddress,
} from './misc';
import {
ProfilesPage,
Expand Down Expand Up @@ -198,6 +199,7 @@ export function App() {
<Route path="useApproveModule" element={<UseApproveModule />} />
<Route path="useClaimHandle" element={<UseClaimHandle />} />
<Route path="useInviteWallets" element={<UseInviteWallets />} />
<Route path="useResolveAddress" element={<UseResolveAddress />} />
<Route
path="lensClientInteroperability"
element={<LensClientInteroperability />}
Expand Down
4 changes: 2 additions & 2 deletions examples/web/src/LogInPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { LoginForm } from './components/auth';

export function LogInPage() {
const navigate = useNavigate();
const { address, isConnected, isConnecting } = useAccount();
const { address, isConnecting, isDisconnected } = useAccount();

const { connect } = useConnect({
connector: new InjectedConnector(),
Expand All @@ -18,7 +18,7 @@ export function LogInPage() {

return (
<div>
{!isConnected && (
{isDisconnected && (
<button disabled={isConnecting} onClick={() => connect()}>
Connect first
</button>
Expand Down
5 changes: 5 additions & 0 deletions examples/web/src/misc/MiscPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ const hooks = [
description: `Test ReactHooks SDK and Client SDK interoperability.`,
path: '/misc/lensClientInteroperability',
},
{
label: 'useResolveAddress',
description: `Resolves and EVM address from a Lens Handle.`,
path: '/misc/useResolveAddress',
},
];

export function MiscPage() {
Expand Down
29 changes: 29 additions & 0 deletions examples/web/src/misc/UseResolveAddress.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { useResolveAddress } from '@lens-protocol/react-web';
import toast from 'react-hot-toast';

export function UseResolveAddress() {
const { execute, loading } = useResolveAddress();

const resolve = async () => {
const result = await execute({ handle: 'test/wagmi' });

if (result.isFailure()) {
toast.error(result.error.message);
return;
}

toast.success(`Resolved address: ${String(result.value)}`);
};

return (
<div>
<h1>
<code>useNotifications</code>
</h1>

<button onClick={resolve} disabled={loading}>
Resolve test/wagmi
</button>
</div>
);
}
1 change: 1 addition & 0 deletions examples/web/src/misc/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@ export * from './MiscPage';
export * from './UseApproveModule';
export * from './UseClaimHandle';
export * from './UseCurrencies';
export * from './UseResolveAddress';
export * from './UseInviteWallets';
export * from './UseNotifications';
91 changes: 91 additions & 0 deletions packages/api-bindings/src/lens/graphql/generated.ts
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,11 @@ export type GetProfileMetadataArgs = {
useFallback?: InputMaybe<Scalars['Boolean']>;
};

export type HandleToAddressRequest = {
/** The full handle - namespace/localname */
handle: Scalars['Handle'];
};

export type HidePublicationRequest = {
for: Scalars['PublicationId'];
};
Expand Down Expand Up @@ -3064,6 +3069,12 @@ export type InjectCommonQueryParams = {
imageMediumSize: ImageTransformParam | null;
};

export type HandleToAddressVariables = Exact<{
request: HandleToAddressRequest;
}>;

export type HandleToAddressData = { result: EvmAddress | null };

export type InvitedResult = { by: EvmAddress; when: string; profileMinted: Profile | null };

export type InvitedProfilesVariables = Exact<{
Expand Down Expand Up @@ -170475,6 +170486,84 @@ export type FeedHighlightsQueryResult = Apollo.QueryResult<
FeedHighlightsData,
FeedHighlightsVariables
>;
export const HandleToAddressDocument = /*#__PURE__*/ {
kind: 'Document',
definitions: [
{
kind: 'OperationDefinition',
operation: 'query',
name: { kind: 'Name', value: 'HandleToAddress' },
variableDefinitions: [
{
kind: 'VariableDefinition',
variable: { kind: 'Variable', name: { kind: 'Name', value: 'request' } },
type: {
kind: 'NonNullType',
type: { kind: 'NamedType', name: { kind: 'Name', value: 'HandleToAddressRequest' } },
},
},
],
selectionSet: {
kind: 'SelectionSet',
selections: [
{
kind: 'Field',
alias: { kind: 'Name', value: 'result' },
name: { kind: 'Name', value: 'handleToAddress' },
arguments: [
{
kind: 'Argument',
name: { kind: 'Name', value: 'request' },
value: { kind: 'Variable', name: { kind: 'Name', value: 'request' } },
},
],
},
],
},
},
],
} as unknown as DocumentNode;

/**
* __useHandleToAddress__
*
* To run a query within a React component, call `useHandleToAddress` and pass it any options that fit your needs.
* When your component renders, `useHandleToAddress` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useHandleToAddress({
* variables: {
* request: // value for 'request'
* },
* });
*/
export function useHandleToAddress(
baseOptions: Apollo.QueryHookOptions<HandleToAddressData, HandleToAddressVariables>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<HandleToAddressData, HandleToAddressVariables>(
HandleToAddressDocument,
options,
);
}
export function useHandleToAddressLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<HandleToAddressData, HandleToAddressVariables>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<HandleToAddressData, HandleToAddressVariables>(
HandleToAddressDocument,
options,
);
}
export type HandleToAddressHookResult = ReturnType<typeof useHandleToAddress>;
export type HandleToAddressLazyQueryHookResult = ReturnType<typeof useHandleToAddressLazyQuery>;
export type HandleToAddressQueryResult = Apollo.QueryResult<
HandleToAddressData,
HandleToAddressVariables
>;
export const InvitedProfilesDocument = /*#__PURE__*/ {
kind: 'Document',
definitions: [
Expand Down Expand Up @@ -248432,6 +248521,7 @@ export type QueryKeySpecifier = (
| 'following'
| 'fxRateFor'
| 'generateModuleCurrencyApprovalData'
| 'handleToAddress'
| 'imageMediumSize'
| 'imageSmallSize'
| 'internalAllowedDomains'
Expand Down Expand Up @@ -248517,6 +248607,7 @@ export type QueryFieldPolicy = {
following?: FieldPolicy<any> | FieldReadFunction<any>;
fxRateFor?: FieldPolicy<any> | FieldReadFunction<any>;
generateModuleCurrencyApprovalData?: FieldPolicy<any> | FieldReadFunction<any>;
handleToAddress?: FieldPolicy<any> | FieldReadFunction<any>;
imageMediumSize?: FieldPolicy<any> | FieldReadFunction<any>;
imageSmallSize?: FieldPolicy<any> | FieldReadFunction<any>;
internalAllowedDomains?: FieldPolicy<any> | FieldReadFunction<any>;
Expand Down
3 changes: 3 additions & 0 deletions packages/api-bindings/src/lens/graphql/handle.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
query HandleToAddress($request: HandleToAddressRequest!) {
result: handleToAddress(request: $request)
}
8 changes: 8 additions & 0 deletions packages/client/src/LensClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
Transaction,
Wallet,
} from './submodules';
import { Handle } from './submodules/handle';

/**
* LensClient configuration
Expand Down Expand Up @@ -114,6 +115,13 @@ export class LensClient {
return new Feed(this.context, this._authentication);
}

/**
* The Handle module
*/
get handle(): Handle {
return new Handle(this.context, this._authentication);
}

/**
* The Invites module
*/
Expand Down
9 changes: 9 additions & 0 deletions packages/client/src/environments.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,12 @@ export const development = new Environment(
'https://api-v2-mumbai-live.lens.dev',
GatedEnvironments.development,
);

/**
* @internal
*/
export const staging = new Environment(
'staging',
'https://api-mumbai.lens-v2.crtlkey.com/',
GatedEnvironments.development,
);
5 changes: 5 additions & 0 deletions packages/client/src/graphql/types.generated.ts
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,11 @@ export type GetProfileMetadataArgs = {
useFallback?: InputMaybe<Scalars['Boolean']['input']>;
};

export type HandleToAddressRequest = {
/** The full handle - namespace/localname */
handle: Scalars['Handle']['input'];
};

export type HidePublicationRequest = {
for: Scalars['PublicationId']['input'];
};
Expand Down
38 changes: 38 additions & 0 deletions packages/client/src/submodules/handle/Handle.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import type { Authentication } from '../../authentication';
import { LensContext } from '../../context';
import { FetchGraphQLClient } from '../../graphql/FetchGraphQLClient';
import { HandleToAddressRequest } from '../../graphql/types.generated';
import { sdkAuthHeaderWrapper } from '../../helpers';
import { Sdk, getSdk } from './graphql/handle.generated';

/**
* Handle is one of the Lens primitives.
*
* Handle can be used to identify an Lens Profile or standalone.
*
* @group LensClient Modules
*/
export class Handle {
private readonly sdk: Sdk;

constructor(context: LensContext, authentication: Authentication) {
const client = new FetchGraphQLClient(context);

this.sdk = getSdk(client, sdkAuthHeaderWrapper(authentication));
}

/**
* Resolve a Handle to the owner address.
* @param request - The request object
* @returns The address or null
*
* @example
* ```ts
* const address = await client.handle.resolveAddress({ handle: 'lens/wagmi' });
* ```
*/
async resolveAddress(request: HandleToAddressRequest): Promise<string | null> {
const response = await this.sdk.HandleToAddress({ request });
return response.data.result;
}
}
Loading
Loading