| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- import { useEffect, useState } from "react";
- import { Button, Space, Tooltip } from "antd";
- import {
- LikeOutlined,
- LikeFilled,
- StarOutlined,
- StarFilled,
- EyeOutlined,
- EyeFilled,
- } from "@ant-design/icons";
- import { delete_, get, post } from "../../request";
- import type {
- ILikeCount,
- ILikeCountListResponse,
- ILikeCountResponse,
- ILikeRequest,
- TLikeType,
- } from "../../api/like";
- interface IWidget {
- resId?: string;
- resType?: string;
- }
- const Like = ({ resId, resType }: IWidget) => {
- const [like, setLike] = useState<ILikeCount>();
- const [favorite, setFavorite] = useState<ILikeCount>();
- const [watch, setWatch] = useState<ILikeCount>();
- useEffect(() => {
- if (!resId) {
- return;
- }
- const url = `/v2/like?view=count&target_id=${resId}`;
- console.info("api request", url);
- get<ILikeCountListResponse>(url).then((json) => {
- console.info("api response", json);
- if (json.ok) {
- setLike(json.data.find((value) => value.type === "like"));
- setFavorite(json.data.find((value) => value.type === "favorite"));
- setWatch(json.data.find((value) => value.type === "watch"));
- }
- });
- }, [resId]);
- const setStatus = (data: ILikeCount) => {
- switch (data.type) {
- case "like":
- setLike(data);
- break;
- case "favorite":
- setFavorite(data);
- break;
- case "watch":
- setWatch(data);
- break;
- }
- };
- const add = (type: TLikeType) => {
- if (!resId || !resType) {
- return;
- }
- const url = `/v2/like`;
- post<ILikeRequest, ILikeCountResponse>(url, {
- type: type,
- target_id: resId,
- target_type: resType,
- }).then((json) => {
- if (json.ok) {
- setStatus(json.data);
- }
- });
- };
- const remove = (id?: string) => {
- if (!resId || !resType || !id) {
- return;
- }
- const url = `/v2/like/${id}`;
- console.info("api request", url);
- delete_<ILikeCountResponse>(url).then((json) => {
- console.info("api response", json);
- if (json.ok) {
- setStatus(json.data);
- }
- });
- };
- return (
- <Space>
- <Button
- type="text"
- icon={like?.selected ? <LikeFilled /> : <LikeOutlined />}
- onClick={() => {
- if (like?.selected) {
- remove(like.my_id);
- } else {
- add("like");
- }
- }}
- >
- {like?.count === 0 ? <></> : like?.count}
- </Button>
- <Button
- type="text"
- icon={favorite?.selected ? <StarFilled /> : <StarOutlined />}
- onClick={() => {
- if (favorite?.selected) {
- remove(favorite.my_id);
- } else {
- add("favorite");
- }
- }}
- >
- {favorite?.count === 0 ? <></> : favorite?.count}
- </Button>
- <Tooltip title="关注">
- <Button
- type="text"
- icon={watch?.selected ? <EyeFilled /> : <EyeOutlined />}
- onClick={() => {
- if (watch?.selected) {
- remove(watch.my_id);
- } else {
- add("watch");
- }
- }}
- >
- {watch?.count === 0 ? <></> : watch?.count}
- </Button>
- </Tooltip>
- </Space>
- );
- };
- export default Like;
|