You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.2 KiB
TypeScript
127 lines
3.2 KiB
TypeScript
import React from 'react';
|
|
import {
|
|
List,
|
|
Avatar,
|
|
Typography,
|
|
Button,
|
|
Space,
|
|
Result,
|
|
Tag,
|
|
} from '@arco-design/web-react';
|
|
import useLocale from '../../utils/useLocale';
|
|
import styles from './style/index.module.less';
|
|
|
|
export interface MessageItemData {
|
|
id: string;
|
|
title: string;
|
|
subTitle?: string;
|
|
avatar?: string;
|
|
content: string;
|
|
time?: string;
|
|
status: number;
|
|
tag?: {
|
|
text?: string;
|
|
color?: string;
|
|
};
|
|
}
|
|
|
|
export type MessageListType = MessageItemData[];
|
|
|
|
interface MessageListProps {
|
|
data: MessageItemData[];
|
|
unReadData: MessageItemData[];
|
|
onItemClick?: (item: MessageItemData, index: number) => void;
|
|
onAllBtnClick?: (
|
|
unReadData: MessageItemData[],
|
|
data: MessageItemData[]
|
|
) => void;
|
|
}
|
|
|
|
function MessageList(props: MessageListProps) {
|
|
const t = useLocale();
|
|
const { data, unReadData } = props;
|
|
|
|
function onItemClick(item: MessageItemData, index: number) {
|
|
if (item.status) return;
|
|
props.onItemClick && props.onItemClick(item, index);
|
|
}
|
|
|
|
function onAllBtnClick() {
|
|
props.onAllBtnClick && props.onAllBtnClick(unReadData, data);
|
|
}
|
|
|
|
return (
|
|
<List
|
|
noDataElement={<Result status="404" subTitle={t['message.empty.tips']} />}
|
|
footer={
|
|
<div className={styles.footer}>
|
|
<div className={styles['footer-item']}>
|
|
<Button type="text" size="small" onClick={onAllBtnClick}>
|
|
{t['message.allRead']}
|
|
</Button>
|
|
</div>
|
|
<div className={styles['footer-item']}>
|
|
<Button type="text" size="small">
|
|
{t['message.seeMore']}
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
}
|
|
>
|
|
{data.map((item, index) => (
|
|
<List.Item
|
|
key={item.id}
|
|
actionLayout="vertical"
|
|
style={{
|
|
opacity: item.status ? 0.5 : 1,
|
|
}}
|
|
>
|
|
<div
|
|
style={{
|
|
cursor: 'pointer',
|
|
}}
|
|
onClick={() => {
|
|
onItemClick(item, index);
|
|
}}
|
|
>
|
|
<List.Item.Meta
|
|
avatar={
|
|
item.avatar && (
|
|
<Avatar shape="circle" size={36}>
|
|
<img src={item.avatar} />
|
|
</Avatar>
|
|
)
|
|
}
|
|
title={
|
|
<div className={styles['message-title']}>
|
|
<Space size={4}>
|
|
<span>{item.title}</span>
|
|
<Typography.Text type="secondary">
|
|
{item.subTitle}
|
|
</Typography.Text>
|
|
</Space>
|
|
{item.tag && item.tag.text ? (
|
|
<Tag color={item.tag.color}>{item.tag.text}</Tag>
|
|
) : null}
|
|
</div>
|
|
}
|
|
description={
|
|
<div>
|
|
<Typography.Paragraph style={{ marginBottom: 0 }} ellipsis>
|
|
{item.content}
|
|
</Typography.Paragraph>
|
|
<Typography.Text type="secondary" style={{ fontSize: 12 }}>
|
|
{item.time}
|
|
</Typography.Text>
|
|
</div>
|
|
}
|
|
/>
|
|
</div>
|
|
</List.Item>
|
|
))}
|
|
</List>
|
|
);
|
|
}
|
|
|
|
export default MessageList;
|