Skip to content
Open
Show file tree
Hide file tree
Changes from 59 commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
36603aa
fix
KEM-CONSOLATION Sep 4, 2025
9f70407
added farcaster file
KEM-CONSOLATION Sep 4, 2025
97e9faf
worked on farcaster json file edit
KEM-CONSOLATION Sep 5, 2025
81545cc
Added Redirect URL
KEM-CONSOLATION Sep 5, 2025
f59b85c
added minikitprovider
KEM-CONSOLATION Sep 5, 2025
a0b2138
removed deny
KEM-CONSOLATION Sep 5, 2025
68684f8
making it discoverable
KEM-CONSOLATION Sep 5, 2025
2c01141
fix
KEM-CONSOLATION Sep 5, 2025
81c441f
added redirect
KEM-CONSOLATION Sep 5, 2025
6ac4e1d
fix
KEM-CONSOLATION Sep 5, 2025
496b649
added preview page
KEM-CONSOLATION Sep 5, 2025
810611d
fix
KEM-CONSOLATION Sep 5, 2025
97ac2fa
version change
KEM-CONSOLATION Sep 5, 2025
8b7187b
fix versioning
KEM-CONSOLATION Sep 6, 2025
ef0f467
fix frame issue
KEM-CONSOLATION Sep 6, 2025
eb50745
fix the embed stuff
KEM-CONSOLATION Sep 6, 2025
010ec2d
fix
KEM-CONSOLATION Sep 6, 2025
15e07aa
fix
KEM-CONSOLATION Sep 6, 2025
06f7b5e
fix
KEM-CONSOLATION Sep 6, 2025
f246d19
fix
KEM-CONSOLATION Sep 6, 2025
79c674b
fix
KEM-CONSOLATION Sep 6, 2025
d1b3bf8
fix
KEM-CONSOLATION Sep 6, 2025
e9453ef
Enhance wallet connection logic to prioritize Farcaster SDK's Ethereu…
KEM-CONSOLATION Sep 6, 2025
659b567
fixed coderabbit reviews
KEM-CONSOLATION Sep 8, 2025
56a458b
Updated App Fav Icons
KEM-CONSOLATION Sep 8, 2025
6867095
mini mode
KEM-CONSOLATION Sep 12, 2025
3f9e619
Refactor Navbar component to conditionally handle dropdown interactio…
KEM-CONSOLATION Sep 12, 2025
0db23ca
Update Navbar component to simplify button visibility logic by removi…
KEM-CONSOLATION Sep 12, 2025
cd1e447
Update developer information in farcaster.json and farcaster-manifest…
KEM-CONSOLATION Oct 14, 2025
01ce454
fix
KEM-CONSOLATION Sep 4, 2025
eb71d9f
added farcaster file
KEM-CONSOLATION Sep 4, 2025
5fc648c
worked on farcaster json file edit
KEM-CONSOLATION Sep 5, 2025
e75cbfe
Added Redirect URL
KEM-CONSOLATION Sep 5, 2025
4e80c89
added minikitprovider
KEM-CONSOLATION Sep 5, 2025
cb730ab
removed deny
KEM-CONSOLATION Sep 5, 2025
809d079
making it discoverable
KEM-CONSOLATION Sep 5, 2025
8dc42de
fix
KEM-CONSOLATION Sep 5, 2025
1e444b9
added redirect
KEM-CONSOLATION Sep 5, 2025
df37353
fix
KEM-CONSOLATION Sep 5, 2025
9a866fd
added preview page
KEM-CONSOLATION Sep 5, 2025
3979b4e
fix
KEM-CONSOLATION Sep 5, 2025
3a24a87
version change
KEM-CONSOLATION Sep 5, 2025
e3a1c4b
fix versioning
KEM-CONSOLATION Sep 6, 2025
86f7b6d
fix frame issue
KEM-CONSOLATION Sep 6, 2025
4125602
fix the embed stuff
KEM-CONSOLATION Sep 6, 2025
8b2b01e
fix
KEM-CONSOLATION Sep 6, 2025
7fa1f47
fix
KEM-CONSOLATION Sep 6, 2025
8f2e79e
fix
KEM-CONSOLATION Sep 6, 2025
05ea5e8
fix
KEM-CONSOLATION Sep 6, 2025
e0a08fa
fix
KEM-CONSOLATION Sep 6, 2025
2ed678c
Enhance wallet connection logic to prioritize Farcaster SDK's Ethereu…
KEM-CONSOLATION Sep 6, 2025
ce52326
fixed coderabbit reviews
KEM-CONSOLATION Sep 8, 2025
fa99608
Updated App Fav Icons
KEM-CONSOLATION Sep 8, 2025
b323cb6
mini mode
KEM-CONSOLATION Sep 12, 2025
d9d9563
Refactor Navbar component to conditionally handle dropdown interactio…
KEM-CONSOLATION Sep 12, 2025
a91bd08
Update Navbar component to simplify button visibility logic by removi…
KEM-CONSOLATION Sep 12, 2025
a1f9376
Update developer information in farcaster.json and farcaster-manifest…
KEM-CONSOLATION Oct 14, 2025
ff5635a
Merge branch 'main' into main
sundayonah Dec 4, 2025
9095ff4
Merge branch 'main' of https://github.com/KEM-CONSOLATION/noblocks in…
sundayonah Dec 4, 2025
0d1b93b
fix: configuration settings by removing unused environment variables …
sundayonah Dec 4, 2025
05bccf0
refactor: update layout and remove unused files; enhance mini mode de…
sundayonah Dec 5, 2025
4035478
refactor: enhance app configuration and layout; integrate Base App co…
sundayonah Dec 9, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions app/.well-known/farcaster.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"name": "Noblocks",
"description": "A crypto-enabled mini app for sending and receiving stablecoins on Base using Farcaster.",
"app": {
"url": "https://noblocks.xyz",
"window": {
"height": 600,
"width": 400
}
},
"icon": {
"light": "https://noblocks.xyz/icons/favicon_.png",
"dark": "https://noblocks.xyz/icons/favicon.png"
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Verify icon paths (possible typo: favicon_.png)

icon.light uses favicon_.png while icon.dark uses favicon.png. Ensure both exist or align names to avoid 404s.


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
for path in \
  "https://noblocks.xyz/icons/favicon_.png" \
  "https://noblocks.xyz/icons/favicon.png"
do
  code=$(curl -sI "$path" | awk 'NR==1{print $2}')
  echo "$code $path"
done

Length of output: 86


Fix broken icon URLs in app/.well-known/farcaster.json (lines 12–14)

Both icon URLs return 404 — upload the missing files or correct the paths/filenames (e.g., remove the stray underscore or point to the actual existing icon).

    "light": "https://noblocks.xyz/icons/favicon_.png",
    "dark": "https://noblocks.xyz/icons/favicon.png"
  },
