-
Notifications
You must be signed in to change notification settings - Fork 1
/
api.js
165 lines (148 loc) · 3.57 KB
/
api.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
import { ApolloClient, InMemoryCache, gql, createHttpLink } from '@apollo/client'
import { utils, ethers } from 'ethers'
import { setContext } from '@apollo/client/link/context';
import omitDeep from 'omit-deep'
import LENS_HUB_ABI from './ABI.json'
export const LENS_HUB_CONTRACT = "0xDb46d1Dc155634FbC732f92E853b10B288AD5a1d"
export const lensHub = new ethers.Contract(LENS_HUB_CONTRACT, LENS_HUB_ABI, getSigner())
const API_URL = 'https://api.lens.dev'
// export const client = new ApolloClient({
// uri: API_URL,
// cache: new InMemoryCache()
// })
/* configuring Apollo GraphQL Client */
const authLink = setContext((_, { headers }) => {
const token = window.localStorage.getItem('lens-auth-token')
return {
headers: {
...headers,
authorization: token ? `Bearer ${token}` : "",
}
}
})
const httpLink = createHttpLink({
uri: API_URL
})
export const client = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache()
})
/* GraphQL queries and mutations */
export async function createPostTypedDataMutation (request, token) {
const result = await client.mutate({
mutation: createPostTypedData,
variables: {
request,
},
context: {
headers: {
Authorization: `Bearer ${token}`
}
}
})
return result.data.createPostTypedData
}
export const createPostTypedData = gql`
mutation createPostTypedData($request: CreatePublicPostRequest!) {
createPostTypedData(request: $request) {
id
expiresAt
typedData {
types {
PostWithSig {
name
type
}
}
domain {
name
chainId
version
verifyingContract
}
value {
nonce
deadline
profileId
contentURI
collectModule
collectModuleInitData
referenceModule
referenceModuleInitData
}
}
}
}
`
export const challenge = gql`
query Challenge($address: EthereumAddress!) {
challenge(request: { address: $address }) {
text
}
}
`
export const authenticate = gql`
mutation Authenticate(
$address: EthereumAddress!
$signature: Signature!
) {
authenticate(request: {
address: $address,
signature: $signature
}) {
accessToken
refreshToken
}
}
`
export const getDefaultProfile = gql`
query DefaultProfile($address: EthereumAddress!) {
defaultProfile(request: { ethereumAddress: $address}) {
id
handle
}
}
`
export const validateMetadata = gql`
query ValidatePublicationMetadata ($metadatav2: PublicationMetadataV2Input!) {
validatePublicationMetadata(request: {
metadatav2: $metadatav2
}) {
valid
reason
}
}
`
/* helper functions */
function getSigner() {
if (typeof window !== "undefined") {
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner()
return signer
}
return null
}
export const signedTypeData = (
domain,
types,
value,
) => {
const signer = getSigner();
return signer._signTypedData(
omit(domain, '__typename'),
omit(types, '__typename'),
omit(value, '__typename')
)
}
export function omit (object, name) {
return omitDeep(object, name);
};
export const splitSignature = (signature) => {
return utils.splitSignature(signature)
}
export const signCreatePostTypedData = async (request, token) => {
const result = await createPostTypedDataMutation(request, token)
const typedData = result.typedData
const signature = await signedTypeData(typedData.domain, typedData.types, typedData.value);
return { result, signature };
}