mirror of
https://github.com/mediacms-io/mediacms.git
synced 2026-03-22 04:33:09 -04:00
feat(types): create typed schema for global cms and runtime config
This commit is contained in:
1
frontend/src/static/js/types/DeepPartial.ts
Normal file
1
frontend/src/static/js/types/DeepPartial.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export type DeepPartial<T> = T extends object ? { [P in keyof T]?: DeepPartial<T[P]> } : T;
|
||||||
212
frontend/src/static/js/types/GlobalMediaCMS.ts
Normal file
212
frontend/src/static/js/types/GlobalMediaCMS.ts
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
type GlobalMediaCMSApi = {
|
||||||
|
actions: string;
|
||||||
|
categories: string;
|
||||||
|
comments: string;
|
||||||
|
history: string;
|
||||||
|
liked: string;
|
||||||
|
manage_comments: string;
|
||||||
|
manage_media: string;
|
||||||
|
manage_users: string;
|
||||||
|
media: string;
|
||||||
|
members: string;
|
||||||
|
playlists: string;
|
||||||
|
search: string;
|
||||||
|
tags: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
type GlobalMediaCMSContents = {
|
||||||
|
header: {
|
||||||
|
right: string;
|
||||||
|
onLogoRight: string;
|
||||||
|
};
|
||||||
|
notifications: {
|
||||||
|
messages: {
|
||||||
|
addToLiked: string;
|
||||||
|
removeFromLiked: string;
|
||||||
|
addToDisliked: string;
|
||||||
|
removeFromDisliked: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
sidebar: {
|
||||||
|
belowNavMenu: string;
|
||||||
|
belowThemeSwitcher: string;
|
||||||
|
footer: string;
|
||||||
|
mainMenuExtraItems: { text: string; link: string; icon: string; className?: string }[]; // @todo: Check "className"
|
||||||
|
navMenuItems: { text: string; link: string; icon: string; className?: string }[]; // @todo: Check "className"
|
||||||
|
};
|
||||||
|
uploader: {
|
||||||
|
belowUploadArea: string;
|
||||||
|
postUploadMessage: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
type GlobalMediaCMSFeatures = {
|
||||||
|
embeddedVideo: {
|
||||||
|
initialDimensions: {
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
headerBar: {
|
||||||
|
hideLogin: boolean;
|
||||||
|
hideRegister: boolean;
|
||||||
|
};
|
||||||
|
sideBar: {
|
||||||
|
hideHomeLink: boolean;
|
||||||
|
hideTagsLink: boolean;
|
||||||
|
hideCategoriesLink: boolean;
|
||||||
|
};
|
||||||
|
media: {
|
||||||
|
actions: {
|
||||||
|
share: boolean;
|
||||||
|
report: boolean;
|
||||||
|
like: boolean;
|
||||||
|
dislike: boolean;
|
||||||
|
download: boolean;
|
||||||
|
comment: boolean;
|
||||||
|
comment_mention: boolean;
|
||||||
|
save: boolean;
|
||||||
|
};
|
||||||
|
shareOptions: ('embed' | 'email')[];
|
||||||
|
};
|
||||||
|
mediaItem: {
|
||||||
|
hideDate: boolean;
|
||||||
|
hideViews: boolean;
|
||||||
|
hideAuthor: boolean;
|
||||||
|
};
|
||||||
|
playlists: {
|
||||||
|
mediaTypes: ('audio' | 'video')[];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
type GlobalCMSPages = {
|
||||||
|
home: {
|
||||||
|
sections: {
|
||||||
|
latest: { title: string };
|
||||||
|
featured: { title: string };
|
||||||
|
recommended: { title: string };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
media: {
|
||||||
|
categoriesWithTitle: boolean;
|
||||||
|
htmlInDescription: boolean;
|
||||||
|
hideViews: boolean;
|
||||||
|
related: { initialSize: number };
|
||||||
|
};
|
||||||
|
profile: {
|
||||||
|
htmlInDescription: boolean;
|
||||||
|
includeHistory: boolean;
|
||||||
|
includeLikedMedia: boolean;
|
||||||
|
};
|
||||||
|
search: { advancedFilters: boolean };
|
||||||
|
};
|
||||||
|
|
||||||
|
type GlobalCMSSite = {
|
||||||
|
api: string;
|
||||||
|
devEnv: boolean;
|
||||||
|
id: string;
|
||||||
|
logo: {
|
||||||
|
lightMode: { img: string; svg: string };
|
||||||
|
darkMode: { img: string; svg: string };
|
||||||
|
};
|
||||||
|
pages: {
|
||||||
|
featured: { enabled: boolean; title: string };
|
||||||
|
latest: { enabled: boolean; title: string };
|
||||||
|
members: { enabled: boolean; title: string };
|
||||||
|
recommended: { enabled: boolean; title: string };
|
||||||
|
};
|
||||||
|
taxonomies: {
|
||||||
|
categories: { enabled: boolean; title: string };
|
||||||
|
tags: { enabled: boolean; title: string };
|
||||||
|
};
|
||||||
|
theme: {
|
||||||
|
mode: 'light' | 'dark';
|
||||||
|
switch: { enabled: boolean; position: 'header' | 'sidebar' };
|
||||||
|
};
|
||||||
|
title: string;
|
||||||
|
url: string;
|
||||||
|
useRoundedCorners: boolean;
|
||||||
|
userPages: {
|
||||||
|
history: { enabled: boolean; title: string };
|
||||||
|
liked: { enabled: boolean; title: string };
|
||||||
|
};
|
||||||
|
version: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
type GlobalCMSUrl = {
|
||||||
|
addMedia: string; // eg: "./add-media.html";
|
||||||
|
admin: string; // eg: "/admin";
|
||||||
|
categories: string; // eg: "./categories.html";
|
||||||
|
changePassword: string; // eg: "./change-password.html";
|
||||||
|
editChannel: string; // eg: "./edit-channel.html";
|
||||||
|
editProfile: string; // eg: "./edit-profile.html";
|
||||||
|
error404: string; // eg: "./error.html";
|
||||||
|
featuredMedia: string; // eg: "./featured.html";
|
||||||
|
history: string; // eg: "./history.html";
|
||||||
|
home: string; // eg: "./index.html";
|
||||||
|
latestMedia: string; // eg: "./latest.html";
|
||||||
|
likedMedia: string; // eg: "./liked.html";
|
||||||
|
manageComments: string; // eg: "./manage-comments.html";
|
||||||
|
manageMedia: string; // eg: "./manage-media.html";
|
||||||
|
manageUsers: string; // eg: "./manage-users.html";
|
||||||
|
members: string; // eg: "./members.html";
|
||||||
|
recommendedMedia: string; // eg: "./recommended.html";
|
||||||
|
register: string; // eg: "./register.html";
|
||||||
|
search: string; // eg: "./search.html";
|
||||||
|
signin: string; // eg: "./signin.html";
|
||||||
|
signout: string; // eg: "./signout.html";
|
||||||
|
tags: string; // eg: "./tags.html";
|
||||||
|
};
|
||||||
|
|
||||||
|
type GlobalCMSUser = {
|
||||||
|
name: string;
|
||||||
|
username: string;
|
||||||
|
thumbnail: string;
|
||||||
|
is: {
|
||||||
|
admin: boolean;
|
||||||
|
anonymous: boolean;
|
||||||
|
};
|
||||||
|
can: {
|
||||||
|
// a
|
||||||
|
addComment: boolean;
|
||||||
|
addMedia: boolean;
|
||||||
|
// c
|
||||||
|
canSeeMembersPage: boolean;
|
||||||
|
changePassword: boolean;
|
||||||
|
contactUser: boolean;
|
||||||
|
// d
|
||||||
|
deleteComment: boolean;
|
||||||
|
deleteMedia: boolean;
|
||||||
|
deleteProfile: boolean;
|
||||||
|
// e
|
||||||
|
editMedia: boolean;
|
||||||
|
editProfile: boolean;
|
||||||
|
editSubtitle: boolean;
|
||||||
|
// l
|
||||||
|
// m
|
||||||
|
manageComments: boolean;
|
||||||
|
manageMedia: boolean;
|
||||||
|
manageUsers: boolean;
|
||||||
|
mentionComment: boolean;
|
||||||
|
// r
|
||||||
|
readComment: boolean;
|
||||||
|
// u
|
||||||
|
usersNeedsToBeApproved: boolean;
|
||||||
|
};
|
||||||
|
pages: {
|
||||||
|
about: string;
|
||||||
|
media: string;
|
||||||
|
playlists: string;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export type GlobalMediaCMS = {
|
||||||
|
api: GlobalMediaCMSApi;
|
||||||
|
contents: GlobalMediaCMSContents;
|
||||||
|
features: GlobalMediaCMSFeatures;
|
||||||
|
pages: GlobalCMSPages;
|
||||||
|
profileId?: string;
|
||||||
|
site: GlobalCMSSite;
|
||||||
|
url: GlobalCMSUrl;
|
||||||
|
user: GlobalCMSUser;
|
||||||
|
};
|
||||||
200
frontend/src/static/js/types/MediaCMSConfig.ts
Normal file
200
frontend/src/static/js/types/MediaCMSConfig.ts
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
import { GlobalMediaCMS } from './GlobalMediaCMS';
|
||||||
|
|
||||||
|
type MediaCMSConfigApi = {
|
||||||
|
archive: {
|
||||||
|
tags: string;
|
||||||
|
categories: string;
|
||||||
|
};
|
||||||
|
featured: string;
|
||||||
|
manage: {
|
||||||
|
media: string;
|
||||||
|
users: string;
|
||||||
|
comments: string;
|
||||||
|
};
|
||||||
|
media: string;
|
||||||
|
playlists: string;
|
||||||
|
recommended: string;
|
||||||
|
search: {
|
||||||
|
query: string;
|
||||||
|
titles: string;
|
||||||
|
tag: string;
|
||||||
|
category: string;
|
||||||
|
};
|
||||||
|
user: {
|
||||||
|
liked: string;
|
||||||
|
history: string;
|
||||||
|
playlists: string;
|
||||||
|
};
|
||||||
|
users: string; // @todo: "users" or "members"?
|
||||||
|
};
|
||||||
|
|
||||||
|
type MediaCMSConfigContents = Omit<GlobalMediaCMS['contents'], 'notifications' | 'sidebar'> & {
|
||||||
|
sidebar: {
|
||||||
|
belowNavMenu: GlobalMediaCMS['contents']['sidebar']['belowNavMenu'];
|
||||||
|
belowThemeSwitcher: GlobalMediaCMS['contents']['sidebar']['belowThemeSwitcher'];
|
||||||
|
footer: GlobalMediaCMS['contents']['sidebar']['footer'];
|
||||||
|
mainMenuExtra: { items: GlobalMediaCMS['contents']['sidebar']['mainMenuExtraItems'] };
|
||||||
|
navMenu: { items: GlobalMediaCMS['contents']['sidebar']['navMenuItems'] };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
type MediaCMSConfigEnabled = Pick<GlobalMediaCMS['site'], 'taxonomies'> & {
|
||||||
|
pages: GlobalMediaCMS['site']['pages'] & GlobalMediaCMS['site']['userPages'];
|
||||||
|
};
|
||||||
|
|
||||||
|
type MediaCMSConfigMember = {
|
||||||
|
name: GlobalMediaCMS['user']['name'] | null;
|
||||||
|
username: GlobalMediaCMS['user']['username'] | null;
|
||||||
|
thumbnail: GlobalMediaCMS['user']['thumbnail'] | null;
|
||||||
|
is: GlobalMediaCMS['user']['is'];
|
||||||
|
can: {
|
||||||
|
// a
|
||||||
|
addComment: boolean;
|
||||||
|
addMedia: boolean;
|
||||||
|
// c
|
||||||
|
canSeeMembersPage: boolean; // @note: This sould be renamed
|
||||||
|
changePassword: boolean;
|
||||||
|
contactUser: boolean;
|
||||||
|
// d
|
||||||
|
deleteComment: boolean;
|
||||||
|
deleteMedia: boolean;
|
||||||
|
deleteProfile: boolean;
|
||||||
|
dislikeMedia: boolean;
|
||||||
|
downloadMedia: boolean;
|
||||||
|
// e
|
||||||
|
editMedia: boolean;
|
||||||
|
editProfile: boolean;
|
||||||
|
editSubtitle: boolean;
|
||||||
|
// l
|
||||||
|
likeMedia: boolean;
|
||||||
|
login: boolean;
|
||||||
|
// m
|
||||||
|
manageComments: boolean;
|
||||||
|
manageMedia: boolean;
|
||||||
|
manageUsers: boolean;
|
||||||
|
mentionComment: boolean;
|
||||||
|
// r
|
||||||
|
readComment: boolean;
|
||||||
|
register: boolean;
|
||||||
|
reportMedia: boolean;
|
||||||
|
// s
|
||||||
|
saveMedia: boolean;
|
||||||
|
shareMedia: boolean;
|
||||||
|
// u
|
||||||
|
usersNeedsToBeApproved: boolean;
|
||||||
|
};
|
||||||
|
pages: {
|
||||||
|
home: string | null; // @todo: Check this again
|
||||||
|
about: GlobalMediaCMS['user']['pages']['about'] | null;
|
||||||
|
media: GlobalMediaCMS['user']['pages']['media'] | null;
|
||||||
|
playlists: GlobalMediaCMS['user']['pages']['playlists'] | null;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
type MediaCMSConfigMedia = {
|
||||||
|
item: {
|
||||||
|
displayAuthor: boolean;
|
||||||
|
displayViews: boolean;
|
||||||
|
displayPublishDate: boolean;
|
||||||
|
};
|
||||||
|
share: { options: string[] };
|
||||||
|
};
|
||||||
|
|
||||||
|
type MediaCMSConfigNotifications = GlobalMediaCMS['contents']['notifications'];
|
||||||
|
|
||||||
|
type MediaCMSConfigOptions = {
|
||||||
|
pages: {
|
||||||
|
home: GlobalMediaCMS['pages']['home'];
|
||||||
|
search: GlobalMediaCMS['pages']['search'];
|
||||||
|
media: Omit<GlobalMediaCMS['pages']['media'], 'hideViews'> & {
|
||||||
|
displayViews: boolean;
|
||||||
|
};
|
||||||
|
profile: GlobalMediaCMS['pages']['profile'];
|
||||||
|
};
|
||||||
|
embedded: {
|
||||||
|
video: {
|
||||||
|
dimensions: {
|
||||||
|
width: number;
|
||||||
|
widthUnit: 'px';
|
||||||
|
// widthUnit: 'px' | 'percent'; // @note: The unit value "percent" is not used
|
||||||
|
height: number;
|
||||||
|
heightUnit: 'px';
|
||||||
|
// heightUnit: 'px' | 'percent'; // @note: The unit value "percent" is not used
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
type MediaCMSConfigPlaylists = GlobalMediaCMS['features']['playlists'];
|
||||||
|
|
||||||
|
type MediaCMSConfigSidebar = GlobalMediaCMS['features']['sideBar'];
|
||||||
|
|
||||||
|
type MediaCMSConfigSite = {
|
||||||
|
api: string;
|
||||||
|
id: string;
|
||||||
|
title: string;
|
||||||
|
url: string;
|
||||||
|
useRoundedCorners: boolean;
|
||||||
|
version: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
type MediaCMSConfigTheme = Pick<GlobalMediaCMS['site'], 'logo'> & GlobalMediaCMS['site']['theme'];
|
||||||
|
|
||||||
|
type MediaCMSConfigUrl = {
|
||||||
|
admin: string; // eg: '/admin'
|
||||||
|
archive: {
|
||||||
|
categories: string; // eg: './categories.html'
|
||||||
|
tags: string; // eg: './tags.html';
|
||||||
|
};
|
||||||
|
changePassword: string; // eg: './change-password.html';
|
||||||
|
embed: string; // eg: 'http://localhost/embed?m=';
|
||||||
|
error404: string; // eg: './error.html';
|
||||||
|
featured: string; // eg: './featured.html';
|
||||||
|
home: string; // eg: './index.html'
|
||||||
|
latest: string; // eg: './latest.html';
|
||||||
|
manage: {
|
||||||
|
comments: string; // eg: './manage-comments.html'
|
||||||
|
media: string; // eg: './manage-media.html';
|
||||||
|
users: string; // eg: './manage-users.html';
|
||||||
|
};
|
||||||
|
members: string; // eg: './members.html';
|
||||||
|
profile: {
|
||||||
|
about: string; // eg: './profile-about.html';
|
||||||
|
media: string; // eg: './profile-media.html';
|
||||||
|
playlists: string; // eg: './profile-playlists.html';
|
||||||
|
shared_by_me: string; // eg: './profile-media.html/shared_by_me';
|
||||||
|
shared_with_me: string; // eg: './profile-media.html/shared_with_me';
|
||||||
|
};
|
||||||
|
recommended: string; // eg: './recommended.html';
|
||||||
|
register: string; // eg: './register.html';
|
||||||
|
search: {
|
||||||
|
base: string; // eg: './search.html';
|
||||||
|
category: string; // eg: './search.html?c=';
|
||||||
|
query: string; // eg: './search.html?q=';
|
||||||
|
tag: string; // eg: './search.html?t=';
|
||||||
|
};
|
||||||
|
signin: string; // eg: './signin.html';
|
||||||
|
signout: string; // eg: './signout.html';
|
||||||
|
user: {
|
||||||
|
addMedia: string; // eg: './add-media.html';
|
||||||
|
editChannel: string; // eg: './edit-channel.html';
|
||||||
|
editProfile: string; // eg: './edit-profile.html';
|
||||||
|
history: string; // eg: './history.html';
|
||||||
|
liked: string; // eg: './liked.html';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export type MediaCMSConfig = {
|
||||||
|
api: MediaCMSConfigApi;
|
||||||
|
contents: MediaCMSConfigContents;
|
||||||
|
enabled: MediaCMSConfigEnabled;
|
||||||
|
member: MediaCMSConfigMember;
|
||||||
|
media: MediaCMSConfigMedia;
|
||||||
|
notifications: MediaCMSConfigNotifications;
|
||||||
|
options: MediaCMSConfigOptions;
|
||||||
|
playlists: MediaCMSConfigPlaylists;
|
||||||
|
sidebar: MediaCMSConfigSidebar;
|
||||||
|
site: MediaCMSConfigSite;
|
||||||
|
theme: MediaCMSConfigTheme;
|
||||||
|
url: MediaCMSConfigUrl;
|
||||||
|
};
|
||||||
3
frontend/src/static/js/types/index.ts
Normal file
3
frontend/src/static/js/types/index.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
export * from './DeepPartial';
|
||||||
|
export * from './GlobalMediaCMS';
|
||||||
|
export * from './MediaCMSConfig';
|
||||||
Reference in New Issue
Block a user