Skip to content

Commit 9f668cb

Browse files
feat: update dependencies, add new methods
1 parent f19b6a6 commit 9f668cb

File tree

7 files changed

+161
-81
lines changed

7 files changed

+161
-81
lines changed

packages/debugger/app/components/frame-app-debugger.tsx

+16
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import type {
2323
FramePrimaryButton,
2424
ResolveClientFunction,
2525
} from "@frames.js/render/frame-app/types";
26+
import { useConfig } from "wagmi";
27+
import type { EIP6963ProviderInfo } from "@farcaster/frame-sdk";
2628

2729
type TabValues = "events" | "console" | "notifications";
2830

@@ -52,6 +54,7 @@ export function FrameAppDebugger({
5254
farcasterSigner,
5355
onClose,
5456
}: FrameAppDebuggerProps) {
57+
const config = useConfig();
5558
const farcasterSignerRef = useRef(farcasterSigner);
5659
farcasterSignerRef.current = farcasterSigner;
5760
const frameAppNotificationManager = useFrameAppNotificationsManager({
@@ -122,6 +125,7 @@ export function FrameAppDebugger({
122125
}
123126
: {
124127
type: "cast_embed",
128+
embed: "",
125129
cast: fallbackFrameContext.castId,
126130
},
127131
farcasterSigner,
@@ -233,6 +237,18 @@ export function FrameAppDebugger({
233237
throw e;
234238
}
235239
},
240+
onEIP6963RequestProviderRequested({ endpoint }) {
241+
if (!config._internal.mipd) {
242+
return;
243+
}
244+
245+
config._internal.mipd.getProviders().map((providerInfo) => {
246+
endpoint.emit({
247+
event: "eip6963:announceProvider",
248+
info: providerInfo.info as EIP6963ProviderInfo,
249+
});
250+
});
251+
},
236252
});
237253

238254
return (

packages/debugger/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@
1818
"dependencies": {
1919
"@upstash/redis": "^1.34.3",
2020
"@lens-protocol/client": "^2.3.2",
21-
"@farcaster/frame-sdk": "^0.0.20",
21+
"@farcaster/frame-sdk": "^0.0.26",
2222
"@xmtp/xmtp-js": "^12.0.0",
2323
"is-port-reachable": "^4.0.0",
2424
"next": "14.1.4",
2525
"open": "^10.0.3",
2626
"react": "^18.2.0",
2727
"react-dom": "^18.2.0",
28-
"zod": "^3.23.8",
28+
"zod": "^3.24.1",
2929
"yargs": "^17.7.2"
3030
},
3131
"engines": {

packages/frames.js/package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -419,13 +419,13 @@
419419
"react-dom": "^18.2.0"
420420
},
421421
"dependencies": {
422-
"@farcaster/frame-core": "^0.0.19",
423-
"@farcaster/frame-node": "^0.0.8",
422+
"@farcaster/frame-core": "^0.0.24",
423+
"@farcaster/frame-node": "^0.0.13",
424424
"@vercel/og": "^0.6.3",
425425
"cheerio": "^1.0.0-rc.12",
426426
"protobufjs": "^7.2.6",
427427
"viem": "^2.7.8",
428428
"type-fest": "^4.28.1",
429-
"zod": "^3.23.8"
429+
"zod": "^3.24.1"
430430
}
431431
}

packages/render/package.json

+5-5
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@
336336
"src"
337337
],
338338
"devDependencies": {
339-
"@farcaster/frame-host-react-native": "^0.0.14",
339+
"@farcaster/frame-host-react-native": "^0.0.19",
340340
"@lens-protocol/client": "^2.3.2",
341341
"@rainbow-me/rainbowkit": "^2.1.2",
342342
"@remix-run/node": "^2.8.1",
@@ -352,7 +352,7 @@
352352
},
353353
"license": "MIT",
354354
"peerDependencies": {
355-
"@farcaster/frame-host-react-native": "^0.0.14",
355+
"@farcaster/frame-host-react-native": "^0.0.19",
356356
"@lens-protocol/client": "^2.0.0",
357357
"@rainbow-me/rainbowkit": "^2.1.2",
358358
"@types/react": "^18.2.0",
@@ -368,10 +368,10 @@
368368
},
369369
"dependencies": {
370370
"@farcaster/core": "^0.15.6",
371-
"@farcaster/frame-host": "^0.0.19",
371+
"@farcaster/frame-host": "^0.0.24",
372372
"@noble/ed25519": "^2.0.0",
373373
"frames.js": "^0.21.0",
374-
"ox": "^0.4.0",
375-
"zod": "^3.23.8"
374+
"ox": "^0.4.4",
375+
"zod": "^3.24.1"
376376
}
377377
}

packages/render/src/frame-app/types.ts

