import { CATEGORIES, FETCH_POSTS_ORDER_FIELDS, USER_ROLES, ViewFlagBehavior } from '@/consts' import type { ReactNode } from 'react' export type Category = typeof CATEGORIES[number] export type FetchPostsOrder = `${ FetchPostsOrderField }:${ 'asc' | 'desc' }` export type FetchPostsOrderField = typeof FETCH_POSTS_ORDER_FIELDS[number] export type FetchPostsParams = { url: string title: string tags: string match: 'all' | 'any' originalCreatedFrom: string originalCreatedTo: string createdFrom: string createdTo: string updatedFrom: string updatedTo: string page: number limit: number order: FetchPostsOrder } export type FetchTagsOrder = `${ FetchTagsOrderField }:${ 'asc' | 'desc' }` export type FetchTagsOrderField = | 'name' | 'category' | 'post_count' | 'created_at' | 'updated_at' export type FetchTagsParams = { post: number | null name: string category: Category | null postCountGTE: number postCountLTE: number | null createdFrom: string createdTo: string updatedFrom: string updatedTo: string page: number limit: number order: FetchTagsOrder } export type Material = { id: number tag: Tag file: string | null url: string | null wikiPageBody?: string | null contentType: string | null createdAt: string createdByUser: { id: number; name: string } updatedAt: string updatedByUser: { id: number; name: string } } export type Menu = MenuItem[] export type MenuInvisibleItem = { name: ReactNode to?: string base?: string visible: false subMenu: SubMenuItem[] } export type MenuItem = MenuVisibleItem | MenuInvisibleItem export type MenuVisibleItem = { name: ReactNode to: string base?: string visible?: true subMenu: SubMenuItem[] } export type NicoTag = Tag & { category: 'nico' linkedTags: Tag[] } export type NiconicoMetadata = { currentTime: number duration: number isVideoMetaDataLoaded: boolean maximumBuffered: number muted: boolean showComment: boolean volume: number } export type NiconicoVideoInfo = { title: string videoId: string lengthInSeconds: number thumbnailUrl: string description: string viewCount: number commentCount: number mylistCount: number postedAt: string watchId: number } export type NiconicoViewerHandle = { play: () => void pause: () => void seek: (time: number) => void mute: () => void unmute: () => void setVolume: (volume: number) => void showComments: () => void hideComments: () => void } export type Post = { id: number url: string title: string thumbnail: string thumbnailBase: string tags: Tag[] viewed: boolean related: Post[] originalCreatedFrom: string | null originalCreatedBefore: string | null createdAt: string updatedAt: string uploadedUser: { id: number; name: string } | null } export type PostTagChange = { post: Post tag: Tag | null user: User | null changeType: 'add' | 'remove' timestamp: string } export type SubMenuComponentItem = { component: ReactNode visible: boolean } export type SubMenuItem = SubMenuComponentItem | SubMenuStringItem export type SubMenuStringItem = { name: ReactNode to: string visible?: boolean } export type Tag = { id: number name: string category: Category postCount: number createdAt: string updatedAt: string hasWiki: boolean materialId: number children?: Tag[] matchedAlias?: string | null } export type Theatre = { id: number name: string | null opensAt: string closesAt: string | null createdByUser: { id: number; name: string } createdAt: string updatedAt: string } export type TheatreComment = { theatreId: number, no: number, user: { id: number, name: string } | null content: string createdAt: string } export type User = { id: number name: string | null inheritanceCode: string role: UserRole } export type ViewFlagBehavior = typeof ViewFlagBehavior[keyof typeof ViewFlagBehavior] export type WikiPage = { id: number title: string createdUserId: number updatedUserId: number createdAt: string updatedAt: string body: string revisionId: number pred: number | null succ: number | null } export type WikiPageChange = { revisionId: number pred: number | null succ: null wikiPage: Pick user: Pick kind: 'content' | 'redirect' message: string | null timestamp: string } export type WikiPageDiff = { wikiPageId: number title: string olderRevisionId: number | null newerRevisionId: number diff: WikiPageDiffDiff[] } export type WikiPageDiffDiff = { type: 'context' | 'added' | 'removed' content: string } export type UserRole = typeof USER_ROLES[number]