27 | {children}
28 |
29 |
Debugging Frame on url: {url}
30 |
31 |
35 | Farcaster Frames Spec
36 |
37 |
38 |
39 |
Frame Validations
40 |
41 | {frameErrorKeys.map((key) => (
42 |
46 |
{key}
47 |
{frameData?.errors?.[key] ? "🔴" : "🟢"}
48 |
{frameData?.errors?.[key]?.join(",")}
49 |
50 | ))}
51 |
52 |
53 |
frames.js `Frame` object
54 |
63 | {JSON.stringify(frameData?.frame, null, 2)}
64 |
65 | {frameData?.frame ? (
66 |
67 |
html tags
68 |
79 |
88 | {getFrameHtmlHead(frameData?.frame)}
89 |
90 |
91 | ) : null}
92 |
93 | );
94 | }
--------------------------------------------------------------------------------
/components/framejs-expo/frame-render.tsx:
--------------------------------------------------------------------------------
1 | import { Frame } from "frames.js";
2 | import { useState } from "react";
3 |
4 | export type FrameRenderProps = {
5 | isLoggedIn: boolean;
6 | frame: Frame;
7 | url: string | null;
8 | submitOption: (args: { buttonIndex: number; inputText?: string }) => void;
9 | };
10 |
11 | export function FrameRender({
12 | frame,
13 | url,
14 | submitOption,
15 | isLoggedIn,
16 | }: FrameRenderProps) {
17 | const [inputText, setInputText] = useState("");
18 |
19 | return (
20 |
21 |

28 | {frame.inputText && (
29 |
setInputText(e.target.value)}
34 | />
35 | )}
36 |
44 | {frame.buttons?.map(({ label, action }, index: number) => (
45 |
65 | ))}
66 |
67 |
68 | );
69 | }
--------------------------------------------------------------------------------
/components/render-frame.tsx:
--------------------------------------------------------------------------------
1 | import { View } from 'react-native';
2 | import React, { useState } from 'react';
3 | import FrameContainer from '~/frame/FrameContainer';
4 | import { getFrameParsedData } from '~/frame/utils/getFrame';
5 | import { Frame } from '~/frame/utils/types';
6 |
7 | export const getFrame = async ({
8 | url,
9 | controller,
10 | }: {
11 | url: string;
12 | controller: AbortController;
13 | }) => {
14 | try {
15 | const response = await fetch(url, {
16 | signal: controller.signal,
17 | cache: 'force-cache',
18 | });
19 | const html = await response.text();
20 | const frameData = getFrameParsedData({ htmlString: html, url: url });
21 | return frameData;
22 | } catch (error) {
23 | console.error('Error:', error);
24 | }
25 | };
26 |
27 | export default function RenderFrame({ frameUrl }: { frameUrl: string }) {
28 | const [frameData, setFrameData] = useState