Bilibili-Evolved/registry/lib/components/utils/comments/disable-search-link/index.ts
2024-09-08 15:05:15 +08:00

71 lines
2.0 KiB
TypeScript

import { defineComponentMetadata } from '@/components/define'
import { forEachCommentArea, CommentAreaV3 } from '@/components/utils/comment-apis'
import { ShadowRootEvents } from '@/core/shadow-root'
import { preventEvent } from '@/core/utils'
const name = 'disableCommentsSearchLink'
let prevent = false
export const component = defineComponentMetadata({
name,
displayName: '禁用评论区搜索词',
instantStyles: [
{
name,
style: () => import('./disable-search-link.scss'),
important: true,
},
{
name,
style: () => import('./disable-search-link-shadow.scss'),
shadowDom: true,
},
],
tags: [componentsTags.utils, componentsTags.style],
entry: async () => {
prevent = true
forEachCommentArea(async area => {
const isV3Area = area instanceof CommentAreaV3
if (isV3Area) {
area.commentAreaEntry.addEventListener(
ShadowRootEvents.Updated,
(e: CustomEvent<MutationRecord[]>) => {
const records = e.detail
records.forEach(record => {
record.addedNodes.forEach(node => {
const isCommentLink =
node instanceof HTMLAnchorElement && node.getAttribute('data-type') === 'search'
if (!isCommentLink) {
return
}
node.removeAttribute('href')
node.removeAttribute('target')
})
})
},
)
} else {
preventEvent(area.element, 'click', e => {
if (!(e.target instanceof HTMLElement) || !prevent) {
return false
}
const element = e.target as HTMLElement
if (
['.jump-link.search-word', '.icon.search-word'].some(selector =>
element.matches(selector),
)
) {
return true
}
return false
})
}
})
},
reload: () => {
prevent = true
},
unload: () => {
prevent = false
},
})