From 96cabfd570f6d3cc65049583c4c167b48e1dfafc Mon Sep 17 00:00:00 2001 From: Gbolahan Akande Date: Sat, 13 Dec 2025 11:32:37 +0100 Subject: [PATCH 01/10] Fix analytics page import error --- packages/nextjs/app/analytics/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nextjs/app/analytics/page.tsx b/packages/nextjs/app/analytics/page.tsx index 6fdf005..4e432a6 100644 --- a/packages/nextjs/app/analytics/page.tsx +++ b/packages/nextjs/app/analytics/page.tsx @@ -8,7 +8,7 @@ */ import dynamic from "next/dynamic"; -import { useState, useEffect } from "use client"; +import { useState, useEffect } from "react"; import type { AnalyticsDashboardData, TimePeriod } from "~~/types/analytics"; import { analyticsService } from "~~/services/analytics"; From 94516b7e1fec0dcab5684358e7f82350b43e0710 Mon Sep 17 00:00:00 2001 From: Gbolahan Akande Date: Sat, 13 Dec 2025 11:33:09 +0100 Subject: [PATCH 02/10] Fix import path in RealPaymentInterface --- packages/nextjs/components/voicepay/RealPaymentInterface.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nextjs/components/voicepay/RealPaymentInterface.tsx b/packages/nextjs/components/voicepay/RealPaymentInterface.tsx index 4644aca..0612afb 100644 --- a/packages/nextjs/components/voicepay/RealPaymentInterface.tsx +++ b/packages/nextjs/components/voicepay/RealPaymentInterface.tsx @@ -2,7 +2,7 @@ import { useState, useRef } from 'react'; import { useAccount } from 'wagmi'; -import { useVoicePay } from '~/hooks/useVoicePay'; +import { useVoicePay } from '~~/hooks/useVoicePay'; import { VoiceRecorder } from './VoiceRecorder'; import { RealBalanceDisplay } from './RealBalanceDisplay'; import { PaymentConfirmationModal } from './PaymentConfirmationModal'; From ce96ba5284f10fda797552633c763f1b77cf2529 Mon Sep 17 00:00:00 2001 From: Gbolahan Akande Date: Sat, 13 Dec 2025 11:35:18 +0100 Subject: [PATCH 03/10] Add react-is dependency for recharts --- packages/nextjs/package.json | 2 ++ yarn.lock | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index dd71a0e..af6bfc0 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -51,6 +51,7 @@ "react-dom": "^19.0.0", "react-hot-toast": "^2.4.0", "react-i18next": "^16.5.0", + "react-is": "^19.2.3", "usehooks-ts": "^3.1.0", "viem": "^2.37.9", "wagmi": "^2.16.4", @@ -65,6 +66,7 @@ "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/node": "^18.19.50", "@types/react": "^19.0.7", + "@types/react-is": "^19", "@vitejs/plugin-react": "^4.2.1", "@vitest/coverage-v8": "^1.0.4", "abitype": "1.0.6", diff --git a/yarn.lock b/yarn.lock index 2633afa..03f64fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6144,6 +6144,7 @@ __metadata: "@trivago/prettier-plugin-sort-imports": ^4.3.0 "@types/node": ^18.19.50 "@types/react": ^19.0.7 + "@types/react-is": ^19 "@uniswap/sdk-core": ^5.8.2 "@uniswap/v2-sdk": ^4.6.1 "@vitejs/plugin-react": ^4.2.1 @@ -6176,6 +6177,7 @@ __metadata: react-dom: ^19.0.0 react-hot-toast: ^2.4.0 react-i18next: ^16.5.0 + react-is: ^19.2.3 tailwindcss: ^4.1.3 type-fest: ^4.26.1 typescript: ^5.8.2 @@ -8393,7 +8395,16 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:^19.0.7": +"@types/react-is@npm:^19": + version: 19.2.0 + resolution: "@types/react-is@npm:19.2.0" + dependencies: + "@types/react": "*" + checksum: cf684b259dd0c60bb07df38e1b51a57728101b8cdde9d06209388e9a22daa64a6e36a8c7945f8d029a588c4a0d6540857ccbf52b7ec98ef083b4cee6ca4a3ee4 + languageName: node + linkType: hard + +"@types/react@npm:*, @types/react@npm:^19.0.7": version: 19.2.7 resolution: "@types/react@npm:19.2.7" dependencies: @@ -20902,6 +20913,13 @@ __metadata: languageName: node linkType: hard +"react-is@npm:^19.2.3": + version: 19.2.3 + resolution: "react-is@npm:19.2.3" + checksum: 3bb317292dc574632ec33093d38b8ff97abb6dc400e7b0375baef9429f148cf5ae0307e37de97358f3fad07edd159cda8fcb9d28aaaf0dcd8d408ee320638b83 + languageName: node + linkType: hard + "react-native-fetch-api@npm:^3.0.0": version: 3.0.0 resolution: "react-native-fetch-api@npm:3.0.0" From 1fb0296d4e99bd8df8701a384dc3e4d7e9a86c68 Mon Sep 17 00:00:00 2001 From: Gbolahan Akande Date: Sat, 13 Dec 2025 11:35:44 +0100 Subject: [PATCH 04/10] Convert debug page to client component --- packages/nextjs/app/debug/page.tsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/nextjs/app/debug/page.tsx b/packages/nextjs/app/debug/page.tsx index bf37414..1894e4d 100644 --- a/packages/nextjs/app/debug/page.tsx +++ b/packages/nextjs/app/debug/page.tsx @@ -1,6 +1,7 @@ +"use client"; + import dynamic from "next/dynamic"; import type { NextPage } from "next"; -import { getMetadata } from "~~/utils/scaffold-eth/getMetadata"; // Dynamic import for DebugContracts to reduce initial bundle size const DebugContracts = dynamic(() => import("./_components/DebugContracts").then(mod => ({ default: mod.DebugContracts })), { @@ -12,11 +13,6 @@ const DebugContracts = dynamic(() => import("./_components/DebugContracts").then ssr: false, }); -export const metadata = getMetadata({ - title: "Debug Contracts", - description: "Debug your deployed 🏗 Scaffold-ETH 2 contracts in an easy way", -}); - const Debug: NextPage = () => { return ( <> From d892acb7391f0a6b36d1a56c22ffd202a3f35a0a Mon Sep 17 00:00:00 2001 From: Gbolahan Akande Date: Sat, 13 Dec 2025 21:29:36 +0100 Subject: [PATCH 05/10] Update react-is to v18 for recharts compatibility --- packages/nextjs/package.json | 2 +- yarn.lock | 23 ++++++++--------------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index af6bfc0..97edb33 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -51,7 +51,7 @@ "react-dom": "^19.0.0", "react-hot-toast": "^2.4.0", "react-i18next": "^16.5.0", - "react-is": "^19.2.3", + "react-is": "18.3.1", "usehooks-ts": "^3.1.0", "viem": "^2.37.9", "wagmi": "^2.16.4", diff --git a/yarn.lock b/yarn.lock index 03f64fc..0a4d0d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6177,7 +6177,7 @@ __metadata: react-dom: ^19.0.0 react-hot-toast: ^2.4.0 react-i18next: ^16.5.0 - react-is: ^19.2.3 + react-is: 18.3.1 tailwindcss: ^4.1.3 type-fest: ^4.26.1 typescript: ^5.8.2 @@ -20892,6 +20892,13 @@ __metadata: languageName: node linkType: hard +"react-is@npm:18.3.1, react-is@npm:^18.0.0": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: e20fe84c86ff172fc8d898251b7cc2c43645d108bf96d0b8edf39b98f9a2cae97b40520ee7ed8ee0085ccc94736c4886294456033304151c3f94978cec03df21 + languageName: node + linkType: hard + "react-is@npm:^16.13.1": version: 16.13.1 resolution: "react-is@npm:16.13.1" @@ -20906,20 +20913,6 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.0.0": - version: 18.3.1 - resolution: "react-is@npm:18.3.1" - checksum: e20fe84c86ff172fc8d898251b7cc2c43645d108bf96d0b8edf39b98f9a2cae97b40520ee7ed8ee0085ccc94736c4886294456033304151c3f94978cec03df21 - languageName: node - linkType: hard - -"react-is@npm:^19.2.3": - version: 19.2.3 - resolution: "react-is@npm:19.2.3" - checksum: 3bb317292dc574632ec33093d38b8ff97abb6dc400e7b0375baef9429f148cf5ae0307e37de97358f3fad07edd159cda8fcb9d28aaaf0dcd8d408ee320638b83 - languageName: node - linkType: hard - "react-native-fetch-api@npm:^3.0.0": version: 3.0.0 resolution: "react-native-fetch-api@npm:3.0.0" From 33ad15aaec2d042fc65c59231b6855808c800c4e Mon Sep 17 00:00:00 2001 From: Gbolahan Akande Date: Sat, 13 Dec 2025 23:44:05 +0100 Subject: [PATCH 06/10] Add recharts dependency --- packages/nextjs/package.json | 1 + yarn.lock | 332 ++++++++++++++++++++++++++++++++++- 2 files changed, 330 insertions(+), 3 deletions(-) diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 97edb33..9e7858d 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -52,6 +52,7 @@ "react-hot-toast": "^2.4.0", "react-i18next": "^16.5.0", "react-is": "18.3.1", + "recharts": "^3.5.1", "usehooks-ts": "^3.1.0", "viem": "^2.37.9", "wagmi": "^2.16.4", diff --git a/yarn.lock b/yarn.lock index 0a4d0d9..5fd919a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5427,6 +5427,28 @@ __metadata: languageName: node linkType: hard +"@reduxjs/toolkit@npm:1.x.x || 2.x.x": + version: 2.11.1 + resolution: "@reduxjs/toolkit@npm:2.11.1" + dependencies: + "@standard-schema/spec": ^1.0.0 + "@standard-schema/utils": ^0.3.0 + immer: ^11.0.0 + redux: ^5.0.1 + redux-thunk: ^3.1.0 + reselect: ^5.1.0 + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 || ^19 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + checksum: e803751c3721552826f6cc13f66ab6ec3addca7f406231f7976676b223e69896281977e968defaee8ab3c863c212408b728083d95266ef49f4d7aa826b152c31 + languageName: node + linkType: hard + "@reown/appkit-adapter-wagmi@npm:^1.6.0, @reown/appkit-adapter-wagmi@npm:^1.8.14": version: 1.8.14 resolution: "@reown/appkit-adapter-wagmi@npm:1.8.14" @@ -6178,6 +6200,7 @@ __metadata: react-hot-toast: ^2.4.0 react-i18next: ^16.5.0 react-is: 18.3.1 + recharts: ^3.5.1 tailwindcss: ^4.1.3 type-fest: ^4.26.1 typescript: ^5.8.2 @@ -7674,6 +7697,20 @@ __metadata: languageName: node linkType: hard +"@standard-schema/spec@npm:^1.0.0": + version: 1.0.0 + resolution: "@standard-schema/spec@npm:1.0.0" + checksum: 2d7d73a1c9706622750ab06fc40ef7c1d320b52d5e795f8a1c7a77d0d6a9f978705092bc4149327b3cff4c9a14e5b3800d3b00dc945489175a2d3031ded8332a + languageName: node + linkType: hard + +"@standard-schema/utils@npm:^0.3.0": + version: 0.3.0 + resolution: "@standard-schema/utils@npm:0.3.0" + checksum: 7084f875d322792f2e0a5904009434c8374b9345b09ba89828b68fd56fa3c2b366d35bf340d9e8c72736ef01793c2f70d350c372ed79845dc3566c58d34b4b51 + languageName: node + linkType: hard + "@storacha/one-webcrypto@npm:^1.0.1": version: 1.0.1 resolution: "@storacha/one-webcrypto@npm:1.0.1" @@ -8177,6 +8214,75 @@ __metadata: languageName: node linkType: hard +"@types/d3-array@npm:^3.0.3": + version: 3.2.2 + resolution: "@types/d3-array@npm:3.2.2" + checksum: 72e8e2abe0911cb431d6f3fe0a1f71b915356b679d4d9c826f52941bb30210c0fe8299dde066b08d9986754c620f031b13b13ab6dfc60d404eceab66a075dd5d + languageName: node + linkType: hard + +"@types/d3-color@npm:*": + version: 3.1.3 + resolution: "@types/d3-color@npm:3.1.3" + checksum: 8a0e79a709929502ec4effcee2c786465b9aec51b653ba0b5d05dbfec3e84f418270dd603002d94021885061ff592f614979193bd7a02ad76317f5608560e357 + languageName: node + linkType: hard + +"@types/d3-ease@npm:^3.0.0": + version: 3.0.2 + resolution: "@types/d3-ease@npm:3.0.2" + checksum: 0885219966294bfc99548f37297e1c75e75da812a5f3ec941977ebb57dcab0a25acec5b2bbd82d09a49d387daafca08521ca269b7e4c27ddca7768189e987b54 + languageName: node + linkType: hard + +"@types/d3-interpolate@npm:^3.0.1": + version: 3.0.4 + resolution: "@types/d3-interpolate@npm:3.0.4" + dependencies: + "@types/d3-color": "*" + checksum: efd2770e174e84fc7316fdafe03cf3688451f767dde1fa6211610137f495be7f3923db7e1723a6961a0e0e9ae0ed969f4f47c038189fa0beb1d556b447922622 + languageName: node + linkType: hard + +"@types/d3-path@npm:*": + version: 3.1.1 + resolution: "@types/d3-path@npm:3.1.1" + checksum: fee8f6b0d3b28a3611c7d7fda3bf2f79392ded266f54b03a220f205c42117644bdcd33dcbf4853da3cca02229f1c669d2a60d5d297a24ce459ba8271ccb26c03 + languageName: node + linkType: hard + +"@types/d3-scale@npm:^4.0.2": + version: 4.0.9 + resolution: "@types/d3-scale@npm:4.0.9" + dependencies: + "@types/d3-time": "*" + checksum: c44265a38e538983686b1b8d159abfb4e81c09b33316f3a68f0f372d38400fa950ad531644d25230cc7b48ea5adb50270fc54823f088979ade62dcd0225f7aa3 + languageName: node + linkType: hard + +"@types/d3-shape@npm:^3.1.0": + version: 3.1.7 + resolution: "@types/d3-shape@npm:3.1.7" + dependencies: + "@types/d3-path": "*" + checksum: 776b982e2c4fc04763782af5100993c02bca338632ff2c76d2423ace398300ba7c48cd745f95b5f51edefabbfd026c45829a146c411f8facde09ef92580b20ce + languageName: node + linkType: hard + +"@types/d3-time@npm:*, @types/d3-time@npm:^3.0.0": + version: 3.0.4 + resolution: "@types/d3-time@npm:3.0.4" + checksum: 0c296884571ce70c4bbd4ea9cd1c93c0c8aee602c6c806b056187dd4ee49daf70c2f41da94b25ba0d796edf8ca83cbb87fe6d1cdda7ca669ab800170ece1c12b + languageName: node + linkType: hard + +"@types/d3-timer@npm:^3.0.0": + version: 3.0.2 + resolution: "@types/d3-timer@npm:3.0.2" + checksum: 1643eebfa5f4ae3eb00b556bbc509444d88078208ec2589ddd8e4a24f230dd4cf2301e9365947e70b1bee33f63aaefab84cd907822aae812b9bc4871b98ab0e1 + languageName: node + linkType: hard + "@types/debug@npm:^4.1.7": version: 4.1.12 resolution: "@types/debug@npm:4.1.12" @@ -8436,6 +8542,13 @@ __metadata: languageName: node linkType: hard +"@types/use-sync-external-store@npm:^0.0.6": + version: 0.0.6 + resolution: "@types/use-sync-external-store@npm:0.0.6" + checksum: a95ce330668501ad9b1c5b7f2b14872ad201e552a0e567787b8f1588b22c7040c7c3d80f142cbb9f92d13c4ea41c46af57a20f2af4edf27f224d352abcfe4049 + languageName: node + linkType: hard + "@types/uuid@npm:^8.3.4": version: 8.3.4 resolution: "@types/uuid@npm:8.3.4" @@ -12302,6 +12415,99 @@ __metadata: languageName: node linkType: hard +"d3-array@npm:2 - 3, d3-array@npm:2.10.0 - 3, d3-array@npm:^3.1.6": + version: 3.2.4 + resolution: "d3-array@npm:3.2.4" + dependencies: + internmap: 1 - 2 + checksum: a5976a6d6205f69208478bb44920dd7ce3e788c9dceb86b304dbe401a4bfb42ecc8b04c20facde486e9adcb488b5d1800d49393a3f81a23902b68158e12cddd0 + languageName: node + linkType: hard + +"d3-color@npm:1 - 3": + version: 3.1.0 + resolution: "d3-color@npm:3.1.0" + checksum: 4931fbfda5d7c4b5cfa283a13c91a954f86e3b69d75ce588d06cde6c3628cebfc3af2069ccf225e982e8987c612aa7948b3932163ce15eb3c11cd7c003f3ee3b + languageName: node + linkType: hard + +"d3-ease@npm:^3.0.1": + version: 3.0.1 + resolution: "d3-ease@npm:3.0.1" + checksum: 06e2ee5326d1e3545eab4e2c0f84046a123dcd3b612e68858219aa034da1160333d9ce3da20a1d3486d98cb5c2a06f7d233eee1bc19ce42d1533458bd85dedcd + languageName: node + linkType: hard + +"d3-format@npm:1 - 3": + version: 3.1.0 + resolution: "d3-format@npm:3.1.0" + checksum: f345ec3b8ad3cab19bff5dead395bd9f5590628eb97a389b1dd89f0b204c7c4fc1d9520f13231c2c7cf14b7c9a8cf10f8ef15bde2befbab41454a569bd706ca2 + languageName: node + linkType: hard + +"d3-interpolate@npm:1.2.0 - 3, d3-interpolate@npm:^3.0.1": + version: 3.0.1 + resolution: "d3-interpolate@npm:3.0.1" + dependencies: + d3-color: 1 - 3 + checksum: a42ba314e295e95e5365eff0f604834e67e4a3b3c7102458781c477bd67e9b24b6bb9d8e41ff5521050a3f2c7c0c4bbbb6e187fd586daa3980943095b267e78b + languageName: node + linkType: hard + +"d3-path@npm:^3.1.0": + version: 3.1.0 + resolution: "d3-path@npm:3.1.0" + checksum: 2306f1bd9191e1eac895ec13e3064f732a85f243d6e627d242a313f9777756838a2215ea11562f0c7630c7c3b16a19ec1fe0948b1c82f3317fac55882f6ee5d8 + languageName: node + linkType: hard + +"d3-scale@npm:^4.0.2": + version: 4.0.2 + resolution: "d3-scale@npm:4.0.2" + dependencies: + d3-array: 2.10.0 - 3 + d3-format: 1 - 3 + d3-interpolate: 1.2.0 - 3 + d3-time: 2.1.1 - 3 + d3-time-format: 2 - 4 + checksum: a9c770d283162c3bd11477c3d9d485d07f8db2071665f1a4ad23eec3e515e2cefbd369059ec677c9ac849877d1a765494e90e92051d4f21111aa56791c98729e + languageName: node + linkType: hard + +"d3-shape@npm:^3.1.0": + version: 3.2.0 + resolution: "d3-shape@npm:3.2.0" + dependencies: + d3-path: ^3.1.0 + checksum: de2af5fc9a93036a7b68581ca0bfc4aca2d5a328aa7ba7064c11aedd44d24f310c20c40157cb654359d4c15c3ef369f95ee53d71221017276e34172c7b719cfa + languageName: node + linkType: hard + +"d3-time-format@npm:2 - 4": + version: 4.1.0 + resolution: "d3-time-format@npm:4.1.0" + dependencies: + d3-time: 1 - 3 + checksum: 7342bce28355378152bbd4db4e275405439cabba082d9cd01946d40581140481c8328456d91740b0fe513c51ec4a467f4471ffa390c7e0e30ea30e9ec98fcdf4 + languageName: node + linkType: hard + +"d3-time@npm:1 - 3, d3-time@npm:2.1.1 - 3, d3-time@npm:^3.0.0": + version: 3.1.0 + resolution: "d3-time@npm:3.1.0" + dependencies: + d3-array: 2 - 3 + checksum: 613b435352a78d9f31b7f68540788186d8c331b63feca60ad21c88e9db1989fe888f97f242322ebd6365e45ec3fb206a4324cd4ca0dfffa1d9b5feb856ba00a7 + languageName: node + linkType: hard + +"d3-timer@npm:^3.0.1": + version: 3.0.1 + resolution: "d3-timer@npm:3.0.1" + checksum: 1cfddf86d7bca22f73f2c427f52dfa35c49f50d64e187eb788dcad6e927625c636aa18ae4edd44d084eb9d1f81d8ca4ec305dae7f733c15846a824575b789d73 + languageName: node + linkType: hard + "dag-jose@npm:^5.0.0": version: 5.1.1 resolution: "dag-jose@npm:5.1.1" @@ -12490,7 +12696,7 @@ __metadata: languageName: node linkType: hard -"decimal.js-light@npm:^2.5.0": +"decimal.js-light@npm:^2.5.0, decimal.js-light@npm:^2.5.1": version: 2.5.1 resolution: "decimal.js-light@npm:2.5.1" checksum: f5a2c7eac1c4541c8ab8a5c8abea64fc1761cefc7794bd5f8afd57a8a78d1b51785e0c4e4f85f4895a043eaa90ddca1edc3981d1263eb6ddce60f32bf5fe66c9 @@ -13282,6 +13488,18 @@ __metadata: languageName: node linkType: hard +"es-toolkit@npm:^1.39.3": + version: 1.43.0 + resolution: "es-toolkit@npm:1.43.0" + dependenciesMeta: + "@trivago/prettier-plugin-sort-imports@4.3.0": + unplugged: true + prettier-plugin-sort-re-exports@0.0.1: + unplugged: true + checksum: 202fe8e59d49c34214e8cf1f9a5c1920d5dc04a2938b44e5073ad25e187a61dd74f173e556c332ae380472ca70509b7cd7bd9f9a868d77c5c0525e3ac5b11b08 + languageName: node + linkType: hard + "es6-promise@npm:^4.0.3": version: 4.2.8 resolution: "es6-promise@npm:4.2.8" @@ -15827,6 +16045,20 @@ __metadata: languageName: node linkType: hard +"immer@npm:^10.1.1": + version: 10.2.0 + resolution: "immer@npm:10.2.0" + checksum: 1c6e389ba6a4ac814c246d3b6d0c7c42f851d120ace1defdce0d6efe835d22415790481b5443708167992f80b453cfe97bc9669382928eabc435f9618ce4a636 + languageName: node + linkType: hard + +"immer@npm:^11.0.0": + version: 11.0.1 + resolution: "immer@npm:11.0.1" + checksum: eecf16ae11535439e0c32d83d03d10f2df10f1fbbbc975ed24530d358bfad3aeff0134b113c4fa1f13be261cfc38a01e391274a061b842fb99bbb0649db85325 + languageName: node + linkType: hard + "immutable@npm:^4.0.0-rc.12": version: 4.3.7 resolution: "immutable@npm:4.3.7" @@ -15956,6 +16188,13 @@ __metadata: languageName: node linkType: hard +"internmap@npm:1 - 2": + version: 2.0.3 + resolution: "internmap@npm:2.0.3" + checksum: 7ca41ec6aba8f0072fc32fa8a023450a9f44503e2d8e403583c55714b25efd6390c38a87161ec456bf42d7bc83aab62eb28f5aef34876b1ac4e60693d5e1d241 + languageName: node + linkType: hard + "interpret@npm:^1.0.0": version: 1.4.0 resolution: "interpret@npm:1.4.0" @@ -20922,6 +21161,25 @@ __metadata: languageName: node linkType: hard +"react-redux@npm:8.x.x || 9.x.x": + version: 9.2.0 + resolution: "react-redux@npm:9.2.0" + dependencies: + "@types/use-sync-external-store": ^0.0.6 + use-sync-external-store: ^1.4.0 + peerDependencies: + "@types/react": ^18.2.25 || ^19 + react: ^18.0 || ^19 + redux: ^5.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + redux: + optional: true + checksum: 96dfe2929561d7c98d4443722738e4595f08758bde27b7bc20cd98ba9b0dfe9b81b9fa17b6888be94a0c1d2d1305397ae493a8219698536d011a941589eb82bd + languageName: node + linkType: hard + "react-refresh@npm:^0.17.0": version: 0.17.0 resolution: "react-refresh@npm:0.17.0" @@ -21103,6 +21361,29 @@ __metadata: languageName: node linkType: hard +"recharts@npm:^3.5.1": + version: 3.5.1 + resolution: "recharts@npm:3.5.1" + dependencies: + "@reduxjs/toolkit": 1.x.x || 2.x.x + clsx: ^2.1.1 + decimal.js-light: ^2.5.1 + es-toolkit: ^1.39.3 + eventemitter3: ^5.0.1 + immer: ^10.1.1 + react-redux: 8.x.x || 9.x.x + reselect: 5.1.1 + tiny-invariant: ^1.3.3 + use-sync-external-store: ^1.2.2 + victory-vendor: ^37.0.2 + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: a9aa1547037adf61e6290d7a337bb118ea89dba158b227afa6e9a00cfc3a57c50a8dab2a6fcb87b6536ad3ce182721fdb29ae29ba5b493043eb05685c2f8d566 + languageName: node + linkType: hard + "rechoir@npm:^0.6.2": version: 0.6.2 resolution: "rechoir@npm:0.6.2" @@ -21148,6 +21429,22 @@ __metadata: languageName: node linkType: hard +"redux-thunk@npm:^3.1.0": + version: 3.1.0 + resolution: "redux-thunk@npm:3.1.0" + peerDependencies: + redux: ^5.0.0 + checksum: bea96f8233975aad4c9f24ca1ffd08ac7ec91eaefc26e7ba9935544dc55d7f09ba2aa726676dab53dc79d0c91e8071f9729cddfea927f4c41839757d2ade0f50 + languageName: node + linkType: hard + +"redux@npm:^5.0.1": + version: 5.0.1 + resolution: "redux@npm:5.0.1" + checksum: e74affa9009dd5d994878b9a1ce30d6569d986117175056edb003de2651c05b10fe7819d6fa94aea1a94de9a82f252f986547f007a2fbeb35c317a2e5f5ecf2c + languageName: node + linkType: hard + "reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": version: 1.0.10 resolution: "reflect.getprototypeof@npm:1.0.10" @@ -21220,6 +21517,13 @@ __metadata: languageName: node linkType: hard +"reselect@npm:5.1.1, reselect@npm:^5.1.0": + version: 5.1.1 + resolution: "reselect@npm:5.1.1" + checksum: 5d32d48be29071ddda21a775945c2210cf4ca3fccde1c4a0e1582ac3bf99c431c6c2330ef7ca34eae4c06feea617e7cb2c275c4b33ccf9a930836dfc98b49b13 + languageName: node + linkType: hard + "resolve-alpn@npm:^1.2.0": version: 1.2.1 resolution: "resolve-alpn@npm:1.2.1" @@ -23147,7 +23451,7 @@ __metadata: languageName: node linkType: hard -"tiny-invariant@npm:^1.1.0": +"tiny-invariant@npm:^1.1.0, tiny-invariant@npm:^1.3.3": version: 1.3.3 resolution: "tiny-invariant@npm:1.3.3" checksum: 5e185c8cc2266967984ce3b352a4e57cb89dad5a8abb0dea21468a6ecaa67cd5bb47a3b7a85d08041008644af4f667fb8b6575ba38ba5fb00b3b5068306e59fe @@ -24119,7 +24423,7 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:^1.5.0, use-sync-external-store@npm:^1.6.0": +"use-sync-external-store@npm:^1.2.2, use-sync-external-store@npm:^1.4.0, use-sync-external-store@npm:^1.5.0, use-sync-external-store@npm:^1.6.0": version: 1.6.0 resolution: "use-sync-external-store@npm:1.6.0" peerDependencies: @@ -24309,6 +24613,28 @@ __metadata: languageName: node linkType: hard +"victory-vendor@npm:^37.0.2": + version: 37.3.6 + resolution: "victory-vendor@npm:37.3.6" + dependencies: + "@types/d3-array": ^3.0.3 + "@types/d3-ease": ^3.0.0 + "@types/d3-interpolate": ^3.0.1 + "@types/d3-scale": ^4.0.2 + "@types/d3-shape": ^3.1.0 + "@types/d3-time": ^3.0.0 + "@types/d3-timer": ^3.0.0 + d3-array: ^3.1.6 + d3-ease: ^3.0.1 + d3-interpolate: ^3.0.1 + d3-scale: ^4.0.2 + d3-shape: ^3.1.0 + d3-time: ^3.0.0 + d3-timer: ^3.0.1 + checksum: fc49f195823f59466ac66d10266e5af783777a1da2f84aad7d3023ce2db149fd1522f1ecbd6d3223849ec1f4c33ba2e8fd9a5eb0443f076698c5832ed574731a + languageName: node + linkType: hard + "viem@npm:2.23.2": version: 2.23.2 resolution: "viem@npm:2.23.2" From 72ad84d3fe1f64a19ea2ce627eacfcaaabbe136c Mon Sep 17 00:00:00 2001 From: Gbolahan Akande Date: Sat, 13 Dec 2025 23:49:55 +0100 Subject: [PATCH 07/10] Remove accessibility CSS file --- packages/nextjs/app/layout.tsx | 1 - packages/nextjs/styles/accessibility.css | 219 ----------------------- 2 files changed, 220 deletions(-) delete mode 100644 packages/nextjs/styles/accessibility.css diff --git a/packages/nextjs/app/layout.tsx b/packages/nextjs/app/layout.tsx index 830c847..18204de 100644 --- a/packages/nextjs/app/layout.tsx +++ b/packages/nextjs/app/layout.tsx @@ -6,7 +6,6 @@ import { PWAProvider } from "~~/components/pwa/PWAProvider"; import { AccessibilityProvider } from "~~/components/accessibility"; import { I18nProvider } from "~~/components/i18n"; import "~~/styles/globals.css"; -import "~~/styles/accessibility.css"; import { getMetadata, getViewport } from "~~/utils/scaffold-eth/getMetadata"; export const metadata = getMetadata({ diff --git a/packages/nextjs/styles/accessibility.css b/packages/nextjs/styles/accessibility.css deleted file mode 100644 index 385d43c..0000000 --- a/packages/nextjs/styles/accessibility.css +++ /dev/null @@ -1,219 +0,0 @@ -/* Screen reader only content */ -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -.sr-only.focus\:not-sr-only:focus { - position: static; - width: auto; - height: auto; - padding: inherit; - margin: inherit; - overflow: visible; - clip: auto; - white-space: normal; -} - -/* High contrast mode support */ -@media (prefers-contrast: high) { - button { - border: 2px solid currentColor; - } - - a { - text-decoration: underline; - } -} - -/* Reduced motion support */ -@media (prefers-reduced-motion: reduce) { - * { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - } -} - -/* Focus indicators */ -*:focus-visible { - outline: 3px solid #3B82F6; - outline-offset: 2px; -} - -/* Color contrast improvements */ -.text-gray-500 { - color: #6B7280; /* WCAG AA compliant */ -} - -.bg-blue-600 { - background-color: #2563EB; /* 4.5:1 contrast with white */ -} - -/* Skip to main content link */ -.skip-link { - position: absolute; - top: -40px; - left: 0; - background: #3B82F6; - color: white; - padding: 8px 16px; - text-decoration: none; - z-index: 100; -} - -.skip-link:focus { - top: 4px; - left: 4px; -} - -/* Keyboard navigation highlights */ -[tabindex]:focus, -button:focus, -a:focus, -input:focus, -select:focus, -textarea:focus { - outline: 3px solid #3B82F6; - outline-offset: 2px; - box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.1); -} - -/* High contrast text */ -@media (prefers-contrast: high) { - body { - background: white; - color: black; - } - - .text-muted, - .text-gray-500, - .text-gray-600 { - color: #000; - } - - button, - .btn { - border: 2px solid currentColor; - } -} - -/* Dark mode improvements */ -@media (prefers-color-scheme: dark) { - *:focus-visible { - outline-color: #60A5FA; - } -} - -/* RTL Support */ -[dir="rtl"] { - direction: rtl; - text-align: right; -} - -[dir="rtl"] .text-left { - text-align: right; -} - -[dir="rtl"] .text-right { - text-align: left; -} - -[dir="rtl"] .float-left { - float: right; -} - -[dir="rtl"] .float-right { - float: left; -} - -/* Font size utilities */ -.text-base { - font-size: 1rem; - line-height: 1.5; -} - -.text-lg-accessible { - font-size: 1.125rem; - line-height: 1.6; -} - -.text-xl-accessible { - font-size: 1.25rem; - line-height: 1.7; -} - -/* Improved touch targets for mobile accessibility */ -@media (hover: none) and (pointer: coarse) { - button, - a, - input[type="button"], - input[type="submit"] { - min-height: 44px; - min-width: 44px; - } -} - -/* Error states with better contrast */ -.error-message { - color: #DC2626; - background-color: #FEE2E2; - border: 2px solid #DC2626; - padding: 12px; - border-radius: 4px; -} - -@media (prefers-contrast: high) { - .error-message { - background-color: #FEE2E2; - color: #7F1D1D; - border-color: #7F1D1D; - } -} - -/* Success states with better contrast */ -.success-message { - color: #059669; - background-color: #D1FAE5; - border: 2px solid #059669; - padding: 12px; - border-radius: 4px; -} - -@media (prefers-contrast: high) { - .success-message { - background-color: #D1FAE5; - color: #064E3B; - border-color: #064E3B; - } -} - -/* Loading states */ -.loading-indicator { - display: inline-block; - width: 20px; - height: 20px; - border: 3px solid rgba(59, 130, 246, 0.3); - border-radius: 50%; - border-top-color: #3B82F6; - animation: spinner 0.6s linear infinite; -} - -@keyframes spinner { - to { transform: rotate(360deg); } -} - -@media (prefers-reduced-motion: reduce) { - .loading-indicator { - animation: none; - border-top-color: #3B82F6; - border-right-color: #3B82F6; - } -} \ No newline at end of file From 57de772a2218bf0eae9bca855ec8005558c1d9dc Mon Sep 17 00:00:00 2001 From: Gbolahan Akande Date: Sat, 13 Dec 2025 23:55:34 +0100 Subject: [PATCH 08/10] Remove tailwindcss-rtl from postcss config --- packages/nextjs/postcss.config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/nextjs/postcss.config.js b/packages/nextjs/postcss.config.js index 3e30a9e..e564072 100644 --- a/packages/nextjs/postcss.config.js +++ b/packages/nextjs/postcss.config.js @@ -1,6 +1,5 @@ module.exports = { plugins: { '@tailwindcss/postcss': {}, - 'tailwindcss-rtl': {}, }, }; From 090ed549e9c9c6ae8c16fb8faaae779d3541f2c5 Mon Sep 17 00:00:00 2001 From: Gbolahan Akande Date: Sun, 14 Dec 2025 07:06:04 +0100 Subject: [PATCH 09/10] Fix i18n SSR compatibility --- packages/nextjs/i18n/index.ts | 69 +++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/packages/nextjs/i18n/index.ts b/packages/nextjs/i18n/index.ts index 7b75cc4..c21772c 100644 --- a/packages/nextjs/i18n/index.ts +++ b/packages/nextjs/i18n/index.ts @@ -12,28 +12,51 @@ import ig from './locales/ig.json'; import sw from './locales/sw.json'; import ar from './locales/ar.json'; -i18n - .use(LanguageDetector) // Detect user language - .use(initReactI18next) // React integration - .init({ - resources: { - en: { translation: en }, - fr: { translation: fr }, - tw: { translation: tw }, - ha: { translation: ha }, - yo: { translation: yo }, - ig: { translation: ig }, - sw: { translation: sw }, - ar: { translation: ar }, - }, - fallbackLng: 'en', - interpolation: { - escapeValue: false, // React already escapes - }, - detection: { - order: ['localStorage', 'navigator', 'htmlTag'], - caches: ['localStorage'], - }, - }); +// Only initialize on client side +if (typeof window !== 'undefined') { + i18n + .use(LanguageDetector) // Detect user language + .use(initReactI18next) // React integration + .init({ + resources: { + en: { translation: en }, + fr: { translation: fr }, + tw: { translation: tw }, + ha: { translation: ha }, + yo: { translation: yo }, + ig: { translation: ig }, + sw: { translation: sw }, + ar: { translation: ar }, + }, + fallbackLng: 'en', + interpolation: { + escapeValue: false, // React already escapes + }, + detection: { + order: ['localStorage', 'navigator', 'htmlTag'], + caches: ['localStorage'], + }, + }); +} else { + // Server-side initialization (minimal) + i18n + .use(initReactI18next) + .init({ + resources: { + en: { translation: en }, + fr: { translation: fr }, + tw: { translation: tw }, + ha: { translation: ha }, + yo: { translation: yo }, + ig: { translation: ig }, + sw: { translation: sw }, + ar: { translation: ar }, + }, + fallbackLng: 'en', + interpolation: { + escapeValue: false, + }, + }); +} export default i18n; \ No newline at end of file From bac6673e03c603e73cd5ffc547d0078ec78b60c4 Mon Sep 17 00:00:00 2001 From: Gbolahan Akande Date: Sun, 14 Dec 2025 07:18:35 +0100 Subject: [PATCH 10/10] Add webpack config for SSR self polyfill --- packages/nextjs/next.config.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/nextjs/next.config.ts b/packages/nextjs/next.config.ts index db104b2..9e54dcf 100644 --- a/packages/nextjs/next.config.ts +++ b/packages/nextjs/next.config.ts @@ -29,8 +29,17 @@ const nextConfig: NextConfig = { "react-hot-toast", ], }, - webpack: config => { + webpack: (config, { isServer }) => { + // Polyfill 'self' for server-side builds + if (isServer) { + config.resolve.fallback = { + ...config.resolve.fallback, + 'self': false, + }; + } + config.resolve.fallback = { + ...config.resolve.fallback, fs: false, net: false, tls: false,