This commit is contained in:
Iliyan Angelov
2025-11-24 08:18:18 +02:00
parent 366f28677a
commit 136f75a859
133 changed files with 14977 additions and 3350 deletions

View File

@@ -98,8 +98,8 @@ export const caseStudyService = {
try {
const queryString = params ? buildQueryString(params) : '';
const url = queryString
? `${API_CONFIG.BASE_URL}/api/case-studies/case-studies/?${queryString}`
: `${API_CONFIG.BASE_URL}/api/case-studies/case-studies/`;
? `${API_CONFIG.BASE_URL}/api/case-studies/?${queryString}`
: `${API_CONFIG.BASE_URL}/api/case-studies/`;
const response = await fetch(url, {
method: 'GET',
@@ -123,7 +123,7 @@ export const caseStudyService = {
getCaseStudyBySlug: async (slug: string): Promise<CaseStudy> => {
try {
const response = await fetch(
`${API_CONFIG.BASE_URL}/api/case-studies/case-studies/${slug}/`,
`${API_CONFIG.BASE_URL}/api/case-studies/${slug}/`,
{
method: 'GET',
headers: {
@@ -147,7 +147,7 @@ export const caseStudyService = {
getFeaturedCaseStudies: async (): Promise<CaseStudy[]> => {
try {
const response = await fetch(
`${API_CONFIG.BASE_URL}/api/case-studies/case-studies/featured/`,
`${API_CONFIG.BASE_URL}/api/case-studies/featured/`,
{
method: 'GET',
headers: {
@@ -171,7 +171,7 @@ export const caseStudyService = {
getLatestCaseStudies: async (limit: number = 6): Promise<CaseStudy[]> => {
try {
const response = await fetch(
`${API_CONFIG.BASE_URL}/api/case-studies/case-studies/latest/?limit=${limit}`,
`${API_CONFIG.BASE_URL}/api/case-studies/latest/?limit=${limit}`,
{
method: 'GET',
headers: {
@@ -195,7 +195,7 @@ export const caseStudyService = {
getPopularCaseStudies: async (limit: number = 6): Promise<CaseStudy[]> => {
try {
const response = await fetch(
`${API_CONFIG.BASE_URL}/api/case-studies/case-studies/popular/?limit=${limit}`,
`${API_CONFIG.BASE_URL}/api/case-studies/popular/?limit=${limit}`,
{
method: 'GET',
headers: {
@@ -219,7 +219,7 @@ export const caseStudyService = {
getRelatedCaseStudies: async (slug: string): Promise<CaseStudy[]> => {
try {
const response = await fetch(
`${API_CONFIG.BASE_URL}/api/case-studies/case-studies/${slug}/related/`,
`${API_CONFIG.BASE_URL}/api/case-studies/${slug}/related/`,
{
method: 'GET',
headers: {

View File

@@ -0,0 +1,71 @@
import { API_BASE_URL } from '../config/api';
// Types for Home Banner data
export interface HomeBanner {
id: number;
icon: string;
badge: string;
heading: string;
highlight: string;
subheading: string;
description: string;
button_text: string;
button_url: string;
display_order: number;
is_active: boolean;
created_at: string;
updated_at: string;
}
class HomeServiceAPI {
private baseUrl = `${API_BASE_URL}/api/home`;
/**
* Get all home banners
*/
async getBanners(): Promise<HomeBanner[]> {
try {
const response = await fetch(`${this.baseUrl}/banner/`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return data.results || data;
} catch (error) {
throw error;
}
}
/**
* Get a specific home banner by ID
*/
async getBanner(id: number): Promise<HomeBanner> {
try {
const response = await fetch(`${this.baseUrl}/banner/${id}/`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
throw error;
}
}
}
export const homeService = new HomeServiceAPI();

View File

@@ -0,0 +1,43 @@
import { useState, useEffect } from 'react';
import { homeService, HomeBanner } from '../api/homeService';
export interface UseHomeBannersReturn {
data: HomeBanner[] | null;
loading: boolean;
error: string | null;
refetch: () => Promise<void>;
}
/**
* Hook to fetch home banners
*/
export const useHomeBanners = (): UseHomeBannersReturn => {
const [data, setData] = useState<HomeBanner[] | null>(null);
const [loading, setLoading] = useState<boolean>(true);
const [error, setError] = useState<string | null>(null);
const fetchData = async () => {
try {
setLoading(true);
setError(null);
const result = await homeService.getBanners();
setData(result);
} catch (err) {
setError(err instanceof Error ? err.message : 'An error occurred');
} finally {
setLoading(false);
}
};
useEffect(() => {
fetchData();
}, []);
return {
data,
loading,
error,
refetch: fetchData,
};
};