React.js – Тема 7 – Результат – Courses WebSkill

Слідкуйте за нами:

Тема 7. React.js Local Chat App

Створення Local Chat App

Створення Product Catalog React.js додатку, введення команд в консоль
D: або C: - переключення між дисками
cd - переходимо в необхідну вам папку
npx create-react-app назва додатку - створення нового React.js проєкту
npx create-react-app - сама команда створення
назва додатку - назва папки в якій буде додаток
cd назва додатку - переходимо в створену папку

Видаляємо непотрібні файли, чистимо index.js та App.js від непотрібних команд
Видаляємо файли: setupTests.js,repor,WebVitals.js,logo.svg,index.css,App.test.js
З файлу index.js видаляємо такі рядки
import './index.css'; import reportWebVitals from './reportWebVitals'; reportWebVitals();
Та коментарі: // If you want...
З файлу App.js видаляємо import logo from './logo.svg';
Тег <div className="app"> і все що всередині нього

В папці src залишаємо лише такі файли:
App.js, App.css, index.js
Одразу можете створити папку Components - папка для компонентів наших файлів

Скопіюйте стилізацію нижче та замініть її в файлі App.css

Стилізація App.css
/* app.css */
.chat-container {
  font-family: Arial, sans-serif;
  max-width: 400px;
  margin: 0 auto;
}

.messages-container {
  margin-bottom: 20px;
}

.message {
  padding: 8px;
  background-color: #f2f2f2;
  margin-bottom: 8px;
  border-radius: 4px;
}

.input-container {
  display: flex;
  align-items: center;
}

.message-input {
  flex: 1;
  padding: 8px;
  border-radius: 4px;
  margin-right: 8px;
  border: 1px solid #ccc;
}

.send-button {
  padding: 8px 16px;
  border-radius: 4px;
  background-color: #007bff;
  color: #fff;
  border: none;
  cursor: pointer;
}

Робимо заміну всієї стилізації в файлі App.css на свою, яку копіювали вище

Початок роботи із App.js та Chat.js

1. Створити новий компонент Chat.js, одразу підключіть та виведіть його в App.js

2. В файлі Chat.js потрібно вивести 2 стани: для збереження повідомлень користувачів та для введення нового повідомлення користувача.

3. Добавити 'useEffect' хуки один для завантаження, другий для зберігання повідомлень в локальному сховищі

4. Добавити 2 функції, одна для відправлення повідомлень, друга - для зміни стану нового повідомлення

App.js
// App.js
import React from 'react';
import Chat from './Components/Chat';
import './App.css';

const App = () => {
  return (
    <div>
      <h1 align="center">Local Chat App</h1>
      <Chat />
    </div>
  );
};

export default App;
Chat.js
// Chat.js
import React, { useState, useEffect } from 'react';

const Chat = () => {
  // Стан для збереження повідомлень користувачів
  const [messages, setMessages] = useState([]);
  // Стан для введення нового повідомлення користувача
  const [newMessage, setNewMessage] = useState('');

  // Ефект, який завантажує повідомлення з локального сховища при завантаженні компонента
  useEffect(() => {
    const storedMessages = JSON.parse(localStorage.getItem('chatMessages')) || [];
    setMessages(storedMessages);
  }, []);

  // Ефект, який зберігає повідомлення в локальному сховищі при їх зміні
  useEffect(() => {
    localStorage.setItem('chatMessages', JSON.stringify(messages));
  }, [messages]);

  // Функція для зміни стану нового повідомлення на основі введеного тексту
  const handleInputChange = (e) => {
    setNewMessage(e.target.value);
  };

  // Функція для відправлення повідомлення
  const handleSendMessage = () => {
    if (newMessage.trim() !== '') {
      // Додає нове повідомлення до списку повідомлень та очищує поле вводу
      setMessages([...messages, newMessage]);
      setNewMessage('');
    }
  };

  return (
    <div>
      <div>
        {/* Виведення списку повідомлень */}
        {messages.map((message, index) => (
          <div key={index}>{message}</div>
        ))}
      </div>
      <div>
        {/* Поле для введення тексту та кнопка для відправлення */}
        <input
          type="text"
          value={newMessage}
          onChange={handleInputChange}
          placeholder="Type a message..."
        />
        <button onClick={handleSendMessage}>Send</button>
      </div>
    </div>
  );
};

export default Chat;

