Back to Documentation
Tutorial30 minutes
Building a Real-Time Dashboard
Learn how to create a live data dashboard using Munashe Tech API and WebSocket connections
Prerequisites
- Node.js 18+ and npm/yarn installed
- Basic knowledge of React and Next.js
- A Munashe Tech account with API access
- Familiarity with TypeScript (recommended)
Step-by-Step Guide
1
Set Up Your Project
5 min
- Create a new Next.js project with TypeScript
- Install required dependencies
- Set up your Munashe Tech API credentials
Code
# Create new Next.js project
npx create-next-app@latest dashboard-app --typescript
# Install dependencies
cd dashboard-app
npm install @munashetech/sdk socket.io-client recharts
# Create .env.local file
echo "NEXT_PUBLIC_MT_API_KEY=your_api_key_here" > .env.local2
Initialize the SDK
3 min
- Create a lib directory for SDK configuration
- Initialize the Munashe Tech SDK with your API key
- Set up WebSocket connection for real-time updates
Code
// lib/munashetech.ts
import { MunasheTech } from '@munashetech/sdk';
export const mtClient = new MunasheTech({
apiKey: process.env.NEXT_PUBLIC_MT_API_KEY!,
environment: 'production',
enableRealtime: true
});
// Configure WebSocket for real-time data
export const realtimeConnection = mtClient.realtime.connect({
autoReconnect: true,
heartbeatInterval: 30000
});3
Create Dashboard Layout
8 min
- Build a responsive dashboard layout
- Add navigation sidebar
- Create placeholder cards for metrics
Code
// app/dashboard/page.tsx
import { DashboardMetrics } from '@/components/dashboard/metrics';
import { RealtimeChart } from '@/components/dashboard/chart';
export default function Dashboard() {
return (
<div className="min-h-screen bg-background">
<nav className="border-b">
<div className="container mx-auto px-4 py-4">
<h1 className="text-2xl font-bold">Real-Time Dashboard</h1>
</div>
</nav>
<main className="container mx-auto px-4 py-8">
<div className="grid gap-6 md:grid-cols-3 mb-8">
<DashboardMetrics />
</div>
<div className="grid gap-6 md:grid-cols-2">
<RealtimeChart />
</div>
</main>
</div>
);
}4
Fetch Real-Time Data
7 min
- Set up React hooks for data fetching
- Subscribe to real-time data streams
- Handle connection states and errors
Code
// hooks/useRealtimeData.ts
import { useState, useEffect } from 'react';
import { realtimeConnection } from '@/lib/munashetech';
export function useRealtimeData() {
const [data, setData] = useState([]);
const [isConnected, setIsConnected] = useState(false);
useEffect(() => {
// Subscribe to data stream
const subscription = realtimeConnection.subscribe('metrics', {
onData: (newData) => {
setData(prev => [...prev, newData].slice(-50));
},
onConnect: () => setIsConnected(true),
onDisconnect: () => setIsConnected(false),
onError: (error) => console.error('Stream error:', error)
});
return () => subscription.unsubscribe();
}, []);
return { data, isConnected };
}5
Build Metric Cards
5 min
- Create reusable metric card components
- Display real-time statistics
- Add loading and error states
Code
// components/dashboard/metrics.tsx
'use client';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { useRealtimeData } from '@/hooks/useRealtimeData';
import { TrendingUp, Users, Activity } from 'lucide-react';
export function DashboardMetrics() {
const { data, isConnected } = useRealtimeData();
const metrics = [
{
title: 'Active Users',
value: data.length > 0 ? data[data.length - 1].users : 0,
icon: Users,
trend: '+12.5%'
},
{
title: 'Requests/sec',
value: data.length > 0 ? data[data.length - 1].rps : 0,
icon: Activity,
trend: '+8.2%'
},
{
title: 'Uptime',
value: '99.9%',
icon: TrendingUp,
trend: 'Stable'
}
];
return (
<>
{metrics.map((metric, i) => (
<Card key={i}>
<CardHeader className="flex flex-row items-center justify-between pb-2">
<CardTitle className="text-sm font-medium">
{metric.title}
</CardTitle>
<metric.icon className="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{metric.value}</div>
<p className="text-xs text-muted-foreground">{metric.trend}</p>
</CardContent>
</Card>
))}
</>
);
}6
Add Real-Time Charts
7 min
- Integrate Recharts library
- Create live updating line charts
- Implement smooth animations
Code
// components/dashboard/chart.tsx
'use client';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { useRealtimeData } from '@/hooks/useRealtimeData';
import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts';
export function RealtimeChart() {
const { data, isConnected } = useRealtimeData();
return (
<Card className="col-span-2">
<CardHeader>
<CardTitle className="flex items-center gap-2">
Live Metrics
{isConnected && (
<span className="flex h-2 w-2 rounded-full bg-green-500">
<span className="animate-ping absolute h-2 w-2 rounded-full bg-green-400 opacity-75" />
</span>
)}
</CardTitle>
</CardHeader>
<CardContent>
<ResponsiveContainer width="100%" height={350}>
<LineChart data={data}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="timestamp" />
<YAxis />
<Tooltip />
<Line
type="monotone"
dataKey="value"
stroke="hsl(var(--primary))"
strokeWidth={2}
dot={false}
isAnimationActive={true}
/>
</LineChart>
</ResponsiveContainer>
</CardContent>
</Card>
);
}Testing Your Dashboard
Now that you've built your dashboard, let's test it:
- 1.Start your development server:
npm run dev - 2.Navigate to
http://localhost:3000/dashboard - 3.Verify the WebSocket connection indicator shows green (connected)
- 4.Watch as metrics update in real-time every few seconds
- 5.Open browser DevTools to monitor WebSocket messages
Troubleshooting Tips
- • Ensure your API key is valid and has real-time access enabled
- • Check browser console for WebSocket connection errors
- • Verify network requests in DevTools Network tab
- • Make sure you're not behind a firewall blocking WebSocket connections
Next Steps
Enhance Your Dashboard
Add filters, date ranges, and export functionality
Add Authentication
Secure your dashboard with user authentication