+25-8
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
import type { HostEndpoint } from "@farcaster/frame-host";
21
import type {
3-
AddFrameResult,
4-
FrameContext,
5-
SetPrimaryButton,
6-
} from "@farcaster/frame-sdk";
2+
HostEndpoint,
3+
Context,
4+
SetPrimaryButtonOptions,
5+
AddFrame,
6+
FrameHost,
7+
} from "@farcaster/frame-host";
78
import type { ParseFramesV2ResultWithFrameworkDetails } from "frames.js/frame-parsers";
89
import type { Provider } from "ox/Provider";
910
import type { Default as DefaultRpcSchema, ExtractRequest } from "ox/RpcSchema";
1011

11-
export type FrameClientConfig = FrameContext["client"];
12+
export type FrameClientConfig = Context.ClientContext;
1213

1314
export type SendTransactionRpcRequest = ExtractRequest<
1415
DefaultRpcSchema,
@@ -62,16 +63,32 @@ export type SharedEthProviderEventHandlers = {
6263
onSignTypedDataRequest: OnSignTypedDataRequestFunction;
6364
};
6465

65-
export type FramePrimaryButton = Parameters<SetPrimaryButton>[0];
66+
export type FramePrimaryButton = SetPrimaryButtonOptions;
6667

6768
export type OnPrimaryButtonSetFunction = (
6869
options: FramePrimaryButton,
6970
pressedCallback: () => void
7071
) => void;
7172

73+
/**
74+
* Returns false if user rejected the request, otherwise it returns the notification details
75+
*/
7276
export type OnAddFrameRequestedFunction = (
7377
frame: ParseFramesV2ResultWithFrameworkDetails
74-
) => Promise<false | Extract<AddFrameResult, { added: true }>>;
78+
) => Promise<false | Required<AddFrame.AddFrameResult>>;
79+
80+
export type OnEIP6963RequestProviderRequestedFunctionOptions = {
81+
endpoint: HostEndpoint;
82+
};
83+
84+
/**
85+
* Function that must emit eip6963:announceProvider event on endpoint to announce available providers
86+
*/
87+
export type OnEIP6963RequestProviderRequestedFunction = (
88+
options: OnEIP6963RequestProviderRequestedFunctionOptions
89+
) => unknown;
90+
91+
export type OnViewProfileFunction = FrameHost["viewProfile"];
7592

