This commit is contained in:
Iliyan Angelov
2025-10-13 01:49:06 +03:00
parent 76c857b4f5
commit 5ad9cbe3a6
97 changed files with 5752 additions and 2376 deletions

View File

@@ -131,7 +131,6 @@ class AboutServiceAPI {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching about page data:', error);
throw error;
}
}
@@ -155,7 +154,6 @@ class AboutServiceAPI {
const data = await response.json();
return data.results || data;
} catch (error) {
console.error('Error fetching about banners:', error);
throw error;
}
}
@@ -179,7 +177,6 @@ class AboutServiceAPI {
const data = await response.json();
return data;
} catch (error) {
console.error(`Error fetching about banner ${id}:`, error);
throw error;
}
}
@@ -203,7 +200,6 @@ class AboutServiceAPI {
const data = await response.json();
return data.results || data;
} catch (error) {
console.error('Error fetching about services:', error);
throw error;
}
}
@@ -227,7 +223,6 @@ class AboutServiceAPI {
const data = await response.json();
return data;
} catch (error) {
console.error(`Error fetching about service ${id}:`, error);
throw error;
}
}
@@ -251,7 +246,6 @@ class AboutServiceAPI {
const data = await response.json();
return data.results || data;
} catch (error) {
console.error('Error fetching about processes:', error);
throw error;
}
}
@@ -275,7 +269,6 @@ class AboutServiceAPI {
const data = await response.json();
return data;
} catch (error) {
console.error(`Error fetching about process ${id}:`, error);
throw error;
}
}
@@ -299,7 +292,6 @@ class AboutServiceAPI {
const data = await response.json();
return data.results || data;
} catch (error) {
console.error('Error fetching about journeys:', error);
throw error;
}
}
@@ -323,7 +315,6 @@ class AboutServiceAPI {
const data = await response.json();
return data;
} catch (error) {
console.error(`Error fetching about journey ${id}:`, error);
throw error;
}
}

View File

@@ -120,7 +120,6 @@ export const blogService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching blog posts:', error);
throw error;
}
},
@@ -142,7 +141,6 @@ export const blogService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching blog post:', error);
throw error;
}
},
@@ -164,7 +162,6 @@ export const blogService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching featured posts:', error);
throw error;
}
},
@@ -186,7 +183,6 @@ export const blogService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching latest posts:', error);
throw error;
}
},
@@ -208,7 +204,6 @@ export const blogService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching popular posts:', error);
throw error;
}
},
@@ -230,7 +225,6 @@ export const blogService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching related posts:', error);
throw error;
}
},
@@ -252,7 +246,6 @@ export const blogService = {
const data = await response.json();
return Array.isArray(data) ? data : data.results || [];
} catch (error) {
console.error('Error fetching blog categories:', error);
throw error;
}
},
@@ -274,7 +267,6 @@ export const blogService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching categories with posts:', error);
throw error;
}
},
@@ -296,7 +288,6 @@ export const blogService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching blog category:', error);
throw error;
}
},
@@ -318,7 +309,6 @@ export const blogService = {
const data = await response.json();
return Array.isArray(data) ? data : data.results || [];
} catch (error) {
console.error('Error fetching blog tags:', error);
throw error;
}
},
@@ -340,7 +330,6 @@ export const blogService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching posts by tag:', error);
throw error;
}
},
@@ -362,7 +351,6 @@ export const blogService = {
const data = await response.json();
return Array.isArray(data) ? data : data.results || [];
} catch (error) {
console.error('Error fetching blog authors:', error);
throw error;
}
},
@@ -384,7 +372,6 @@ export const blogService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching posts by author:', error);
throw error;
}
},
@@ -406,7 +393,6 @@ export const blogService = {
const data = await response.json();
return Array.isArray(data) ? data : data.results || [];
} catch (error) {
console.error('Error fetching comments:', error);
throw error;
}
},
@@ -429,7 +415,6 @@ export const blogService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error creating comment:', error);
throw error;
}
},

View File

