chore: initiate the website file

This commit is contained in:
RiO
2024-12-27 06:16:26 +05:30
commit 2d9c1ea88f
30 changed files with 7255 additions and 0 deletions

28
src/hooks/usePackages.ts Normal file
View File

@@ -0,0 +1,28 @@
import { useState, useEffect } from 'react';
import { Package } from '../types';
import { fetchPackages } from '../services/api';
export function usePackages() {
const [packages, setPackages] = useState<Package[]>([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
const loadPackages = async () => {
try {
const data = await fetchPackages();
setPackages(data);
setError(null);
} catch (err) {
setError('Failed to load packages. Please try again later.');
console.error('Failed to fetch packages:', err);
} finally {
setLoading(false);
}
};
loadPackages();
}, []);
return { packages, loading, error };
}

24
src/hooks/useTheme.ts Normal file
View File

@@ -0,0 +1,24 @@
import { useState, useEffect } from 'react';
type Theme = 'light' | 'dark';
export function useTheme() {
const [theme, setTheme] = useState<Theme>(() => {
const savedTheme = localStorage.getItem('theme');
if (savedTheme === 'dark' || savedTheme === 'light') return savedTheme;
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
});
useEffect(() => {
const root = window.document.documentElement;
root.classList.remove('light', 'dark');
root.classList.add(theme);
localStorage.setItem('theme', theme);
}, [theme]);
const toggleTheme = () => {
setTheme(prev => prev === 'light' ? 'dark' : 'light');
};
return { theme, toggleTheme };
}