diff --git a/.gitignore b/.gitignore index 4ef86cc77b..93e680f355 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ yarn-error.log* .env.development.local .env.test.local .env.production.local +.env* # vercel .vercel diff --git a/lang/ct.json b/lang/ct.json index 1f1a4c7fec..ffb948a80d 100644 --- a/lang/ct.json +++ b/lang/ct.json @@ -61,7 +61,7 @@ "component.pro_guide.tips.address.item1": "Comproveu dues vegades que la vostra adreça de moneder sigui correcta per no perdre les vostres donacions.", "component.pro_guide.tips.address.item2": "Fes servir una adreça de recepció específica per al teu projecte, en lloc d’utilitzar una adreça que fas servir per a altres activitats on-chain. Això millora la transparència i la comptabilitat, i redueix el risc.", "component.pro_guide.tips.address.item3": "Recomanem utilitzar un moneder de maquinari per millorar la seguretat.", - "component.pro_guide.tips.address.item4":"Afegir una adreça de recepció a múltiples cadenes augmentarà la teva visibilitat davant possibles donants.", + "component.pro_guide.tips.address.item4": "Afegir una adreça de recepció a múltiples cadenes augmentarà la teva visibilitat davant possibles donants.", "component.pro_guide.tips.address.item5": "Podeu actualitzar les vostres adreces de destinatari en qualsevol moment.", "component.pro_guide.tips.social_media.item1": "Afegir els teus comptes de xarxes socials permet als teus donants i comunitat connectar-se amb tu i saber què estàs fent!", "component.pro_guide.tips.social_media.item2": "Els teus comptes estaran enllaçats des de la pàgina del teu projecte a Giveth.", @@ -288,7 +288,7 @@ "label.copied": "Copiat!", "label.copy_link": "Copiar enllaç", "label.copy_the_memo_to_use_in_your_app": "Copia la mnemotècnia per utilitzar a la teva aplicació de cartera.", -"label.the_recipient_wallet_doesnt_require_a_memo_but_giveth_requires_one": "La cartera del destinatari no requereix cap memo, però Giveth sí que en requereix un per detectar correctament la donació. Assegura’t d’enviar la quantitat correcta de tokens o la teva donació es PERDRÀ!", + "label.the_recipient_wallet_doesnt_require_a_memo_but_giveth_requires_one": "La cartera del destinatari no requereix cap memo, però Giveth sí que en requereix un per detectar correctament la donació. Assegura’t d’enviar la quantitat correcta de tokens o la teva donació es PERDRÀ!", "label.covenant": "conveni", "label.created_at": "Creat el", "label.create_a_project": "Crear un projecte", @@ -935,7 +935,7 @@ "label.save_changes": "Desa els canvis", "label.save_on_gas_fees": "Estalvia en taxes de gas, canvia de xarxa.", "label.say_hello_to": "Saluda a...", -"label.scan_to_donate": "Escaneja el codi QR o copia l’adreça per fer la transferència. Per obtenir millors resultats, utilitza una cartera nativa de Stellar; les donacions enviades directament des d’intercanvis centralitzats poden no ser detectades.", + "label.scan_to_donate": "Escaneja el codi QR o copia l’adreça per fer la transferència. Per obtenir millors resultats, utilitza una cartera nativa de Stellar; les donacions enviades directament des d’intercanvis centralitzats poden no ser detectades.", "label.sdg_impact_fund": "Fons d'impacte SDG", "label.search": "Cerca", "label.search_for_a_project_or_a_cause": "Cerca un projecte o una causa a totes les categories", @@ -1237,7 +1237,7 @@ "label.verify_your_project.modal.three": "procés de verificació ", "label.verify_your_project.modal.two": "Aquest senzill ", "label.view": "Veure", -"label.view_all_projects": "Veure tots els projectes", + "label.view_all_projects": "Veure tots els projectes", "label.view_all_causes": "Veure totes les Causes", "label.view_details": "Veure detalls", "label.view_more": "Veure més", @@ -1899,7 +1899,7 @@ "label.cause.transfer": "Transferència", "label.cause.congratulations": "Enhorabona", "label.cause.success_message": "La teva Causa s'ha publicat.", -"label.cause.ai_powered": "Potenciat per IA", + "label.cause.ai_powered": "Potenciat per IA", "label.cause.please_note_desc": "La teva aportació aquí serà utilitzada per l'agent de donacions amb IA per avaluar i distribuir fons als projectes. Sigues específic sobre l'impacte que vols aconseguir.", "label.cause.description_required": "Cal introduir una descripció", "label.cause.cause_all": "Totes les Causes", @@ -1983,9 +1983,9 @@ "label.cause.transaction_failed_desc_2": "Si us plau, torna enrere i intenta-ho de nou.", "label.cause.donate_to_cause": "Dona a la causa", "label.cause.distributed_by_ai": "Distribuït per IA", -"label.cause.distributed_by_ai_desc": "Les donacions fetes a Causes es canvien per GIV i es distribueixen a projectes basant-se en una rigorosa anàlisi d'IA de la informació del projecte i la seva activitat a les xarxes socials.", -"label.cause.distributed_by_ai_desc_2": "Les donacions fetes a aquesta Causa es distribueixen als projectes indicats a continuació segons una rigorosa anàlisi d'IA de la informació de cada projecte i la seva activitat a les xarxes socials.", -"label.cause.this_cause_doesnt_accept_on": "Aquesta causa no accepta", + "label.cause.distributed_by_ai_desc": "Les donacions fetes a Causes es canvien per GIV i es distribueixen a projectes basant-se en una rigorosa anàlisi d'IA de la informació del projecte i la seva activitat a les xarxes socials.", + "label.cause.distributed_by_ai_desc_2": "Les donacions fetes a aquesta Causa es distribueixen als projectes indicats a continuació segons una rigorosa anàlisi d'IA de la informació de cada projecte i la seva activitat a les xarxes socials.", + "label.cause.this_cause_doesnt_accept_on": "Aquesta causa no accepta", "label.cause.this_token_is_not_supported_by_squid": "Aquest token no és compatible amb el router Squid. Tria un altre token.", "label.cause.cause_deactivated": "La teva causa ha estat desactivada correctament. Gràcies per utilitzar Giveth.", "label.cause.go_to_causes": "Anar a Causes", diff --git a/lang/es.json b/lang/es.json index 13c4cf1858..69516a39fb 100644 --- a/lang/es.json +++ b/lang/es.json @@ -61,7 +61,7 @@ "component.pro_guide.tips.address.item1": "Verifica dos veces que tu dirección de billetera sea correcta para no perder tus donaciones.", "component.pro_guide.tips.address.item2": "Usa una dirección de recepción específica para tu proyecto, en lugar de utilizar una dirección que empleas para otras actividades on-chain. Esto mejora la transparencia y la contabilidad, y reduce el riesgo.", "component.pro_guide.tips.address.item3": "Recomendamos usar un monedero de hardware para mejorar la seguridad.", - "component.pro_guide.tips.address.item4":"Añadir una dirección de recepción en múltiples cadenas aumentará tu visibilidad ante posibles donantes.", + "component.pro_guide.tips.address.item4": "Añadir una dirección de recepción en múltiples cadenas aumentará tu visibilidad ante posibles donantes.", "component.pro_guide.tips.address.item5": "Puedes actualizar tus direcciones de destinatario en cualquier momento.", "component.pro_guide.tips.social_media.item1": "Agregar tus cuentas de redes sociales permite a tus donantes y comunidad conectarse contigo y saber en qué estás trabajando.", "component.pro_guide.tips.social_media.item2": "Tus cuentas estarán vinculadas desde la página de tu proyecto en Giveth.", @@ -286,7 +286,7 @@ "label.copied": "Copiado!", "label.copy_link": "Copiar Link", "label.copy_the_memo_to_use_in_your_app": "Copia la mnemotecnia para usar en tu aplicación de billetera.", -"label.the_recipient_wallet_doesnt_require_a_memo_but_giveth_requires_one": "La billetera del destinatario no requiere un memo, pero Giveth sí requiere uno para detectar correctamente la donación. ¡Asegúrate de enviar la cantidad correcta de tokens o tu donación se PERDERÁ!", + "label.the_recipient_wallet_doesnt_require_a_memo_but_giveth_requires_one": "La billetera del destinatario no requiere un memo, pero Giveth sí requiere uno para detectar correctamente la donación. ¡Asegúrate de enviar la cantidad correcta de tokens o tu donación se PERDERÁ!", "label.covenant": "El convenio", "label.created_at": "Creación", "label.create_a_project": "Crea un Proyecto", @@ -935,7 +935,7 @@ "label.save_changes": "Guardar cambios", "label.save_on_gas_fees": "Ahorra en tarifas de gas, cambia de red.", "label.say_hello_to": "Dile hola a...", -"label.scan_to_donate": "Escanea el código QR o copia la dirección para realizar la transferencia. Para obtener mejores resultados, usa una billetera nativa de Stellar; las donaciones enviadas directamente desde exchanges centralizados pueden no ser detectadas.", + "label.scan_to_donate": "Escanea el código QR o copia la dirección para realizar la transferencia. Para obtener mejores resultados, usa una billetera nativa de Stellar; las donaciones enviadas directamente desde exchanges centralizados pueden no ser detectadas.", "label.sdg_impact_fund": "Fondo de impacto SDG", "label.search": "Buscar", "label.search_for_a_project_or_a_cause": "Busca un proyecto o una Causa en todas las categorias", @@ -1899,7 +1899,7 @@ "label.cause.transfer": "Transferencia", "label.cause.congratulations": "Enhorabuena", "label.cause.success_message": "Tu Causa ha sido publicada.", -"label.cause.ai_powered": "Potenciado por IA", + "label.cause.ai_powered": "Potenciado por IA", "label.cause.please_note_desc": "Tu aportación aquí será utilizada por el agente de donaciones con IA para evaluar y distribuir fondos a los proyectos. Sé específico sobre el impacto que deseas lograr.", "label.cause.description_required": "La descripción es obligatoria", "label.cause.cause_all": "Todas las Causas", @@ -1983,9 +1983,9 @@ "label.cause.transaction_failed_desc_2": "Por favor vuelve atrás e intenta de nuevo.", "label.cause.donate_to_cause": "Donar a la Causa", "label.cause.distributed_by_ai": "Distribuido por IA", -"label.cause.distributed_by_ai_desc": "Las donaciones hechas a Causas se cambian por GIV y se distribuyen a proyectos basándose en un riguroso análisis de IA de la información del proyecto y su actividad en redes sociales.", + "label.cause.distributed_by_ai_desc": "Las donaciones hechas a Causas se cambian por GIV y se distribuyen a proyectos basándose en un riguroso análisis de IA de la información del proyecto y su actividad en redes sociales.", "label.cause.distributed_by_ai_desc_2": "Las donaciones hechas a esta Causa se distribuyen a los proyectos indicados abajo según un riguroso análisis de IA de la información de cada proyecto y su actividad en redes sociales.", -"label.cause.this_cause_doesnt_accept_on": "Esta Causa no acepta", + "label.cause.this_cause_doesnt_accept_on": "Esta Causa no acepta", "label.cause.this_token_is_not_supported_by_squid": "Este token no es compatible con el router Squid. Elige otro token.", "label.cause.cause_deactivated": "Tu Causa fue desactivada correctamente. Gracias por usar Giveth.", "label.cause.go_to_causes": "Ir a Causas", diff --git a/next.config.js b/next.config.js index b3e47382a0..5721c46328 100644 --- a/next.config.js +++ b/next.config.js @@ -16,6 +16,8 @@ const locales = ['en', 'ct', 'es']; const moduleExports = withBundleAnalyzer({ // Your existing module.exports reactStrictMode: true, + // Transpile the Farcaster SDK for proper ESM support + transpilePackages: ['@farcaster/miniapp-sdk', '@farcaster/miniapp-core'], images: { remotePatterns: [ { protocol: 'https', port: '', hostname: 'placekitten.com' }, @@ -133,7 +135,20 @@ const moduleExports = withBundleAnalyzer({ 'https://nounspace.com', 'https://www.nounspace.com', ]; - const frameAncestors = ["'self'", safe, ...nounspace].join(' '); + // Base Mini App and Farcaster clients + const baseApp = [ + 'https://base.org', + 'https://www.base.org', + 'https://base.dev', + 'https://www.base.dev', + 'https://warpcast.com', + 'https://www.warpcast.com', + 'https://www.farcaster.xyz', + 'https://farcaster.xyz', + ]; + const frameAncestors = ["'self'", safe, ...nounspace, ...baseApp].join( + ' ', + ); // Declare additional consts and include them in frameAncestors to enable additional domains to embed Giveth pages in iframes. return [ { @@ -186,6 +201,26 @@ const moduleExports = withBundleAnalyzer({ }, ], }, + { + // Adding CORS headers for /.well-known/farcaster.json (Base Mini App manifest) + source: '/.well-known/farcaster.json', + locale: false, + headers: [ + { + key: 'Access-Control-Allow-Origin', + value: '*', + }, + { key: 'Access-Control-Allow-Methods', value: 'GET' }, + { + key: 'Access-Control-Allow-Headers', + value: 'X-Requested-With, content-type, Authorization', + }, + { + key: 'Cache-Control', + value: 'public, max-age=3600', + }, + ], + }, ]; }, }); diff --git a/package.json b/package.json index a272517f68..42a53346aa 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,10 @@ }, "dependencies": { "@apollo/client": "^3.11.8", + "@coinbase/onchainkit": "^1.1.2", "@divvi/referral-sdk": "^1.0.0", + "@farcaster/miniapp-sdk": "^0.2.1", + "@farcaster/miniapp-wagmi-connector": "^1.1.0", "@giveth/ui-design-system": "^1.11.36", "@next/third-parties": "^14.2.5", "@react-google-maps/api": "^2.19.3", diff --git a/pages/_app.tsx b/pages/_app.tsx index d0cd2539b4..23e52ec6d1 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from 'react'; import { createWeb3Modal } from '@web3modal/wagmi/react'; import Head from 'next/head'; +import dynamic from 'next/dynamic'; import { IntlProvider } from 'react-intl'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { Toaster } from 'react-hot-toast'; @@ -42,6 +43,22 @@ import MaintenanceIndex from '@/components/views/Errors/MaintenanceIndex'; import { SolanaProvider } from '@/providers/solanaWalletProvider'; import type { AppProps } from 'next/app'; +// Dynamically import MiniKitProvider with SSR disabled to prevent SDK issues +const MiniKitProvider = dynamic( + () => + import('@/components/MiniKitProvider').then(mod => mod.MiniKitProvider), + { ssr: false }, +); + +// Dynamically import FarcasterAutoConnect to handle automatic wallet connection in mini app +const FarcasterAutoConnect = dynamic( + () => + import('@/components/FarcasterAutoConnect').then( + mod => mod.FarcasterAutoConnect, + ), + { ssr: false }, +); + if (!isProduction) { // Adds messages only in a dev environment loadDevMessages(); @@ -174,54 +191,63 @@ function MyApp({ Component, pageProps }: AppProps) { name='viewport' content='width=device-width, initial-scale=1.0' /> + - - - - - - - - - {isMaintenanceMode ? ( - - ) : ( - <> - - - - - - {isGIVeconomyRoute( - router.route, - ) && } - {(pageProps as any) - .errorStatus ? ( - - ) : ( - - )} - {/* {process.env.NEXT_PUBLIC_ENV !== + + + + + + + + + {/* Auto-connect to Farcaster wallet when in mini app */} + + + {isMaintenanceMode ? ( + + ) : ( + <> + + + + + + {isGIVeconomyRoute( + router.route, + ) && } + {(pageProps as any) + .errorStatus ? ( + + ) : ( + + )} + {/* {process.env.NEXT_PUBLIC_ENV !== 'production' && (