profile + summerize

This commit is contained in:
hamid zarghami
2025-07-24 17:17:55 +03:30
parent d8726db44e
commit cc744ebac9
24 changed files with 1063 additions and 20 deletions
+2 -2
View File
@@ -25,10 +25,10 @@ const Favorite: FC<{ flagged: boolean, id: string, mailbox: string }> = ({ flagg
}, [flagged])
return (
<div className="inline-block mt-[3px] relative -right-6" onClick={handleFavoriteClick}>
<div onClick={handleFavoriteClick}>
<Star1
variant={isFavorite ? 'Bold' : 'Outline'}
size={18}
size={19}
color={isFavorite ? '#FFC107' : '#8C90A3'}
className='cursor-pointer select-none'
/>
@@ -0,0 +1,77 @@
import { FC, useState } from 'react'
import { useSummarizeEmail } from '../hooks/useEmailData';
import DefaulModal from '@/components/DefaulModal';
import Button from '@/components/Button';
import { InboxMessage } from '@/pages/draft/types/DraftTypes';
const Summerize: FC<{ id: string, mailbox: string, item: InboxMessage }> = ({ id, mailbox, item }) => {
const [open, setOpen] = useState(false)
const { mutate: summarizeEmail } = useSummarizeEmail();
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const [data, setData] = useState<any>()
const handleSummarizeEmail = () => {
summarizeEmail({ messageId: Number(id), mailbox }, {
onSuccess: (data) => {
setData(data)
}
});
setOpen(true)
};
console.log('data', data);
return (
<div>
<div onClick={handleSummarizeEmail}>
S
</div>
<DefaulModal
open={open}
close={() => setOpen(false)}
isHeader
title_header='پیش نمایش ایمیل'
>
<div className='mt-5'>
<div className='text-xs'>
موضوع:
</div>
<div className='mt-1.5 text-xs'>
{item.subject}
</div>
<div className='mt-7'>
<div className='text-xs'>
خلاصه متن:
</div>
<div className='mt-3 leading-5 text-xs text-description'>
{data?.data?.summary}
</div>
</div>
<div className='mt-14 flex justify-end'>
<div className='flex gap-3'>
<Button
label='بستن'
variant='secondary'
className='w-fit !px-10'
onClick={() => setOpen(false)}
/>
<Button
label='مشاهده'
className='w-fit !px-10'
onClick={() => {
}}
/>
</div>
</div>
</div>
</DefaulModal>
</div>
)
}
export default Summerize
+15 -7
View File
@@ -12,6 +12,7 @@ import { formatDate } from '@/config/func';
import MarkAsRead from '@/assets/images/mark_as_read.svg'
import { useEmailActions } from '@/hooks/useEmailActions';
import Favorite from './Components/Favorite';
import Summerize from './Components/Summerize';
const List: FC = () => {
const navigate = useNavigate();
@@ -30,13 +31,6 @@ const List: FC = () => {
const [selectedMessages, setSelectedMessages] = useState<InboxMessage[]>([]);
const columns: ColumnType<InboxMessage>[] = [
{
key: 'flagged',
title: 'علامت گذاری',
render: (item) => (
<Favorite flagged={item.flagged} id={item.id.toString()} mailbox={item.mailbox} />
)
},
{
key: 'subject',
title: 'عنوان پیام',
@@ -144,6 +138,19 @@ const List: FC = () => {
setSelectedMessages([]);
};
const getInlineActions = (item: InboxMessage) => [
{
icon: <Favorite flagged={item.flagged} id={item.id.toString()} mailbox={item.mailbox} />,
onClick: () => { }, // عملیات در کامپوننت Favorite خودش انجام می‌شود
tooltip: item.flagged ? 'حذف از علاقه‌مندی‌ها' : 'اضافه به علاقه‌مندی‌ها'
},
{
icon: <Summerize item={item} id={item.id.toString()} mailbox={item.mailbox} />,
onClick: () => { }, // عملیات در کامپوننت Summerize خودش انجام می‌شود
tooltip: 'خلاصه‌سازی'
}
];
const getRowActions = (message: InboxMessage): RowActionItem[] => [
{
label: message.seen ? 'علامت‌گذاری به عنوان خوانده نشده' : 'علامت‌گذاری به عنوان خوانده شده',
@@ -215,6 +222,7 @@ const List: FC = () => {
</div>
}
selectable={true}
inlineActions={getInlineActions}
rowActions={getRowActions}
pagination={pager ? {
totalPages: pager.totalPages,
+7 -1
View File
@@ -1,6 +1,6 @@
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import * as api from '../service/EmailService';
import { SendEmailDto, MessageListQueryDto, SingleActionRequest } from '../types/Types';
import { SendEmailDto, MessageListQueryDto, SingleActionRequest, SummarizeEmailRequest } from '../types/Types';
export const useSendEmail = () => {
return useMutation({
@@ -118,4 +118,10 @@ export const useDownloadAttachment = () => {
mutationFn: ({ messageId, attachmentId, mailbox }: { messageId: string; attachmentId: string; mailbox: string }) =>
api.downloadAttachment(messageId, attachmentId, mailbox),
});
};
export const useSummarizeEmail = () => {
return useMutation({
mutationFn: (params: SummarizeEmailRequest) => api.summarizeEmail(params),
});
};
@@ -6,6 +6,7 @@ import {
InboxResponse,
MessageDetailResponse,
MessageDetail,
SummarizeEmailRequest,
} from "../types/Types";
export const sendEmail = async (params: SendEmailDto) => {
@@ -149,3 +150,8 @@ export const downloadAttachment = async (
);
return response.data;
};
export const summarizeEmail = async (params: SummarizeEmailRequest) => {
const { data } = await axios.post(`/ai-assistant/summarize-email`, params);
return data;
};
+7
View File
@@ -314,3 +314,10 @@ export interface SingleActionRequest {
messageId: string;
mailbox: string;
}
export interface SummarizeEmailRequest {
messageId: number;
mailbox: string;
length?: "medium" | "short" | "long";
tone?: "professional" | "casual" | "formal";
}