import { ESendStatus, ISend, ISendData } from '../../../electron/types/message'; import { Button, Header, Icon, Label, List } from 'semantic-ui-react'; import React, { useEffect, useRef, useState } from 'react'; import { Apis } from '../../../electron/types/apis'; interface ISendRowProps { data: ISend; isActive: boolean; } export const STORAGE_KEY = 'sendList'; const SendRow = ({ data, isActive }: ISendRowProps): JSX.Element => { return ( {(() => { switch (data.status) { case ESendStatus.FAILED: return ; case ESendStatus.SENDING: return ; case ESendStatus.WAIT: return isActive ? ( ) : ( ); case ESendStatus.SUCCESS: return ; default: return ''; } })()} {data.value} {(() => { switch (data.status) { case ESendStatus.FAILED: return 'ส่งไม่สำเร็จ'; case ESendStatus.SENDING: return 'กำลังส่ง'; case ESendStatus.SUCCESS: return 'สำเร็จแล้ว'; case ESendStatus.WAIT: return 'รอดำเนินการ'; default: return '-'; } })()} {data.error && ( )} ); }; interface ISendPageProps { sendData: ISendData; onBack: () => void; } export const SendPage = ({ sendData, onBack }: ISendPageProps): JSX.Element => { const [list, setList] = useState(sendData.list); const [status, setStatus] = useState<'active' | 'wait'>('wait'); const refStatus = useRef('wait'); const refList = useRef(sendData.list); const start = () => { setStatus('active'); refStatus.current = 'active'; sendMessage(); }; useEffect(() => { refStatus.current = status; refList.current = list; }); useEffect(() => { window.localStorage.setItem(STORAGE_KEY, JSON.stringify({ ...sendData, list })); }, [list]); const setListByValue = (value: string, newData: ISend) => { setList((prevState) => { return prevState.map((v) => { if (v.value === value) { return newData; } return v; }); }); }; const sendMessage = async () => { const target = refList.current.find((v) => v.status === ESendStatus.WAIT); if (target && refStatus.current === 'active') { try { setListByValue(target.value, { ...target, status: ESendStatus.SENDING }); await window.ipcRenderer.invoke( Apis.SEND_MESSAGE, target.value, sendData.messages, ); setListByValue(target.value, { ...target, error: undefined, status: ESendStatus.SUCCESS, }); } catch (e) { setListByValue(target.value, { ...target, error: e.message, status: ESendStatus.FAILED, }); } setTimeout(() => { sendMessage(); }); } else { stop(); } }; const stop = () => { setStatus('wait'); refStatus.current = 'wait'; }; return (
รายการส่งข้อความ
{status === 'wait' && ( )} {status === 'active' && ( )}
{list.map((v) => ( ))}
); }; export default SendPage;