카테고리 없음

Til (2022.02.23)

prdg 2023. 2. 28. 18:10

채팅글 컴포넌트

 

실시간 채팅을 socket.io를 통해 객체로 받아온다. 

객체안에는 채팅 친 사람의 id가 들어있는데 그 id를 이용해 css만으로 반대로 나오게 해봤다.

각자 스타일컴포넌트로 props를 통해 id를 내려준후 그 id가 자신과 일치하면 오른쪽 정렬,

일치하지 않으면 flex-direction: row-reverse나 정렬만 바꿔주는것 만으로 전체 반전이 일어날 수 있게 했다.

import React from "react";
import styled from "styled-components";

function Testtext({ chat }: any) {
  //아이디가 내아이디와 같으면 왼쪽 아니면 오른쪽
  //세션 아이디
  const myId = sessionStorage.getItem("steamid");

  return (
    <ChatDiv id={chat.id} myId={myId}>
      <ChatImg src={chat.profileImg}></ChatImg>
      <ChatBoxDiv>
        <ChatBoxNameH2 id={chat.id} myId={myId}>
          {chat.nickName}
        </ChatBoxNameH2>
        <ChatBoxTextDiv id={chat.id} myId={myId}>
          <ChatBoxTextP id={chat.id} myId={myId}>
            {chat.text}
          </ChatBoxTextP>
          <ChatBoxTextDateP>{chat.time}</ChatBoxTextDateP>
        </ChatBoxTextDiv>
      </ChatBoxDiv>
    </ChatDiv>
  );
}

export default Testtext;

const ChatDiv = styled.div<{ id: any; myId: any }>`
  margin-bottom: 30px;
  display: flex;
  flex-direction: ${(props) => (props.id !== props.myId ? "" : "row-reverse")};
`;
const ChatImg = styled.img`
  width: 60px;
  height: 60px;
  background-color: #fff;
  border-radius: 50%;
`;
const ChatBoxDiv = styled.div`
  margin: 0 15px;
`;
const ChatBoxNameH2 = styled.h2<{ id: any; myId: any }>`
  font-size: 16px;
  color: #fff;
  margin-bottom: 10px;
  text-align: ${(props) => (props.id !== props.myId ? "left" : "right")};
`;
const ChatBoxTextDiv = styled.div<{ id: any; myId: any }>`
  display: flex;
  flex-direction: ${(props) =>
    props.id !== props.myId ? "row" : "row-reverse"};
`;
const ChatBoxTextP = styled.p<{ id: any; myId: any }>`
  background-color: #ccc;
  max-width: 500px;
  padding: 10px 15px;
  border-radius: 10px;
  border-top-left-radius: ${(props) =>
    props.id !== props.myId ? "0" : "10px"};
  border-top-right-radius: ${(props) =>
    props.id !== props.myId ? "10px" : "0"};
`;
const ChatBoxTextDateP = styled.p`
  margin-top: auto;
  margin-left: 12px;
  margin-right: 12px;
  color: #ccc;
  font-size: 12px;
  font-weight: 100;
`;