@@ -54,13 +54,14 @@ export interface JobApplication {
class CareerService {
private baseUrl = `${API_BASE_URL}/api/career`;
/**
* Get all active job positions
*/
async getAllJobs(): Promise<JobPosition[]> {
try {
const response = await fetch(`${this.baseUrl}/jobs/`, {
const response = await fetch(`${this.baseUrl}/jobs`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@@ -75,7 +76,6 @@ class CareerService {
// Handle paginated response - extract results array
return data.results || data;
} catch (error) {
console.error('Error fetching jobs:', error);
throw error;
}
}
@@ -85,7 +85,7 @@ class CareerService {
*/
async getJobBySlug(slug: string): Promise<JobPosition> {
try {
const response = await fetch(`${this.baseUrl}/jobs/${slug}/`, {
const response = await fetch(`${this.baseUrl}/jobs/${slug}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@@ -99,7 +99,6 @@ class CareerService {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching job:', error);
throw error;
}
}
@@ -109,7 +108,7 @@ class CareerService {
*/
async getFeaturedJobs(): Promise<JobPosition[]> {
try {
const response = await fetch(`${this.baseUrl}/jobs/featured/`, {
const response = await fetch(`${this.baseUrl}/jobs/featured`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@@ -124,7 +123,6 @@ class CareerService {
// Handle paginated response - extract results array
return data.results || data;
} catch (error) {
console.error('Error fetching featured jobs:', error);
throw error;
}
}
@@ -136,19 +134,15 @@ class CareerService {
try {
const formData = new FormData();
// Append all fields to FormData
// Required fields
formData.append('job', applicationData.job.toString());
formData.append('first_name', applicationData.first_name);
formData.append('last_name', applicationData.last_name);
formData.append('email', applicationData.email);
formData.append('consent', applicationData.consent.toString());
formData.append('resume', applicationData.resume);
// Append resume file
if (applicationData.resume) {
formData.append('resume', applicationData.resume);
}
// Append optional fields
// Optional fields (only append if they exist)
if (applicationData.phone) formData.append('phone', applicationData.phone);
if (applicationData.current_position) formData.append('current_position', applicationData.current_position);
if (applicationData.current_company) formData.append('current_company', applicationData.current_company);
@@ -160,24 +154,24 @@ class CareerService {
if (applicationData.website_url) formData.append('website_url', applicationData.website_url);
if (applicationData.available_from) formData.append('available_from', applicationData.available_from);
if (applicationData.notice_period) formData.append('notice_period', applicationData.notice_period);
if (applicationData.expected_salary) formData.append('expected_salary', applicationData.expected_salary.toString());
if (applicationData.expected_salary !== undefined) formData.append('expected_salary', applicationData.expected_salary.toString());
if (applicationData.salary_currency) formData.append('salary_currency', applicationData.salary_currency);
const response = await fetch(`${this.baseUrl}/applications/`, {
const response = await fetch(`${this.baseUrl}/applications`, {
method: 'POST',
body: formData,
// Don't set Content-Type header - browser will set it with boundary for multipart/form-data
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || `Failed to submit application: ${response.statusText}`);
const errorData = await response.json().catch(() => ({}));
const errorMessage = errorData.error || errorData.message || errorData.detail || `HTTP ${response.status}: ${response.statusText}`;
throw new Error(errorMessage);
}
const data = await response.json();
return data;
} catch (error) {
console.error('Error submitting application:', error);
throw error;
}
}
@@ -187,7 +181,7 @@ class CareerService {
*/
async getJobsByDepartment(department: string): Promise<JobPosition[]> {
try {
const response = await fetch(`${this.baseUrl}/jobs/?department=${department}`, {
const response = await fetch(`${this.baseUrl}/jobs?department=${department}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@@ -202,7 +196,6 @@ class CareerService {
// Handle paginated response - extract results array
return data.results || data;
} catch (error) {
console.error('Error fetching jobs by department:', error);
throw error;
}
}
@@ -212,7 +205,7 @@ class CareerService {
*/
async getJobsByEmploymentType(employmentType: string): Promise<JobPosition[]> {
try {
const response = await fetch(`${this.baseUrl}/jobs/?employment_type=${employmentType}`, {
const response = await fetch(`${this.baseUrl}/jobs?employment_type=${employmentType}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@@ -227,7 +220,6 @@ class CareerService {
// Handle paginated response - extract results array
return data.results || data;
} catch (error) {
console.error('Error fetching jobs by employment type:', error);
throw error;
}
}

View File

@@ -115,7 +115,6 @@ export const caseStudyService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching case studies:', error);
throw error;
}
},
@@ -140,7 +139,6 @@ export const caseStudyService = {
const data = await response.json();
return data;
} catch (error) {
console.error(`Error fetching case study ${slug}:`, error);
throw error;
}
},
@@ -165,7 +163,6 @@ export const caseStudyService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching featured case studies:', error);
throw error;
}
},
@@ -190,7 +187,6 @@ export const caseStudyService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching latest case studies:', error);
throw error;
}
},
@@ -215,7 +211,6 @@ export const caseStudyService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching popular case studies:', error);
throw error;
}
},
@@ -240,7 +235,6 @@ export const caseStudyService = {
const data = await response.json();
return data;
} catch (error) {
console.error(`Error fetching related case studies for ${slug}:`, error);
throw error;
}
},
@@ -265,7 +259,6 @@ export const caseStudyService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching case study categories:', error);
throw error;
}
},
@@ -290,7 +283,6 @@ export const caseStudyService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching categories with case studies:', error);
throw error;
}
},
@@ -315,7 +307,6 @@ export const caseStudyService = {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching clients:', error);
throw error;
}
},
@@ -340,7 +331,6 @@ export const caseStudyService = {
const data = await response.json();
return data;
} catch (error) {
console.error(`Error fetching client ${slug}:`, error);
throw error;
}
},
@@ -365,7 +355,6 @@ export const caseStudyService = {
const data = await response.json();
return data;
} catch (error) {
console.error(`Error fetching case studies for client ${slug}:`, error);
throw error;
}
},

View File

@@ -51,7 +51,6 @@ class PolicyServiceAPI {
const data = await response.json();
return data.results || data;
} catch (error) {
console.error('Error fetching policies:', error);
throw error;
}
}
@@ -75,7 +74,6 @@ class PolicyServiceAPI {
const data = await response.json();
return data;
} catch (error) {
console.error(`Error fetching policy ${type}:`, error);
throw error;
}
}
@@ -99,7 +97,6 @@ class PolicyServiceAPI {
const data = await response.json();
return data;
} catch (error) {
console.error(`Error fetching policy ${id}:`, error);
throw error;
}
}

View File

@@ -151,7 +151,6 @@ export const getTicketCategories = async (): Promise<TicketCategory[]> => {
// Handle paginated response
return data.results || data;
} catch (error) {
console.error('Error fetching ticket categories:', error);
throw error;
}
};
@@ -167,7 +166,6 @@ export const getTicketStatuses = async (): Promise<TicketStatus[]> => {
// Handle paginated response
return data.results || data;
} catch (error) {
console.error('Error fetching ticket statuses:', error);
throw error;
}
};
@@ -183,7 +181,6 @@ export const getTicketPriorities = async (): Promise<TicketPriority[]> => {
// Handle paginated response
return data.results || data;
} catch (error) {
console.error('Error fetching ticket priorities:', error);
throw error;
}
};
@@ -204,17 +201,38 @@ export const createTicket = async (data: CreateTicketData): Promise<SupportTicke
if (!response.ok) {
const errorData = await response.json().catch(() => ({}));
// Handle validation errors
if (response.status === 400 && errorData.user_email) {
throw new Error(errorData.user_email[0] || 'Email validation failed');
// Handle specific HTTP status codes
if (response.status === 400) {
// Handle validation errors
if (errorData.user_email) {
throw new Error(errorData.user_email[0] || 'Email validation failed');
}
if (errorData.title) {
throw new Error(errorData.title[0] || 'Title is required');
}
if (errorData.description) {
throw new Error(errorData.description[0] || 'Description is required');
}
if (errorData.user_name) {
throw new Error(errorData.user_name[0] || 'Name is required');
}
// Generic validation error
throw new Error(errorData.detail || errorData.message || 'Please check all required fields and try again');
} else if (response.status === 429) {
throw new Error('Too many requests. Please wait a moment and try again');
} else if (response.status >= 500) {
throw new Error('Server error. Please try again later');
} else if (response.status === 403) {
throw new Error('Access denied. Please contact support if this persists');
} else if (response.status === 404) {
throw new Error('Service not found. Please refresh the page and try again');
}
throw new Error(errorData.detail || errorData.message || 'Failed to create ticket');
throw new Error(errorData.detail || errorData.message || 'An unexpected error occurred');
}
return await response.json();
} catch (error) {
console.error('Error creating ticket:', error);
throw error;
}
};
@@ -239,7 +257,6 @@ export const checkTicketStatus = async (ticketNumber: string): Promise<SupportTi
}
return await response.json();
} catch (error) {
console.error('Error checking ticket status:', error);
throw error;
}
};
@@ -268,7 +285,6 @@ export const addTicketMessage = async (
if (!response.ok) throw new Error('Failed to add ticket message');
return await response.json();
} catch (error) {
console.error('Error adding ticket message:', error);
throw error;
}
};
@@ -284,7 +300,6 @@ export const getKnowledgeBaseCategories = async (): Promise<KnowledgeBaseCategor
// Handle paginated response
return data.results || data;
} catch (error) {
console.error('Error fetching knowledge base categories:', error);
throw error;
}
};
@@ -303,7 +318,6 @@ export const getKnowledgeBaseArticles = async (search?: string): Promise<Knowled
// Handle paginated response
return data.results || data;
} catch (error) {
console.error('Error fetching knowledge base articles:', error);
throw error;
}
};
@@ -319,7 +333,6 @@ export const getFeaturedArticles = async (): Promise<KnowledgeBaseArticle[]> =>
// Handle both array and paginated responses
return Array.isArray(data) ? data : (data.results || data);
} catch (error) {
console.error('Error fetching featured articles:', error);
throw error;
}
};
@@ -333,7 +346,6 @@ export const getKnowledgeBaseArticle = async (slug: string): Promise<KnowledgeBa
if (!response.ok) throw new Error('Failed to fetch knowledge base article');
return await response.json();
} catch (error) {
console.error('Error fetching knowledge base article:', error);
throw error;
}
};
@@ -349,7 +361,6 @@ export const getArticlesByCategory = async (categorySlug: string): Promise<Knowl
// Handle paginated response
return data.results || data;
} catch (error) {
console.error('Error fetching articles by category:', error);
throw error;
}
};
@@ -369,7 +380,6 @@ export const markArticleHelpful = async (slug: string, helpful: boolean): Promis
if (!response.ok) throw new Error('Failed to mark article helpful');
return await response.json();
} catch (error) {
console.error('Error marking article helpful:', error);
throw error;
}
};
@@ -385,7 +395,6 @@ export const getSupportSettings = async (): Promise<SupportSettings[]> => {
// Handle paginated response
return data.results || data;
} catch (error) {
console.error('Error fetching support settings:', error);
throw error;
}
};
@@ -399,7 +408,6 @@ export const getSupportSetting = async (settingName: string): Promise<SupportSet
if (!response.ok) throw new Error('Failed to fetch support setting');
return await response.json();
} catch (error) {
console.error('Error fetching support setting:', error);
throw error;
}
};

View File

@@ -53,7 +53,6 @@ export const useAbout = (): UseAboutReturn => {
setData(result);
} catch (err) {
setError(err instanceof Error ? err.message : 'An error occurred');
console.error('Error fetching about page data:', err);
} finally {
setLoading(false);
}
@@ -87,7 +86,6 @@ export const useAboutBanners = (): UseAboutBannerReturn => {
setData(result);
} catch (err) {
setError(err instanceof Error ? err.message : 'An error occurred');
console.error('Error fetching about banners:', err);
} finally {
setLoading(false);
}
@@ -121,7 +119,6 @@ export const useAboutServices = (): UseAboutServiceReturn => {
setData(result);
} catch (err) {
setError(err instanceof Error ? err.message : 'An error occurred');
console.error('Error fetching about services:', err);
} finally {
setLoading(false);
}
@@ -155,7 +152,6 @@ export const useAboutProcesses = (): UseAboutProcessReturn => {
setData(result);
} catch (err) {
setError(err instanceof Error ? err.message : 'An error occurred');
console.error('Error fetching about processes:', err);
} finally {
setLoading(false);
}
@@ -189,7 +185,6 @@ export const useAboutJourneys = (): UseAboutJourneyReturn => {
setData(result);
} catch (err) {
setError(err instanceof Error ? err.message : 'An error occurred');
console.error('Error fetching about journeys:', err);
} finally {
setLoading(false);
}

View File

@@ -18,7 +18,6 @@ export const useJobs = () => {
setError(null);
} catch (err) {
setError(err instanceof Error ? err.message : 'An error occurred');
console.error('Error fetching jobs:', err);
} finally {
setLoading(false);
}
@@ -39,21 +38,27 @@ export const useJob = (slug: string) => {
const [error, setError] = useState<string | null>(null);
useEffect(() => {
console.log('🔍 useJob hook called with slug:', slug);
if (!slug) {
console.log('❌ No slug provided, setting loading to false');
setLoading(false);
return;
}
const fetchJob = async () => {
try {
console.log('📡 Fetching job data for slug:', slug);
setLoading(true);
const data = await careerService.getJobBySlug(slug);
console.log('✅ Job data fetched successfully:', data);
setJob(data);
setError(null);
} catch (err) {
console.error('❌ Error fetching job data:', err);
setError(err instanceof Error ? err.message : 'An error occurred');
console.error('Error fetching job:', err);
} finally {
console.log('🔄 Setting loading to false');
setLoading(false);
}
};
@@ -81,7 +86,6 @@ export const useFeaturedJobs = () => {
setError(null);
} catch (err) {
setError(err instanceof Error ? err.message : 'An error occurred');
console.error('Error fetching featured jobs:', err);
} finally {
setLoading(false);
}

View File

@@ -39,7 +39,6 @@ export const useCaseStudies = (params?: {
});
} catch (err) {
setError(err as Error);
console.error('Error fetching case studies:', err);
} finally {
setLoading(false);
}
@@ -79,7 +78,6 @@ export const useCaseStudy = (slug: string | null) => {
setCaseStudy(data);
} catch (err) {
setError(err as Error);
console.error(`Error fetching case study ${slug}:`, err);
} finally {
setLoading(false);
}
@@ -106,7 +104,6 @@ export const useFeaturedCaseStudies = () => {
setFeaturedCaseStudies(data);
} catch (err) {
setError(err as Error);
console.error('Error fetching featured case studies:', err);
} finally {
setLoading(false);
}
@@ -133,7 +130,6 @@ export const useLatestCaseStudies = (limit: number = 6) => {
setLatestCaseStudies(data);
} catch (err) {
setError(err as Error);
console.error('Error fetching latest case studies:', err);
} finally {
setLoading(false);
}
@@ -160,7 +156,6 @@ export const usePopularCaseStudies = (limit: number = 6) => {
setPopularCaseStudies(data);
} catch (err) {
setError(err as Error);
console.error('Error fetching popular case studies:', err);
} finally {
setLoading(false);
}
@@ -192,7 +187,6 @@ export const useRelatedCaseStudies = (slug: string | null) => {
setRelatedCaseStudies(data);
} catch (err) {
setError(err as Error);
console.error(`Error fetching related case studies for ${slug}:`, err);
} finally {
setLoading(false);
}
@@ -219,7 +213,6 @@ export const useCaseStudyCategories = () => {
setCategories(data);
} catch (err) {
setError(err as Error);
console.error('Error fetching case study categories:', err);
} finally {
setLoading(false);
}
@@ -246,7 +239,6 @@ export const useCategoriesWithCaseStudies = () => {
setCategories(data);
} catch (err) {
setError(err as Error);
console.error('Error fetching categories with case studies:', err);
} finally {
setLoading(false);
}
@@ -273,7 +265,6 @@ export const useClients = () => {
setClients(data);
} catch (err) {
setError(err as Error);
console.error('Error fetching clients:', err);
} finally {
setLoading(false);
}
@@ -305,7 +296,6 @@ export const useClient = (slug: string | null) => {
setClient(data);
} catch (err) {
setError(err as Error);
console.error(`Error fetching client ${slug}:`, err);
} finally {
setLoading(false);
}
@@ -337,7 +327,6 @@ export const useClientCaseStudies = (slug: string | null) => {
setCaseStudies(data.results);
} catch (err) {
setError(err as Error);
console.error(`Error fetching case studies for client ${slug}:`, err);
} finally {
setLoading(false);
}

View File

@@ -32,7 +32,6 @@ export const usePolicies = (): UsePoliciesReturn => {
setData(result);
} catch (err) {
setError(err instanceof Error ? err.message : 'An error occurred');
console.error('Error fetching policies:', err);
} finally {
setLoading(false);
}
@@ -71,7 +70,6 @@ export const usePolicy = (type: 'privacy' | 'terms' | 'support' | null): UsePoli
setData(result);
} catch (err) {
setError(err instanceof Error ? err : new Error('An error occurred'));
console.error('Error fetching policy:', err);
} finally {
setIsLoading(false);
}
@@ -110,7 +108,6 @@ export const usePolicyById = (id: number | null): UsePolicyReturn => {
setData(result);
} catch (err) {
setError(err instanceof Error ? err : new Error('An error occurred'));
console.error('Error fetching policy:', err);
} finally {
setIsLoading(false);
}