0x0x230x

Untitled

Jul 9th, 2025
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.49 KB | None | 0 0
  1. 'use client';
  2.  
  3. import { useEffect, useState, createContext, useContext } from 'react';
  4. import { Context, miniAppHost } from '@farcaster/miniapp-sdk';
  5. import { useLoginToFrame } from '@privy-io/react-auth/farcaster';
  6. import { usePrivy, useWallets } from '@privy-io/react-auth';
  7. import { useIsMiniAppOnMobile } from '@/lib/hooks/useIsMiniAppOnMobile';
  8. import { useAccount, useConnect } from 'wagmi';
  9. import { farcasterMiniApp } from '@farcaster/miniapp-wagmi-connector';
  10. import { CLIENT_FIDS } from '@/lib/constants/common';
  11.  
  12. const MiniAppContext = createContext<{
  13. isSDKLoaded: boolean;
  14. miniAppContext: Context.MiniAppContext | null;
  15. loginIntoMiniApp: () => Promise<void>;
  16. miniAppEnv: 'farcaster' | 'coinbase_wallet' | null;
  17. }>({
  18. isSDKLoaded: false,
  19. miniAppContext: null,
  20. loginIntoMiniApp: () => Promise.resolve(),
  21. miniAppEnv: null,
  22. });
  23.  
  24. export const useMiniAppContext = () => {
  25. const context = useContext(MiniAppContext);
  26. if (!context) {
  27. throw new Error('useMiniApp must be used within a MiniAppProvider');
  28. }
  29. return context;
  30. };
  31.  
  32. export default function MiniAppProvider({
  33. children,
  34. }: {
  35. children: React.ReactNode;
  36. }) {
  37. const [isSDKLoaded, setIsSDKLoaded] = useState(false);
  38. const [miniAppContext, setMiniAppContext] =
  39. useState<Context.MiniAppContext | null>(null);
  40.  
  41. const { ready, authenticated, user } = usePrivy();
  42. const { initLoginToFrame, loginToFrame } = useLoginToFrame();
  43. const isMiniAppOnMobile = useIsMiniAppOnMobile();
  44. const { connect } = useConnect();
  45. const { wallets } = useWallets();
  46.  
  47. const [miniAppEnv, setMiniAppEnv] = useState<
  48. 'farcaster' | 'coinbase_wallet' | null
  49. >(null);
  50. const { isConnected } = useAccount();
  51.  
  52. // Setup SDK
  53. useEffect(() => {
  54. const load = async () => {
  55. const miniAppContext = await miniAppHost.context;
  56. // await setTimeout(10000);
  57.  
  58. await miniAppHost.ready();
  59. setMiniAppContext(miniAppContext);
  60.  
  61. setMiniAppEnv(
  62. miniAppContext.client.clientFid === CLIENT_FIDS.FARCASTER
  63. ? 'farcaster'
  64. : 'coinbase_wallet',
  65. );
  66. };
  67.  
  68. if (miniAppHost && !isSDKLoaded) {
  69. setIsSDKLoaded(true);
  70. load();
  71. }
  72. }, [isSDKLoaded]);
  73.  
  74. const login = async () => {
  75. const { nonce } = await initLoginToFrame();
  76. const result = await miniAppHost.signIn({
  77. nonce,
  78. acceptAuthAddress: true,
  79. });
  80.  
  81. if (result.result?.message && result.result?.signature) {
  82. await loginToFrame({
  83. message: result.result.message,
  84. signature: result.result.signature,
  85. });
  86. }
  87. };
  88.  
  89. // Add MiniApp
  90. useEffect(() => {
  91. if (!miniAppContext || !authenticated) {
  92. return;
  93. }
  94.  
  95. const addMiniApp = async () => {
  96. await miniAppHost.addMiniApp();
  97. };
  98.  
  99. if (!miniAppContext?.client.added) {
  100. setTimeout(() => {
  101. addMiniApp();
  102. }, 1000);
  103. }
  104. }, [miniAppContext, authenticated, ready, user]);
  105.  
  106. // If we are on mobile and have miniApp context, connect to farcaster wallet
  107. useEffect(() => {
  108. if (isConnected) {
  109. return;
  110. }
  111.  
  112. if (miniAppContext && isMiniAppOnMobile) {
  113. connect({ connector: farcasterMiniApp() });
  114. }
  115. }, [miniAppContext, isMiniAppOnMobile, isConnected, wallets]);
  116.  
  117. return (
  118. <MiniAppContext.Provider
  119. value={{
  120. isSDKLoaded,
  121. miniAppContext,
  122. loginIntoMiniApp: login,
  123. miniAppEnv,
  124. }}
  125. >
  126. {children}
  127. </MiniAppContext.Provider>
  128. );
  129. }
  130.  
Advertisement
Add Comment
Please, Sign In to add comment