Скріншоти усіх файлів в нашому додатку

Завдання 1

Перше завдання зв'язане з вдосконаленням коду, добавляючи вибір із повідомлень які можна відправити. 

1. Створіть список фіксованих фраз або шаблонів, які можна вставляти у поле введення повідомлення.
2. Відобразіть ці фрази для вибору у вигляді кнопок або випадаючого списку
3.Після вибору фрази вставте її у поле введення повідомлення

Завдання 2

Друге завдання зв'язане з вдосконаленням коду, добавляючи можливість видалення повідомлень із підтвердженням через модальне вікно.

1. Створіть компонент для pop up вікна, потрібно добавити в нього кнопки скасування та підтвердження видалення.
2. Добавити функції та стани:
   2.1 Функція для видалення повідомлення
   2.2
Функція для скасування видалення
   2.3
Функція для підтвердження видалення
   2.4
Стани для відкриття модального вікна підтвердження та індексу повідомлення, яке потрібно видалити
3. Добавити кнопку видалення з викликом функції для видалення повідомлення та модальне вікно підтвердження видалення в return();
4.
Переглянути або скопіювати стилізацію можна нижче, використовуйте її як приклад

App.css
/* Стилі для Завдання 2 */

.predefined-messages {
  margin-right: 8px;
  margin-bottom: 8px;
  padding: 6px 10px;
  background-color: #f0f0f0;
  border: 1px solid #ccc;
  border-radius: 4px;
  cursor: pointer;
}

.message {
  display: flex;
  justify-content: space-between;
  align-items: center;
  border: 1px solid #ccc;
  padding: 8px;
  margin-bottom: 8px;
}

