import { v4 } from 'uuid'; import { useEffect, useState, useCallback } from 'react'; import Button from '../shared/button'; import { LotData, Datum } from '../../models/lotData.model'; import { dateSplitYear, dateSplitDays } from '../../utils/stringFormaters'; interface IProps { params: string; } const ShopTable = ({ params }: IProps) => { const [currentPage, setCurrentPage] = useState(1); const [lastPage, setLastPage] = useState(1); const [totalItems, setTotalItems] = useState(1); const [data, setData] = useState(); const [lots, setLots] = useState([]); const [err, setErr] = useState(false); const [dataFilter, setDataFilter] = useState('old'); const [smsNumber, setSmsNumber] = useState(); const [isFetching, setIsFetching] = useState(false); // To prevent redundant fetches const [socket, setSocket] = useState(null); const [isConnected, setIsConnected] = useState(false); // Fetch data when page or filter changes const fetchData = useCallback(async () => { if (isFetching) return; // Prevent duplicate fetches setIsFetching(true); try { const response = await fetch( `https://sms.turkmentv.gov.tm/api/shop/messages-by-code?page=${currentPage}`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ unique_code: params, sort_by_dt_descending: dataFilter === 'old' ? false : true, }), }, ); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const data: LotData = await response.json(); setErr(false); setData(data); setSmsNumber(data.data.unique_code); setLastPage(data.data.lot_sms_messages.meta.last_page); setTotalItems(data.data.lot_sms_messages.meta.total); // Efficiently manage lot state updates setLots( (prevLots) => currentPage === 1 ? [...data.data.lot_sms_messages.data] // Replace if first page : [...prevLots, ...data.data.lot_sms_messages.data], // Append otherwise ); } catch (error) { console.error(error); setErr(true); } finally { setIsFetching(false); } }, [currentPage, dataFilter, params, isFetching]); useEffect(() => { fetchData(); }, [currentPage, dataFilter, fetchData]); // WebSocket connection handling with cleanup // useEffect(() => { // let reconnectTimeout: NodeJS.Timeout | null = null; // let pingInterval: NodeJS.Timeout | null = null; // const connectWebSocket = () => { // if (!smsNumber) return; // const ws = new WebSocket(`wss://sms.turkmentv.gov.tm/ws/quiz?dst=${smsNumber}`); // setSocket(ws); // ws.onopen = () => { // console.log('WebSocket is connected'); // setIsConnected(true); // // Ping WebSocket every 25 seconds to keep connection alive // pingInterval = setInterval(() => { // if (ws.readyState === WebSocket.OPEN) { // ws.send(JSON.stringify({ type: 'ping' })); // } // }, 25000); // }; // ws.onmessage = (event) => { // try { // console.log('Message received from WebSocket:', event.data); // const message = JSON.parse(event.data); // // Handle received message if needed // } catch (error) { // console.error('Error processing message:', error); // } // }; // ws.onerror = (error) => { // console.error('WebSocket error:', error); // }; // ws.onclose = () => { // console.log('WebSocket closed, attempting to reconnect...'); // setIsConnected(false); // if (pingInterval) clearInterval(pingInterval); // // Attempt to reconnect after a delay // reconnectTimeout = setTimeout(connectWebSocket, 5000); // }; // return () => { // if (ws) ws.close(); // if (pingInterval) clearInterval(pingInterval); // if (reconnectTimeout) clearTimeout(reconnectTimeout); // }; // }; // const cleanup = connectWebSocket(); // return () => cleanup && cleanup(); // }, [smsNumber]); // Filter handler with memoization to prevent re-creation const filterClickHandler = useCallback((dataType: string) => { setDataFilter(dataType); setCurrentPage(1); }, []); return data?.data && !err ? (

{data?.data.seller_name}

{/*

Показать:

*/}
Telefon belgisi Kod Wagty
{lots.map((lot, index) => dataFilter === 'old' ? (
{index + 1} {lot.client} {lot.msg.toString()}
{dateSplitYear(lot.dt)} {dateSplitDays(lot.dt)}
) : (
{totalItems - index} {lot.client} {lot.msg}
{dateSplitYear(lot.dt)} {dateSplitDays(lot.dt)}
), )}
{currentPage !== lastPage ? ( ) : null}
) : err ? (

Kod nädogry

) : (
Loading...
); }; export default ShopTable;