This commit is contained in:
Tomas Dvorak
2025-11-02 01:04:02 +01:00
parent ac886502e0
commit b9cea0cd77
153 changed files with 43713 additions and 1700 deletions
+51 -8
View File
@@ -27,31 +27,73 @@ export interface SocialLink {
icon?: string;
}
// Normalize backend objects (backend may return `ID` instead of `id`)
function normalizeNavItem(raw: any): NavigationItem {
if (!raw || typeof raw !== 'object') return raw as NavigationItem;
const id = raw.id ?? raw.ID;
const children = Array.isArray(raw.children)
? raw.children.map((c: any) => normalizeNavItem(c))
: undefined;
return {
id,
label: raw.label,
url: raw.url,
icon: raw.icon,
type: raw.type,
page_type: raw.page_type,
page_id: raw.page_id,
visible: raw.visible,
display_order: raw.display_order,
parent_id: raw.parent_id,
children,
target: raw.target,
css_class: raw.css_class,
requires_auth: raw.requires_auth,
requires_admin: raw.requires_admin,
} as NavigationItem;
}
function normalizeSocialLink(raw: any): SocialLink {
if (!raw || typeof raw !== 'object') return raw as SocialLink;
const id = raw.id ?? raw.ID;
return {
id,
platform: raw.platform,
url: raw.url,
display_order: raw.display_order,
visible: raw.visible,
icon: raw.icon,
} as SocialLink;
}
// Public endpoints
export const getNavigationItems = async (): Promise<NavigationItem[]> => {
const response = await api.get(`/navigation`);
return response.data;
const data = Array.isArray(response.data) ? response.data : [];
return data.map((it: any) => normalizeNavItem(it));
};
export const getSocialLinks = async (): Promise<SocialLink[]> => {
const response = await api.get(`/social-links`);
return response.data;
const data = Array.isArray(response.data) ? response.data : [];
return data.map((it: any) => normalizeSocialLink(it));
};
// Admin endpoints
export const getAllNavigationItems = async (): Promise<NavigationItem[]> => {
const response = await api.get(`/admin/navigation`);
return response.data;
const data = Array.isArray(response.data) ? response.data : [];
return data.map((it: any) => normalizeNavItem(it));
};
export const createNavigationItem = async (item: Partial<NavigationItem>): Promise<NavigationItem> => {
const response = await api.post(`/admin/navigation`, item);
return response.data;
return normalizeNavItem(response.data);
};
export const updateNavigationItem = async (id: number, item: Partial<NavigationItem>): Promise<NavigationItem> => {
const response = await api.put(`/admin/navigation/${id}`, item);
return response.data;
return normalizeNavItem(response.data);
};
export const deleteNavigationItem = async (id: number): Promise<void> => {
@@ -65,17 +107,18 @@ export const reorderNavigationItems = async (orders: { id: number; display_order
// Social links admin endpoints
export const getAllSocialLinks = async (): Promise<SocialLink[]> => {
const response = await api.get(`/admin/social-links`);
return response.data;
const data = Array.isArray(response.data) ? response.data : [];
return data.map((it: any) => normalizeSocialLink(it));
};
export const createSocialLink = async (link: Partial<SocialLink>): Promise<SocialLink> => {
const response = await api.post(`/admin/social-links`, link);
return response.data;
return normalizeSocialLink(response.data);
};
export const updateSocialLink = async (id: number, link: Partial<SocialLink>): Promise<SocialLink> => {
const response = await api.put(`/admin/social-links/${id}`, link);
return response.data;
return normalizeSocialLink(response.data);
};
export const deleteSocialLink = async (id: number): Promise<void> => {