7693
/**
7794
* Function called when the frame app is being loaded and we need to resolve the client that renders the frame app

packages/render/src/use-frame-app.ts

+57-25
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
import type {
2-
FrameHost,
3-
FrameLocationContext,
4-
FrameLocationContextLauncher,
5-
} from "@farcaster/frame-sdk";
61
import type { ParseFramesV2ResultWithFrameworkDetails } from "frames.js/frame-parsers";
7-
import type { HostEndpoint } from "@farcaster/frame-host";
2+
import type { FrameHost, HostEndpoint, Context } from "@farcaster/frame-host";
3+
import { AddFrame } from "@farcaster/frame-host";
84
import { useMemo } from "react";
95
import { useFreshRef } from "./hooks/use-fresh-ref";
106
import type { FarcasterSignerState } from "./farcaster";
@@ -14,10 +10,12 @@ import type {
1410
FrameClientConfig,
1511
HostEndpointEmitter,
1612
OnAddFrameRequestedFunction,
13+
OnEIP6963RequestProviderRequestedFunction,
1714
OnPrimaryButtonSetFunction,
1815
OnSendTransactionRequestFunction,
1916
OnSignMessageRequestFunction,
2017
OnSignTypedDataRequestFunction,
18+
OnViewProfileFunction,
2119
ResolveClientFunction,
2220
} from "./frame-app/types";
2321
import { assertNever } from "./assert-never";
@@ -69,6 +67,25 @@ const defaultOnSignTypedDataRequest: OnSignTypedDataRequestFunction = () => {
6967
return Promise.resolve(true);
7068
};
7169

70+
const defaultViewProfile: OnViewProfileFunction = () => {
71+
// eslint-disable-next-line no-console -- provide feedback to the developer
72+
console.warn(
73+
"@frames.js/render/use-frame-app",
74+
"onViewProfile not implemented"
75+
);
76+
77+
return Promise.reject(new Error("onViewProfile not implemented"));
78+
};
79+
80+
const defaultEIP6963RequestProviderRequested: OnEIP6963RequestProviderRequestedFunction =
81+
() => {
82+
// eslint-disable-next-line no-console -- provide feedback to the developer
83+
console.warn(
84+
"@frames.js/render/use-frame-app",
85+
"onEIP6963RequestProviderRequested not implemented"
86+
);
87+
};
88+
7289
export type UseFrameAppOptions = {
7390
/**
7491
* @example
@@ -100,7 +117,7 @@ export type UseFrameAppOptions = {
100117
*
101118
* @defaultValue launcher context
102119
*/
103-
location?: FrameLocationContext;
120+
location?: Context.LocationContext;
104121
/**
105122
* Either:
106123
*
@@ -164,6 +181,16 @@ export type UseFrameAppOptions = {
164181
* If the method has been called during the session more than once it immediatelly rejects
165182
*/
166183
onAddFrameRequested?: OnAddFrameRequestedFunction;
184+
/**
185+
* Called when app calls `viewProfile` method.
186+
*/
187+
onViewProfile?: OnViewProfileFunction;
188+
/**
189+
* Called when app calls `eip6963RequestProvider` method.
190+
*
191+
* It will announce the provider to the frame app once this function returns the info
192+
*/
193+
onEIP6963RequestProviderRequested?: OnEIP6963RequestProviderRequestedFunction;
167194
/**
168195
* Enabled debugging
169196
*
@@ -201,7 +228,7 @@ export type UseFrameAppReturn =
201228
status: "error";
202229
};
203230

204-
const defaultLocation: FrameLocationContextLauncher = {
231+
const defaultLocation: Context.LauncherLocationContext = {
205232
type: "launcher",
206233
};
207234

@@ -226,6 +253,8 @@ export function useFrameApp({
226253
onSendTransactionRequest = defaultOnSendTransactionRequest,
227254
onSignMessageRequest = defaultOnSignMessageRequest,
228255
onSignTypedDataRequest = defaultOnSignTypedDataRequest,
256+
onViewProfile = defaultViewProfile,
257+
onEIP6963RequestProviderRequested = defaultEIP6963RequestProviderRequested,
229258
}: UseFrameAppOptions): UseFrameAppReturn {
230259
const providerRef = useFreshRef(provider);
231260
const debugRef = useFreshRef(debug);
@@ -234,6 +263,10 @@ export function useFrameApp({
234263
const closeRef = useFreshRef(onClose);
235264
const onOpenUrlRef = useFreshRef(onOpenUrl);
236265
const onPrimaryButtonSetRef = useFreshRef(onPrimaryButtonSet);
266+
const onViewProfileRef = useFreshRef(onViewProfile);
267+
const onEIP6963RequestProviderRequestedRef = useFreshRef(
268+
onEIP6963RequestProviderRequested
269+
);
237270
const farcasterSignerRef = useFreshRef(farcasterSigner);
238271
const onAddFrameRequestedRef = useFreshRef(onAddFrameRequested);
239272
const addFrameRequestsCacheRef = useFreshRef(addFrameRequestsCache);
@@ -307,10 +340,7 @@ export function useFrameApp({
307340
reason: "invalid_domain_manifest",
308341
});
309342

310-
return {
311-
added: false,
312-
reason: "invalid_domain_manifest",
313-
};
343+
throw new AddFrame.InvalidDomainManifest();
314344
}
315345

316346
if (
@@ -325,40 +355,34 @@ export function useFrameApp({
325355
reason: "rejected_by_user",
326356
});
327357

328-
return {
329-
added: false,
330-
reason: "rejected_by_user",
331-
};
358+
throw new AddFrame.RejectedByUser();
332359
}
333360

334-
const added = await onAddFrameRequestedRef.current(frame);
361+
const result = await onAddFrameRequestedRef.current(frame);
335362

336-
logDebug("onAddFrameRequested() called", added);
363+
logDebug("onAddFrameRequested() called", result);
337364

338365
addFrameRequestsCacheRef.current.add(
339366
frame.frame.button.action.url
340367
);
341368

342-
if (!added) {
369+
if (!result) {
343370
logDebug("Frame add request rejected by user");
344371

345372
endpoint.emit({
346373
event: "frame_add_rejected",
347374
reason: "rejected_by_user",
348375
});
349376

350-
return {
351-
added: false,
352-
reason: "rejected_by_user",
353-
};
377+
throw new AddFrame.RejectedByUser();
354378
}
355379

356380
endpoint.emit({
357381
event: "frame_added",
358-
notificationDetails: added.notificationDetails,
382+
notificationDetails: result.notificationDetails,
359383
});
360384

361-
return added;
385+
return result;
362386
},
363387
close() {
364388
logDebug("sdk.close() called");
@@ -373,6 +397,9 @@ export function useFrameApp({
373397
// @ts-expect-error -- type mismatch
374398
return providerRef.current.request(parameters);
375399
},
400+
eip6963RequestProvider() {
401+
onEIP6963RequestProviderRequestedRef.current({ endpoint });
402+
},
376403
openUrl(url) {
377404
logDebug("sdk.openUrl() called", url);
378405

@@ -398,6 +425,9 @@ export function useFrameApp({
398425
// @todo implement
399426
throw new Error("not implemented");
400427
},
428+
viewProfile(options) {
429+
return onViewProfileRef.current(options);
430+
},
401431
}),
402432
status: "success",
403433
frame: frameResolutionState.frame,
@@ -431,5 +461,7 @@ export function useFrameApp({
431461
onOpenUrlRef,
432462
readyRef,
433463
onPrimaryButtonSetRef,
464+
onViewProfileRef,
465+
onEIP6963RequestProviderRequestedRef,
434466
]);
435467
}

0 commit comments

Comments
 (0)