.delete-button {
  padding: 6px 10px;
  background-color: #ff6347;
  color: #fff;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}
/* Стилі для модального попап вікна підтвердження видалення повідомлення */
.confirmation-popup {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  display: flex;
  justify-content: center;
  align-items: center;
}

.confirmation-content {
  background-color: #fff;
  padding: 20px;
  border-radius: 8px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
  text-align: center;
}

.confirmation-content p {
  margin-bottom: 20px;
}

.confirmation-buttons button {
  margin: 0 10px;
  padding: 8px 16px;
  border-radius: 4px;
  cursor: pointer;
}

.confirmation-buttons button:first-child {
  background-color: #ccc;
  color: #000;
}

.confirmation-buttons button:last-child {
  background-color: #ff6347;
  color: #fff;
}

Завдання 3

Третє завдання зв'язане з вдосконаленням коду, добавляючи входу в чат використовуючи ім'я або нік а також відображення імені при надсиланні повідомлення.

1. Створіть компонент з інформацією про користувача, потрібно добавити в нього стани для збереження значень імені та електронної пошти
2. Добавити функції в новий компонент:
   2.1 Функція, яка викликається при зміні значення поля введення імені і таку ж для електронної пошти
   2.2 Функція, яка викликається при кліку на кнопку "Start Chat"(Перевіряє, чи введено ім'я та електронну пошту перед викликом функції onStartChat)
   2.3 Поля введення для імені та електронної пошти
   2.4 Кнопка для початку чату
3. Переглянути або скопіювати стилізацію можна нижче, використовуйте її як приклад

1. Змінити функцію для відправлення повідомлень handleSendMessage, щоб відображати ім'я, хто надіслав повідомлення
2. Добавити рядок  для показу імені в блок в
ідображення повідомлень користувачів

1. Стани для відображення чату та збереження імені та електронної пошти користувача
2. Функція, яка викликається при початку чату:
   2.1 Зберігає ім'я користувача
   2.2 Зберігає електронну пошту користувача
   2.3 Показує компонент чату
3. Обгортка для центрування контенту
4. Умовний оператор для відображення форми введення даних або чату
5.
Компонент для введення даних користувача
6. Компонент чату

App.css
/* Стилі для Завдання 3 */

/* Стилі для форми введення інформації користувача */
.user-info-form {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 20px;
  border: 1px solid #ccc;
  border-radius: 8px;
  background-color: #f9f9f9;
}

.user-info-form input {
  margin-bottom: 10px;
  padding: 8px;
  width: 250px;
  border-radius: 4px;
  border: 1px solid #ccc;
}

.user-info-form button {
  padding: 10px 20px;
  border: none;
  border-radius: 4px;
  background-color: #007bff;
  color: #fff;
  cursor: pointer;
  transition: background-color 0.3s ease;
}

.user-info-form button:hover {
  background-color: #0056b3;
}

Завдання 1. Список фіксованих фраз

Chat.js

// Chat.js
import React, { useState, useEffect } from 'react';

const Chat = () => {
// Стан для збереження повідомлень користувачів
const [messages, setMessages] = useState([]);
// Стан для введення нового повідомлення користувача
const [newMessage, setNewMessage] = useState('');

// Масив із зазначеними заздалегідь повідомленнями
const predefinedMessages = [
'Hello!',
'How are you?',
'Nice to meet you.',
// Додайте інші фрази
];

// Функція, яка встановлює нове повідомлення після кліку на попередньо визначене повідомлення
const handlePredefinedMessageClick = (message) => {
setNewMessage(message);
};

// Ефект, який завантажує повідомлення з локального сховища при завантаженні компонента
useEffect(() => {
const storedMessages = JSON.parse(localStorage.getItem('chatMessages')) || [];
setMessages(storedMessages);
}, []);

// Ефект, який зберігає повідомлення в локальному сховищі при їх зміні
useEffect(() => {
localStorage.setItem('chatMessages', JSON.stringify(messages));
}, [messages]);

// Функція для зміни стану нового повідомлення на основі введеного тексту
const handleInputChange = (e) => {
setNewMessage(e.target.value);
};

// Функція для відправлення повідомлення
const handleSendMessage = () => {
if (newMessage.trim() !== '') {
// Додає нове повідомлення до списку повідомлень та очищує поле вводу
setMessages([...messages, newMessage]);
setNewMessage('');
}
};

return (
<div className="chat-container">
{/* Відображення повідомлень користувачів */}
<div className="messages-container">
{messages.map((message, index) => (
<div key={index} className="message">
{message}
</div>
))}
</div>

{/* Відображення кнопок для попередньо визначених повідомлень */}
<div className="predefined-messages">
{predefinedMessages.map((message, index) => (
<button key={index} onClick={() => handlePredefinedMessageClick(message)}>
{message}
</button>
))}
</div>

{/* Інтерфейс для введення нового повідомлення */}
<div className="input-container">
<input
type="text"
value={newMessage}
onChange={handleInputChange}
placeholder="Type a message..."
className="message-input"
/>
<button onClick={handleSendMessage} className="send-button">
Send
</button>
</div>
</div>
);
};

export default Chat;

1. Список фіксованих фраз або шаблонів:

const predefinedMessages = [
'Hello!',
'How are you?',
'Nice to meet you.',
// Додайте інші фрази
];

2. Відобразіть ці фрази для вибору у вигляді кнопок або випадаючого списку:

<div className="predefined-messages">
{predefinedMessages.map((message, index) => (
<button key={index} onClick={() => handlePredefinedMessageClick(message)}>
{message}
</button>

))}
</div>

3. Після вибору фрази вставте її у поле введення повідомлення:

const handlePredefinedMessageClick = (message) => {
setNewMessage(message);
};

Завдання 2. Можливість видалення повідомлень

Chat.js
// Chat.js
import React, { useState, useEffect } from 'react';
import ConfirmationPopup from './ConfirmationPopup'; // Імпорт компонента підтвердження видалення

const Chat = () => {
  // Стан для збереження повідомлень користувачів
  const [messages, setMessages] = useState([]);
  // Стан для введення нового повідомлення користувача
  const [newMessage, setNewMessage] = useState('');

  // Масив із зазначеними заздалегідь повідомленнями
  const predefinedMessages = [
    'Hello!',
    'How are you?',
    'Nice to meet you.',
    // Додайте інші фрази
  ];
 
  // Функція, яка встановлює нове повідомлення після кліку на попередньо визначене повідомлення
  const handlePredefinedMessageClick = (message) => {
    setNewMessage(message);
  };

  // Функція для видалення повідомлення
  const handleDeleteMessage = (index) => {
    // Встановлюємо індекс повідомлення, яке потрібно видалити
    setDeleteIndex(index);
    // Відкриваємо модальне вікно підтвердження видалення
    setIsConfirmationOpen(true);
  };
 
  // Стани для відкриття модального вікна підтвердження та індексу повідомлення, яке потрібно видалити
  const [isConfirmationOpen, setIsConfirmationOpen] = useState(false);
  const [deleteIndex, setDeleteIndex] = useState(null);

  // Функція для скасування видалення
  const handleCancelDelete = () => {
      setIsConfirmationOpen(false);
  };

  // Функція для підтвердження видалення
  const handleConfirmDelete = () => {
      // Копіюємо масив повідомлень
      const updatedMessages = [...messages];
      // Видаляємо повідомлення за індексом deleteIndex
      updatedMessages.splice(deleteIndex, 1);
      // Встановлюємо оновлений масив повідомлень та закриваємо модальне вікно
      setMessages(updatedMessages);
      setIsConfirmationOpen(false);
  };
 
  // Ефект, який завантажує повідомлення з локального сховища при завантаженні компонента
  useEffect(() => {
    const storedMessages = JSON.parse(localStorage.getItem('chatMessages')) || [];
    setMessages(storedMessages);
  }, []);

  // Ефект, який зберігає повідомлення в локальному сховищі при їх зміні
  useEffect(() => {
    localStorage.setItem('chatMessages', JSON.stringify(messages));
  }, [messages]);

  // Функція для зміни стану нового повідомлення на основі введеного тексту
  const handleInputChange = (e) => {
    setNewMessage(e.target.value);
  };

  // Функція для відправлення повідомлення
  const handleSendMessage = () => {
    if (newMessage.trim() !== '') {
      setMessages([...messages, newMessage]);
      setNewMessage('');
    }
  };

  return (
    <div className="chat-container">
      {/* Відображення повідомлень користувачів */}
      <div className="messages-container">
        {messages.map((message, index) => (
          <div key={index} className="message">
            {message}
            {/* Кнопка видалення з викликом функції для видалення повідомлення */}
            <button onClick={() => handleDeleteMessage(index)} className='delete-button'>Delete</button>
          </div>
        ))}
      </div>
      {/* Модальне вікно підтвердження видалення */}
      <ConfirmationPopup
        isOpen={isConfirmationOpen}
        message="Are you sure you want to delete this message?"
        onCancel={handleCancelDelete}
        onConfirm={handleConfirmDelete}
      />
      {/* Відображення кнопок для попередньо визначених повідомлень */}
      <div className="predefined-messages">
        {predefinedMessages.map((message, index) => (
          <button key={index} onClick={() => handlePredefinedMessageClick(message)}>
            {message}
          </button>
        ))}
      </div>

      {/* Інтерфейс для введення нового повідомлення */}
      <div className="input-container">
        <input
          type="text"
          value={newMessage}
          onChange={handleInputChange}
          placeholder="Type a message..."
          className="message-input"
        />
        <button onClick={handleSendMessage} className="send-button">
          Send
        </button>
      </div>
    </div>
  );
};

export default Chat;
App.css
/* Стилі для Завдання 2 */

 

.predefined-messages {
  margin-right: 8px;
  margin-bottom: 8px;
  padding: 6px 10px;
  background-color: #f0f0f0;
  border: 1px solid #ccc;
  border-radius: 4px;
  cursor: pointer;
}

 

.message {
  display: flex;
  justify-content: space-between;
  align-items: center;
  border: 1px solid #ccc;
  padding: 8px;
  margin-bottom: 8px;
}

 

.delete-button {
  padding: 6px 10px;
  background-color: #ff6347;
  color: #fff;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}
/* Стилі для модального попап вікна підтвердження видалення повідомлення */
.confirmation-popup {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  display: flex;
  justify-content: center;
  align-items: center;
}

 

.confirmation-content {
  background-color: #fff;
  padding: 20px;
  border-radius: 8px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
  text-align: center;
}

 

.confirmation-content p {
  margin-bottom: 20px;
}

 

.confirmation-buttons button {
  margin: 0 10px;
  padding: 8px 16px;
  border-radius: 4px;
  cursor: pointer;
}

 

.confirmation-buttons button:first-child {
  background-color: #ccc;
  color: #000;
}

 

.confirmation-buttons button:last-child {
  background-color: #ff6347;
  color: #fff;
}
ConfirmationPopup.js
const ConfirmationPopup = ({ isOpen, message, onCancel, onConfirm }) => {
    return (
      isOpen && (
        <div className="confirmation-popup">
          <div className="confirmation-content">
            <p>{message}</p>
            <div className="confirmation-buttons">
              <button onClick={onCancel}>Cancel</button>
              <button onClick={onConfirm}>Confirm</button>
            </div>
          </div>
        </div>
      )
    );
  };

export default ConfirmationPopup;

Друге завдання зв'язане з вдосконаленням коду, добавляючи можливість видалення повідомлень із підтвердженням через модальне вікно.

1. Створено компонент ConfirmationPopup для pop up вікна, потрібно добавити в нього кнопки скасування та підтвердження видалення.
2. Добавлені функції та стани:
2.1 Функція для видалення повідомлення
2.2
Функція для скасування видалення
2.3
Функція для підтвердження видалення
2.4
Стани для відкриття модального вікна підтвердження та індексу повідомлення, яке потрібно видалити
3. Добавлено кнопку видалення з викликом функції для видалення повідомлення та модальне вікно підтвердження видалення в return();
4. 
Оновлено стилізацію

Завдання 3. Авторизація із показом відправника повідомлень

Chat.js
// Chat.js
import React, { useState, useEffect } from 'react';
import ConfirmationPopup from './ConfirmationPopup'; // Імпорт компонента підтвердження видалення

 

const Chat = ({ userName }) => {
  // Стан для збереження повідомлень користувачів
  const [messages, setMessages] = useState([]);
  // Стан для введення нового повідомлення користувача
  const [newMessage, setNewMessage] = useState('');

 

  // Масив із зазначеними заздалегідь повідомленнями
  const predefinedMessages = [
    'Hello!',
    'How are you?',
    'Nice to meet you.',
    // Додайте інші фрази
  ];
 
  // Функція, яка встановлює нове повідомлення після кліку на попередньо визначене повідомлення
  const handlePredefinedMessageClick = (message) => {
    setNewMessage(message);
  };

 

  // Функція для видалення повідомлення
  const handleDeleteMessage = (index) => {
    const updatedMessages = [...messages];
    updatedMessages[index].isDeleted = true;
    setMessages(updatedMessages);
    // Встановлюємо індекс повідомлення, яке потрібно видалити
    setDeleteIndex(index);
    // Відкриваємо модальне вікно підтвердження видалення
    setIsConfirmationOpen(true);
  };
 
  // Стани для відкриття модального вікна підтвердження та індексу повідомлення, яке потрібно видалити
  const [isConfirmationOpen, setIsConfirmationOpen] = useState(false);
  const [deleteIndex, setDeleteIndex] = useState(null);

 

  // Функція для скасування видалення
  const handleCancelDelete = () => {
      setIsConfirmationOpen(false);
  };

 

  // Функція для підтвердження видалення
  const handleConfirmDelete = () => {
      // Копіюємо масив повідомлень
      const updatedMessages = [...messages];
      // Видаляємо повідомлення за індексом deleteIndex
      updatedMessages.splice(deleteIndex, 1);
      // Встановлюємо оновлений масив повідомлень та закриваємо модальне вікно
      setMessages(updatedMessages);
      setIsConfirmationOpen(false);
  };
 
  // Ефект, який завантажує повідомлення з локального сховища при завантаженні компонента
  useEffect(() => {
    localStorage.setItem('chatMessages', JSON.stringify(messages));
  }, [messages]);
 
  useEffect(() => {
    const storedMessages = JSON.parse(localStorage.getItem('chatMessages')) || [];
    storedMessages.forEach((msg) => {
      msg.isDeleted = false; // Додаємо поле isDeleted для кожного повідомлення
    });
    setMessages(storedMessages);
  }, []);

 

  // Функція для зміни стану нового повідомлення на основі введеного тексту
  const handleInputChange = (e) => {
    setNewMessage(e.target.value);
  };

 

  // Функція для відправлення повідомлення
  const handleSendMessage = () => {
    if (newMessage.trim() !== '') {
      setMessages([...messages, { text: newMessage, user: userName }]);
      setNewMessage('');
    }
  };

 

  return (
    <div className="chat-container">
      {/* Відображення повідомлень користувачів */}
      <div className="messages-container">
        {messages.map((message, index) => (
          <div key={index} className="message">
            <span className="user-name">{message.user}: </span>
            <span>{message.text}</span>
            {/* Кнопка видалення з викликом функції для видалення повідомлення */}
            <button onClick={() => handleDeleteMessage(index)} className='delete-button'>Delete</button>
          </div>
        ))}
      </div>
      {/* Модальне вікно підтвердження видалення */}
      <ConfirmationPopup
        isOpen={isConfirmationOpen}
        message="Are you sure you want to delete this message?"
        onCancel={handleCancelDelete}
        onConfirm={handleConfirmDelete}
      />
      {/* Відображення кнопок для попередньо визначених повідомлень */}
      <div className="predefined-messages">
        {predefinedMessages.map((message, index) => (
          <button key={index} onClick={() => handlePredefinedMessageClick(message)}>
            {message}
          </button>
        ))}
      </div>

 

      {/* Інтерфейс для введення нового повідомлення */}
      <div className="input-container">
        <input
          type="text"
          value={newMessage}
          onChange={handleInputChange}
          placeholder="Type a message..."
          className="message-input"
        />
        <button onClick={handleSendMessage} className="send-button">
          Send
        </button>
      </div>
    </div>
  );
};

 

export default Chat;
App.js
// App.js

// Імпорт необхідних модулів React та компонентів
import React, { useState } from 'react';
import './App.css'; // Імпорт стилів для цього компонента
import Chat from './Components/Chat'; // Припустимо, що у вас є компонент Chat
import UserInfoForm from './Components/UserInfoForm'; // Компонент для введення імені та електронної пошти

// Основний компонент App, що містить у собі весь вміст сторінки
const App = () => {
  // Стани для відображення чату та збереження імені та електронної пошти користувача
  const [showChat, setShowChat] = useState(false);
  const [userName, setUserName] = useState('');
  const [userEmail, setUserEmail] = useState('');

  // Функція, яка викликається при початку чату
  const handleStartChat = (name, email) => {
    setUserName(name); // Зберігає ім'я користувача
    setUserEmail(email); // Зберігає електронну пошту користувача
    setShowChat(true); // Показує компонент чату
  };

  return (
    <div className="app" align="center"> {/* Обгортка для центрування контенту */}
      <h1 align="center">Local Chat App</h1> {/* Заголовок додатку */}
      {/* Умовний оператор для відображення форми введення даних або чату */}
      {!showChat ? (
        <UserInfoForm onStartChat={handleStartChat} /> // Компонент для введення даних користувача
      ) : (
        <Chat userName={userName} userEmail={userEmail} /> // Компонент чату, якщо showChat = true
      )}
    </div>
  );
};

export default App; // Експорт компоненту App для використання в інших частинах додатку
UserInfoForm.js
// UserInfoForm.js

// Імпорт необхідних модулів React та useState з React
import React, { useState } from 'react';

// Компонент форми для введення імені та електронної пошти користувача
const UserInfoForm = ({ onStartChat }) => {
  // Стани для збереження значень імені та електронної пошти, початкові значення - пусті рядки
  const [name, setName] = useState('');
  const [email, setEmail] = useState('');

  // Функція, яка викликається при зміні значення поля введення імені
  const handleNameChange = (e) => {
    setName(e.target.value); // Оновлює значення імені при зміні в полі введення
  };

  // Функція, яка викликається при зміні значення поля введення електронної пошти
  const handleEmailChange = (e) => {
    setEmail(e.target.value); // Оновлює значення електронної пошти при зміні в полі введення
  };

  // Функція, яка викликається при кліку на кнопку "Start Chat"
  const handleStartChat = () => {
    // Перевіряє, чи введено ім'я та електронну пошту перед викликом функції onStartChat
    if (name && email) {
      onStartChat(name, email); // Викликає функцію onStartChat з введеними даними
    }
  };

  return (
    <div className="user-info-form">
      {/* Поля введення для імені та електронної пошти */}
      <input
        type="text"
        placeholder="Your Name"
        value={name}
        onChange={handleNameChange} // Викликається при зміні значення поля імені
      />
      <input
        type="email"
        placeholder="Your Email"
        value={email}
        onChange={handleEmailChange} // Викликається при зміні значення поля електронної пошти
      />
      {/* Кнопка для початку чату */}
      <button onClick={handleStartChat}>Start Chat</button>
    </div>
  );
};

export default UserInfoForm; // Експорт компонента UserInfoForm для використання в інших частинах додатку
 

Прокоментовано усі вище показані файли, якщо діти швидко справляться із завданнями, можна добавити декілька додаткових:
1. Можливість зміни користувача який вводить повідомлення
2. Можливість перегляду історії повідомлень
3. Можливість добавлення смайликів в чат

Copyright © 2023 Courses WebSkill | Powered by WebSkill
Scroll to Top