/* * Copyright (c) Baidu, Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * @file citation 组件 mobile 端 */ import {Component} from 'san'; import Tooltip from '@cosui/cosmic/tooltip'; import Image from '@cosui/cosmic/image'; import Icon from '@cosui/cosmic/icon'; import Avatar from '@cosui/cosmic/avatar'; import type {CitationProps, CitationData, CitationEvents, CitationMethods} from '../interface'; export default class Citation extends Component implements CitationMethods { static trimWhitespace = 'all'; static template = ` {{titleFirstWord}} {{titleAfterWord}} {{citationId}} {{source.tag.text}}
参考来源:
{{titleBeforeWord}} {{titleLastWord}}
`; static components = { 'cos-image': Image, 'cos-avatar': Avatar, 'cos-icon': Icon, 'cos-tooltip': Tooltip }; static computed = { titleBeforeWord(this: Citation) { return this.data.get('title').slice(0, -1); }, titleLastWord(this: Citation) { return this.data.get('title').slice(-1); }, titleFirstWord(this: Citation) { return this.data.get('source')?.name?.slice(0, 1) || ''; }, titleAfterWord(this: Citation) { return this.data.get('source')?.name?.slice(1) || ''; } }; private _hideTooltipFn: () => void; initData(): CitationProps { return { getPopupContainer: () => { return document.body; }, appearance: '', disabled: false, isVideo: false, citationId: '', thumbnail: '', source: undefined, title: '', linkInfo: { href: '' } }; } detached() { document.removeEventListener('scroll', this._hideTooltipFn); } hideTooltip() { const tooltip = this.ref('tooltip'); tooltip && tooltip.close(); } handleToggle(showTooltip: boolean) { this._hideTooltipFn = this.hideTooltip.bind(this); document[showTooltip ? 'addEventListener' : 'removeEventListener']('scroll', this._hideTooltipFn); this.fire('toggle', { open: showTooltip }); } handleClick(event: Event, from: string) { if (from === 'tooltip') { this.hideTooltip(); } this.fire('click', { event, from }); } }