| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- import { Button, Card, Dropdown, Space, Typography } from "antd";
- import {
- MoreOutlined,
- EditOutlined,
- TranslationOutlined,
- } from "@ant-design/icons";
- import type { ITermDataResponse } from "../../api/Term";
- import MdView from "../template/MdView";
- import TimeShow from "../general/TimeShow";
- import TermModal from "./TermModal";
- import { useEffect, useState } from "react";
- import StudioName from "../auth/Studio";
- import { Link, useNavigate } from "react-router";
- import { useAppSelector } from "../../hooks";
- import { click, clickedTerm } from "../../reducers/term-click";
- import store from "../../store";
- import "../article/article.css";
- import Discussion from "../discussion/Discussion";
- import { useIntl } from "react-intl";
- import User from "../auth/User";
- const { Text } = Typography;
- interface IWidget {
- data?: ITermDataResponse;
- onTermClick?: Function;
- }
- const TermItemWidget = ({ data, onTermClick }: IWidget) => {
- const [openTermModal, setOpenTermModal] = useState(false);
- const [showDiscussion, setShowDiscussion] = useState(false);
- const navigate = useNavigate();
- const termClicked = useAppSelector(clickedTerm);
- const intl = useIntl();
- useEffect(() => {
- console.debug("on redux", termClicked, data);
- if (typeof termClicked === "undefined") {
- return;
- }
- if (termClicked?.channelId === data?.channel?.id) {
- store.dispatch(click(null));
- if (typeof onTermClick !== "undefined") {
- onTermClick(termClicked);
- }
- }
- }, [data, termClicked]);
- return (
- <>
- <Card
- bodyStyle={{ padding: 8 }}
- title={
- <Space orientation="vertical" size={3}>
- <Space>
- <Link to={`/term/show/${data?.guid}`}>
- <Text strong>{data?.meaning}</Text>
- </Link>
- <Text type="secondary">{data?.other_meaning}</Text>
- </Space>
- <Space style={{ fontSize: "80%" }}>
- <StudioName data={data?.studio} />
- {data?.channel
- ? data.channel.name
- : intl.formatMessage({
- id: "term.general-in-studio",
- })}
- <Text type="secondary">
- <User {...data?.editor} showAvatar={false} />
- </Text>
- <TimeShow type="secondary" updatedAt={data?.updated_at} />
- </Space>
- </Space>
- }
- extra={
- <Dropdown
- key={1}
- trigger={["click"]}
- menu={{
- items: [
- {
- key: "edit",
- label: "edit",
- icon: <EditOutlined />,
- },
- {
- key: "translate",
- label: "translate",
- icon: <TranslationOutlined />,
- },
- ],
- onClick: (e) => {
- console.log("click ", e);
- switch (e.key) {
- case "edit":
- setOpenTermModal(true);
- break;
- case "translate":
- navigate(`/article/term/${data?.guid}`);
- break;
- default:
- break;
- }
- },
- }}
- placement="bottomRight"
- >
- <Button
- size="small"
- shape="circle"
- icon={<MoreOutlined />}
- ></Button>
- </Dropdown>
- }
- >
- <div className="pcd_article">
- <MdView html={data?.html} />
- </div>
- {showDiscussion ? (
- <Discussion resType="term" resId={data?.guid} />
- ) : (
- <div style={{ textAlign: "right" }}>
- <Button type="link" onClick={() => setShowDiscussion(true)}>
- 纠错
- </Button>
- </div>
- )}
- </Card>
- <TermModal
- id={data?.guid}
- open={openTermModal}
- onClose={() => setOpenTermModal(false)}
- />
- </>
- );
- };
- export default TermItemWidget;
|