
рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЯреАрдо / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ / рджреЛрд╕реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреИрдЯ рдХреИрд╕реЗ рдХрд░реЗрдВ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдкрдХрд╛ рдмреИрдХрдПрдВрдб рдирд╣реАрдВ рд╣реИ рдпрд╛ рдЖрдк рдЗрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдирд╣реАрдВ рдмрд┐рддрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреЗрдХреНрд╕реНрдЯ рдЪреИрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕рдореЗрдВ рд╣рдореЗрдВ рд▓рдЧрднрдЧ рдПрдХ рдШрдВрдЯрд╛ рд▓рдЧреЗрдЧрд╛ред
рдмреИрдХрдПрдВрдб рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрд╢реАрд▓ рдиреЗрдЯрд╡рд░реНрдХ рдЪреИрдЯ рд▓рд┐рдЦрдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИ, рдпрд╣ рдПрдХ рдлреЙрд░реНрдо рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЪреИрдЯрд┐рдХреНрд╕ рдФрд░ рдЙрд╕рдХреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрд╕рдбреАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЪреИрдЯрд┐рдХреНрд╕ рдФрд░ рдПрд╕рдбреАрдХреЗ рд╕рдВрджреЗрд╢ рднрдВрдбрд╛рд░рдг рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд▓рдЧреЗ рд░рд╣реЗрдВрдЧреЗ, рдФрд░ рд╣рдо рдлреНрд░рдВрдЯ-рдПрдВрдб рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред
рддреИрдпрд╛рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ
рдбреЗрдореЛ
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛
- рдЕрдиреБрдкреНрд░рдпреЛрдЧ (рдЖрд╡реЗрджрди рдХрд╛ рдореВрд▓ рдШрдЯрдХ, рдПрдХ рд░рд╛рдЬреНрдп рд╕рдВрд░рдХреНрд╖рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкрд╛рда рдореЗрдВ рд╣рдо Redux рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд░рд╛рдЬреНрдп рдХрд╛рд░реНрдпрд╛рд▓рдп рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗ)
- рд╣реЗрдбрд░ (рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╣реЗрдбрд░ рдЬреЛ рд▓реЛрдЧреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЪреИрдЯ рдХрд╛ рдирд╛рдо рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдкрдирд╛ рдирд╛рдо рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ)
- LogoHeader
- RoomTitle
- рдореБрдЦреНрдп
- рд╕рджрд╕реНрдп рд╕реВрдЪреА (рдЪреИрдЯ рд╕реВрдЪреА)
- рдЪреИрдЯрдлрд┐рд▓реНрдб (рдЪреИрдЯ рд╕рдВрджреЗрд╢реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░)
- MessageContainer
- рд╕рдВрджреЗрд╢ [] (рд╕рдВрджреЗрд╢ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐; рдЗрд╕ рдкрд╛рда рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдкрд╛рда рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ)
- SendMessageForm (рдПрдХ рдирдпрд╛ рдЪреИрдЯ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реЙрд░реНрдо)
- ChatixSDK (рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдкреНрд░рдореБрдЦ рдШрдЯрдХ)
рд░рд╛рдЬреНрдп рднрдВрдбрд╛рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реВрдЪрдирд╛ред рдмреЗрд╢рдХ, рдпрд╣рд╛рдВ Redux рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рдордп рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд░рд╛рдЬреНрдп рдХреЛ рдРрдк рдХреЗ рдореВрд▓ рдШрдЯрдХ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдмрд╛рд▓ рдШрдЯрдХреЛрдВ рдХреЛ рдбреЗрдЯрд╛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдирдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ рдмрд╛рд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдореЗрдВ рдЪреИрдЯ рдХрд╛ рдирд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдРрдк рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рд╣реЗрдЬ рд▓реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ App тЖТ Header тЖТ RoomTitle
рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ: App тЖТ Header тЖТ RoomTitle
ред рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдИ рд╕рдВрджреЗрд╢ рд▓рд┐рдЦрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЙрд╕реЗ SendMessageForm рд╕реЗ рдРрдк рдореЗрдВ SendMessageForm тЖТ ChatField тЖТ Main тЖТ App
: SendMessageForm тЖТ ChatField тЖТ Main тЖТ App
ред
рд╣рдорд╛рд░реА рдЪреИрдЯ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд
рд╣рдорд╛рд░реЗ рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдбреЗрдЯрд╛ рдкреНрд░реЗрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдм рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░реЗрдВрдЧреЗред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдореБрдЦреНрдп рдШрдЯрдХ App
, рдЬреЛ рдмрд╛рд▓ рдШрдЯрдХреЛрдВ рдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХрд╛рд░рдг, рд╣рдо рдмрд╕ prop
рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрдЪреНрдЪрд╛ рдШрдЯрдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдЧрд╛), рдФрд░ рдмрдЪреНрдЪреЗ рдШрдЯрдХ рдХреНрд░рдорд┐рдХ рддрд░реАрдХреЗ рд╕реЗ App
рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЙрддреНрдкрд╛рджрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП), рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рдмрдХ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧрд╛ред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг
рджреГрд╢реНрдп рдШрдЯрдХ рдмрдирд╛рдПрдБ
рдЯреЛрдкреА
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо create-react-app рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
npx create-react-app chatix-chatroom cd chatix-chatroom
рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪрд▓рд╛рдПрдБ
npm start
рд╣реЗрдбрд░ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢реАрд░реНрд╖рд▓реЗрдЦ рдореЗрдВ рдПрдХ рд▓реЛрдЧреЛ рдЬреЛрдбрд╝реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, src рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░, рдШрдЯрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ, рдФрд░ рдЗрд╕рдореЗрдВ logo_header рдлрд╝реЛрд▓реНрдбрд░ред рд╣рдо рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓реЛрдЧреЛ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ 2 LogoHeader.js рдФрд░ LogoHeader.css рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВ
LogoHeader.js
import React from 'react' import logo from './chatix_logo.svg'; import './LogoHeader.css'; function LogoHeader(){ return ( <div className="LogoHeader"> <img src={logo} className="App-logo" alt="Chatix logo" /> </div> ); } export default LogoHeader;
LogoHeader.css
.LogoHeader{ flex-basis: 200px; flex-grow: 0; flex-shrink: 0; }
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЗрд╕ рдШрдЯрдХ рдореЗрдВ рдПрдХ рд▓реЛрдЧреЛ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрд╕ рдЖрдпрд╛рдд рдХреА рдЬрд╛рддреА рд╣реИред
рдореИрдВ рдЕрдм рдпрд╣рд╛рдВ рд╕реНрдЯрд╛рдЗрд▓рд╢реАрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирд╣реАрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛, рдЖрдк рдЙрдиреНрд╣реЗрдВ рддреИрдпрд╛рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреГрд╖реНрда рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ
рдЕрдм рдЪреИрдЯ рд░реВрдо рдХрд╛ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд░реВрдо-рдЯрд╛рдЗрдЯрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдФрд░ рдЗрд╕рдореЗрдВ рд░реВрдордЯрд╛рдЗрдЯрд▓ рдШрдЯрдХ рдмрдирд╛рдПрдВ ред рд╣рдо рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдШрдЯрдХ рдореЗрдВ рдирд╛рдо рдХреЛ рдлреЗрдВрдХ рджреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо props.chatroomName
рдФрд░ рдЕрдм рд╣рдо рдЗрд╕реЗ рдпрд╣рд╛рдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред
RoomTitle
import React from 'react'; import './RoomTitle.css'; function RoomTitle(props){ return ( <div className="RoomTitle"> <h1>{props.chatroomName}</h1> </div> ); } export default RoomTitle;
рдлрд┐рд░ рд╣рдо рд╣реЗрдбрд░ рдХрдВрдкреЛрдиреЗрдВрдЯ рдЦреБрдж рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдореЗрдВ рд▓реЛрдЧреЛ рдФрд░ рдЪреИрдЯ рд░реВрдо рдХрд╛ рдирд╛рдо рд░рдЦрддреЗ рд╣реИрдВред рддреБрд░рдВрдд рдмрдЪреНрдЪреЗ рдХреЗ рдирд╛рдо рдХреЛ рдЪреИрдЯ chatroomName
рдкреНрд░реЛрдк chatroomName
рдорд╛рдзреНрдпрдо рд╕реЗ рдлреЗрдВрдХ рджреЗрдВред
рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рд╕рд╣рдордд рдереЗ рдХрд┐ рд╕рднреА рдбреЗрдЯрд╛ (рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯреЗрдЯ) рдРрдк рдХреЗ рд░реВрдЯ рдШрдЯрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕рд╕реЗ рд╣рдо рд╣реИрдбрд░ рдХреЛ рдкрд╣рд▓реЗ рд╣реИрдбрд░ рдФрд░ рд╣реИрдбрд░ рд╕реЗ рд░реВрдордЯрд╛рдЗрдЯрд▓ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░реЗрдВрдЧреЗ ред
рдШрдЯрдХреЛрдВ \ рд╣реИрдбрд░ \ рд╣реИрдбрд░ред рдЬреЗрдПрд╕
Header.js
import React from 'react'; import './Header.css' import LogoHeader from '../logo_header/LogoHeader'; import RoomTitle from '../room-title/RoomTitle'; function Header(props) { return ( <header> <LogoHeader/> <RoomTitle chatroomName={props.chatroomName} /> </header> ); } export default Header;
рдЗрд╕рдХреЗ рдмрд╛рдж, App.js рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдЙрд╕рдореЗрдВ Header.js рдШрдЯрдХ рдЬреЛрдбрд╝реЗрдВред
рдлрд┐рд░ рд╣рдо рд░рд╛рдЬреНрдп рдореЗрдВ рдирд╛рдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЗрдбрд░ рдкрд░ рднреЗрдЬрддреЗ рд╣реИрдВ ред
рд╕рд╛рде рд╣реА рд╣реЗрдбрд░ рдореЗрдВ рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдирд╛рдо рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд░рд╛рдЬреНрдп рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдЗрд╕реЗ рд╣реЗрдбрд░ рдкрд░ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░реЗрдВ
import React from 'react'; import './App.css'; import Header from './components/header/Header'; class App extends React.Component { constructor(props){ super(props); chatroomName: '-', me: { is_online: true, name: "", uuid: "98s7dfh9a8s7dhf" } } render() { return ( <div className="App"> <Header chatroomName={this.state.chatroomName} me={this.state.me} /> </div> ); }; } export default App;
рдЕрдм рд╣реЗрдбрд░ рдореЗрдВ рдЖрдкрдХреЛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдирдкреБрдЯ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреЛ рдРрдк рдШрдЯрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХреЗрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо handleChangeName
рдлрд╝рдВрдХреНрд╢рди props.updateVisitor
рдХреЛ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рдореЗрдВ props.updateVisitor
рдФрд░ props.updateVisitor
рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдирд╛рдо рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
Header.js
function Header(props) { const [name, setName] = useState(props.me.name ? props.me.name : props.me.uuid.substr(-10)) const handleChangeName = (e) => { setName(e.target.value) let visitor = {...props.me}; visitor.name = e.target.value; props.updateVisitor(visitor) } return ( <header> <LogoHeader/> <RoomTitle chatroomName={props.chatroomName}/> { props.me ? <input className='name-input' value={name} placeholder=' ' onChange={(e) => handleChangeName(e)} /> : null } </header> ); }
рдЕрдм рдЗрд╕ рдлрдВрдХреНрд╢рди props.updateVisitor
рдХреЛ рдРрдк рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ props.updateVisitor
ред рдЕрдм рддрдХ, рдпрд╣ рдХреЗрд╡рд▓ рд░рд╛рдЬреНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗред
onUpdateVisitor = (visitor) => { this.setState({me: visitor}) }
рддреЛ, рдЕрдм рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЕрдм рддрдХ рдХреЗрд╡рд▓ рдирд╛рдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЬрд╛рдирддрд╛ рд╣реИред рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ

