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;