🤖 Prompt for AI Agents
In app/.well-known/farcaster.json around lines 12 to 14, the light and/or dark
icon URLs are broken (404). Fix by correcting the paths or filenames to point to
existing assets (for example remove the stray underscore from "favicon_.png" to
match the actual file name, or upload the missing icon files to
https://noblocks.xyz/icons/), and update the JSON values so both "light" and
"dark" keys reference valid, reachable URLs.

"splash_screen": {
"light": "https://noblocks.xyz/android-chrome-192x192.png",
"dark": "https://noblocks.xyz/android-chrome-192x192.png"
},
"navigation_bar": {
"visible": true,
"title": "Noblocks"
},
"version": "1.0.0",
"primaryCategory": "finance",
"tags": ["web3"],
"developer": {
"name": "Paycrest",
"website": "https://paycrest.io",
"contact": "mailto:[email protected]"
},
"accountAssociation": {
"header": "eyJmaWQiOjExNjI4ODAsInR5cGUiOiJhdXRoIiwia2V5IjoiMHgzZERCMTQ5RGNBMEZjMDcxM0ZjMzhBQ2IxNjdDMzM2NzIwQjVGMDdmIn0",
"payload": "eyJkb21haW4iOiJub2Jsb2Nrcy1pYWxjLnZlcmNlbC5hcHAifQ",
"signature": "qV6dj7aiufYm6/Lnb79FhFQD3jETpubKivIbqXyFVdZK8kvLOsE/bMw0b3YN2iTbp44RAD83IXt0mJVjW8NuVRw="
}
}
10 changes: 10 additions & 0 deletions app/.well-known/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
export async function GET() {
const hostedManifestUrl = process.env.NEXT_PUBLIC_FC_HOSTED_MANIFEST_URL!;
return new Response(null, {
status: 307,
headers: {
Location: hostedManifestUrl,
"Cache-Control": "public, s-maxage=300, stale-while-revalidate=86400",
},
});
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Handle missing/invalid hosted manifest URL; improve caching

Non-null assertion on env can yield an invalid Location at runtime. Add a guard and validate as a URL. Also add max-age for browsers (s-maxage applies to CDNs only).

 export async function GET() {
-  const hostedManifestUrl = process.env.NEXT_PUBLIC_FC_HOSTED_MANIFEST_URL!;
-  return new Response(null, {
+  const hostedManifestUrl = process.env.NEXT_PUBLIC_FC_HOSTED_MANIFEST_URL;
+  if (!hostedManifestUrl) {
+    return new Response("Missing NEXT_PUBLIC_FC_HOSTED_MANIFEST_URL", { status: 500 });
+  }
+  try {
+    new URL(hostedManifestUrl);
+  } catch {
+    return new Response("Invalid NEXT_PUBLIC_FC_HOSTED_MANIFEST_URL", { status: 500 });
+  }
+  return new Response(null, {
     status: 307,
     headers: {
       Location: hostedManifestUrl,
-      "Cache-Control": "public, s-maxage=300, stale-while-revalidate=86400",
+      "Cache-Control": "public, max-age=300, s-maxage=300, stale-while-revalidate=86400",
     },
   });
 }
+
+export async function HEAD() {
+  return GET();
+}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export async function GET() {
const hostedManifestUrl = process.env.NEXT_PUBLIC_FC_HOSTED_MANIFEST_URL!;
return new Response(null, {
status: 307,
headers: {
Location: hostedManifestUrl,
"Cache-Control": "public, s-maxage=300, stale-while-revalidate=86400",
},
});
}
export async function GET() {
const hostedManifestUrl = process.env.NEXT_PUBLIC_FC_HOSTED_MANIFEST_URL;
if (!hostedManifestUrl) {
return new Response("Missing NEXT_PUBLIC_FC_HOSTED_MANIFEST_URL", { status: 500 });
}
try {
new URL(hostedManifestUrl);
} catch {
return new Response("Invalid NEXT_PUBLIC_FC_HOSTED_MANIFEST_URL", { status: 500 });
}
return new Response(null, {
status: 307,
headers: {
Location: hostedManifestUrl,
"Cache-Control": "public, max-age=300, s-maxage=300, stale-while-revalidate=86400",
},
});
}
export async function HEAD() {
return GET();
}
🤖 Prompt for AI Agents
In app/.well-known/route.ts around lines 1–10, remove the non-null assertion and
add a guard that checks process.env.NEXT_PUBLIC_FC_HOSTED_MANIFEST_URL exists
and is a valid URL (e.g., try new URL(value) and catch errors); if
missing/invalid, return a 400 (or 500) Response with a clear message instead of
performing the redirect; when valid, use the parsed URL.href as the Location
header and update Cache-Control to include a browser-facing max-age as well as
s-maxage and stale-while-revalidate (for example: "public, max-age=60,
s-maxage=300, stale-while-revalidate=86400").

💡 Verification agent

🧩 Analysis chain

Route path doesn’t intercept /.well-known/farcaster.json

This route handles /.well-known, not /.well-known/farcaster.json. If you intend to redirect the JSON path via code (instead of vercel.json), move this file under app/.well-known/farcaster.json/route.ts. Otherwise, delete this route and rely on the Vercel redirect only.

I can script a curl check to confirm the live behavior for both /.well-known and /.well-known/farcaster.json.


🏁 Script executed:

#!/bin/bash
# Locate vercel.json
echo "=== vercel.json path ==="
fd -t f vercel.json || echo "vercel.json not found"

# Show content of vercel.json if exists
if [ -f vercel.json ]; then
  echo "=== vercel.json content ==="
  sed -n '1,200p' vercel.json
fi

# Locate next.config.js or next.config.ts
echo "=== next.config.js or ts ==="
fd -t f next.config.js next.config.ts || echo "next.config.js/ts not found"

# Show redirect config in next.config.js
if [ -f next.config.js ]; then
  echo "=== next.config.js redirects ==="
  grep -R "redirects" -n next.config.js | sed 's/^/   /'
fi

# Show redirect config in next.config.ts
if [ -f next.config.ts ]; then
  echo "=== next.config.ts redirects ==="
  grep -R "redirects" -n next.config.ts | sed 's/^/   /'
fi

# Show app/.well-known/route.ts content
echo "=== app/.well-known/route.ts content ==="
if [ -f app/.well-known/route.ts ]; then
  sed -n '1,200p' app/.well-known/route.ts
else
  echo "app/.well-known/route.ts not found"
fi

Length of output: 781


Route file only matches /.well-known, not /.well-known/farcaster.json
Move app/.well-known/route.ts to app/.well-known/farcaster.json/route.ts if you intend to handle the JSON redirect in code; otherwise delete this route and rely on the existing vercel.json redirect for the .well-known/farcaster.json path.

🤖 Prompt for AI Agents
In app/.well-known/route.ts around lines 1 to 10, the route currently only
matches /.well-known; either move this file to
app/.well-known/farcaster.json/route.ts so it handles requests to
/.well-known/farcaster.json (keeping the same GET handler) or delete this route
file entirely and rely on the existing vercel.json redirect for the
/.well-known/farcaster.json path; after moving, ensure the file path and exports
remain the same and update any imports or references if necessary.

81 changes: 81 additions & 0 deletions app/api/og/route.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import { ImageResponse } from "next/og";

export async function GET() {
return new ImageResponse(
(
<div
style={{
display: "flex",
height: "100%",
width: "100%",
alignItems: "center",
justifyContent: "center",
flexDirection: "column",
background: "linear-gradient(135deg, #317EFB 0%, #1E40AF 100%)",
color: "white",
fontFamily: "system-ui, -apple-system, sans-serif",
padding: "40px",
}}
>
{/* Logo/Brand */}
<div
style={{
fontSize: 80,
fontWeight: "800",
marginBottom: 20,
letterSpacing: "-0.02em",
}}
>
Noblocks
</div>

{/* Tagline */}
<div
style={{
fontSize: 36,
textAlign: "center",
maxWidth: "900px",
lineHeight: 1.2,
opacity: 0.95,
fontWeight: "400",
}}
>
Change stablecoins to cash in seconds
</div>

{/* Subtitle */}
<div
style={{
fontSize: 24,
textAlign: "center",
maxWidth: "800px",
marginTop: 30,
opacity: 0.8,
fontWeight: "300",
}}
>
Decentralized payments to any bank or mobile wallet
</div>

{/* Visual element */}
<div
style={{
position: "absolute",
bottom: 40,
right: 40,
display: "flex",
alignItems: "center",
fontSize: 20,
opacity: 0.7,
}}
>
noblocks.xyz
</div>
</div>
),
{
width: 1200,
height: 630,
},
);
}
10 changes: 9 additions & 1 deletion app/blog/[id]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import DetailClient from "@/app/components/blog/post/detail-client";
import { getPost, getRecentPosts } from "@/app/lib/sanity-data";
import { notFound } from "next/navigation";
import { notFound, redirect } from "next/navigation";
import { Metadata } from "next";
import type { PortableTextBlock } from "@portabletext/types";

Expand Down Expand Up @@ -109,9 +109,17 @@ export async function generateMetadata({

export default async function BlogPostDetailPage({
params,
searchParams,
}: {
params: Promise<{ id: string }>;
searchParams: Promise<{ mini?: string }>;
}) {
Comment on lines 110 to 116
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Use canonical Next.js App Router types for params/searchParams

These aren’t Promises in App Router. Aligning types removes unnecessary awaits and TS friction.

-export default async function BlogPostDetailPage({
-  params,
-  searchParams,
-}: {
-  params: Promise<{ id: string }>;
-  searchParams: Promise<{ mini?: string }>;
-}) {
+export default async function BlogPostDetailPage({
+  params,
+  searchParams,
+}: {
+  params: { id: string };
+  searchParams?: { mini?: string };
+}) {
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export default async function BlogPostDetailPage({
params,
searchParams,
}: {
params: Promise<{ id: string }>;
searchParams: Promise<{ mini?: string }>;
}) {
export default async function BlogPostDetailPage({
params,
searchParams,
}: {
params: { id: string };
searchParams?: { mini?: string };
}) {
🤖 Prompt for AI Agents
In app/blog/[id]/page.tsx around lines 76 to 82, the params and searchParams are
typed as Promises but in Next.js App Router they are plain objects; change the
function signature to accept params: { id: string } and searchParams?: { mini?:
string } (or searchParams: { mini?: string } depending on optionality) and
remove any unnecessary await usage or Promise handling inside the function and
its callers; update all references that treat these values as Promises (remove
await, use directly) and adjust any downstream type annotations to match the
non-Promise types.

// Redirect to home page if in mini mode
const resolvedSearchParams = await searchParams;
if (resolvedSearchParams.mini === "true") {
redirect("/?mini=true");
}

const { id } = await params;
const post = await getPost(id);
if (!post) notFound();
Expand Down
13 changes: 12 additions & 1 deletion app/blog/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import React, { Suspense } from "react";
import { getPosts, getCategories, getCachedPosts } from "@/app/lib/sanity-data";
import HomeClient from "@/app/components/blog/home-client";
import { Metadata } from "next";
import { redirect } from "next/navigation";

// Force dynamic rendering to ensure fresh data
export const dynamic = "force-dynamic";
Expand Down Expand Up @@ -43,7 +44,17 @@ export async function generateMetadata(): Promise<Metadata> {
};
}

export default async function Home() {
export default async function Home({
searchParams,
}: {
searchParams: Promise<{ mini?: string }>;
}) {
// Redirect to home page if in mini mode
const resolvedSearchParams = await searchParams;
if (resolvedSearchParams.mini === "true") {
redirect("/?mini=true");
}
Comment on lines +47 to +56
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Fix searchParams typing; it isn’t a Promise in Next.js App Router.

Current type compiles but is incorrect and can confuse tools.

-export default async function Home({
-  searchParams,
-}: {
-  searchParams: Promise<{ mini?: string }>;
-}) {
-  // Redirect to home page if in mini mode
-  const resolvedSearchParams = await searchParams;
-  if (resolvedSearchParams.mini === "true") {
+export default async function Home({
+  searchParams,
+}: {
+  searchParams?: { mini?: string };
+}) {
+  // Redirect to home page if in mini mode
+  if (searchParams?.mini === "true") {
     redirect("/?mini=true");
   }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export default async function Home({
searchParams,
}: {
searchParams: Promise<{ mini?: string }>;
}) {
// Redirect to home page if in mini mode
const resolvedSearchParams = await searchParams;
if (resolvedSearchParams.mini === "true") {
redirect("/?mini=true");
}
export default async function Home({
searchParams,
}: {
searchParams?: { mini?: string };
}) {
// Redirect to home page if in mini mode
if (searchParams?.mini === "true") {
redirect("/?mini=true");
}
🤖 Prompt for AI Agents
In app/blog/page.tsx around lines 41 to 50, the Home component types
searchParams as a Promise but in Next.js App Router searchParams is a plain
object; change the prop type from searchParams: Promise<{ mini?: string }> to
searchParams: { mini?: string } (and remove the await on searchParams), so use
const resolvedSearchParams = searchParams or reference searchParams directly
when checking mini === "true".


// Fetch data from Sanity (cached to avoid duplicate fetch in metadata)
const sanityPosts = await getCachedPosts();
const sanityCategories = await getCategories();
Expand Down
11 changes: 8 additions & 3 deletions app/components/HomePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
import WalkthroughVideo from "./WalkthroughVideo";
import { ScrollArrowLine, ScrollArrowHead } from "./ImageAssets";
import { getBannerPadding } from "../utils";
import { useMiniMode } from "../hooks/useMiniMode";
import { BlockFestBanner } from "./blockfest";

const crimsonPro = Crimson_Pro({
Expand Down Expand Up @@ -49,6 +50,8 @@ function HomePageComponent({
isRecipientFormOpen,
showBlockFestBanner = false,
}: HomePageProps) {
const isMiniMode = useMiniMode();

const handleScrollToForm = () => {
const formElement = document.getElementById("hero");
if (formElement) {
Expand Down Expand Up @@ -143,8 +146,9 @@ function HomePageComponent({
</motion.div>
</div>

{/* All additional content - always visible, scroll-triggered animations */}
<div className="-mt-2 w-full lg:-mt-4">
{/* All additional content - only visible in normal mode, scroll-triggered animations */}
{!isMiniMode && (
<div className="-mt-2 w-full lg:-mt-4">
<BlurRevealSection
id="video-section"
className="mx-auto mb-[4.875rem] w-full max-w-[62.75rem] scroll-mt-24 px-5 md:mb-[11.5625rem]"
Expand Down Expand Up @@ -433,7 +437,8 @@ function HomePageComponent({
));
})()}
</BlurRevealSection>
</div>
</div>
)}
</div>
);
}
Expand Down
64 changes: 38 additions & 26 deletions app/components/MainPageContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,10 @@ import { clearFormState, getBannerPadding } from "../utils";
import { useSearchParams } from "next/navigation";
import { HomePage } from "./HomePage";
import { useNetwork } from "../context/NetworksContext";
import { useMiniMode } from "../hooks/useMiniMode";
import { useBlockFestModal } from "../context/BlockFestModalContext";
import { useInjectedWallet } from "../context";
import { useMiniMode } from "../hooks/useMiniMode";

const PageLayout = ({
authenticated,
Expand All @@ -45,13 +47,15 @@ const PageLayout = ({
transactionFormComponent,
isRecipientFormOpen,
isBlockFestReferral,
isMiniMode,
}: {
authenticated: boolean;
ready: boolean;
currentStep: string;
transactionFormComponent: React.ReactNode;
isRecipientFormOpen: boolean;
isBlockFestReferral: boolean;
isMiniMode: boolean;
}) => {
const { claimed, resetClaim } = useBlockFestClaim();
const { user } = usePrivy();
Expand All @@ -68,7 +72,7 @@ const PageLayout = ({
const walletAddress = isInjectedWallet
? injectedAddress
: user?.linkedAccounts.find((account) => account.type === "smart_wallet")
?.address;
?.address;

return (
<>
Expand All @@ -86,7 +90,12 @@ const PageLayout = ({

<BlockFestCashbackModal isOpen={isOpen} onClose={closeModal} />

{currentStep === STEPS.FORM ? (
{isMiniMode ? (
// Mini mode: Show only transaction components
<div className={`px-5 py-28 ${getBannerPadding()}`}>
{transactionFormComponent}
</div>
) : currentStep === STEPS.FORM ? (
<HomePage
transactionFormComponent={transactionFormComponent}
isRecipientFormOpen={isRecipientFormOpen}
Expand All @@ -107,7 +116,9 @@ export function MainPageContent() {
const { currentStep, setCurrentStep } = useStep();
const { isInjectedWallet, injectedReady } = useInjectedWallet();
const { selectedNetwork } = useNetwork();
const isMiniMode = useMiniMode();
const { isBlockFestReferral } = useBlockFestReferral();
const isMiniMode = useMiniMode();
const [isPageLoading, setIsPageLoading] = useState(true);
const [isFetchingRate, setIsFetchingRate] = useState(false);
const [isFetchingInstitutions, setIsFetchingInstitutions] = useState(false);
Expand Down Expand Up @@ -149,30 +160,30 @@ export function MainPageContent() {

// State props for child components
const stateProps: StateProps = {
formValues,
setFormValues,

rate,
setRate,
isFetchingRate,
setIsFetchingRate,
rateError,
setRateError,

institutions,
setInstitutions,
isFetchingInstitutions,
setIsFetchingInstitutions,

selectedRecipient,
setSelectedRecipient,

orderId,
setOrderId,
setCreatedAt,
setTransactionStatus,
}
formValues,
setFormValues,

rate,
setRate,
isFetchingRate,
setIsFetchingRate,
rateError,
setRateError,

institutions,
setInstitutions,
isFetchingInstitutions,
setIsFetchingInstitutions,

selectedRecipient,
setSelectedRecipient,

orderId,
setOrderId,
setCreatedAt,
setTransactionStatus,
}

useEffect(function setPageLoadingState() {
setOrderId("");
setIsPageLoading(false);
Expand Down Expand Up @@ -457,6 +468,7 @@ export function MainPageContent() {
transactionFormComponent={transactionFormComponent}
isRecipientFormOpen={isRecipientFormOpen}
isBlockFestReferral={isBlockFestReferral}
isMiniMode={isMiniMode}
/>
)}
</div>
Expand Down
Loading