import React, { useMemo, useState } from "react"; const TRAINS = [ { code: "701", name: "Subarna Express", route: "Chattogram - Dhaka", type: "Intercity" }, { code: "703", name: "Mohanagar Godhuli", route: "Chattogram - Dhaka", type: "Intercity" }, { code: "704", name: "Mohanagar Provati", route: "Dhaka - Chattogram", type: "Intercity" }, { code: "705", name: "Ekota Express", route: "Dhaka - Panchagarh", type: "Intercity" }, { code: "707", name: "Tista Express", route: "Dhaka - Dewanganj", type: "Intercity" }, { code: "709", name: "Parabat Express", route: "Dhaka - Sylhet", type: "Intercity" }, { code: "711", name: "Upakul Express", route: "Noakhali - Dhaka", type: "Intercity" }, { code: "713", name: "Korotoa Express", route: "Santahar - Burimari", type: "Intercity" }, { code: "715", name: "Kopotaksh Express", route: "Khulna - Rajshahi", type: "Intercity" }, { code: "717", name: "Joyontika Express", route: "Dhaka - Sylhet", type: "Intercity" }, { code: "719", name: "Paharika Express", route: "Chattogram - Sylhet", type: "Intercity" }, { code: "721", name: "Mahanagar Express", route: "Chattogram - Dhaka", type: "Intercity" }, { code: "723", name: "Udayan Express", route: "Chattogram - Sylhet", type: "Intercity" }, { code: "725", name: "Sundarban Express", route: "Khulna - Dhaka", type: "Intercity" }, { code: "727", name: "Rupsa Express", route: "Khulna - Chilahati", type: "Intercity" }, { code: "729", name: "Meghna Express", route: "Chattogram - Chandpur", type: "Intercity" }, { code: "731", name: "Barind Express", route: "Rajshahi - Chilahati", type: "Intercity" }, { code: "733", name: "Titumir Express", route: "Rajshahi - Chilahati", type: "Intercity" }, { code: "735", name: "Agnibeena Express", route: "Dhaka - Tarakandi", type: "Intercity" }, { code: "737", name: "Egarosindur Provati", route: "Dhaka - Kishoreganj", type: "Intercity" }, { code: "739", name: "Upaban Express", route: "Dhaka - Sylhet", type: "Intercity" }, { code: "741", name: "Turna Express", route: "Chattogram - Dhaka", type: "Intercity" }, { code: "743", name: "Brahmaputra Express", route: "Dhaka - Dewanganj", type: "Intercity" }, { code: "745", name: "Jamuna Express", route: "Dhaka - Tarakandi", type: "Intercity" }, { code: "747", name: "Simanta Express", route: "Khulna - Chilahati", type: "Intercity" }, { code: "749", name: "Egarosindur Godhuli", route: "Dhaka - Kishoreganj", type: "Intercity" }, { code: "751", name: "Lalmoni Express", route: "Dhaka - Lalmonirhat", type: "Intercity" }, { code: "753", name: "Silk City Express", route: "Dhaka - Rajshahi", type: "Intercity" }, { code: "755", name: "Madhumati Express", route: "Dhaka - Rajshahi", type: "Intercity" }, { code: "757", name: "Drutajan Express", route: "Dhaka - Panchagarh", type: "Intercity" }, { code: "759", name: "Padma Express", route: "Dhaka - Rajshahi", type: "Intercity" }, { code: "761", name: "Sagardari Express", route: "Khulna - Rajshahi", type: "Intercity" }, { code: "763", name: "Chitra Express", route: "Khulna - Dhaka", type: "Intercity" }, { code: "765", name: "Nilsagar Express", route: "Dhaka - Chilahati", type: "Intercity" }, { code: "767", name: "Dolonchapa Express", route: "Santahar - Panchagarh", type: "Intercity" }, { code: "769", name: "Dhumketu Express", route: "Dhaka - Rajshahi", type: "Intercity" }, { code: "771", name: "Rangpur Express", route: "Dhaka - Rangpur", type: "Intercity" }, { code: "773", name: "Kalni Express", route: "Dhaka - Sylhet", type: "Intercity" }, { code: "775", name: "Sirajganj Express", route: "Sirajganj Bazar - Dhaka", type: "Intercity" }, { code: "777", name: "Haor Express", route: "Dhaka - Mohonganj", type: "Intercity" }, { code: "779", name: "Dhalarchar Express", route: "Dhalarchar - Rajshahi", type: "Intercity" }, { code: "781", name: "Kishoreganj Express", route: "Dhaka - Kishoreganj", type: "Intercity" }, { code: "783", name: "Tungipara Express", route: "Gobra - Rajshahi", type: "Intercity" }, { code: "785", name: "Bijoy Express", route: "Chattogram - Jamalpur", type: "Intercity" }, { code: "787", name: "Sonar Bangla Express", route: "Chattogram - Dhaka", type: "Intercity" }, { code: "789", name: "Mohanagar Express", route: "Dhaka - Mohonganj", type: "Intercity" }, { code: "791", name: "Banlata Express", route: "Dhaka - Chapainawabganj", type: "Intercity" }, { code: "793", name: "Panchagarh Express", route: "Dhaka - Panchagarh", type: "Intercity" }, { code: "795", name: "Benapole Express", route: "Benapole - Dhaka", type: "Intercity" }, { code: "797", name: "Kurigram Express", route: "Dhaka - Kurigram", type: "Intercity" }, { code: "799", name: "Jamalpur Express", route: "Dhaka - Bhuyapur", type: "Intercity" }, { code: "801", name: "Chattala Express", route: "Chattogram - Dhaka", type: "Intercity" }, { code: "803", name: "Banglabandha Express", route: "Rajshahi - Panchagarh", type: "Intercity" }, { code: "805", name: "Chilahati Express", route: "Dhaka - Chilahati", type: "Intercity" }, { code: "809", name: "Burimari Express", route: "Dhaka - Burimari", type: "Intercity" }, { code: "813", name: "Coxs Bazar Express", route: "Coxs Bazar - Dhaka", type: "Intercity" }, { code: "815", name: "Paryatak Express", route: "Coxs Bazar - Dhaka", type: "Intercity" }, { code: "817", name: "Subarnachar Express", route: "Noakhali - Dhaka", type: "Intercity" }, { code: "819", name: "Tanguar Express", route: "Dhaka - Sylhet", type: "Intercity" }, { code: "821", name: "Shoikat Express", route: "Chattogram - Coxs Bazar", type: "Intercity" }, { code: "822", name: "Probal Express", route: "Coxs Bazar - Chattogram", type: "Intercity" }, { code: "827", name: "Rupashi Bangla Express", route: "Benapole - Dhaka", type: "Intercity" }, ]; const Icon = ({ name, size = 20, className = "" }) => { const common = { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", className, "aria-hidden": "true", }; const paths = { search: ( <> ), pin: ( <> ), train: ( <> ), clock: ( <> ), refresh: ( <> ), wifi: ( <> ), alert: ( <> ), }; return {paths[name]}; }; function filterTrains(trains, searchText) { const normalizedSearch = searchText.trim().toLowerCase(); if (!normalizedSearch) { return trains; } return trains.filter((train) => { const value = `${train.code} ${train.name} ${train.route} ${train.type}`.toLowerCase(); return value.includes(normalizedSearch); }); } function makeMockLocation(train, now = new Date()) { const locations = [ "Near Tongi", "Crossing Akhaura", "Departed Feni", "Near Ishwardi", "Reached Bhairab Bazar", "Between Joydebpur and Tangail", ]; const nextStations = ["Kamalapur", "Airport", "Akhaura", "Rajshahi", "Chattogram", "Sylhet"]; const trainCodeNumber = Number(train.code) || 0; const index = trainCodeNumber % locations.length; return { currentLocation: locations[index], nextStation: nextStations[index], delay: `${(trainCodeNumber % 17) + 3} min`, speed: `${55 + (trainCodeNumber % 35)} km/h`, lastUpdated: now.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", }), status: "Running", }; } function getMockLiveLocation(train) { return new Promise((resolve) => { window.setTimeout(() => { resolve(makeMockLocation(train)); }, 700); }); } async function fetchLiveLocation(train) { // Real backend ready code: // const response = await fetch(`/api/train-location?train=${encodeURIComponent(train.code)}`); // if (!response.ok) throw new Error("Could not fetch train location"); // return response.json(); return getMockLiveLocation(train); } function runSelfTests() { if (typeof console === "undefined") return; console.assert(Array.isArray(TRAINS), "TRAINS should be an array"); console.assert(TRAINS.length > 0, "TRAINS should not be empty"); console.assert(filterTrains(TRAINS, "701").some((train) => train.code === "701"), "Search by train code should work"); console.assert(filterTrains(TRAINS, "Subarna").some((train) => train.name === "Subarna Express"), "Search by train name should work"); console.assert(filterTrains(TRAINS, "dhaka").length > 0, "Search by route should work"); const mock = makeMockLocation({ code: "701" }, new Date("2026-01-01T10:30:00")); console.assert(Boolean(mock.currentLocation), "Mock location should include currentLocation"); console.assert(Boolean(mock.nextStation), "Mock location should include nextStation"); console.assert(mock.status === "Running", "Mock status should be Running"); } runSelfTests(); export default function BDTrainLiveTracker() { const [query, setQuery] = useState(""); const [selectedTrain, setSelectedTrain] = useState(null); const [isOpen, setIsOpen] = useState(false); const [location, setLocation] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const filteredTrains = useMemo(() => filterTrains(TRAINS, query), [query]); const handleSelect = async (train) => { setSelectedTrain(train); setQuery(`${train.code} - ${train.name}`); setIsOpen(false); setLoading(true); setLocation(null); setError(""); try { const data = await fetchLiveLocation(train); setLocation(data); } catch (err) { setError("Live location load kora jayni. Please abar try korun."); } finally { setLoading(false); } }; const handleRefresh = () => { if (selectedTrain && !loading) { handleSelect(selectedTrain); } }; return (
Bangladesh Railway Live Tracker

BD Train Live Location

Train name or code diye search korun. Dropdown theke select korlei page reload chara live location dekhabe.

Total trains

{TRAINS.length}

{ setQuery(event.target.value); setIsOpen(true); }} onFocus={() => setIsOpen(true)} placeholder="Example: 701, Subarna, Dhaka..." className="w-full rounded-2xl border border-slate-200 bg-slate-50 py-4 pl-12 pr-4 text-base outline-none transition focus:border-slate-400 focus:bg-white" /> {isOpen && (
{filteredTrains.length === 0 ? (
No train found
) : ( filteredTrains.map((train) => ( )) )}
)}

Train list preview

{TRAINS.slice(0, 20).map((train) => ( ))}

Dropdown e full list searchable ache. Ei preview section optional.

{!selectedTrain && !loading && !error && (

Select a train

Train select korle ekhanei live location show korbe.

)} {loading && (

Fetching live location...

Backend API theke latest data ashtese.

)} {error && !loading && (

Something went wrong

{error}

)} {selectedTrain && location && !loading && !error && (

Selected train

{selectedTrain.code} - {selectedTrain.name}

{selectedTrain.route}

Current location

{location.currentLocation}

Next station

{location.nextStation}

Delay

{location.delay}

Speed

{location.speed}

Status

{location.status}

Last updated: {location.lastUpdated}
)}
); }