Files
ColdBreeze-chat-web/src/routes/chat/ChannelChat/PinList.tsx
T
2023-02-02 11:20:27 +08:00

59 lines
2.2 KiB
TypeScript

import { FC, FormEvent } from "react";
import styled from "styled-components";
import usePinMessage from "../../../common/hook/usePinMessage";
import IconSurprise from "../../../assets/icons/emoji.surprise.svg";
import IconClose from "../../../assets/icons/close.svg";
import { useTranslation } from "react-i18next";
import PinnedMessage from "../../../common/component/PinnedMessage";
const Styled = styled.div`
.preview {
background: none;
.down img {
width: 100% !important;
height: auto !important;
}
}
`;
type Props = {
id: number;
};
const PinList: FC<Props> = ({ id }: Props) => {
const { t } = useTranslation("chat");
const { pins, unpinMessage, canPin } = usePinMessage(id);
const handleUnpin = (evt: FormEvent<HTMLButtonElement>) => {
const { mid } = evt.currentTarget.dataset;
if (!mid) return;
unpinMessage(+mid);
};
const noPins = pins.length == 0;
return (
<Styled className="p-4 drop-shadow-md overflow-y-scroll max-h-[90vh] min-w-[486px] rounded-xl bg-gray-50">
<h4 className=" text-gray-600 mb-4 font-semibold">{t("pinned_msg")}({pins.length})</h4>
{noPins ? (
<div className="flex flex-col items-center gap-2 w-full p-4">
<IconSurprise />
<div className="w-60 font-semibold text-gray-500 text-center">{t("pin_empty_tip")}</div>
</div>
) : (
<ul className="flex flex-col gap-2">
{pins.map((data) => {
return (
<li key={data.mid} className="group relative border border-solid border-slate-100 rounded-md ">
<PinnedMessage data={data} />
<div className="invisible group-hover:visible flex items-center gap-1 absolute top-1 right-1 p-1 border border-solid border-black/10 rounded-md">
{canPin && (
<button className="flex bg-none border-none" data-mid={data.mid} onClick={handleUnpin}>
<IconClose className="fill-slate-900" />
</button>
)}
</div>
</li>
);
})}
</ul>
)}
</Styled>
);
};
export default PinList;