Skip to main content

Development Guide

Development workflow, best practices, and common tasks for ZÈYA Admin Panel.

Development Workflow

1. Start Development Server

npm run dev

The dashboard will be available at http://localhost:3000

2. Make Changes

  • Edit files in pages/, components/, sub-components/
  • Changes hot-reload automatically
  • Check browser console for errors

3. Test Changes

  • Test in browser
  • Check console for errors
  • Verify API integration
  • Test responsive design

Code Quality

ESLint

# Run linting
npm run lint

# Fix auto-fixable issues
npm run lint -- --fix

Code Formatting

Follow project style guide:

  • 2 spaces for indentation
  • Single quotes for strings
  • Semicolons
  • Trailing commas

Common Development Tasks

Creating a New Page

  1. Create file in pages/
// pages/new-page.js
import DefaultDashboardLayout from 'layouts/DefaultDashboardLayout';

export default function NewPage() {
return (
<DefaultDashboardLayout>
<div>New Page Content</div>
</DefaultDashboardLayout>
);
}
  1. Access at /new-page

Creating a New Component

  1. Create component file
// components/NewComponent.js
export default function NewComponent({ title }) {
return (
<div>
<h1>{title}</h1>
</div>
);
}
  1. Use in pages
import NewComponent from '../components/NewComponent';

<NewComponent title="Hello" />

Making API Calls

import axios from 'axios';
import Cookies from 'js-cookie';

const fetchData = async () => {
try {
const token = Cookies.get('auth_token');
const response = await axios.get(`${process.env.NEXT_PUBLIC_API_URL}/endpoint`, {
headers: {
Authorization: `Bearer ${token}`,
},
});
return response.data;
} catch (error) {
console.error('API Error:', error);
throw error;
}
};

Using Data Caching

import useCachedData from '../hooks/useCachedData';

function MyComponent() {
const { data, loading, error } = useCachedData(
'cache-key',
async () => {
const response = await fetchData();
return response;
},
{ ttl: 60000 } // Cache for 60 seconds
);

if (loading) return <div>Loading...</div>;
if (error) return <div>Error: {error.message}</div>;

return <div>{JSON.stringify(data)}</div>;
}

Creating Protected Pages

import withAuth from '../utils/withAuth';
import DefaultDashboardLayout from 'layouts/DefaultDashboardLayout';

function ProtectedPage() {
return (
<DefaultDashboardLayout>
<div>Protected Content</div>
</DefaultDashboardLayout>
);
}

export default withAuth(ProtectedPage);

Using Charts

ApexCharts:

import dynamic from 'next/dynamic';
const Chart = dynamic(() => import('react-apexcharts'), { ssr: false });

function MyChart() {
const options = {
chart: { type: 'bar' },
series: [{ data: [1, 2, 3] }],
};

return <Chart options={options} series={options.series} type="bar" />;
}

Recharts:

import { BarChart, Bar, XAxis, YAxis } from 'recharts';

function MyChart() {
const data = [{ name: 'A', value: 1 }];

return (
<BarChart data={data}>
<XAxis dataKey="name" />
<YAxis />
<Bar dataKey="value" />
</BarChart>
);
}

Debugging

Browser DevTools

  • React DevTools: Inspect React components
  • Console: View logs and errors
  • Network: Monitor API calls
  • Application: View cookies and storage

Console Logging

console.log('Debug message');
console.warn('Warning message');
console.error('Error message');

API Debugging

// Log API requests
axios.interceptors.request.use(request => {
console.log('Request:', request);
return request;
});

// Log API responses
axios.interceptors.response.use(response => {
console.log('Response:', response);
return response;
});

Testing

Manual Testing Checklist

  • Test on Chrome
  • Test on Firefox
  • Test on Safari
  • Test responsive design
  • Test authentication flows
  • Test API integration
  • Test form submissions
  • Test navigation

Browser Testing

  • Chrome (latest)
  • Firefox (latest)
  • Safari (latest)
  • Edge (latest)

Performance Optimization

Code Splitting

// Dynamic import for heavy components
import dynamic from 'next/dynamic';

const HeavyComponent = dynamic(() => import('../components/HeavyComponent'), {
loading: () => <div>Loading...</div>,
});

Image Optimization

import Image from 'next/image';

<Image
src="/images/example.jpg"
alt="Example"
width={500}
height={300}
loading="lazy"
/>

Data Caching

// Use caching hook to reduce API calls
const { data } = useCachedData('key', fetchFunction, { ttl: 60000 });

Common Issues & Solutions

Build Errors

# Clear Next.js cache
rm -rf .next

# Reinstall dependencies
rm -rf node_modules
npm install

API Errors

  • Verify API URL in .env.local
  • Check CORS settings
  • Verify authentication token
  • Check network tab in browser

Styling Issues

  • Check SCSS compilation
  • Verify Bootstrap classes
  • Check component styles
  • Inspect in browser DevTools

Git Workflow

Branch Naming

feature/feature-name
fix/bug-description
refactor/component-name

Commit Messages

feat: add new feature
fix: fix bug description
refactor: refactor component
docs: update documentation
style: code formatting
test: add tests

Before Committing

  • Code is linted
  • No console.logs left
  • Build succeeds
  • Tested in browser

Best Practices

1. Component Structure

// ✅ Good: Small, focused components
function UserCard({ user }) {
return <div>...</div>;
}

// ❌ Bad: Large, complex components
function UserCard({ user }) {
// 200+ lines of code
}

2. API Calls

// ✅ Good: Error handling
try {
const data = await fetchData();
} catch (error) {
console.error('Error:', error);
// Show user-friendly error
}

// ❌ Bad: No error handling
const data = await fetchData();

3. Authentication

// ✅ Good: Use withAuth HOC
export default withAuth(ProtectedPage);

// ❌ Bad: Manual auth checks everywhere
if (!token) {
router.push('/sign-in');
}

4. Data Caching

// ✅ Good: Use caching hook
const { data } = useCachedData('key', fetchFunction);

// ❌ Bad: Fetch on every render
useEffect(() => {
fetchData();
}, []);