Skip to content

Commit 52cb0c8

Browse files
feat: allow to override fetch function in farcaster identity hooks (#528)
1 parent a2cf90e commit 52cb0c8

File tree

3 files changed

+61
-29
lines changed

3 files changed

+61
-29
lines changed

.changeset/serious-phones-judge.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@frames.js/render": patch
3+
---
4+
5+
feat(@frames.js/render): allow to override fetch function in farcaster identity hooks

packages/render/src/identity/farcaster/use-farcaster-identity.tsx

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,14 @@ type UseFarcasterIdentityOptions = {
134134
* @defaultValue 'farcasterIdentity'
135135
*/
136136
storageKey?: string;
137+
/**
138+
* Function used to generate a unique user id for signer._id property value
139+
*/
137140
generateUserId?: () => string | number;
141+
/**
142+
* Custom fetch function used to do requests
143+
*/
144+
fetchFn?: typeof fetch;
138145
/**
139146
* Used to detect if the current context is visible, this affects the polling of the signer approval status.
140147
*/
@@ -157,6 +164,8 @@ const defaultGenerateUserId = (): number => {
157164
return Date.now();
158165
};
159166

167+
const defaultFetchFn: typeof fetch = (...args) => fetch(...args);
168+
160169
export function useFarcasterIdentity({
161170
onMissingIdentity,
162171
enableIdentityPolling = true,
@@ -169,6 +178,7 @@ export function useFarcasterIdentity({
169178
onLogInStart,
170179
onLogOut,
171180
generateUserId = defaultGenerateUserId,
181+
fetchFn = defaultFetchFn,
172182
}: UseFarcasterIdentityOptions): FarcasterSignerInstance {
173183
const storageRef = useRef(storage);
174184
const identityPoller = useRef(new IdentityPoller()).current;
@@ -194,13 +204,14 @@ export function useFarcasterIdentity({
194204
const onLogOutRef = useFreshRef(onLogOut);
195205
const generateUserIdRef = useFreshRef(generateUserId);
196206
const onMissingIdentityRef = useFreshRef(onMissingIdentity);
207+
const fetchFnRef = useFreshRef(fetchFn);
197208

198209
const createFarcasterSigner =
199210
useCallback(async (): Promise<FarcasterCreateSignerResult> => {
200211
try {
201212
const keypair = await createKeypairEDDSA();
202213
const keypairString = convertKeypairToHex(keypair);
203-
const authorizationResponse = await fetch(
214+
const authorizationResponse = await fetchFnRef.current(
204215
// real signer or local one are handled by local route so we don't need to expose anything to client side bundle
205216
signerUrl,
206217
{
@@ -231,18 +242,21 @@ export function useFarcasterIdentity({
231242
const {
232243
result: { signedKeyRequest },
233244
} = (await (
234-
await fetch(`https://api.warpcast.com/v2/signed-key-requests`, {
235-
method: "POST",
236-
headers: {
237-
"Content-Type": "application/json",
238-
},
239-
body: JSON.stringify({
240-
key: keypairString.publicKey,
241-
signature,
242-
requestFid,
243-
deadline,
244-
}),
245-
})
245+
await fetchFnRef.current(
246+
"https://api.warpcast.com/v2/signed-key-requests",
247+
{
248+
method: "POST",
249+
headers: {
250+
"Content-Type": "application/json",
251+
},
252+
body: JSON.stringify({
253+
key: keypairString.publicKey,
254+
signature,
255+
requestFid,
256+
deadline,
257+
}),
258+
}
259+
)
246260
).json()) as {
247261
result: {
248262
signedKeyRequest: { token: string; deeplinkUrl: string };
@@ -297,7 +311,7 @@ export function useFarcasterIdentity({
297311
console.error("@frames.js/render: API Call failed", error);
298312
throw error;
299313
}
300-
}, [generateUserIdRef, onLogInStartRef, setState, signerUrl]);
314+
}, [fetchFnRef, generateUserIdRef, onLogInStartRef, setState, signerUrl]);
301315

302316
const impersonateUser = useCallback(
303317
async (fid: number) => {

packages/render/src/identity/farcaster/use-farcaster-multi-identity.tsx

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,14 @@ type UseFarcasterMultiIdentityOptions = {
195195
onLogOut?: (identity: FarcasterSigner) => void;
196196
onIdentityRemove?: (identity: FarcasterSigner) => void;
197197
onIdentitySelect?: (identity: FarcasterSigner) => void;
198+
/**
199+
* Function used to generate a unique user id for signer._id property value
200+
*/
198201
generateUserId?: () => string | number;
202+
/**
203+
* Custom fetch function used to do requests
204+
*/
205+
fetchFn?: typeof fetch;
199206
};
200207

201208
export type FarcasterMultiSignerInstance =
@@ -210,6 +217,7 @@ export type FarcasterMultiSignerInstance =
210217

211218
const defaultStorage = new WebStorage();
212219
const defaultGenerateUserId = (): number => Date.now();
220+
const defaultFetchFn: typeof fetch = (...args) => fetch(...args);
213221

214222
type SignedKeyRequestSponsorship = {
215223
sponsorFid: number;
@@ -229,6 +237,7 @@ export function useFarcasterMultiIdentity({
229237
onIdentityRemove,
230238
onIdentitySelect,
231239
generateUserId = defaultGenerateUserId,
240+
fetchFn = defaultFetchFn,
232241
}: UseFarcasterMultiIdentityOptions): FarcasterMultiSignerInstance {
233242
const storageRef = useRef(storage);
234243
const identityPoller = useRef(new IdentityPoller()).current;
@@ -268,13 +277,14 @@ export function useFarcasterMultiIdentity({
268277
const onIdentitySelectRef = useFreshRef(onIdentitySelect);
269278
const generateUserIdRef = useFreshRef(generateUserId);
270279
const onMissingIdentityRef = useFreshRef(onMissingIdentity);
280+
const fetchFnRef = useFreshRef(fetchFn);
271281

272282
const createFarcasterSigner =
273283
useCallback(async (): Promise<FarcasterCreateSignerResult> => {
274284
try {
275285
const keypair = await createKeypairEDDSA();
276286
const keypairString = convertKeypairToHex(keypair);
277-
const authorizationResponse = await fetch(
287+
const authorizationResponse = await fetchFnRef.current(
278288
// real signer or local one are handled by local route so we don't need to expose anything to client side bundle
279289
signerUrl,
280290
{
@@ -312,19 +322,22 @@ export function useFarcasterMultiIdentity({
312322
const {
313323
result: { signedKeyRequest },
314324
} = (await (
315-
await fetch(`https://api.warpcast.com/v2/signed-key-requests`, {
316-
method: "POST",
317-
headers: {
318-
"Content-Type": "application/json",
319-
},
320-
body: JSON.stringify({
321-
key: keypairString.publicKey,
322-
signature,
323-
requestFid,
324-
deadline,
325-
sponsorship,
326-
}),
327-
})
325+
await fetchFnRef.current(
326+
"https://api.warpcast.com/v2/signed-key-requests",
327+
{
328+
method: "POST",
329+
headers: {
330+
"Content-Type": "application/json",
331+
},
332+
body: JSON.stringify({
333+
key: keypairString.publicKey,
334+
signature,
335+
requestFid,
336+
deadline,
337+
sponsorship,
338+
}),
339+
}
340+
)
328341
).json()) as {
329342
result: {
330343
signedKeyRequest: {
@@ -383,7 +396,7 @@ export function useFarcasterMultiIdentity({
383396
console.error("@frames.js/render: API Call failed", error);
384397
throw error;
385398
}
386-
}, [generateUserIdRef, onLogInStartRef, setState, signerUrl]);
399+
}, [fetchFnRef, generateUserIdRef, onLogInStartRef, setState, signerUrl]);
387400

388401
const impersonateUser = useCallback(
389402
async (fid: number) => {

0 commit comments

Comments
 (0)