checkWinner(id) {
        console.log(typeof id)
        console.log(id)
        console.log(typeof{[id]: Math.max(...Object.values(this.state))})
        console.log({[id]: Math.max(...Object.values(this.state))})
        return this.setState(state => {
            return JSON.stringify({
                [id]: Math.max(...Object.values(state))
            })
        })
    }checkWinner(id) {
        console.log(typeof id)
        console.log(id)
        console.log(typeof{[id]: Math.max(...Object.values(this.state))})
        console.log({[id]: Math.max(...Object.values(this.state))})
        return this.setState(state => {
            return JSON.stringify({
                [id.toString()]: Math.max(...Object.values(state))
            })
        })
    }        
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  function checkTicketsAvailable(data, time, numOfTicketBooked,number,food,format) {
    console.log('Выбираем билет...');
    return new  Promise((resolve, reject) => {
        setTimeout(() => {
            const setsAvailable = seats[data][time].freeSeats.length;
            if (setsAvailable >= numOfTicketBooked) {
                resolve(setsAvailable);
            } else {
                reject(`Мест на ${data} в ${time} нет`)
            }
        },2000);
    })
        .then(() => {
            console.log('Бронируем билеты...');
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    const checkFreeSeats = number.every((el) => seats[data][time].freeSeats.includes(el))
                    if (checkFreeSeats === true) {
                        resolve(checkFreeSeats)
                    } else {
                        reject(`На ${data} в ${time} места ${number} занято`)
                    }
                },1500)
            })
        })
        .then(() => {
            console.log('Проверяем можно ли в зал с едой...');
            return new Promise((resolve) => {
                setTimeout(() => {
                    if (food === true) {
                        console.log(`Сеанс ${data} в ${time} с едой можно`);
                    } else {
                        console.log(`Сеанс ${data} в ${time} с едой к сожалению нельзя`);
                    }
                    resolve(food);
                },3000)
            })
        })
        .then(() => {
            console.log('Выбираем формат фильма...');
            return new Promise((resolve) => {
                setTimeout(() => {
                    if (format === true) {
                        console.log(`Сеанс ${data} в ${time} будет в формате 3D`);
                    } else {
                         console.log(`Сеанс ${data} в ${time} будет в формате 2D`);
                    }
                    resolve(format);
                },4000)
            })
        })
}
async function bookTickets(data, time, numOfTicketBooked,number,food,format) {
    try {
        const availableSeats = await checkTicketsAvailable(data, time, numOfTicketBooked,number,food,format);
        console.log(`Вы забронировали на ${data}, ${numOfTicketBooked} билетов на ${time}, ваши места ${number}`)
    } catch (error) {
        console.log(error)
    } finally {
        console.log('Спасибо что выбрали наш кинотеатр !')
    }
}
bookTickets('2023-02-17','15:00',3,['11', '21','50'],false,false);        
  
  promise и async/await в данный код.seatsAvailable это количество свободных мест больше чемnumTicket это количество билетов которые я забронировал)        
  
  messageContainer.appendChild(textParagraph);textParagraph.appendChild(response.message);isMessageFromUser.appendChild(textParagraph);        
  
  textParagraphmessage.appendChild(textParagraph)        
  
  import express from 'express';
import { Server } from 'socket.io'
const PORT = 3000;
const app = express();
const options = {
  cors: true,
  origin: ['http://localhost:3000'],
}
const server = app.listen(PORT, () => {
  console.log('Сервер запустился!');
})
const io = new Server(server, options);
app.use(express.static('./dist'))
app.get('/', (req, res) => {
  res.sendFile("index.html");
})
const messages = {}
io.on('connection', socket => {
  socket.emit('добрый день', socket.id);
  socket.join('room1');
  socket.emit('messages', messages);
  socket.on('message', message => {
    io.to('room1').emit('receiveMessage', {
      userId: socket.id,
      message: message
    })
  })
  socket.on('editMessage', (data) => {
    if (messages[data.messageId]) {
      message[data.messageId].message = data.message;
    }
    io.to('room1').emit('updateMessage', {
      messageId: data.messageId,
      message: messages[data.messageId]
    });
  })
  socket.on('deleteMessage', messageId => {
    delete messages[messageId];
    io.to('room1').emit('removeMessage', messageId);
  })
})        
  
  product_button(Купить) при нажатие на которые появляются разные модальные окна product_congratulations. Я это реализовал таким образом if (event.target.tagName === 'BUTTON') {
        const currentParentDIV = document.querySelector('.wrapper_product').closest('.product');
        console.log(currentParentDIV);
        currentParentDIV.classList.toggle('active');
        setTimeout(() => {
            document.querySelectorAll('.active').forEach((activeEl) => {
                activeEl.classList.remove('active')
            })
        },3000);
    }product_button(Купить) родителю кнопки product добавляется класс active, следовательно если у родителя product есть класс active то должно появляться модальное окно product_congratulations.product_congratulations появляется только при нажатие на кнопку product_button(Купить) которая находиться в карточки iPhone, при нажатие на другие кнопки(Купить) в других карточках модальные окна не появляются.active добавляется кнопки product_button(Купить) а должен добавляться родителю кнопки product        
  
  active на button ?product или wrapper_product чтобы все работало.