Files
btrc-hub/frontend/src/types.ts
T
2026-05-06 15:47:20 +09:00

262 lines
7.8 KiB
TypeScript

import { CATEGORIES,
FETCH_POSTS_ORDER_FIELDS,
PLATFORMS,
USER_ROLES,
ViewFlagBehavior } from '@/consts'
import type { ReactNode } from 'react'
export type Category = typeof CATEGORIES[number]
export type Deerjikist = { platform: Platform; code: string }
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 Platform = typeof PLATFORMS[number]
export type Post = {
id: number
versionNo: number
url: string
title: string | null
thumbnail: string | null
thumbnailBase: string | null
tags: Tag[]
parentPosts?: Post[]
childPosts?: Post[]
siblingPosts?: Record<`${ number }`, Post[]>
viewed: boolean
related: Post[]
originalCreatedFrom: string | null
originalCreatedBefore: string | null
createdAt: string
updatedAt: string
uploadedUser: { id: number; name: string | null } | null }
export type PostTagChange = {
post: Post
tag: Tag | null
user: User | null
changeType: 'add' | 'remove'
timestamp: string }
export type PostVersion = {
postId: number
latestVersionNo: number
versionNo: number
eventType: 'create' | 'update' | 'discard' | 'restore'
title: { current: string | null; prev: string | null }
url: { current: string; prev: string | null }
thumbnail: { current: string | null; prev: string | null }
thumbnailBase: { current: string | null; prev: string | null }
tags: { name: string
type: 'context' | 'added' | 'removed' }[]
parentPosts: { id: number
title: string
type: 'context' | 'added' | 'removed' }[]
originalCreatedFrom: { current: string | null; prev: string | null }
originalCreatedBefore: { current: string | null; prev: string | null }
createdAt: string
createdByUser: { id: number; name: string | null } | null }
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
aliases: string[]
parents: Tag[]
postCount: number
createdAt: string
updatedAt: string
hasWiki: boolean
materialId: number | null
hasDeerjikists: boolean
children?: Tag[]
matchedAlias?: string | null }
export type TagVersion = {
tagId: number
versionNo: number
eventType: 'create' | 'update' | 'discard' | 'restore'
name: { current: string; prev: string | null }
category: { current: Category; prev: Category | null }
aliases: { name: string; type: 'context' | 'added' | 'removed' }[]
parentTags: { tag: Tag; type: 'context' | 'added' | 'removed' }[]
createdAt: string
createdByUser: { id: number; name: string | null } | 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<WikiPage, 'id' | 'title'>
user: Pick<User, 'id' | 'name'>
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]