This commit is contained in:
2026-05-11 16:24:14 +07:00
commit 6a48d6351c
313 changed files with 41936 additions and 0 deletions
+57
View File
@@ -0,0 +1,57 @@
export interface MissionHeroData {
badge: string;
title: string;
description: string;
studentCount: string;
image: string;
imageAlt: string;
coreValues: string[];
}
export interface LeadershipData {
heading: string;
description: string;
members: Array<{
name: string;
role: string;
bio: string;
avatar: string;
social: { linkedin?: string; twitter?: string };
}>;
}
export interface LearningModelData {
heading: string;
description: string;
async: { title: string; description: string; features: Array<{ icon: string; title: string; desc: string }> };
sync: { title: string; description: string; features: Array<{ icon: string; title: string; desc: string }> };
}
export interface AccreditationData {
heading: string;
description: string;
badges: Array<{ icon: string; title: string; desc: string }>;
stats: Array<{ value: string; label: string; isPrimary?: boolean }>;
}
export interface SuccessStoriesData {
heading: string;
description: string;
stories: Array<{ quote: string; name: string; program: string; avatar: string }>;
}
export interface CTAData {
heading: string;
description: string;
primaryButton: { label: string; href: string };
secondaryButton: { label: string; href: string };
}
export interface AboutData {
hero: MissionHeroData;
leadership: LeadershipData;
learningModel: LearningModelData;
accreditation: AccreditationData;
successStories: SuccessStoriesData;
cta: CTAData;
}
+136
View File
@@ -0,0 +1,136 @@
/**
* Blog Types
* Định nghĩa các interface cho Blog system
*/
export interface BlogCategory {
_id?: string;
name: string;
slug: string;
description?: string;
postCount?: number;
isActive?: boolean;
createdAt?: string;
updatedAt?: string;
}
export interface BlogTag {
_id?: string;
name: string;
slug: string;
postCount?: number;
isActive?: boolean;
createdAt?: string;
updatedAt?: string;
}
export interface BlogComment {
_id?: string;
postId?: string;
authorName: string;
authorAvatar?: string;
content: string;
createdAt: string;
status?: 'pending' | 'approved' | 'rejected';
parentId?: string;
parentAuthorName?: string | null;
}
export interface BlogPost {
_id?: string;
title: string;
slug: string;
excerpt: string;
content: string;
category: string[];
tags: string[];
author: string;
status: 'draft' | 'published';
publishedAt: string;
isFeatured: boolean;
featuredImage: string;
galleryImages?: string[];
quote?: string;
contentAfterQuote?: string;
commentsCount: number;
comments?: BlogComment[];
createdAt?: string;
updatedAt?: string;
}
export interface RecentPost {
_id?: string;
title: string;
slug: string;
thumbnail: string;
publishedAt: string;
originalPostId?: string;
createdAt?: string;
updatedAt?: string;
}
export interface BlogPagination {
current: number;
total: number;
limit: number;
totalItems: number;
}
export interface BlogListResponse {
success: boolean;
message: string;
data: {
blogs: BlogPost[];
pagination: BlogPagination;
};
}
export interface BlogDetailResponse {
success: boolean;
message: string;
data: BlogPost;
}
export interface BlogFeaturedResponse {
success: boolean;
message: string;
data: BlogPost[];
}
export interface BlogRecentResponse {
success: boolean;
message: string;
data: RecentPost[];
}
export interface CategoryListResponse {
success: boolean;
message: string;
data: BlogCategory[];
}
export interface CategoryDetailResponse {
success: boolean;
message: string;
data: BlogCategory;
}
export interface TagListResponse {
success: boolean;
message: string;
data: BlogTag[];
}
export interface TagDetailResponse {
success: boolean;
message: string;
data: BlogTag;
}
export interface BlogQueryParams {
page?: number;
limit?: number;
category?: string;
tag?: string;
search?: string;
}
+27
View File
@@ -0,0 +1,27 @@
export interface FooterData {
brand: {
logo: { image: string; href: string };
description: string;
social: Array<{ icon: string; href: string }>;
};
explore: {
heading: string;
links: Array<{ label: string; href: string }>;
};
contact: {
heading: string;
address: string;
phone: string;
email: string;
};
newsletter: {
heading: string;
description: string;
placeholder: string;
buttonText: string;
};
bottom: {
copyright: string;
links: Array<{ label: string; href: string }>;
};
}
+7
View File
@@ -0,0 +1,7 @@
export interface HeaderMenu {
id: string;
title: string;
url: string;
type?: 'internal' | 'external';
children?: HeaderMenu[];
}
+42
View File
@@ -0,0 +1,42 @@
export interface HeaderLogo {
image: string;
href: string;
}
export interface HeaderButton {
label: string;
href: string;
}
export interface HeaderMenuItem {
id: string;
title: string;
url: string;
type: 'internal' | 'external';
status: 'active' | 'inactive';
children: HeaderMenuItem[];
}
export interface HeaderData {
logo: HeaderLogo;
signInButton: HeaderButton;
ctaButton: HeaderButton;
status: 'active' | 'inactive';
}
export interface NavLink {
label: string;
href: string;
status?: 'active' | 'inactive';
children?: { label: string; href: string; status?: 'active' | 'inactive' }[];
}
export interface HeaderProps {
logo: HeaderLogo;
navLinks: NavLink[];
actions: {
signIn: HeaderButton;
cta: HeaderButton;
};
status: 'active' | 'inactive';
}
+73
View File
@@ -0,0 +1,73 @@
export interface HeroData {
badge: string;
title: string;
description: string;
searchPlaceholder: string;
buttonLabel: string;
image: string;
imageAlt: string;
floatingBadge: { icon: string; value: string; label: string };
}
export interface QuickLinkItem {
icon: string;
title: string;
description: string;
linkText: string;
href: string;
}
interface Feature {
icon: string;
title: string;
description: string;
}
interface Stat {
value: string;
label: string;
image: string;
imageAlt: string;
}
export interface ValuePropData {
badge: string;
title: string;
description: string;
features: Feature[];
stats: Stat[];
}
export interface ProgramItem {
category: string;
image: string;
duration: string;
rating: string;
title: string;
description: string;
studentCount: string;
href: string;
}
export interface ProgramsData {
heading: string;
description: string;
items: ProgramItem[];
}
export interface RequestInfoData {
heading: string;
description: string;
phone: string;
email: string;
programs: string[];
}
export interface HomeData {
hero: HeroData;
quickLinks: QuickLinkItem[];
valueProp: ValuePropData;
programs: ProgramsData;
requestInfo: RequestInfoData;
}
+5
View File
@@ -0,0 +1,5 @@
/**
* Export all types
*/
export * from './blog';
export * from './header';
+63
View File
@@ -0,0 +1,63 @@
export interface FilterOption {
label: string;
count?: number;
checked?: boolean;
}
export interface FiltersData {
levels: FilterOption[];
fields: FilterOption[];
durations: FilterOption[];
}
export interface Course {
id: string;
title: string;
description: string;
icon: string;
}
export interface Outcome {
title: string;
description: string;
icon: string;
}
export interface FAQ {
question: string;
answer: string;
}
export interface Programme {
id: string;
level: string;
fieldOfStudy?: string;
title: string;
description: string;
duration: string;
durationInMonths?: number;
cost: string;
selected?: boolean;
link: string;
shortName: string;
// Detail fields
detailBadge?: string;
detailTitle?: string;
detailDescription?: string;
heroImage?: string;
overview?: string;
credits?: number;
format?: string;
coreCourses?: Course[];
electives?: string[];
outcomes?: Outcome[];
faqs?: FAQ[];
nextStartDate?: string;
monthlyCost?: string;
perCourseCost?: string;
}
export interface ProgrammesData {
filters: FiltersData;
programmes: Programme[];
}