рд╕рд╛рдЗрдбрдмрд╛рд░
рдЕрдм рд╕рд╛рдЗрдбрдмрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЗрдВред
рд╕рд╛рдЗрдбрдмрд╛рд░ рдореЗрди.рдЬреЗрдПрд╕ рдкреЗрдЬ рдкрд░ рдореБрдЦреНрдп рдШрдЯрдХ рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ред
рд╣рдо рдЗрд╕реЗ рдШрдЯрдХ \ main \ Main.js рдмрдирд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдШрдЯрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдХ рдмрдирд╛рддреЗ рд╣реИрдВ \ рд╕рджрд╕реНрдп-рд╕реВрдЪреА \ рд╕рджрд╕реНрдп-рд╕реВрдЪреАред рдЬреЗрдПрд╕ рдФрд░ рддреБрд░рдВрдд рдПрдХ рдШрдЯрдХ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдШрдЯрдХ \ рд╕рджрд╕реНрдп-рдЖрдЗрдЯрдо \ рд╕рджрд╕реНрдп-рдХрд╛рд░реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпреЗ 3 рдШрдЯрдХ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
рдШрдЯрдХ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрдм рдХреНрд░рдо рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдРрдк рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕рд░рдгреА рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдореБрдЦреНрдп рдШрдЯрдХ рдЬреЛрдбрд╝реЗрдВред рдлрд┐рд░ рд╣рдо рдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕рдореЗрдВ рднреЗрдЬреЗрдВрдЧреЗред
рдРрдк
class App extends React.Component { constructor(props) { super(props); this.state = { chatroomName: '-', members: [ { is_online: true, name: "", uuid: "98s7dfh9a8s7dhf" }, { is_online: true, name: "", uuid: "mnzxcv97zx6chvo" }, { is_online: false, name: "", uuid: "kjuhv987ashdfoua" }, { is_online: false, name: "", uuid: "jdhnf978WEHJSNDL" }, ], me: { is_online: true, name: "", uuid: "98s7dfh9a8s7dhf" } }; } render() { return ( <div className="App"> <Header chatroomName={this.state.chatroomName} me={this.state.me} /> <Main members={this.state.members} me={this.state.me} /> </div> ); }; }
рдореБрдЦреНрдп рдШрдЯрдХ рдореЗрдВ, рд╕рджрд╕реНрдп рдШрдЯрдХ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕рд░рдгреА рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдБ ред
main.js
function Main(props) { return( <section className="Main"> <MemberList members={props.members} /> </section> ); }
рдФрд░ рдореЗрдВрдмрд░рд▓рд┐рд╕реНрдЯ рдШрдЯрдХ рдореЗрдВ , рд╣рдо рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдореЗрдВрдмрд░рдЯреИрдо рдШрдЯрдХ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
MemberList.js
function MemberList(props) { const members = props.members.map((member) => <MemberItem key={member.uuid} member={member} /> ); return ( <section className="MemberList"> {members} </section> ); }
рд╕рджрд╕реНрдп рдЗрдЯреЗрдо рдШрдЯрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рд╛рдЗрдбрдмрд╛рд░ рдореЗрдВ рд╕реАрдзреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕рдореЗрдВ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдирд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдкрд╣рд▓реЗ 10 рдЕрдХреНрд╖рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред рд╣рдо рдСрдирд▓рд╛рдЗрди / рдСрдлрд╝рд▓рд╛рдЗрди рд╕реНрдерд┐рддрд┐ рдХреА рднреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╡рд╣ рдЪрд┐рд╣реНрди "(рдЖрдк)" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реЛред
function MemberItem(props) { function getName(){ let name = '' if (props.member.uuid === props.me.uuid) { if(props.me.name) { name = props.me.name } else { name = props.me.uuid.substring(props.me.uuid.length-10, props.me.uuid.length); } } else { if(props.member.name){ name = props.member.name } else { name = props.member.uuid.substring(props.member.uuid.length-10, props.member.uuid.length); } } return name; } return( <div className="MemberItem"> <img src={ icon } alt={ props.member.name }/> <span> { getName() } { props.member.uuid === props.me.uuid && " () " } </span> { props.member.is_online && <span className="online">тАв</span> } </div> ); }
рд╣реЛ рдЧрдпрд╛ред рдЕрдм рдЖрд╡реЗрджрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ

рдЕрдм рд╣рдо рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рдФрд░ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝реЙрд░реНрдо рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдЬреЛрдбрд╝реЗрдВред
рдРрдк
this.state = { chatroomName: '-', messages: [ { content: " 1", sender_id: "mnzxcv97zx6chvo", uuid: "dg897sdfg" }, { content: " 2", sender_id: "98s7dfh9a8s7dhf", uuid: "8723hernm" }, { content: " ", sender_id: "mnzxcv97zx6chvo", uuid: "435nbcv98234" } ], members: [ { is_online: true, name: "", uuid: "98s7dfh9a8s7dhf" }, { is_online: true, name: "", uuid: "mnzxcv97zx6chvo" }, { is_online: false, name: "", uuid: "kjuhv987ashdfoua" }, { is_online: false, name: "", uuid: "jdhnf978WEHJSNDL" }, ], me: { is_online: true, name: "", uuid: "98s7dfh9a8s7dhf" } };
рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореБрдЦреНрдп рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░реЗрдВ
рдРрдк
<Main members={this.state.members} messages={this.state.messages} me={this.state.me} />
рдЕрдм рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрдВрдлрд░реНрд╕ / рдЪреИрдЯ-рдлреАрд▓реНрдб / ChatField.js рдмрдирд╛рдПрдВ
рдЗрд╕реЗ рдореЗрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░реЗрдВред
рдореБрдЦреНрдп
function Main(props) { return( <section className="Main"> <MemberList me={props.me} members={props.members} /> <ChatField messages={props.messages} /> </section> ); }
рдЗрд╕рдХреЗ рдмрд╛рдж, рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрдВрд╕рдкрд░реНрд╕ / рдореИрд╕реЗрдЬ-рдХрдВрдЯреЗрдирд░ / MessageContainer.js рдмрдирд╛рдПрдВ
рдЗрд╕реЗ ChatField рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рднреА рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░реЗрдВред
Chatfield
function Main(props) { return( <section className="Main"> <MemberList me={props.me} members={props.members} /> <ChatField messages={props.messages} /> </section> ); }
рдлрд┐рд░ рд╣рдо рд╕рднреА рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдХреЛ рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рджрд┐рдЦрд╛рдПрдЧрд╛ред
рдЖрдЗрдП рдЗрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ рд╕рдВрджреЗрд╢ / рд╕рдВрджреЗрд╢ / рд╕рдВрджреЗрд╢.рдЬреЗрдПрд╕ ред рдЗрд╕рдореЗрдВ рд╣рдо рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдХрд╛ рдЖрдЗрдХрди, рдЙрд╕рдХрд╛ рдирд╛рдо рдпрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рдВрджреЗрд╢ рдкрд╛рда рд╣реА рд╣реИред
рд╕рдВрджреЗрд╢
function Message(props) { const getSenderName = () => { if (props.sender) { return props.sender.name ? props.sender.name : props.sender.uuid.substr(-10); } return "Unknown sender"; }; return( <div className="Message"> <div className="message-sender-icon"> <img src={icon} alt="visitor icon"/> </div> <div className="message-bubble"> <div className="message-sender-name">{getSenderName()}</div> <div className="message-content">{props.message.content}</div> </div> </div> ); }
рдЕрдм, MessageContainer рдореЗрдВ, рд╣рдо рд╕рднреА рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╡рд╣ рд╕рдВрджреЗрд╢ рдШрдЯрдХ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рд╣рдо рд╕рдВрджреЗрд╢ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ
MessageContainer
function MessageContainer(props) { const messageList = props.messages.map(message => <Message key={message.uuid} sender={props.members.find((member) => member.uuid === message.sender_id)} message={message} /> ); return ( <section className="MessageContainer" ref={messagesContainer}> {messageList} </section> ); }
рдЕрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

