0x0x230x

Untitled

Feb 13th, 2025
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.33 KB | None | 0 0
  1. 'use client';
  2.  
  3. import { useEffect, useState, createContext, useContext } from 'react';
  4. import sdk, { Context } from '@farcaster/frame-sdk';
  5. import { useLoginToFrame } from '@privy-io/react-auth/farcaster';
  6. import { usePrivy } from '@privy-io/react-auth';
  7.  
  8. const FrameContext = createContext<{
  9. isSDKLoaded: boolean;
  10. frameContext: Context.FrameContext | null;
  11. }>({
  12. isSDKLoaded: false,
  13. frameContext: null,
  14. });
  15.  
  16. export const useFrameContext = () => {
  17. const context = useContext(FrameContext);
  18. if (!context) {
  19. throw new Error('useFrame must be used within a FrameProvider');
  20. }
  21. return context;
  22. };
  23.  
  24. export default function FrameProvider({
  25. children,
  26. }: {
  27. children: React.ReactNode;
  28. }) {
  29. const [isSDKLoaded, setIsSDKLoaded] = useState(false);
  30. const [frameContext, setFrameContext] = useState<Context.FrameContext | null>(
  31. null,
  32. );
  33. const { ready, authenticated, user, createWallet } = usePrivy();
  34. const { initLoginToFrame, loginToFrame } = useLoginToFrame();
  35.  
  36. // Setup SDK
  37. useEffect(() => {
  38. const load = async () => {
  39. const frameContext = await sdk.context;
  40. console.log('frameContext', frameContext);
  41. setFrameContext(frameContext);
  42. sdk.actions.ready();
  43. };
  44.  
  45. if (sdk && !isSDKLoaded) {
  46. setIsSDKLoaded(true);
  47. load();
  48. }
  49. }, [isSDKLoaded]);
  50.  
  51. // Login to Frame
  52. useEffect(() => {
  53. if (!frameContext) {
  54. return;
  55. }
  56.  
  57. if (ready && !authenticated) {
  58. const login = async () => {
  59. const { nonce } = await initLoginToFrame();
  60. const result = await sdk.actions.signIn({ nonce: nonce });
  61.  
  62. await loginToFrame({
  63. message: result.message,
  64. signature: result.signature,
  65. });
  66. };
  67. login();
  68. }
  69. }, [ready, authenticated, frameContext]);
  70.  
  71. // Create Embedded Wallet
  72. useEffect(() => {
  73. if (
  74. authenticated &&
  75. ready &&
  76. user &&
  77. user.linkedAccounts.filter(
  78. (account) =>
  79. account.type === 'wallet' && account.walletClientType === 'privy',
  80. ).length === 0
  81. ) {
  82. console.log('Creating embedded wallet');
  83. createWallet();
  84. }
  85. }, [authenticated, ready, user]);
  86.  
  87. return (
  88. <FrameContext.Provider value={{ isSDKLoaded, frameContext }}>
  89. {children}
  90. </FrameContext.Provider>
  91. );
  92. }
  93.  
Advertisement
Add Comment
Please, Sign In to add comment