Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
53 changes: 53 additions & 0 deletions app/.well-known/farcaster.json/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { NextRequest, NextResponse } from "next/server";
import config from "../../lib/config";

export async function GET() {
const assetBaseUrl = "https://noblocks.xyz";

const manifest: any = {
accountAssociation: {
header: config.baseAppHeader,
payload: config.baseAppPayload,
signature: config.baseAppSignature,
},
baseBuilder: {
ownerAddress: config.baseBuilderOwnerAddress,
},
miniapp: {
version: "1",
name: "Noblocks",
homeUrl: assetBaseUrl,
iconUrl: `${assetBaseUrl}/icons/android-chrome-192x192.png`,
imageUrl: `${assetBaseUrl}/images/og-image.jpg`,
splashImageUrl: `${assetBaseUrl}/images/noblocks-bg-image.png`,
splashBackgroundColor: "#8B85F4",
subtitle: "Decentralized Payments",
description:
"Send crypto payments to any bank or mobile wallet via distributed liquidity network.",
screenshotUrls: [
`${assetBaseUrl}/screenshots/mobile-narrow.png`,
`${assetBaseUrl}/screenshots/desktop-wide.png`,
],
primaryCategory: "finance",
tags: ["payments", "crypto", "remittance", "defi"],
heroImageUrl: `${assetBaseUrl}/images/noblocks-bg-image.png`,
tagline: "Crypto-to-fiat payments",
ogTitle: "Noblocks",
ogDescription: "Decentralized payments to any bank or mobile wallet via distributed liquidity network.",
ogImageUrl: `${assetBaseUrl}/images/og-image.jpg`,
noindex: false,
},
};

return NextResponse.json(manifest, {
headers: {
"Content-Type": "application/json",
// Disable caching completely during testing
"Cache-Control": "no-cache, no-store, must-revalidate, max-age=0",
"Pragma": "no-cache",
"Expires": "0",
// Explicitly allow framing
"X-Frame-Options": "",
},
});
}
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 }>;
}) {
// 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");
}

// Fetch data from Sanity (cached to avoid duplicate fetch in metadata)
const sanityPosts = await getCachedPosts();
const sanityCategories = await getCategories();
Expand Down
38 changes: 26 additions & 12 deletions app/components/AppLayout.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import React from "react";
"use client";
import React, { useEffect, useState } from "react";
import Script from "next/script";
import config from "../lib/config";

import Providers from "../providers";
import MainContent from "../mainContent";
import {
Footer,
Expand All @@ -11,22 +11,36 @@ import {
PWAInstall,
NoticeBanner,
} from "./index";
import { useBaseApp } from "../context";

export default function AppLayout({ children }: { children: React.ReactNode }) {
const { isBaseApp, isFarcaster } = useBaseApp();
const [isMounted, setIsMounted] = useState(false);

// Only check mini app status after mount to prevent hydration mismatch
useEffect(() => {
setIsMounted(true);
}, []);

// Always render full UI on server, then conditionally hide on client after mount
const isMiniApp = isMounted && (isBaseApp || isFarcaster);

return (
<Providers>
<>
<div className="min-h-full min-w-full bg-white transition-colors dark:bg-neutral-900">
<div className="relative">
<Navbar />
{config.noticeBannerText && (
<NoticeBanner textLines={config.noticeBannerText.split("|")} />
)}
</div>
<LayoutWrapper footer={<Footer />}>
{!isMiniApp && (
<div className="relative">
<Navbar />
{config.noticeBannerText && (
<NoticeBanner textLines={config.noticeBannerText.split("|")} />
)}
</div>
)}
<LayoutWrapper footer={!isMiniApp ? <Footer /> : undefined}>
<MainContent>{children}</MainContent>
</LayoutWrapper>

<PWAInstall />
{!isMiniApp && <PWAInstall />}
</div>

{/* Brevo Chat Widget */}
Expand All @@ -44,6 +58,6 @@ export default function AppLayout({ children }: { children: React.ReactNode }) {
/>{" "}
</>
)}
</Providers>
</>
);
}
2 changes: 1 addition & 1 deletion app/components/HomePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ function HomePageComponent({
</motion.div>
</div>

{/* All additional content - always visible, scroll-triggered animations */}
{/* All additional content - scroll-triggered animations */}
<div className="-mt-2 w-full lg:-mt-4">
<BlurRevealSection
id="video-section"
Expand Down
50 changes: 25 additions & 25 deletions app/components/MainPageContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ const PageLayout = ({
const walletAddress = isInjectedWallet
? injectedAddress
: user?.linkedAccounts.find((account) => account.type === "smart_wallet")
?.address;
?.address;

return (
<>
Expand Down Expand Up @@ -149,30 +149,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
5 changes: 2 additions & 3 deletions app/components/Navbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -193,9 +193,8 @@ export const Navbar = () => {
<div className="hidden items-center sm:flex">
<Link
href="/"
className={`${
IS_MAIN_PRODUCTION_DOMAIN ? "" : "-mt-[3px]"
} text-sm font-medium text-gray-700 transition-colors hover:text-gray-900 dark:text-white/80 dark:hover:text-white`}
className={`${IS_MAIN_PRODUCTION_DOMAIN ? "" : "-mt-[3px]"
} text-sm font-medium text-gray-700 transition-colors hover:text-gray-900 dark:text-white/80 dark:hover:text-white`}
>
Swap
</Link>
Expand Down
Loading