рдЕрдм рд╕рдВрджреЗрд╢ рдШрдЯрдХреЛрдВ / рднреЗрдЬрдиреЗ-рд╕рдВрджреЗрд╢-рдлрд╛рд░реНрдо / SendMessageForm.js рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╛рд░реНрдо рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдХ рдмрдирд╛рдПрдВред рдЗрд╕рдореЗрдВ, рд╣рдо рдПрдХ рдЗрдирдкреБрдЯ рдФрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди рдмрдирд╛рдПрдВрдЧреЗред рдЬрдм рдЗрдирдкреБрдЯ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдореЗрдВ рд╕реЗ рдкрд╛рда рд░рд╛рдЬреНрдп рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдЖрдк рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо onSendNewMessage
рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рд╛рдЬреНрдп рд╕реЗ рд╕рдВрджреЗрд╢ рдХреЛ рдЗрд╕рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред onSendNewMessage
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдШрдЯрдХ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж onSendNewMessage
рдлрд╝рдВрдХреНрд╢рди onSendNewMessage
рдФрд░ рдЗрд╕реЗ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред
SendMessageForm
class SendMessageForm extends React.Component { constructor(props) { super(props); this.state = { message: '' }; } currentMessageChanged = (e) => { this.setState({message: e.target.value }); } sendMessageClicked = async (e) => { e.preventDefault(); if (this.state.message.length > 0) { await this.props.onSendNewMessage(this.state.message); this.setState({...this.state, ...{message : ''}}); } } render(){ return ( <section className="SendMessageForm"> <form> <input type="text" value={this.state.message} onChange={this.currentMessageChanged} placeholder="Type message to send"/> <button type="submit" onClick={this.sendMessageClicked} > Send </button> </form> </section> ); } }
рдЕрдм SendMessageForm рдШрдЯрдХ рдХреЛ ChatField рдХреЗ рдЕрдВрджрд░ рд░рдЦреЗрдВ ред
Chatfield
function ChatField(props) { return( <section className="ChatField"> <MessageContainer members={props.members} messages={props.messages} /> <SendMessageForm onSendNewMessage={props.onSendNewMessage}/> </section> ); }
рдореБрдЦреНрдп рдШрдЯрдХ рдореЗрдВ, рд╣рдо onSendNewMessage
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рднреА onSendNewMessage
рдХрд░реЗрдВрдЧреЗред
рдореБрдЦреНрдп
<ChatField members={props.members} messages={props.messages} onSendNewMessage={props.onSendNewMessage} />
рдЕрдм рдЗрд╕ рдлрдВрдХреНрд╢рди рдХреЛ App рдореЗрдВ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ Main рдореЗрдВ рдлреЙрд░рд╡рд░реНрдб рдХрд░реЗрдВред
рдРрдк
onSendNewMessage = async (message) => { console.log(message) }
рдРрдк
<Main members={this.state.members} messages={this.state.messages} onSendNewMessage={this.onSendNewMessage} me={this.state.me} />
рд╣реЛ рдЧрдпрд╛ред рдЕрдм, рдЬрдм рдЖрдк рднреЗрдЬреЗрдВ рд╕рдВрджреЗрд╢ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдРрдк рдШрдЯрдХ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдм рдЖрд╡реЗрджрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдЗрд╕рд▓рд┐рдП, рдЕрдм рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╕рдм рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рд╕реНрдереИрддрд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде, рдФрд░ рд╣рдорд╛рд░реА рдЪреИрдЯ рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдмреИрдХрдПрдВрдб рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдмреИрдХрдПрдВрдб рдХрдиреЗрдХреНрд╢рди
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдЖрдкрдХреЛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рд╡рд╣ рдЪреИрдЯрд┐рдХреНрд╕-рдХреЛрд░ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред
npm i chatix-core
рдлрд┐рд░ рдЪреИрдЯрд┐рдХреНрд╕ рдкрд░ рдПрдХ рдЦрд╛рддрд╛ рдмрдирд╛рдПрдВ рдФрд░ рдПрдХ рдЪреИрдЯ рд░реВрдо рдмрдирд╛рдПрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, chatix.io рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдкрдВрдЬреАрдХрд░рдг рдХрд░реЗрдВред
рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж, рдЖрдк рдЪреИрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкреЗрдЬ рдкрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдЖрдИрдбреАрдбреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рд╣рдо рдПрдХ рдирдпрд╛ рдЪреИрдЯ рд░реВрдо рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред

рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдШрдЯрдХ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред
рдШрдЯрдХреЛрдВ \ chatix \ ChatixSDK.js
рд╣рдо рдЗрд╕рдореЗрдВ ChatixCore рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
import ChatixCore from 'chatix-core';
ChatixSDK рдШрдЯрдХ рдореЗрдВ , ChatixCore рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ рдФрд░ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ websiteId рдкрд╛рд╕ рдХрд░реЗрдВред
const websiteId = "_WEBSITE_ID"; this.sdk = new ChatixCore(websiteId);
рдЕрдм рдЗрд╕рдореЗрдВ .sdk рдЖрдк рдЪреИрдЯ рд░реВрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЪреИрдЯ-рдХреЛрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреЗрдЬ рдкрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рдЪреИрдЯ рд░реВрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЗрдердб рд╕реНрдЯрд╛рд░реНрдЯ () рдФрд░ рдЧреЗрдЯрд╡рдЪрд░реВрдо () рд╣реИрдВ ред
рдЪреИрдЯ рд░реВрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдЗрдП рддреБрд░рдВрдд рдЗрд╕рдХрд╛ рдирд╛рдо рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдРрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдРрдк рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди updateChatroomTitle(chatroom.title)
рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ ChatixSDK рдореЗрдВ рдХреЙрд▓ рдХрд░реЗрдВред
ChatixSDK
class ChatixSDK extends React.Component { constructor(props){ super(props); const websiteId = "_WEBSITE_ID"; this.chatroomId = "_CHATROOM_ID"; this.sdk = new ChatixCore(websiteId); this.sdk.start() .then( async () => { try { // refresh information about chatroom and call passed handler const chatroom = await this.sdk.getChatroom(this.chatroomId); if (props.updateChatroomTitle) { props.updateChatroomTitle(chatroom.title); } } catch (err) { console.error(err); } }) .catch((e) => { console.error(e); }); } render(){ return null; } }
рдЖрдк рд╡рд╛рдВрдЫрд┐рдд рдЪреИрдЯ рд░реВрдо рдЦреЛрд▓рдХрд░ рдкреНрд░рдмрдВрдзрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЗрд╕. this.chatroomId
рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм App рдореЗрдВ рд╣рдо ChatixSDK рдШрдЯрдХ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдФрд░ рдЕрдкрдбреЗрдЯрдЪреИрдЯ рд░реВрдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕рдореЗрдВ рдлреЗрдВрдХ рджреЗрдВрдЧреЗ, рдЬреЛ рдЪреИрдЯ рдирд╛рдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рджреЗрдЧрд╛ред рд╣рдо рдЗрд╕рдореЗрдВ рдПрдХ ref
рд▓рд┐рдВрдХ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕ рдШрдЯрдХ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХреЗрдВред
рдРрдк
this.chatixSDK = React.createRef();
setChatroomTitle = (newName) => { const newStateFragment = { chatroomName: newName}; this.setState({...this.state, ...newStateFragment}); };
рдРрдк
render() { return ( <div className="App"> <Header chatroomName={this.state.chatroomName} me={this.state.me} updateVisitor={this.onUpdateVisitor} /> <Main members={this.state.members} messages={this.state.messages} onSendNewMessage={this.onSendNewMessage} me={this.state.me} /> <ChatixSDK ref={this.chatixSDK} updateChatroomTitle={this.setChatroomTitle} /> </div> ); };
рд╣реЛ рдЧрдпрд╛ред рдЕрдм, рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреЗ рдареАрдХ рдмрд╛рдж, рд╣рдо рдЪреИрдЯ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдРрдк рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдЪреВрдВрдХрд┐ рд░рд╛рдЬреНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдХрд╛рд░рдг рдШрдЯрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣реЗрдбрд░ рдореЗрдВ рдирд╛рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЕрдм рд░рд╛рдЬреНрдп рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╛рдо рдХреЛ рдПрдХ рд░рд┐рдХреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдРрдк
chatroomName: ''
рдЕрдм рд╕рд╛рдЗрдбрдмрд╛рд░ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рднрд░реЗрдВред
рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдЪреИрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрд╕ this.sdk.start()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ this.sdk.start()
рд╣рдореЗрдВ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЪреИрдЯ рд░реВрдо рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЪрд╛рд▓реВ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред
ChatixSDK
const myChatrooms = await this.sdk.getMyChatrooms(); if (myChatrooms.filter(x => x.id===this.chatroomId).length === 0) { await this.sdk.connectToChatroom(this.chatroomId); }
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рд╣рдорд╛рд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪреИрдЯ рд░реВрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ, рд╣рдо рдЗрд╕ рдЪреИрдЯ рдореЗрдВ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
ChatixSDK
// lets get all chatroom members using infinite loop with break on empty server response let membersPage = 1; let allChatroomMembers = []; while(true) { let pagedMembers = await this.sdk.getChatroomMembers(this.chatroomId, membersPage++, 10); allChatroomMembers = [...allChatroomMembers, ...pagedMembers]; if (pagedMembers.length === 0) { break; } }
рдпрд╣рд╛рдВ, рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдкреЗрдЬ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рд╕рднреА рдХреЛ рдкреНрд░рд╛рдкреНрдд рди рдХрд░ рд▓реЗрдВ, рдЬреИрд╕реЗ рд╣реА рд╣рдо рд╕рднреА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рд▓реВрдк рдХреЛ рддреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЪреИрдЯ рд░реВрдо рдХреЗ рдирд╛рдо рдХреА рддрд░рд╣, рд╣рдо рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдореВрд▓ рдШрдЯрдХ рдореЗрдВ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
ChatixSDK
if (props.setChatroomMembers) { props.setChatroomMembers(allChatroomMembers); }
рдЕрдм, рдРрдк рдШрдЯрдХ рдореЗрдВ, рдЗрд╕ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди setChatroomMembers
рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдирдХреА рдСрдирд▓рд╛рдЗрди / рдСрдлрд╝рд▓рд╛рдЗрди рд╕реНрдерд┐рддрд┐ рдФрд░ рд╡рд░реНрдгрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╕реЙрд░реНрдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд░рд╛рдЬреНрдп рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдЧрд╛ред
App.js
setChatroomMembers = (members) => { members.sort(this.sortMembers); const newStateFragment = { members: members}; this.setState({...this.state, ...newStateFragment}); }
рдЫрдБрдЯрд╛рдИ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реНрдерд┐рддрд┐ рдФрд░ рд╡рд░реНрдгрд╛рдиреБрдХреНрд░рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреНрд░рдордмрджреНрдз рдХрд░рддрд╛ рд╣реИред
App.js
sortMembers(a, b) { if (a.is_online === true && b.is_online === false) { return -1; } else if (b.is_online === true && a.is_online === false) { return 1; } else { if (a.name && b.name) { if (a.name.toLocaleUpperCase() > b.name.toLocaleUpperCase()) { return 1; } else if (a.name.toLocaleUpperCase() < b.name.toLocaleUpperCase()) { return -1; } } else if (a.name && !b.name) { return -1; } else if (!a.name && b.name) { return 1; } if (a.uuid > b.uuid) { return -1; } else { return 1; } } }
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо ChatChatSDK рдореЗрдВ setChatroomMembers рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ ред
рдРрдк
render() { return ( <div className="App"> <Header chatroomName={this.state.chatroomName} me={this.state.me} updateVisitor={this.onUpdateVisitor} /> <Main members={this.state.members} messages={this.state.messages} onSendNewMessage={this.onSendNewMessage} me={this.state.me} /> <ChatixSDK ref={this.chatixSDK} updateChatroomTitle={this.setChatroomTitle} setChatroomMembers={this.setChatroomMembers} /> </div> ); };
рдЕрдм, рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рд╣рдо, рд╕рд╛рде рд╣реА рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде, рд╕рднреА рдЬреБрдбрд╝реЗ рд╣реБрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдРрдк рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдФрд░ рд░рд╛рдЬреНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реВрдЪреА рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЛ рднреА рдмрджрд▓реЗрдВред
рдРрдк
members: []
рдЕрдм, рд╕рдорд╛рди рд╕рд┐рджреНрдзрд╛рдВрдд рджреНрд╡рд╛рд░рд╛, рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╡рд╕реНрддреБ рдФрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдорд┐рд▓рддреА рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдРрдк рд╕реНрдерд┐рддрд┐ рдкрд░ рднреА рд▓рд┐рдЦрддреЗ рд╣реИрдВ
ChatixSDK
// lets load 100 last messages from current chatroom const lastMessages = await this.sdk.getChatroomMessages(this.chatroomId, null, 100); if (props.setChatroomMessages) { props.setChatroomMessages(lastMessages); } if (props.setMe) { const me = this.sdk.getVisitor(); this.props.setMe(me); }
рдРрдк
<ChatixSDK ref={this.chatixSDK} setMe={this.setMe} updateChatroomTitle={this.setChatroomTitle} setChatroomMembers={this.setChatroomMembers} setChatroomMessages={this.setChatroomMessages} />
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВрдЧреЗред
рд╣рдо рдРрдк рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдлрд╝рдВрдХреНрд╢рди onSendNewMessage
рдЬреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрдВрд╕реЛрд▓ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдмрд╕ sendChatroomMessage
рд╕реЗ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП sendChatroomMessage
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред
рдпрд╣ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рд╣реИ рдФрд░ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдХреА рд╡рд╕реНрддреБ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд░рд╛рдЬреНрдп рдореЗрдВ рд╕рдВрджреЗрд╢ рд╕рд░рдгреА рдореЗрдВ рддреБрд░рдВрдд рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╡реИрд╕реЗ, рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рдЗрд╕. this.chatixSDK
рд▓рд┐рдВрдХ this.chatixSDK
рдХреЛ this.chatixSDK
рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдРрдк
onSendNewMessage = async (message) => { let receivedMsg = await this.chatixSDK.current.sendChatroomMessage(message); const currentMessages = this.state.messages; currentMessages.push(receivedMsg); const newStateFragment = {messages: currentMessages}; this.setState({...this.state, ...newStateFragment}); }
рдЪреВрдВрдХрд┐ рд░рд╛рдЬреНрдп рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕реВрдЪреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧреАред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рд╕рдВрджреЗрд╢ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓ рдиреАрдЪреЗ рдЪрд▓рд╛ рдЬрд╛рдПред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, MessageContainer рдШрдЯрдХ рдЦреЛрд▓реЗрдВ рдФрд░ useEffect рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ , рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рд╕рд░рдгреА рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВ, рдФрд░ рдЬреИрд╕реЗ рд╣реА рдпрд╣ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВ, рд╣рдореЗрдВ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдХреНрд░реЙрд▓рд╣рд╛рдЗрдЯ рдмреНрд▓реЙрдХ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЙрд╕реА рд░рд╛рд╢рд┐ рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВ
function MessageContainer(props) { const messagesContainer = React.createRef(); useEffect(() => { messagesContainer.current.scrollTop = messagesContainer.current.scrollHeight }, [props, messagesContainer]); const messageList = props.messages.map(message => <Message key={message.uuid} sender={props.members.find((member) => member.uuid === message.sender_id)} message={message} /> ); return ( <section className="MessageContainer" ref={messagesContainer}> {messageList} </section> ); }
рдЕрдм рдпреВрдЬрд╝рд░рдиреЗрдо рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЦрддреНрдо рдХрд░рддреЗ рд╣реИрдВред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд╣реЗрдбрд░ рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрджрд▓рддреЗ рд╕рдордп, рд╣рдо рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдРрдк рдШрдЯрдХ рдкрд░ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рд╣рдо рдЗрд╕реЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЪрд▓рд┐рдП рдЗрд╕ рдлрдВрдХреНрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ this.chatixSDK.current.updateVisitor(user)
рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдЗрд╕рд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдмрд╕ рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо this.state.me
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ this.state.members
рдПрд░реЗ рдореЗрдВ this.state.members
рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рднреА this.state.members
рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдирд╛рдо рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдРрдк
onUpdateVisitor = (user) => { this.chatixSDK.current.updateVisitor(user) this.setMe(user) let currentUser = this.state.members.find((member) => (member.uuid === user.uuid)) let currentUserIndex = this.state.members.indexOf(currentUser) let newMembers = [...this.state.members] newMembers[currentUserIndex] = user; this.setState({ members: newMembers }) }
рдЕрдм рд╣рдореЗрдВ рдпрд╣ рд╕реАрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рдХреИрд╕реЗ рджрд┐рдпрд╛ рдЬрд╛рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ / рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЬреБрдбрд╝реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдПред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ ChatixSDK.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдЪреИрдЯ-рдХреЛрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреЗрдЬ рдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рддрд░реНрдХреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдо onChatroomMessageReceived , onMemberConnectedToChatroom , onMemberDisconnectedFromChatroom рдФрд░ onApplyVisitorInfo рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред
рд╣рдо рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрдкрдиреЗ рдХреЙрд▓рдмреИрдХ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдРрдк рдореЗрдВ рдмрдирд╛рдПрдВрдЧреЗред
this.sdk.onChatroomMessageReceived = (chatroomId, message) => { if (chatroomId === this.chatroomId) { this.props.onNewMessageReceived(message); } }; this.sdk.onMemberConnectedToChatroom = (chatroomId, member) => { if (chatroomId === this.chatroomId && props.addChatroomMember) { this.props.addChatroomMember(member); } }; this.sdk.onMemberDisconnectedFromChatroom = (chatroomId, member) => { if (chatroomId === this.chatroomId && props.removeChatroomMember) { this.props.removeChatroomMember(member); } }; this.sdk.onApplyVisitorInfo = (visitor) => { this.props.onMemberUpdated(visitor) }
рдЗрд╕рдХреЗ рдмрд╛рдж, рдРрдк рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдПрдВред
onNewMessageReceived (рд╕рдВрджреЗрд╢)
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕рдВрджреЗрд╢ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдмрд╕ рдЗрд╕реЗ рдмрд╛рдХреА рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред , .
App
onNewMessageReceived = (message) => { const currentMessages = this.state.messages; currentMessages.push(message); const newStateFragment = {messages: currentMessages}; this.setState({...this.state, ...newStateFragment}); }
App
addChatroomMember(member)
state members. .
App
addChatroomMember = (member) => { const newStateFragment = {}; const currentMembers = this.state.members; currentMembers.push(member); currentMembers.sort(this.sortMembers); newStateFragment.members = currentMembers; this.setState({...this.state, ...newStateFragment}); }
App
removeChatroomMember(memberId)
state members state .
removeChatroomMember = (memberId) => { const currentMembers = this.state.members; const filteredMembers = currentMembers.filter(x=> x.uuid !== memberId); const newStateFragment = {members: filteredMembers}; this.setState({...this.state, ...newStateFragment}); }
onMemberUpdated(updatedMember)
. . state .
App
onMemberUpdated = (updatedMember) => { let oldMember = this.state.members.find(member => member.uuid === updatedMember.uuid); oldMember = this.state.members.indexOf(oldMember); let newStateMembers = this.state.members; newStateMembers[oldMember] = updatedMember; this.setState({ members: newStateMembers }) }
ChatixSDK
ChatixSDK
<ChatixSDK ref={this.chatixSDK} setMe={this.setMe} updateChatroomTitle={this.setChatroomTitle} setChatroomMembers={this.setChatroomMembers} addChatroomMember={this.addChatroomMember} removeChatroomMember={this.removeChatroomMember} setChatroomMessages={this.setChatroomMessages} onNewMessageReceived={this.onNewMessageReceived} onMemberUpdated={this.onMemberUpdated} />
рд╣реЛ рдЧрдпрд╛! \ , , / .
alekseyso
рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рдордЧреНрд░реА:
SDK Chatix ()
SDK Chatix (npm)
192 -