new pages added

This commit is contained in:
brooktewabe 2026-03-01 14:22:33 +03:00
parent 2c96be08bf
commit 5587dff57c
7 changed files with 304 additions and 25 deletions

21
app/event/[id]/page.tsx Normal file
View File

@ -0,0 +1,21 @@
import Link from "next/link"
import { getEventById } from "@/lib/mock-data"
import { MatchDetailView } from "@/components/betting/match-detail-view"
export default async function EventPage({ params }: { params: Promise<{ id: string }> }) {
const { id } = await params
const event = getEventById(id)
if (!event) {
return (
<div className="flex flex-col items-center justify-center min-h-[40vh] gap-4">
<p className="text-white/80">Match not found.</p>
<Link href="/" className="text-brand-primary font-bold hover:underline">
Back to home
</Link>
</div>
)
}
return <MatchDetailView event={event} />
}

View File

@ -57,41 +57,39 @@
:root {
--radius: 0rem;
/* Brand Colors (Black, Yellow, White theme) */
--brand-primary: #ff9800;
--brand-primary-hover: #e68900;
--brand-secondary: #ff9800;
/* Usually same as primary for now */
--brand-bg: #121212;
--brand-surface: #1a1a1a;
--brand-surface-light: #2a2a2a;
--brand-accent: #852222;
/* Maroon */
--brand-live: #ff3b3b;
/* Brand Colors (White and Green theme) - dark grey, not near-black */
--brand-primary: #22c55e;
--brand-primary-hover: #16a34a;
--brand-secondary: #22c55e;
--brand-bg: #252525;
--brand-surface: #2d2d2d;
--brand-surface-light: #353535;
--brand-accent: #15803d;
--brand-live: #22c55e;
/* Shadcn default mappings */
--background: var(--brand-bg);
--foreground: #ffffff;
--card: #1e1e1e;
--card: #2a2a2a;
--card-foreground: #ffffff;
--popover: #1e1e1e;
--popover: #2a2a2a;
--popover-foreground: #ffffff;
--primary: var(--brand-primary);
--primary-foreground: #ffffff;
--secondary: #222222;
--secondary: #2d2d2d;
--secondary-foreground: #a0a0a0;
--muted: #1a1a1a;
--muted: #252525;
--muted-foreground: #808080;
--accent: var(--brand-primary);
--accent-foreground: #121212;
--destructive: #ef4444;
--border: #2a2a2a;
--input: #222222;
--border: #353535;
--input: #2d2d2d;
--ring: var(--brand-primary);
}
.dark {
--background: oklch(0.13 0.008 250);
--background: oklch(0.17 0.01 250);
--foreground: oklch(0.93 0.005 250);
--card: oklch(0.17 0.01 250);
--card-foreground: oklch(0.93 0.005 250);

View File

@ -42,13 +42,13 @@ export default function LoginPage() {
))}
</div>
{/* HARIF box */}
<div className="bg-[#852222] px-3 py-1 -skew-x-12 flex items-center h-[38px]">
<div className="bg-brand-accent px-3 py-1 -skew-x-12 flex items-center h-[38px]">
<span className="text-2xl font-black text-white italic tracking-tighter skew-x-12 inline-block leading-none">
HARIF
</span>
</div>
{/* SPORT text */}
<span className="text-2xl font-black text-[#ff9800] italic tracking-tighter ml-1 leading-none">
<span className="text-2xl font-black text-brand-primary italic tracking-tighter ml-1 leading-none">
SPORT
</span>
</div>
@ -76,7 +76,7 @@ export default function LoginPage() {
type="tel"
value={phone}
onChange={(e) => setPhone(e.target.value)}
className="flex-1 bg-white border border-gray-300 px-3 py-2 text-sm text-[#333] placeholder:text-gray-400 focus:outline-none focus:border-[#ff9800]"
className="flex-1 bg-white border border-gray-300 px-3 py-2 text-sm text-[#333] placeholder:text-gray-400 focus:outline-none focus:border-brand-primary"
/>
</div>
</div>
@ -91,7 +91,7 @@ export default function LoginPage() {
value={password}
onChange={(e) => setPassword(e.target.value)}
placeholder="Password"
className="w-full bg-white border border-gray-300 px-3 py-2 text-sm text-[#333] placeholder:text-gray-400 focus:outline-none focus:border-[#ff9800]"
className="w-full bg-white border border-gray-300 px-3 py-2 text-sm text-[#333] placeholder:text-gray-400 focus:outline-none focus:border-brand-primary"
/>
</div>
@ -99,7 +99,7 @@ export default function LoginPage() {
<div className="text-right">
<Link
href="/reset-password"
className="text-[11px] text-white/50 hover:text-[#ff9800] transition-colors"
className="text-[11px] text-white/50 hover:text-brand-primary transition-colors"
>
Forgot password?
</Link>
@ -120,7 +120,7 @@ export default function LoginPage() {
{/* Register link */}
<p className="text-center text-[11px] text-white/50">
Don&apos;t have an account?{" "}
<Link href="/register" className="text-[#ff9800] hover:underline font-semibold">
<Link href="/register" className="text-brand-primary hover:underline font-semibold">
Register
</Link>
</p>

View File

@ -1,6 +1,11 @@
import { Suspense } from "react"
import { SportHome } from "@/components/betting/sport-home"
export default function Home() {
return <SportHome />
return (
<Suspense fallback={<div>Loading...</div>}>
<SportHome />
</Suspense>
)
}

View File

@ -220,6 +220,31 @@ export const mockEvents: Event[] = [
],
totalMarkets: 110,
},
{
id: "01890",
sport: "Soccer",
sportIcon: "⚽",
league: "Premier League",
country: "England",
homeTeam: "Burnley",
awayTeam: "Brentford",
time: "05:00",
date: "Feb 28, 26",
isLive: false,
markets: [
{ id: "1", label: "1", odds: 4.58 },
{ id: "x", label: "x", odds: 4.00 },
{ id: "2", label: "2", odds: 1.78 },
{ id: "o25", label: "Over (2.5)", odds: 1.80 },
{ id: "u25", label: "Under (2.5)", odds: 2.05 },
{ id: "1x", label: "1X", odds: 2.10 },
{ id: "12", label: "12", odds: 1.25 },
{ id: "x2", label: "X2", odds: 1.20 },
{ id: "yes", label: "Yes", odds: 1.71 },
{ id: "no", label: "No", odds: 2.15 },
],
totalMarkets: 112,
},
{
id: "01124",
sport: "Soccer",
@ -247,6 +272,125 @@ export const mockEvents: Event[] = [
},
];
export function getEventById(id: string): Event | undefined {
return mockEvents.find((e) => e.id === id)
}
export type DetailMarketOutcome = { label: string; odds: number }
export type DetailMarketSection = {
id: string
title: string
outcomes: DetailMarketOutcome[]
}
export function getEventDetailMarkets(eventId: string): DetailMarketSection[] {
const event = getEventById(eventId)
if (!event) return []
return [
{
id: "1x2",
title: "1x2",
outcomes: [
{ label: "Home", odds: 4.58 },
{ label: "Draw", odds: 4.0 },
{ label: "Away", odds: 1.78 },
],
},
{
id: "total",
title: "Total",
outcomes: [
{ label: "Over (2.5)", odds: 1.8 },
{ label: "Under (2.5)", odds: 2.05 },
],
},
{
id: "draw-no-bet",
title: "Draw No Bet",
outcomes: [
{ label: "Home", odds: 3.25 },
{ label: "Away", odds: 1.35 },
],
},
{
id: "asian-handicap",
title: "Asian Handicap 0.5",
outcomes: [
{ label: "Home (+0.5)", odds: 2.1 },
{ label: "Away (-0.5)", odds: 1.76 },
],
},
{
id: "double-chance",
title: "Double Chance",
outcomes: [
{ label: "Home or Draw", odds: 1.96 },
{ label: "Home or Away", odds: 1.25 },
{ label: "Draw or Away", odds: 1.2 },
],
},
{
id: "btts",
title: "Both teams to score",
outcomes: [
{ label: "Yes", odds: 1.71 },
{ label: "No", odds: 2.15 },
],
},
{
id: "1st-half-1x2",
title: "1st Half - 1X2",
outcomes: [
{ label: "Home", odds: 4.8 },
{ label: "Draw", odds: 2.4 },
{ label: "Away", odds: 2.3 },
],
},
]
}
/** Cards/Bookings markets: left column and right column of sections */
export function getCardsBookingsMarkets(eventId: string): {
left: DetailMarketSection[]
right: DetailMarketSection[]
} {
getEventById(eventId) // ensure event exists
return {
left: [
{ id: "bookings-1x2", title: "Bookings 1X2", outcomes: [{ label: "Home", odds: 2.2 }, { label: "Draw", odds: 3.7 }, { label: "Away", odds: 2.5 }] },
{ id: "bookings-ou", title: "Bookings - Over/Under", outcomes: [] },
{ id: "sending-off", title: "Sending Off", outcomes: [{ label: "Yes", odds: 5.4 }, { label: "No", odds: 1.12 }] },
{ id: "1st-half-bookings-ou", title: "1st Half Bookings - Over/Under", outcomes: [] },
{ id: "1st-booking", title: "1st Booking", outcomes: [{ label: "Home", odds: 1.79 }, { label: "None", odds: 28.11 }, { label: "Away", odds: 1.9 }] },
{ id: "home-exact-bookings", title: "Home Exact Bookings", outcomes: [] },
{ id: "1st-half-bookings-1x2", title: "1st Half - Bookings 1X2", outcomes: [{ label: "Home", odds: 2.95 }, { label: "Draw", odds: 2.15 }, { label: "Away", odds: 3.2 }] },
{ id: "1st-half-away-exact", title: "1st Half - Away Exact Bookings", outcomes: [] },
{ id: "away-sending-off", title: "Away Sending Off", outcomes: [] },
{ id: "1st-half-home-sending", title: "1st Half - Home Sending Off", outcomes: [] },
],
right: [
{
id: "booking-points-ou",
title: "Booking Points-Over/Under",
outcomes: [
{ label: "Over 35.5", odds: 1.85 }, { label: "Under 35.5", odds: 1.85 },
{ label: "Over 45.5", odds: 2.85 }, { label: "Under 45.5", odds: 1.38 },
{ label: "Over 55.5", odds: 4.6 }, { label: "Under 55.5", odds: 1.16 },
{ label: "Over 15.5", odds: 1.1 }, { label: "Under 15.5", odds: 5.8 },
{ label: "Over 25.5", odds: 1.35 }, { label: "Under 25.5", odds: 2.95 },
],
},
{ id: "exact-bookings", title: "Exact Bookings", outcomes: [] },
{ id: "1st-half-total-points", title: "1st Half - Total Booking Points", outcomes: [] },
{ id: "1st-half-exact-bookings", title: "1st Half - Exact Bookings", outcomes: [] },
{ id: "1st-half-1st-booking", title: "1st Half - 1st Booking", outcomes: [{ label: "Home", odds: 2.5 }, { label: "None", odds: 2.95 }, { label: "Away", odds: 2.65 }] },
{ id: "away-exact-bookings", title: "Away Exact Bookings", outcomes: [] },
{ id: "1st-half-home-exact", title: "1st Half - Home Exact Bookings", outcomes: [] },
{ id: "home-sending-off", title: "Home Sending Off", outcomes: [] },
],
}
}
export const popularLeagues = [
{ id: "ucl", name: "UEFA Champions League", logo: "https://upload.wikimedia.org/wikipedia/en/thumb/b/bf/UEFA_Champions_League_logo_2.svg/300px-UEFA_Champions_League_logo_2.svg.png" },
{ id: "uel", name: "UEFA Europa League", logo: "https://upload.wikimedia.org/wikipedia/en/thumb/0/0c/UEFA_Europa_League_logo_%282021%29.svg/300px-UEFA_Europa_League_logo_%282021%29.svg.png" },

BIN
public/aviator-bannsser.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

111
tenant.config.js Normal file
View File

@ -0,0 +1,111 @@
module.exports = {
tenant: "fortunebets",
tenant_name: "FortuneBets",
tenant_email: "customer@fortunebets.net",
tenant_phone_number: "",
tenant_location: "Around Lem Hotel , Addis Ababa Ethiopia",
tenant_map_link: "https://maps.app.goo.gl/zvhxt8sh7JbsVpbc8",
tenant_telegram_link: "https://t.me/fortunebetts",
tenant_facebook_link: "https://www.facebook.com/profile.php?id=61565869044955",
tenant_bot_link: "",
app_title: "FortuneBets",
theme_color: "#ffffff",
robots_sitemap: "https://fortunebets.net/sitemap.xml",
root_url: "https://fortunebets.net",
tile_color: "#00a300",
theme: "/tenant/fortunebets/theme.json",
logo: "/tenant/fortunebets/Logo.webp",
favicon: "/tenant/fortunebets/favicon.ico",
favicon96: "/tenant/fortunebets/favicon-96x96.png",
favicon_svg: "/tenant/fortunebets/favicon.svg",
apple_touch_icon: "/tenant/fortunebets/apple-touch-icon.png",
logo_small: "/tenant/fortunebets/logo-small.webp",
logo_white: "/tenant/fortunebets/logo-white.webp",
site_manifest: "/tenant/fortunebets/site.webmanifest",
slider_1: "/tenant/fortunebets/fortunebet-image-1.webp",
slider_2: "/tenant/fortunebets/fortunebet-image-2.webp",
slider_3: "/tenant/fortunebets/fortunebet-image-3.webp",
home_page_canonical: "https://fortunebets.net",
homepage_title:
"FortuneBets - Premier Ethiopia Online Casino and Sports Betting",
homepage_desc:
"Discover Ethiopia's premier betting destination. Premier League, Champions League, MMA, Dog and Horse Racing and Virtual Games Betting!",
homepage_keywords:
"Casino, Sports Betting, Ethiopia, MMA, Keno, Spin to Win, Fire Crash, Aviator, Football, GoldenRace, Premier League, Champions League, Chapa, Telebirr, CBEBirr, Betika, Betking, QwickBirr, Anbessabet, Vamos bet, Habeshabet, Hulusport, ZuraPlay",
homepage_openGraph: {
images: [
"https://fortunebets.net/Logo.webp",
"https://demo.fortunebets.net/Logo.webp",
],
},
jsonD: {
"@context": "https://schema.org",
"@type": "Organization",
name: "Fortunebets",
image: "https://fortunebets.net/Logo.webp",
"@id": "",
url: "https://fortunebets.net",
telephone: "",
address: {
"@type": "PostalAddress",
streetAddress: "Lem Hotel, Megenagna",
addressLocality: "Addis Ababa",
postalCode: "",
addressCountry: "ET",
},
geo: {
"@type": "GeoCoordinates",
latitude: 9.018046093660232,
longitude: 38.79564644773323,
},
sameAs: ["https://www.facebook.com/profile.php?id=61565869044955"],
},
deposit_title: "Deposit - FortuneBets",
deposit_description:
"Deposit cash into your FortuneBets Account so that you can start playing games for cash",
deposit_keyword:
"withdraw, Birr, Chapa, CBEBirr, TeleBirr, Deposit, FortuneBets, Ethiopia, Sports Betting",
deposit_alt_canonical: "https://fortunebets.net/deposit",
games_title: "FortuneBetss - Ethiopia Online Casino and Sports Betting",
games_desc:
"FortuneBetss is Ethiopia's premier betting destination. Win cash prizes by playing Number-Games like Spin To Win, roulette, online slots and Keno, as well as adrenaline-pumping Crash-Games including Fire Crash, Bank Run, and Meteoroid. You can preview or play the game. Join now and win your fortune!",
games_keywords:
"FortuneBetss, Casino, Sports Betting, Ethiopia, Addis Ababa, Hawassa, Fire Crash, Bank Run, Meteoroid, Keno, MMA, Spin to Win , Aviator , Virtual Football,Football, GoldenRace, Champions League, QwickBirr, Anbessabet, Vamos bet, Vamosbet, Habeshabet, Hulusport, ZuraPlay",
games_openGraph: {
images: ["https://fortunebets.net/Logo.webp"],
},
games_alt_canonical: "https://fortunebets.net/games",
login_title: "Login - FortuneBets",
login_desc:
"Login to FortuneBets Account so that you can start playing games for cash",
login_keywords:
"Sign Up, Register, Reset Password, Login, FortuneBets, Ethiopia, Sports Betting",
login_alt_canonical: "https://fortunebets.net/login",
register_title: "Register - FortuneBets",
register_desc:
"Create a new FortuneBets Account so that you can start playing games for cash",
register_keywords:
"Sign Up, Register, Reset Password, Login, FortuneBets, Ethiopia, Sports Betting",
register_alt_canonical: "https://fortunebets.net/register",
reset_title: "Reset Password - FortuneBets",
reset_desc:
"Did you forget your FortuneBets Password? Send a code to your account to create a new password",
reset_keywords:
"Sign Up, Register, Reset Password, Login, FortuneBets, Ethiopia, Sports Betting",
reset_alt_canonical: "https://fortunebets.net/reset-password",
rules_title: "Rules - FortuneBets",
rules_desc:
"Terms and Conditions, Responsible Gambling, FortuneBets is committed to providing a safe and responsible platform where Players can use the Services",
rules_keywords:
"FortuneBets, Ethiopia, Sports Betting, Terms and Conditions, Responsible Gambling, Account Suspension,",
rules_alt_canonical: "https://fortunebets.net/rules",
virtual_sports_title: "Virtual Sports - FortuneBets",
virtual_sports_desc:
"Win Cash Prizes by betting on FortuneBets Virtual Sports! Football tournaments like Premier League, Bundesliga, La Liga, Ligue 1, Series A, Champions League, World Cup. Mixed Martial Arts Betting. Racing sports like Motorcycle, Horse, Dog, Speedway Racing.",
virtual_sports_keywords:
"Virtual Sports Betting, Football Betting, QwickBirr Premier League, Bundesliga, La Liga, Ligue 1, Serie A, Champions League, World Cup, MMA, Motoracing, Horse Racing, Dog Racing, Basketball, Speedway Racing, Betika",
virtual_sports_alt_canonical: "https://fortunebets.net/virtual",
};