*aJ#)*tKNs1dfr{|Ku90nMv{Xs{$i1c)j?29d?C0f2
zAIcBLAzO&1gnd2k+7y(
z%#~N!qBgEiKCs73F1~B#Z!jaJtSX^H2-UW0Z7?HV|25VOTrp)0JVS9opV77oRC8}`
zP0mZPf(~)UB9DEIa)Z{@w|LWJXUhs)E;+Sq*z@FrzfjJP{GfS+EJSN_HpS4WJvb&8
zCTA%qTy2^STBbUB06P`j7|1_s_2$UWF)X9FDuFdQeG^NVtI4j~_#R?9?4Q*NIq3!L
z=TS&=fjYbPM{BE;$!|88?!Ku#-GH#<1e{CXaEV`fPLEL%^o|7kSjNkIypgl;on~
zenv4g8HS|IC@zHLe=gRi40NI5te+IZo98Jd%Ez_D8mrRo^2LTDp=7#ox4iA3gXtw<6KxW;8`1KDL9o?A6QyL~MlafKVn~zD%kYJwIncz|_#v
J0HNm^`(H{+KPLbH
literal 0
HcmV?d00001
diff --git a/public/item/chatHead.png b/public/item/chatHead.png
new file mode 100644
index 0000000000000000000000000000000000000000..a72c9ebf06b297a9a857299afd38ae246074ad3a
GIT binary patch
literal 2711
zcmb7Gc|6n!8~;s;B9W_%BW=5tYqb^L$W6|{x+YgBjEuocW;wA%I`wn~A%-f;y
znscM0sdu7=TDV(1JhNcd3UL|3$zKR>UFPvhiQ
z6~N%Z#Ac!lM41kQlJ9_-!bo6_?c;X8Lggk|cGwvm%V$k<(a%|9m5vDrr*0G~mh8ON
zCoP>iihF3PjtPvX@fFys{AptBWD6JFv83WWht=L-_n?|HQf7RQMMEbt{ip4OtY9t*
zYJd;;?AcyUZ!9ycsC=0kuBh$U4<$GK)e(aow{y$KvEvH=32j4Er?=baaowWk63*1e
zE<3mr!%9D!RYfs%bdgB(pl2|yp@E?26s)A_h>WJEl8mwtzVdB*rQXmK(+8S&AhWAo
zvnj@G=)UksdwY1Ww+p2RG!cfFjRGqwp13d_!y5RoqLZW}z8ZtW;|USjO(pS#2y!av
zr(Z9o*IqCW6Poc-T;cIp^nro1-uZ0DY_o1pb+_tWVj!pyhl9npbk;a(zO|GGH#?Fh
zNhH#G(Jx8(=K-@$A=tr^{K0pve#P2eju#>_w(I>GY=t@;aT;!o|DC_pp^yc;p0!f_
z;8i8vQ`A6}^$HdxGWvt`k}!(zb^$>@=&mX=En}M4fM4oA`u>gw#0ly?qMAvK*%`E4
zqSk%NgY+vr_H2A0%|2tm_3hmjkFxdARacCkG->_T6J1g
zC^YHC3p>K9htyK302q7{B#wQkTH>)-g%4szy1t&m`hHmHQhf*+SP!33twrzaXivm!
zuafbBWR>cVIQYc0JogZ9OB6i^k1H1olyQBhxPEGXB!$Squv0h}(#LA)CAPO$>w604=FU@)q4Kd^
zRAN5PdP0MmGm*%6Rzt5_6k*og8exs_-%2uHFH+w09<(x2n6=NCQx1)Ey*^*pyq6+K
zJ%PhiUfZI!FkSVsoa{O={qu{U2dAK?cWGSoLNxw6-pmCa5z;UI4Nxhye<9TTe5n)n
zXEIR+y*bEQmikt-pX$qf`>ZKZxBb+tf5k+;R($4=yQb|PZvYda6Su!m<8^VDJ6^MF
z`%Zx1x>&XOVuo~=zP~=$)S%TTTN7rleV|?0y*b~Ab|&aV?ijqKgs>=Z%L;3PCE#M
zvKKuTy)491bt});+@!&vqoJ`Yc9%{d0q0){Zu2;A`_UR{;kInWxP}69V!C
zmBfDM$d(;)=^JhS(3w_ht;6A
z_+{M?P&xs&C-3{K>|ZbMxLVnU(a4Q$Sl#&=yZ2o~xSt(OuGlV7#r!z7{n6*>&BrD3
z;I(j+-7@?DCxsZzZToGmgrSHw%+ecoUNFmp{COu^LA~-
zxS>;p260~?0~0c{zn*Jyn+HKjr)@E$2#XqzBOwS;S|z)bU8%j`kYnPL{U9`BMzTy|
zb${(CW=y&(2rR)gZWFNh^9YxfIn)fJMf>mP6};K`+&yMR+~W7`vbI~#*>-k#S_vEs
zxBD^^1%bwCxx&Y0RA7tLUCd380Xjd}KzbnV)GL2~Q3VdPVK`
zBZ@tEq5zDP{Lw4Cy(fHbm6^t$kTOG$eo^9*n8*@U0bnJ~Zrhl^vmcUXFi(r1J}rzd
zh3og364AQdxMXMpO?np3+QF?s_unmwHU?F?%+m1aKk$s!6+_)jPT#Y=#
zmaRep7V30Vqele~Hj$wm^$V|eA&1dAHiVYZceK$bz#$c@y56&4Y16a44N_EW&7tyA`N0{*#lOj6~Q#MRbexX|OR
zWHRF?T;wPQQoNyi1XxN@-kh!pt-k`a-8>CZ@6PE9GWjdhBYiGI>&A`y#l^+Q?N#Sy
t^nTO%lhzq(wM$F>?(e+g=Ek@5uNxTXIv0eVKl~#BOEX(jtg-i#{{bfTNJ; {
- const newMessage: Message = {
- id: Date.now(),
- from: currentUser.name,
- content: messageContent,
- date: new Date().toISOString(), // ISO 형식의 날짜 문자열 사용
- };
-
- setMessages((prevMessages) => [...prevMessages, newMessage]);
- };
+ const sendMessage = (messageContent: string) => {
+ const newMessage: Message = {
+ id: Date.now(),
+ from: currentUser.name,
+ content: messageContent,
+ date: new Date().toISOString(), // ISO 형식의 날짜 문자열 사용
+ };
+
+ setMessages((prevMessages) => [...prevMessages, newMessage]);
+ };
+
const toggleUser = () => {
setCurrentUserIndex((currentIndex) => (currentIndex === 0 ? 1 : 0));
diff --git a/src/components/ChatBody.tsx b/src/components/ChatBody.tsx
index 9484755..e596cbb 100644
--- a/src/components/ChatBody.tsx
+++ b/src/components/ChatBody.tsx
@@ -1,9 +1,12 @@
+
import React from 'react';
import {
ChatBodyContainer,
TimeDisplay,
DateSeparator,
ChatMessageBox,
+ UserProfileImage
+
} from '../style/ChatBodyStyle';
interface Message {
@@ -49,11 +52,11 @@ const ChatBody: React.FC = ({ messages, currentUser }) => {
{displayDateSeparator && (
{formatDate(message.date)}
)}
+ {formatTime(message.date)}
- {message.from}
{message.content}
- {formatTime(message.date)}
+
);
})}
@@ -61,4 +64,4 @@ const ChatBody: React.FC = ({ messages, currentUser }) => {
);
};
-export default ChatBody;
+export default ChatBody;
\ No newline at end of file
diff --git a/src/components/ChatBottom.tsx b/src/components/ChatBottom.tsx
index b2f8dc2..e74790c 100644
--- a/src/components/ChatBottom.tsx
+++ b/src/components/ChatBottom.tsx
@@ -6,8 +6,8 @@ import {
SendButton,
} from '../style/ChatBottomStyle';
-const sendIcon = '/item/sendIcon.png';
-const micIcon = 'item/micIcon.png';
+const sendIcon = '/item/sendIcon.png';
+const micIcon = '/item/micIcon.png';
interface ChatBottomProps {
onSendMessage: (messageContent: string) => void;
@@ -42,10 +42,7 @@ const ChatBottom: React.FC = ({ onSendMessage }) => {
}
onKeyPress={handleKeyPress}
/>
-
+
);
};
diff --git a/src/components/ChatHead.tsx b/src/components/ChatHead.tsx
index 77dd734..4526bde 100644
--- a/src/components/ChatHead.tsx
+++ b/src/components/ChatHead.tsx
@@ -14,7 +14,7 @@ interface ChatHeadProps {
const ChatHead: React.FC = ({ user, onUserClick }) => {
return (
- < UserImage
+ `
- padding: 10px;
+display:inline-block;
+ padding: 5px;
+ width:196px;
margin: 5px;
border-radius: 8px;
- background-color: lightgray;
+ background-color: #EDEDED;
align-self: flex-start;
+ font-size: 16px;
+ border-radius: 20px 20px 5px 20px;
+
+
${(props) =>
props.isCurrentUser &&
css`
- background-color: lightblue;
+ background-color: #DCF7C5;
align-self: flex-end;
`}
`;
export const ChatBodyContainer = styled.div`
+
display: flex;
flex-direction: column;
+ margin-top: 96px;
+ margin-bottom:80px;
+
+
+
+`;
+
+export const UserProfileImage = styled.img<{ isCurrentUser: boolean }>`
+ width: 20px;
+ height: 20px;
+ border-radius: 50%;
+ margin-right: 0px; /* 메시지 박스와의 간격 */
+ display:inline-block;
+
+ ${(props) =>
+ props.isCurrentUser &&
+ css`
+ display:none;
+ `}
`;
export const DateSeparator = styled.div`
@@ -35,4 +61,6 @@ export const TimeDisplay = styled.span`
display: block; // 메시지 박스 위에 표시
text-align: center; // 정중앙 정렬
margin-bottom: 5px;
+ font-size: 12px;
+
`;
\ No newline at end of file
diff --git a/src/style/ChatBottomStyle.tsx b/src/style/ChatBottomStyle.tsx
index 9da37da..bb8bd25 100644
--- a/src/style/ChatBottomStyle.tsx
+++ b/src/style/ChatBottomStyle.tsx
@@ -1,28 +1,35 @@
import styled from 'styled-components';
+// ChatBottomContainer를 div로 변경하여 컨테이너로 사용
export const ChatBottomContainer = styled.div`
- display: flex;
- align-items: center;
- padding: 10px;
+position: fixed;
+bottom: 0;
+width: 375px;
+height: 80px;
+
+
+ flex-shrink: 0;
+
+ background-image: url('/item/chatBottom.png');
+ background-size: cover;
`;
export const ChatInput = styled.input`
- flex-grow: 1;
- margin-right: 8px;
- padding: 8px;
- border-radius: 4px;
- border: 1px solid #ccc;
+ width: 14.25rem;
+ height: 2rem;
+ flex-shrink: 0;
+ font-size: 14px;
+
+ border-radius: 1rem;
+ border: 0.5px solid var(--gray, #8d8d8f);
+ opacity: 0.4496;
+ background: var(--white, #fff);
`;
-export const SendButton = styled.button<{ backgroundImage: string }>`
- width: 40px;
- height: 40px;
- border-radius: 20px;
- border: none;
- background-color: transparent;
- background-image: url(${(props) => props.backgroundImage});
- background-repeat: no-repeat;
- background-position: center;
- background-size: cover;
+export const SendButton = styled.img`
+ width: 1.5rem;
+ height: 1.5rem;
+ flex-shrink: 0;
cursor: pointer;
-`;
+ border: none;
+`;
\ No newline at end of file
diff --git a/src/style/ChatHeadStyle.tsx b/src/style/ChatHeadStyle.tsx
index 270b73e..0cb6b6f 100644
--- a/src/style/ChatHeadStyle.tsx
+++ b/src/style/ChatHeadStyle.tsx
@@ -1,16 +1,22 @@
import styled from 'styled-components';
export const ChatHeadContainer = styled.div`
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 10px;
+width: 375px;
+height: 96px;
+position: fixed;
+top: 0px;
+
+ flex-shrink: 0;
+ background-image: url('/item/chatHead.png');
+ background-size: cover;
`;
export const UserImage = styled.img`
width: 50px;
height: 50px;
border-radius: 50%;
+
`;
-export const UserName = styled.h2``;
+export const UserName = styled.h2`font-size: 16px;
+`;
diff --git a/src/style/ChattingRoomStyle.tsx b/src/style/ChattingRoomStyle.tsx
index c041e24..dad78ae 100644
--- a/src/style/ChattingRoomStyle.tsx
+++ b/src/style/ChattingRoomStyle.tsx
@@ -1,3 +1,8 @@
import styled from 'styled-components';
-export const ChatRoomContainer = styled.div``;
+export const ChatRoomContainer = styled.div`
+ width: 375px;
+ height: 812px;
+ background: var(--white, #fff);
+
+`;
From 995e3e5a9d9a3fccff9aff25792240294001a64d Mon Sep 17 00:00:00 2001
From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com>
Date: Fri, 29 Mar 2024 14:26:42 +0900
Subject: [PATCH 18/72] .
---
src/style/ChatBottomStyle.tsx | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/style/ChatBottomStyle.tsx b/src/style/ChatBottomStyle.tsx
index bb8bd25..55884fa 100644
--- a/src/style/ChatBottomStyle.tsx
+++ b/src/style/ChatBottomStyle.tsx
@@ -4,7 +4,7 @@ import styled from 'styled-components';
export const ChatBottomContainer = styled.div`
position: fixed;
bottom: 0;
-width: 375px;
+width: 100%;
height: 80px;
@@ -15,14 +15,15 @@ height: 80px;
`;
export const ChatInput = styled.input`
- width: 14.25rem;
+width: 60%;
+
height: 2rem;
flex-shrink: 0;
font-size: 14px;
-
+ margin-left:11%;
border-radius: 1rem;
border: 0.5px solid var(--gray, #8d8d8f);
- opacity: 0.4496;
+ opacity: 0.5;
background: var(--white, #fff);
`;
From ea208c02c97b82c51bb5b6ed22ec3013d1c15fce Mon Sep 17 00:00:00 2001
From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com>
Date: Fri, 29 Mar 2024 15:52:53 +0900
Subject: [PATCH 19/72] =?UTF-8?q?style:=20=ED=94=BC=EA=B7=B8=EB=A7=88=20?=
=?UTF-8?q?=EB=94=94=EC=9E=90=EC=9D=B8=20=EA=B5=AC=ED=98=84(=ED=94=BD?=
=?UTF-8?q?=EC=85=80)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
public/item/chatBottom.png | Bin 2659 -> 1244 bytes
src/App.css | 38 ---------------------
src/components/ChatBody.tsx | 1 +
src/components/ChatBottom.tsx | 1 +
src/components/ChatHead.tsx | 2 +-
src/index.css | 13 --------
src/style/ChatBodyStyle.tsx | 57 +++++++++++++++++++++++++-------
src/style/ChatBottomStyle.tsx | 46 ++++++++++++++------------
src/style/ChatHeadStyle.tsx | 20 +++++++++--
src/style/ChattingRoomStyle.tsx | 1 +
10 files changed, 90 insertions(+), 89 deletions(-)
diff --git a/public/item/chatBottom.png b/public/item/chatBottom.png
index 5a89932f5816287f21364900af92febb58de8616..402dc135081af881cfe24b1038b08049a34ef74f 100644
GIT binary patch
literal 1244
zcmeAS@N?(olHy`uVBq!ia0y~yU@Ql+131`#VM%xNb!1@J*w6hZkrl`-^mK6ysbGA2*WPDNs?33p&)=M4l=al~LfyshO36mCDfoo$jwk<4O@LRXm6bTFS(B8SF^V6-;}m_<_iwV?=oNVt~B2GbYQJ@#p(CIWhy4}
ziK9{gmisVQ8rM=D@@|&39UZT2~~V)K|C={m!{FJ1<$jJdyoZris)_6LF#M
zbN5D7ZL$61@0ZBV78<3m_hftR)q(znQ5<{Jn#D5Azap>-CkR`ZRWd}>}4yp|K^)-G?;y<$TVwz>H3TRZqC1VcYWQv
zC(ow~{n)r>3DC&+e|IYL`K7+Cllg3Yo$vPj`d#;`KW>>)*K;>t^NqmuS5#V
z*j@DC{`zHwayD=FS1xYp(@-@qGTZhlv+mcM@_%z?`_+mkY!>>qw?FnyECY{)exbbM
zBfc+}vJJPYJin(qnP2_xuYWVYIWC?2XH%&6+E)+5_rLlZ{y*jAeUtBNR_|m?pS<1G
zFV6D!7C)8eeZNz#zPA6jYU$g0zrO148{KbnCTM)RQx(^6_r|L)spX#x
zWBVok_iw(|oXfu2QF}u@q_ODkzWbJ2w%FYF(e7?{XP=&TfBo{;=OuThCzp3<-Y-15
z$9jtP`_}h!+-yC#`+F~aK6!2H+0HLNU;pkjj0t#q&yQQo4p7EXn%!
zedfx4y#-FCES=Uzwi;ZvndNMM@>bg4&hD1Ie|?{aygH@b-pN8Ut~hJY
zoviom@@kFkGd^+r`Og3C_U@#x`ZddE*URlcpT7FI*y_rkug{xb{&e-)N_~T{OaFgm
z@7}%JzgDQaczN;cz0=d%ez%v-wtZm2$Hy0>si*SJfARt5W)00ZH*cKJmXW*li{(pL
z)Q!y>`>XFsMLyzY=UH~et|fBf8T|#ilN`d|Ii6(RA0T|~=g~Ls7Hyo&cIwJohnG(4
z-0b9j>cnT9IeJWC*}Iir|I90I`Wx|Lt(x85#-N$I8PKyDTFx5??t=de(^^7*`&h?x
Q0}CStPgg&ebxsLQ03rukYXATM
literal 2659
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
J0HNm^`(H{+KPLbH
diff --git a/src/App.css b/src/App.css
index 83b7c5e..e69de29 100644
--- a/src/App.css
+++ b/src/App.css
@@ -1,38 +0,0 @@
-.App {
- text-align: center;
-}
-
-.App-logo {
- height: 40vmin;
- pointer-events: none;
-}
-
-@media (prefers-reduced-motion: no-preference) {
- .App-logo {
- animation: App-logo-spin infinite 20s linear;
- }
-}
-
-.App-header {
- background-color: #282c34;
- min-height: 100vh;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- font-size: calc(10px + 2vmin);
- color: white;
-}
-
-.App-link {
- color: #61dafb;
-}
-
-@keyframes App-logo-spin {
- from {
- transform: rotate(0deg);
- }
- to {
- transform: rotate(360deg);
- }
-}
diff --git a/src/components/ChatBody.tsx b/src/components/ChatBody.tsx
index e596cbb..f8d3424 100644
--- a/src/components/ChatBody.tsx
+++ b/src/components/ChatBody.tsx
@@ -37,6 +37,7 @@ const formatTime = (isoDateString: string) => {
const ChatBody: React.FC = ({ messages, currentUser }) => {
let lastDate = '';
+
return (
{messages.map((message, index) => {
diff --git a/src/components/ChatBottom.tsx b/src/components/ChatBottom.tsx
index e74790c..1196a9f 100644
--- a/src/components/ChatBottom.tsx
+++ b/src/components/ChatBottom.tsx
@@ -36,6 +36,7 @@ const ChatBottom: React.FC = ({ onSendMessage }) => {
) =>
setInputValue(e.target.value)
diff --git a/src/components/ChatHead.tsx b/src/components/ChatHead.tsx
index 4526bde..de552db 100644
--- a/src/components/ChatHead.tsx
+++ b/src/components/ChatHead.tsx
@@ -17,7 +17,7 @@ const ChatHead: React.FC = ({ user, onUserClick }) => {
{user.name}
diff --git a/src/index.css b/src/index.css
index ec2585e..e69de29 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,13 +0,0 @@
-body {
- margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
- 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
- sans-serif;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-code {
- font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
- monospace;
-}
diff --git a/src/style/ChatBodyStyle.tsx b/src/style/ChatBodyStyle.tsx
index dea019f..7f20506 100644
--- a/src/style/ChatBodyStyle.tsx
+++ b/src/style/ChatBodyStyle.tsx
@@ -2,23 +2,40 @@ import styled, { css } from 'styled-components';
export const ChatMessageBox = styled.div<{ isCurrentUser: boolean }>`
display:inline-block;
- padding: 5px;
+ padding: 8px 9px 8px 9px;
+
width:196px;
- margin: 5px;
+ margin-left:30px;
border-radius: 8px;
background-color: #EDEDED;
align-self: flex-start;
- font-size: 16px;
- border-radius: 20px 20px 5px 20px;
-
+ border-radius: 20px 20px 20px 5px;
+ color: var(--dark-gray, #4E5058);
+font-family: "Noto Sans KR";
+font-size: 16px;
+font-style: normal;
+font-weight: 400;
+line-height: 150%; /* 24px */
+letter-spacing: -0.41px;
${(props) =>
props.isCurrentUser &&
css`
+ border-radius: 20px 20px 5px 20px;
background-color: #DCF7C5;
align-self: flex-end;
- `}
+ margin-right:5px;
+ `
+ }
+
+ ${(props) =>
+ !props.isCurrentUser &&
+ css`
+
+
+ `
+ }
`;
export const ChatBodyContainer = styled.div`
@@ -26,7 +43,9 @@ export const ChatBodyContainer = styled.div`
display: flex;
flex-direction: column;
margin-top: 96px;
- margin-bottom:80px;
+ margin-bottom:85px;
+ width: 375px;
+
@@ -37,30 +56,44 @@ export const UserProfileImage = styled.img<{ isCurrentUser: boolean }>`
height: 20px;
border-radius: 50%;
margin-right: 0px; /* 메시지 박스와의 간격 */
+ margin-left: 5px; /* 메시지 박스와의 간격 */
display:inline-block;
+ margin-top:-10px;
+ position:relative;
+ z-index:-5;
+
${(props) =>
props.isCurrentUser &&
css`
display:none;
+
`}
`;
export const DateSeparator = styled.div`
- width: 7.625rem;
- height: 1.3125rem;
- flex-shrink: 0;
- border-radius: 0.25rem;
- background: #D9D9D9;
+width: 122px;
+height: 21px;
+flex-shrink: 0;
+border-radius: 4px;
+background: var(--medium-gray, #D9D9D9);
color: #000;
text-align: center;
margin: 10px auto; // 정중앙 정렬
+ font-family: "Noto Sans KR";
+font-size: 12px;
+font-style: normal;
+font-weight: 500;
+line-height: 180%; /* 18px */
+
+
`;
export const TimeDisplay = styled.span`
display: block; // 메시지 박스 위에 표시
text-align: center; // 정중앙 정렬
margin-bottom: 5px;
+ margin-top:5px;
font-size: 12px;
`;
\ No newline at end of file
diff --git a/src/style/ChatBottomStyle.tsx b/src/style/ChatBottomStyle.tsx
index 55884fa..d64758e 100644
--- a/src/style/ChatBottomStyle.tsx
+++ b/src/style/ChatBottomStyle.tsx
@@ -2,35 +2,37 @@ import styled from 'styled-components';
// ChatBottomContainer를 div로 변경하여 컨테이너로 사용
export const ChatBottomContainer = styled.div`
-position: fixed;
-bottom: 0;
-width: 100%;
-height: 80px;
-
-
+ position: fixed;
+ bottom: 0;
+ width: 375px;
+ height: 80px;
flex-shrink: 0;
-
+
background-image: url('/item/chatBottom.png');
background-size: cover;
`;
export const ChatInput = styled.input`
-width: 60%;
-
- height: 2rem;
+ width: 275px;
+ height: 32px;
flex-shrink: 0;
- font-size: 14px;
- margin-left:11%;
- border-radius: 1rem;
- border: 0.5px solid var(--gray, #8d8d8f);
- opacity: 0.5;
- background: var(--white, #fff);
+ font-size: 14px;
+ margin-left: 11%;
+ border-radius: 16px;
+ border: 0.5px solid #8e8e93;
+ padding: 0px 0px 0px 7px;
+ opacity: 0.4496;
+ margin-top: 8px;
+ background: #fff;
`;
export const SendButton = styled.img`
- width: 1.5rem;
- height: 1.5rem;
- flex-shrink: 0;
- cursor: pointer;
- border: none;
-`;
\ No newline at end of file
+ width: 30px;
+ height: 30px;
+ flex-shrink: 0;
+ cursor: pointer;
+ border: none;
+ position: absolute;
+ margin-top: 9px;
+ margin-left: 4px;
+`;
diff --git a/src/style/ChatHeadStyle.tsx b/src/style/ChatHeadStyle.tsx
index 0cb6b6f..db1b9fb 100644
--- a/src/style/ChatHeadStyle.tsx
+++ b/src/style/ChatHeadStyle.tsx
@@ -5,6 +5,10 @@ width: 375px;
height: 96px;
position: fixed;
top: 0px;
+display:flex;
+justify-content:flex-start;
+align-items:center;
+
flex-shrink: 0;
background-image: url('/item/chatHead.png');
@@ -12,11 +16,21 @@ top: 0px;
`;
export const UserImage = styled.img`
- width: 50px;
- height: 50px;
+margin-left:45px;
+margin-right:10px;
+margin-top:30px;
border-radius: 50%;
+ width: 10px;
+ height: 40px;
+
+
+
`;
-export const UserName = styled.h2`font-size: 16px;
+export const UserName = styled.h2`
+font-size: 16px;
+margin-top:47px;
+font-style: normal;
+font-weight: 500;
`;
diff --git a/src/style/ChattingRoomStyle.tsx b/src/style/ChattingRoomStyle.tsx
index dad78ae..c8b70ff 100644
--- a/src/style/ChattingRoomStyle.tsx
+++ b/src/style/ChattingRoomStyle.tsx
@@ -4,5 +4,6 @@ export const ChatRoomContainer = styled.div`
width: 375px;
height: 812px;
background: var(--white, #fff);
+
`;
From 3e9b3990335a3197230303bb35f9dbe31a9be77f Mon Sep 17 00:00:00 2001
From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com>
Date: Fri, 29 Mar 2024 15:59:32 +0900
Subject: [PATCH 20/72] =?UTF-8?q?feat:ChatBody.tsx-displayMinuteSeparator?=
=?UTF-8?q?=20=EA=B5=AC=ED=98=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/ChatBody.tsx | 14 +++++++++++++-
src/style/ChatBodyStyle.tsx | 2 ++
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/src/components/ChatBody.tsx b/src/components/ChatBody.tsx
index f8d3424..8ced6f0 100644
--- a/src/components/ChatBody.tsx
+++ b/src/components/ChatBody.tsx
@@ -36,24 +36,36 @@ const formatTime = (isoDateString: string) => {
const ChatBody: React.FC = ({ messages, currentUser }) => {
let lastDate = '';
+ let lastMinute = '';
return (
{messages.map((message, index) => {
const messageDate = formatDate(message.date);
+ const messageMinute = formatTime(message.date);
let displayDateSeparator = false;
+ let displayMinuteSeparator = false;
+
if (messageDate !== lastDate) {
lastDate = messageDate;
displayDateSeparator = true;
}
+ if (messageMinute !== lastMinute) {
+ lastMinute = messageMinute;
+ displayMinuteSeparator = true;
+ }
+
return (
{displayDateSeparator && (
{formatDate(message.date)}
)}
- {formatTime(message.date)}
+ {displayMinuteSeparator && (
+ {formatTime(message.date)}
+ )}
+
{message.content}
diff --git a/src/style/ChatBodyStyle.tsx b/src/style/ChatBodyStyle.tsx
index 7f20506..32d93fb 100644
--- a/src/style/ChatBodyStyle.tsx
+++ b/src/style/ChatBodyStyle.tsx
@@ -6,6 +6,8 @@ display:inline-block;
width:196px;
margin-left:30px;
+ margin-bottom:5px;
+ margin-top:5px;
border-radius: 8px;
background-color: #EDEDED;
align-self: flex-start;
From 5ac25d5646507dc6e3b1758bb510bb695a2c92b2 Mon Sep 17 00:00:00 2001
From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com>
Date: Fri, 29 Mar 2024 18:19:35 +0900
Subject: [PATCH 21/72] setting:jason-server
---
package-lock.json | 6 ++++++
package.json | 1 +
src/ChattingRoom.tsx | 25 ++++++++++++++-----------
src/dummy.json | 3 +++
4 files changed, 24 insertions(+), 11 deletions(-)
create mode 100644 src/dummy.json
diff --git a/package-lock.json b/package-lock.json
index b518622..d0755a5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,6 +15,7 @@
"@types/node": "^16.18.91",
"@types/react": "^18.2.69",
"@types/react-dom": "^18.2.22",
+ "nodejs": "^0.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "5.0.1",
@@ -12673,6 +12674,11 @@
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
"integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
},
+ "node_modules/nodejs": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/nodejs/-/nodejs-0.0.0.tgz",
+ "integrity": "sha512-1V+0HwaB/dhxzidEFc4uJ3k52gLI4B6YBZgJIofjwYCSAkD6CI0me6TDBT2QM2nbGWNxCHcq9/wVynzQYZOhUg=="
+ },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
diff --git a/package.json b/package.json
index 6f5afcf..5e6fc8e 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,7 @@
"@types/node": "^16.18.91",
"@types/react": "^18.2.69",
"@types/react-dom": "^18.2.22",
+ "nodejs": "^0.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "5.0.1",
diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx
index a7c657d..2a5c4fb 100644
--- a/src/ChattingRoom.tsx
+++ b/src/ChattingRoom.tsx
@@ -2,6 +2,7 @@ import React, { useState, useEffect, useRef } from 'react';
import ChatHead from './components/ChatHead';
import ChatBody from './components/ChatBody';
import ChatBottom from './components/ChatBottom';
+import dummy from './dummy.json';
interface Message {
id: number;
@@ -38,6 +39,9 @@ function ChattingRoom() {
useEffect(() => {
// 메시지 데이터를 localStorage에 저장
localStorage.setItem('messages', JSON.stringify(messages));
+
+ //dummy.message = JSON.stringify(messages);
+ //console.log(dummy.message);
}, [messages]);
useEffect(() => {
@@ -45,17 +49,16 @@ function ChattingRoom() {
messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
}, [messages]);
- const sendMessage = (messageContent: string) => {
- const newMessage: Message = {
- id: Date.now(),
- from: currentUser.name,
- content: messageContent,
- date: new Date().toISOString(), // ISO 형식의 날짜 문자열 사용
- };
-
- setMessages((prevMessages) => [...prevMessages, newMessage]);
- };
-
+ const sendMessage = (messageContent: string) => {
+ const newMessage: Message = {
+ id: Date.now(),
+ from: currentUser.name,
+ content: messageContent,
+ date: new Date().toISOString(), // ISO 형식의 날짜 문자열 사용
+ };
+
+ setMessages((prevMessages) => [...prevMessages, newMessage]);
+ };
const toggleUser = () => {
setCurrentUserIndex((currentIndex) => (currentIndex === 0 ? 1 : 0));
diff --git a/src/dummy.json b/src/dummy.json
new file mode 100644
index 0000000..e62f743
--- /dev/null
+++ b/src/dummy.json
@@ -0,0 +1,3 @@
+{
+ "messages": []
+ }
\ No newline at end of file
From 8b2318ffd0f6c4f6a88fa06fa7bdb2d89d5f25a7 Mon Sep 17 00:00:00 2001
From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com>
Date: Fri, 29 Mar 2024 18:58:31 +0900
Subject: [PATCH 22/72] =?UTF-8?q?feat:=EC=B4=88=EA=B8=B0=20=EC=83=81?=
=?UTF-8?q?=ED=83=9C=20dummy.json=EC=97=90=EC=84=9C=20=EB=B6=88=EB=9F=AC?=
=?UTF-8?q?=EC=98=A4=EB=8A=94=20=EA=B2=83=EC=9C=BC=EB=A1=9C=20=EB=B3=80?=
=?UTF-8?q?=EA=B2=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/ChattingRoom.tsx | 6 ++++--
src/dummy.json | 38 +++++++++++++++++++++++++++++++++++---
2 files changed, 39 insertions(+), 5 deletions(-)
diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx
index 2a5c4fb..fdca42e 100644
--- a/src/ChattingRoom.tsx
+++ b/src/ChattingRoom.tsx
@@ -29,8 +29,10 @@ function ChattingRoom() {
// 현재 메시지 기롥 상태 관리
const [messages, setMessages] = useState(() => {
// 로컬 스토리지에서 초기 메시지 로드
- const savedMessages = localStorage.getItem('messages');
- return savedMessages ? JSON.parse(savedMessages) : [];
+ // const savedMessages = localStorage.getItem('messages');
+ const savedMessages = dummy;
+ //return savedMessages ? JSON.parse(savedMessages) : [];
+ return savedMessages;
});
const currentUser = initialUsers[currentUserIndex];
// 메세지 목록 끝으로 스크롤
diff --git a/src/dummy.json b/src/dummy.json
index e62f743..782935e 100644
--- a/src/dummy.json
+++ b/src/dummy.json
@@ -1,3 +1,35 @@
-{
- "messages": []
- }
\ No newline at end of file
+
+
+[
+ {
+ "id": 1711705694689,
+ "from": "이지인",
+ "content": "국가는 농수산물의 수급균형과 유통구조의 개선에 노력하여",
+ "date": "2024-03-29T09:48:14.689Z"
+ },
+ {
+ "id": 1711705702873,
+ "from": "이영인",
+ "content": "가격안정을 도모함으로써 농·어민의 이익을 보호한다.",
+ "date": "2024-03-29T09:48:22.873Z"
+ },
+ {
+ "id": 1711705711651,
+ "from": "이지인",
+ "content": "정당은 그 목적·조직과 활동이 민주적이어야 하며,",
+ "date": "2024-03-29T09:48:31.651Z"
+ },
+ {
+ "id": 1711705718508,
+ "from": "이지인",
+ "content": "국민의 정치적 의사형성에 참여",
+ "date": "2024-03-29T09:48:38.508Z"
+ },
+ {
+ "id": 1711705726747,
+ "from": "이영인",
+ "content": "하는데 필요한 조직을 가져야 한다.",
+ "date": "2024-03-29T09:48:46.747Z"
+ }
+
+]
\ No newline at end of file
From 881f972f7dfd03325125327cecd89eeae7237580 Mon Sep 17 00:00:00 2001
From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com>
Date: Fri, 29 Mar 2024 19:04:52 +0900
Subject: [PATCH 23/72] =?UTF-8?q?feat=20README.md=20-=20=EB=B0=B0=ED=8F=AC?=
=?UTF-8?q?=20=EB=A7=81=ED=81=AC=20=EC=97=85=EB=A1=9C=EB=93=9C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index 82b92ad..ec33c8f 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
# 서론
+배포 링크 : https://react-messenger-19th-taupe.vercel.app/
+
안녕하세요 🙌🏻 19기 프론트 운영진 배성준입니다. 이번 미션에서는 드디어 투두리스트에서 벗어나 새로운 프로젝트인 **messenger** 만들기를 진행합니다.
이번주는 특별히 **디자이너와의 협업**으로 진행되는 미션입니다. 디자이너분께서 열심히 리디자인 한 메신저 프로젝트를 여러분들께서 구현해주시면 됩니다.
From 92b8fce5600d048310d94cb4c676551286bec415 Mon Sep 17 00:00:00 2001
From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com>
Date: Fri, 29 Mar 2024 19:34:31 +0900
Subject: [PATCH 24/72] =?UTF-8?q?feat:=20userImage=EB=8F=84=20=20ChatBodyP?=
=?UTF-8?q?rops=EB=A1=9C=20=EC=A0=84=EB=8B=AC=ED=95=98=EC=97=AC,=20current?=
=?UTF-8?q?User,=20body=20=ED=94=84=EB=A1=9C=ED=95=84=EC=97=90=EB=8F=84=20?=
=?UTF-8?q?=EB=B0=98=EC=98=81=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?=
=?UTF-8?q?=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
public/item/profile_mini2.png | Bin 0 -> 18783 bytes
src/ChattingRoom.tsx | 4 ++--
src/components/ChatBody.tsx | 5 +++--
3 files changed, 5 insertions(+), 4 deletions(-)
create mode 100644 public/item/profile_mini2.png
diff --git a/public/item/profile_mini2.png b/public/item/profile_mini2.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2841564344d6db9918055a268d5a6456ed8965e
GIT binary patch
literal 18783
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͋|q2|pV%4XsK%J0
zHlO?u)VPh4Dqp!G7tdb=NytJ4M57@04ou9*(xnTMgX)fDKzG1=Z6cfJizz_fV8<+T
z1$d%@UDd~Krh{z`bok52dQy2C2}FEof9B5C0J$KhbEZX0kGb
z3$+PH@AeQ=IBuj}fieX!)7o)c!-gSPn7#KtncrKIWgx-nxqY&=wyFXrJarJ|cVnC|
z5!baDcr3i=Nut)!E-FUljOu&Pv=oFj4-=L}FbiTEC^D|abHl!UEu64T%%ageharTa
z)(wzqA{7)H7IO`=fFsI8a~vkd7zsnn!~<<)@lAgnar-7%*DFickRw1&Igyvd{4rpD
zm;}(?q?qd)S7dd)q7@emjJhx-MJ(cSqXVr;>fo^^&`G`BHz&`QH0#C)h;a#@Us>CN
zS?D4$GzGI@%XOrIsojN4QXN0>Jwe7+wT>Q1C4b-yHs)QMZ7N?GT;Q0
zdvHHAFfLo5RqEP@-&1Z*M;1gQLkL#lel%GEYs*Ae7jcuv{!7?ocJ>r4b%1uX_}dk5
z>PK`Mf>Aa8Th)=1eIU^~cIEQ*RoTFTE33&uqR=zM8k}z$DC*L?4JF`m*!?wjMB#g?
z9aG<=kQB%zLn0A&wA1xWGk;)m^KNJ^#EBpy%dooruDpBkD)RDdZB9$QGY~U*!L**S
zVBy5^T>ubi<&-!GU>XUo2FS%RP~H68m21ngzP={+E<7O9^Yh4NRsjf(so?W@Q1_fJ
zgp8yMU(>@z=_75+g(V+HKfvAH1W@QfaQGt7H947?+b!w*tn}@)j3KDmtkRqKKr_hy4dv$>h8Yt4!QX5IiyRQaMF%0@D@xEQHHJA29SK%
zO=b=W=fs#NX1^`fCHE?G&>`-m|k4h$I#^UmKfAcWRT3R6|?O}q0
z2@vO8s=9Lc@FCd#j+}eiu}=qmZ?
zASGa0xJ@F8lxzYylic(k$q<
zCyG&u0Fck87L{RlL6xU+l43p?ClneMPTK+)C}v<*u5*}KAlqfzk*OqPOvG$OPs}Ii
zIr%}9m|_6tDD5(jaR0YHzgxA&*3nL;HkYvTvj@lJ`FD^BM66M*Z^_ZSj)4o?t<{Rm
z<9C`}v2>>*=Z|Z0JJ5&$(2|d+9ytrJE<(g%r%m;}T6KIUwP`o#p{d!uk{+MN>v{8?
zHvZ1f>-*yP;~q8v3-2titB90!!E7$-0)1u*S*1|$pE3m5E@>zQb^y{Dmo-*2?dZ
zFaqsz8W6*&tdTk>u<4}CU=!&>B=$?(SEsj
z@sjRjUJQ${IVz)=1_qBCSm+M>LmcDmDK(a0QV@>*6y2RZb5_hxL!07=M@qZ0^4U8l
zbr1kci`0RdQb=w5-#e3+|KT$;^33a-GB-CbpZ)dUQZv_uAnJhT{Z>zHIIqdY;?WWW
z77HvarRqIaonX@hSU68j52>Oga`Ss(@(u#!f&b$00DL8x0#Y?Je~FaI-!MA&AOvrK
zT#;KRvkL9#t8lVnQVL`SVsNlaAv?8gkZy2Faa)&C?VTki$-+(|mcrD5iq_#P*bSA(
z!tms6yvEAB0^s7Rzhx*G+oTrrUAuTewkma)4%hUBkPXJ?6F8)tjI!b6&RhjKq8lfU^U4*b
zBnRl68Y`Gtj_{4F?AKAXfe8(C2pjyO&k|LimLvu0y-k^@-(wIw&}^pr8Z^W$d)itI
z2aG&%MjP^D2JT9rNQ!ex8t@V8&3Gns_;CUSw8PoOY-
z#|Uv3l100x(;A>Tw(0PV#hq=4Zkys}2U^4?(W7{6|1@Ht<{89JdE`e@a(yKy|I_dP
zukzB5Ps!h${-J6)cLir|rEqT9Si&$8%;l&_jV98?;VYn#@pMA{3Sq0+z`m{<{%@v5sIOL3F@UP6XON>>hJvnx#xk0r$`Qq}8ZP3qjG<
zrJBM}#tY=DNWF|tWMm4gX%@JgXt@P!y#b=G-N%B!aoHIpuyA7hhU#)zw(yy0B&RqQ
z<2S$b+p>CfN#1<9$4HAp3g#v^be{XmZ5w`xojfC
zz?iQg8==C%`I2fM!utXq={p~g0?0*jQTq<;m$|)rca+ka#cbo6uPt4Yb8o#Z=ihl7
z*9AXn$D$rZE6VHp3Wr(u+aL5sY`7H-Vn!HY@ElW$+<;vA{9hsr93XqaCcZ~2APOh?iO*pP-(YJuY
zFIpH*s>4q2-u?Gv_x)c~IM3n=?S9e*(H%^MNK~I|1j_>JO`I!>F9J|4Z9sfZnW)vO
z$UHVQk75~qNRShxRZnZ0oiW%U=YHto5qd6Lf37BQSb|D9qFUlN#XOUYRJ14{0yV#Yb
z(q6f6>59Di>RS+GCmLjIsh^62UfFZ^q&)E8y|R4%T{U}gm;)9s6MYwwtR}=R1|vK@
znN_xp=!wFlLCmI1?_w;1xLTG4A;tqkhO*(GD8~%WjLp*AbhgC8gJM&q20S(Dv(nhTCResPNcQwKx}Am7o&bJlVA_RNc3`HmEFj3lmF}3D%)l%a
z)#PZ8;}DI03jM{AK)(6EeZBnc|M+wnAy$dA4oq)(AY<6&
zo`nQc+)^rmrihp1&`whjB=ndf<@*_#!!{DeW-8&nlUxcsV@-jI)qoXi}(=*`@ow8ir#>}rtB3n>283aRCz%tRlA5~ICgrEw-
zH+`0@w_-ko*UdU#7Wps;z4MO4a^>S*?NZDdff_
zn4b{&JO4n|U-(a&Xkuv&D>S&BEG=|!6ezI!R!3>^;{;HG?V(ptVXUZeIXK|gViC)Z1Ciq55PV5%0)>d#~p)jSWnJK
z#ma*HjGGuD8e(QX+jMiAofv8}Hy3?u&k^Zut^w(7s>#zRoB8Ir(Ma>05sXBs8e?vd
z++sx`5FfjAomecIZV=lZqGp>ZL#@I+GIh^`2GaW5=E`KlqF9ES;E2h?h&g9JI_DIC
z3(wgNyiwVKan^;)xG`${AZ)DozP3Ws?o3d1GgSpLCJPJQz|0^#u+pF6$_
z9M1_x?wh|1STZwHC_vj3WAHQe?{ut0be9&EXlmf*Y~R_yHY6v}mEHF@((4#;DL!+Bk1h8J789r3<-;ljDvEd_G=^ozaEJ@mO<2#7wX*!adffFgjT&+U)f#J$)coi
z@_UX-e*fL#BjO*lDyGHXwxgy>BM-IVV$49Gx1F#xm^1eZ3AI43ha7+Gj^CEa`+ief
z4FaVwg3|I*u?YtE~kAzTXTsFar)kQ}J!gpk;PGZMB~$NNnF{r10S1lg#{4)k=yM`8`sZ@I5nNV4VGZ>bp(svK&J{V-;h66kt?>s>{K4WQ|K~SO2flm4iRPQANutf;Ru0VlKlqo971!K}
z9o4M1T7Z+S6&afxAE~a+ud+?W-q0TFGTNq=n5KsjyRE%^o@ugd_Y^9Ucw`Y91?LoI
zWc-0I$pju0h+A6`ANgvpQ^nu9=5tv?1*mJ~rjQ<(6C1(|BQ4@a>LHHdztk+s&Wait
znbP6@I*NodNC96(wZ0rl!yS8oVFtq6u~ZavD&|vA&MT@iJ)uj+K~1pfxu)sWWrOz**6bYEMSo#4IMEB-+o>XZ`Hu
zYqA?;A?KEG!L7g~mE7pQ9YfYuFI?wHQCk8v2T3cCN!fuOhJY*Pb3bhg|R3FtXn&b%+qL_2cwGh?Oyz-1IE^ndGs~R
z_n1LDkyZuah*8$-qG<#a|Lna-`&JLA
ziG>6V5_6fnM&`Ul5vQ*uGzSom#=r`EN??!~E`Ig;8vIXJt4Ub%$^?w|5ppoHZ-&YQ
zS`!?O+P@SMTZXMAC89A80#G8eFru{e{)C8ZN%y;bGepc)yKH*f-O$xsgx>3l0}7bA
za}Dqyf0b~ydtj_kMzdMe{8^@_!wQT)*`64*-Agw5+d!iJkEnPp%6AM8qBosug16jv
z|1o1$Lqj8JWshY&wRrlO@`n}(55MO=*6H+WI`&TQ3E0u#Nb?MqZKfLdrdN>EbBj4?
zoeC$q^R6u|>jh|`Gqk4L>1h=TtHTF+%ZaElQv2}C;_Te(S}4Fl$cdOz=_~?J_B1pj
zpN3G<^-UEFA70-x4VOAx-w=63i~b4`I9u|m=lcKk`GxpPGpoE_cl&C$H
zSW$h6ISjbQsJXU?17_tM`iLemL%gKz%L_rG&m
zZdV{Y&R@LrVlFdrVyoRN`4)(}SQa^NTPpPdQo3zf-E7G!$h=KFvWVcBp0(r5F()<0
zOmm|529e=y=?o;~jx~aD6;-KI)uCL5bW=lO4~L))+rf4SMxt3>awEhU1)2QD2=`N?
z$8kWQ;mq63T3C|pT0qzWDWQpZZIVeY_p_Z
zXew`*GoPKBkQe{@Wn@SkqtbUam0lyk*B9_Ur_LMF+4}q}J#|C~etf
zX0J+8uPgg!i@MuW;KE|bq&j?3Fzm@zC$61CQMxr|N4qM}B+x(yfSKDCSW)^w`=j
zXl7m+4cT_;hE}(B_^2@IPByn#y5q>9+V`IRvoCFKUi-N-;O!5Phm_0b%JEF@adJaS
zAp>=>nxx-m?{`Oo#!#zI%xsS&cqH0=j&tSiVP2gjIi~-_iu^(nq-9ns;|UUM$I$Qu
z0(>xe;0i_EV;RQ
z<;A=1IX;d>{5%J9ky7DZI6b5jDIn&%_smXd?G-y$gNTglF_npvnnJ3RPLFYbPK)-#
z(J(I#wr78Mnqy>P_VkVi?B7nr3_2O^V2ulgZa*?(QBfU_VG>Cf+%omICaw!3cpDA@
zHwno0V?o)zHQvw!S|ec$4?B#k)QIvC8BYDAK)Bd;6vn*r}eM5gC2|Z$bj@fD#
z4zgQ{@%s^CLM%XbldHmVPgAuh`aEwbM2O4kZk`}VFD24(Eev3uBW9Vx>z%Ir;-d$QAaYn)r6@r0ra
z+o-E;YP7WGmW64^O|URqE8~Oc4xPNmd9SBJ(i_l6iT{xwh~fc7P_}gwjxw*02K`$S
zMFMieu+Ez~++haLxd}4Mj;Sp=NXZ)B;WLQ%HWOEnj9gh>){d#rH+)_Y-Ot32&Pm&y
zV@&3yv`!0~wFWNmAns<9MD3+wtOdZs_1DPqkk
z@6M*}30mpV)jJXl?^Ymk<1J5(yRdGti-!wnn>jyf&Z0YWTGovacvwdz5d$01{x<}k
zBWm&{CVChE?x5zi5eU56+Vxdw)SHF?)zVH;dPJ*F;6IakPb$*=K@Hb_+rlvC^%0I|
z{`iSSSf`UfD;zWuwf{03XGycx)aX6IxP%qt9QlWIDkpgIt^`!26g!Rphk2VjCu$R>
z6DQ|KWHe%6f6nO+k$Q{#+QTs%3B6+wW2&&`*ol)z_w4ydx6S*=x9@&?@x|5qAN*V2LyGn9@82_(
zBFgId@u-D(ATuB%*#lUu)Rp068!<10?E)-FIJfwkESP;%NUBcl
zeaysAmQ};{I(cBv%tyYl7MA158kJFhM3e5gC_xl0NY6S})JNAB3s
z!-|TycQUS8;3>m>J6wE4O`%!b;RuVNFmDvdwlGJLv^C6w>%i6>(MY5bfiYW3etPEK
zR!ObKjHzi>?#gkLord{d#L0g3z^+|o`IyJY(vabC{P>;a<98oD&}=rpl^e^-{{6d^
zlZwaU5fu`b>q}Q|MAQ9=5VApFROSdnlww$REKW8OO8kF=ZL(a7anKrSag
z31R3p$tQfgc;@X#kW_j!oy`;nKvP$*ZOFB&t5UhX42rZayWnfsPB*)2wgGmRt
z(5c5vwoM0GTjmZumTZsb3~x3!q3LJ80rEzREh7j#q{Meb+-%GB)e4x-
zifmpzEBj~iFjsejfJ`fm&zlbOp13Kkr82i>RZ=h_`V0XWMB2b(yO?csXs{j$C)i=u
zEHf#=+5us?*xD0Br*4NMlckF>D!vFK?G#N}5AUdR{;juQa^IF>E`7Sby88A12Z=oS
zgpZGP`|kHUj^C;H`{c`SU4FP;>phB1Rw9;1HN0i&&btJKO4^zdBK98IX3&TXeKQ5;TjrZg
zM$rsNU>0)a@&);$fBH{qc4h7HKYi=MC#n@Yk59yhyx;M;yAM2tFE|M&{cX}E3?7qU
zc(rIE2%@_ZMCn*I(0e8YOIn_Rqo!s9f0P^7jHK2>g-T&)ZIh;O-KfmQHyJ|DjEj<}
zg-kz}c^FoF_|aTloy4<^(1Ku_0Z>+0O!cB4xZ10p&t<-~@Re44`G@u`@sTOI%R
zBaf9jZtJo8?%4medmeZ|lT$r6&<-Y693~N5u|$(a%-RVRi%LKp6S0pdk6?Iz#GOoU
zFygLuc03u%Jer$gnPLW-LfbKI(-N9{c{nk9n=OubD*YbL0qc9G-Cp`9gV5Ybhh|fI0&O#ml-k4h@jHiq8wsO^Px-d(`%fJ`dh}z(6}Nl*!UZxso_p@O
zQqT)dv|Z~_Sg2Ag8P_(4R5qi%7wpE>%%L;Pg=+_=m^-oEh>nKSibh%@JBucw8sLbg
zPqNjHh1ik6I$#ahhsaxs4+3`)?|wFA+fN)gaNtAT-T9L~erW>Pc|7??e{#aM5)Y?y
z*)L}EnG!p)I1!HR25b_tN7Q;~3e;%rcLsr>DPoqW+-4}Qp$X!l(~H=S$H8J_IYmvR
zJsQzvSarLLfVjzxb=4E&wtwKs&w+O2AU7XpE?+K6&s(r#
zu>~g#N}=uCZ&;Sd
a9{&}P5(pCZCLx;u0000
-
+
diff --git a/src/components/ChatBody.tsx b/src/components/ChatBody.tsx
index 8ced6f0..758b262 100644
--- a/src/components/ChatBody.tsx
+++ b/src/components/ChatBody.tsx
@@ -19,6 +19,7 @@ interface Message {
interface ChatBodyProps {
messages: Message[];
currentUser: string;
+ userImage: string;
}
const formatDate = (isoDateString: string) => {
@@ -34,7 +35,7 @@ const formatTime = (isoDateString: string) => {
.padStart(2, '0')}`;
};
-const ChatBody: React.FC = ({ messages, currentUser }) => {
+const ChatBody: React.FC = ({ messages,userImage, currentUser}) => {
let lastDate = '';
let lastMinute = '';
@@ -69,7 +70,7 @@ const ChatBody: React.FC = ({ messages, currentUser }) => {
{message.content}
-
+
);
})}
From db159235bd72c38ed5cdb828335ca5c2fbb842d6 Mon Sep 17 00:00:00 2001
From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com>
Date: Fri, 29 Mar 2024 21:20:32 +0900
Subject: [PATCH 25/72] =?UTF-8?q?feat:chatbody=20props=EB=A1=9C=20currentU?=
=?UTF-8?q?ser=EA=B0=80=20=EC=95=84=EB=8B=8C,=20otherUser=20profile=20?=
=?UTF-8?q?=EC=A0=84=EB=8B=AC=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?=
=?UTF-8?q?=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/ChattingRoom.tsx | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/ChattingRoom.tsx b/src/ChattingRoom.tsx
index ad870b9..37f699e 100644
--- a/src/ChattingRoom.tsx
+++ b/src/ChattingRoom.tsx
@@ -35,6 +35,9 @@ function ChattingRoom() {
return savedMessages;
});
const currentUser = initialUsers[currentUserIndex];
+ const otherUserIndex = (currentUserIndex + 1) % initialUsers.length;
+ const otherUser = initialUsers[otherUserIndex];
+
// 메세지 목록 끝으로 스크롤
const messagesEndRef = useRef(null);
@@ -69,7 +72,11 @@ function ChattingRoom() {
return (
From 6536e109583d6c9f1642ac3b8f22e65629fb9b4b Mon Sep 17 00:00:00 2001
From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com>
Date: Fri, 29 Mar 2024 22:34:39 +0900
Subject: [PATCH 26/72] =?UTF-8?q?feat=20README.md=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 122 ++++++++++++++++++++++++++++++++++--------------------
1 file changed, 76 insertions(+), 46 deletions(-)
diff --git a/README.md b/README.md
index ec33c8f..28c50a6 100644
--- a/README.md
+++ b/README.md
@@ -1,68 +1,98 @@
-# 서론
+# 🥳 배포 링크
-배포 링크 : https://react-messenger-19th-taupe.vercel.app/
+https://react-messenger-19th-taupe.vercel.app/
-안녕하세요 🙌🏻 19기 프론트 운영진 배성준입니다. 이번 미션에서는 드디어 투두리스트에서 벗어나 새로운 프로젝트인 **messenger** 만들기를 진행합니다.
+# ⚙️ 구현 기능
-이번주는 특별히 **디자이너와의 협업**으로 진행되는 미션입니다. 디자이너분께서 열심히 리디자인 한 메신저 프로젝트를 여러분들께서 구현해주시면 됩니다.
+
-동시에, 이번주부터는 새로 **TypeScript**를 적용해보려고 합니다.
+![화면 기록 2024-03-29 오후 9 20 44 (1)](https://github.com/CEOS-Developers/react-messenger-19th/assets/101055312/f5128e75-1798-4afd-b183-713668a26bb6)
-프로젝트의 규모가 커지게 될 수록, 컴포넌트가 가지는 props의 종류 또한 다양해지게 됩니다. 무지성 코딩을 하다보면 가끔 이 props의 구성과 이름, 어떤 타입이 들어가야 하는지 헷갈리기 마련이죠. 보통 그럴 때 다시 컴포넌트 정의 부분으로 돌아가 props의 구성을 보고 오곤 합니다.
+## React Hooks 사용
-하지만 이럴 때, typescript를 적용한다면 컴포넌트의 구성과 그 이름, 심지어 타입까지 한번에 자동완성으로 편리하게 관리할 수 있고, 생산성이 증대되겠죠.
+1. **useState**: ChatBottom 컴포넌트에서 사용자가 입력한 메시지 값을 관리 등 컴포넌트의 상태를 관리하기 위해 사용했습니다.
+2. **useEffect**: UI와 관련 없는 부수 효과를 수행하기 위해 사용했습니다. 예시로, ChattingRoom 컴포넌트가 마운트될 때 서버에서 메시지 목록을 불러오거나, 메시지 목록이 업데이트될 때마다 자동으로 스크롤 위치를 조정할 때 사용했습니다.
+3. **useRef**: DOM 요소에 직접 접근하기 위해 사용되는 훅입니다. 새 메시지가 추가될 때마다 채팅 목록의 스크롤을 가장 아래로 이동시키기 위해 messagesEndRef를 사용했습니다.
-또한, **React Hooks**에 조금 더 익숙해지는 것을 목표로 합니다. 여러 Hook들이 있지만 그 중에서도 `useState`, `useEffect`, `useRef`를 중점적으로 사용해 보는 미션인데요, React를 사용하면서 굉장히 자주 쓰이는 Hook들이기 때문에 이 부분을 집중적으로 공부해 보아요!
+- 작동 방식 : messagesEndRef는 채팅 목록 끝 참조 → useEffect 훅을 통해, 메시지가 추가될 때마다, current가 가리키는 DOM 요소(채팅 목록 끝)로 스크롤을 이동시킴
-그럼 이번 미션도 파이팅입니다!!🎉
+```typescript
+const messagesEndRef = useRef(null);
-# 미션
+//..
+useEffect(() => {
+ // 메시지가 추가될 때마다 스크롤을 하단으로 이동
+ messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
+}, [messages]);
+```
-## Key Questions
+# ✅ Key Questions
-- JavaScript를 사용할때에 비해 TypeScript를 사용할 때의 장점은 무엇인가요?
-- 디자이너로부터 전달받은 피그마 링크 혹은, 피그마 캡처본
-- 컴포넌트를 분리한 기준은 무엇인가요?
-- 디자인 시스템을 적용하면서 느낀 점은 무엇인가요?
-- 디자이너와 소통하며 느낀점은 무엇인가요?
+## JavaScript를 사용할때에 비해 TypeScript를 사용할 때의 장점은 무엇인가요?
-## 미션 목표
+1. 타입 체크를 통한 오류 예방
-- TypeScript를 사용해봅시다.
-- useState로 컴포넌트의 상태를 관리합니다.
-- useEffect와 useRef의 사용법을 이해합니다.
-- styled-components를 통한 CSS-in-JS 및 CSS Preprocessor의 사용법에 익숙해집니다.
+```typescript
+interface Message {
+ id: number;
+ from: string;
+ content: string;
+ date: string;
+}
-## 기한
+interface ChatBodyProps {
+ messages: Message[];
+ currentUser: string;
+ userImage: string;
+}
-2024년 3월 29일 금요일
+const [messages, setMessages] = useState([]);
+```
-## 필수 구현 기능
+ChatBodyProps 인터페이스는 ChatBody 컴포넌트가 받아야 할 props의 구조와 타입을 명시적으로 정의해주기 때문에,
+컴포넌트에 잘못된 타입의 props를 전달하거나 전달하지 않았을 경우, 컴파일 단계에서 바로 오류를 발견할 수 있습니다.
-- 피그마를 보고 [결과화면](https://3th-fb-messenger.netlify.app)과 같이 구현합니다.
-- 디자인 시스템을 구축합니다.
-- 채팅방 상단의 프로필을 클릭하면 사용자를 변경할 수 있습니다.
-- 메세지를 보내면 채팅방 하단으로 스크롤을 이동시킵니다.
-- 메세지에 유저 정보(프로필 사진, 이름)를 표시합니다.
-- user와 message 데이터를 json 파일에 저장합니다.
-- UI는 **반응형을 제외**하고 피그마파일을 따라서 진행합니다.
+또한 메시지를 추가하는 함수 내에서 newMessage 객체를 생성할 때, Message 인터페이스에서 요구하는 속성을 빼먹거나 잘못된 타입을 사용하면 TypeScript 컴파일러가 즉시 오류를 표시하기 떄문에, 런타임 오류를 방지하고, 실수 가능성을 줄입니다.
-### 추가 구현 기능
+2. 코드 자동 완성 및 리팩토링 용이
+ 컴포넌트에 어떤 props를 전달해야 하는지 쉽게 알 수 있고, 이는 개발 효율성을 높입니다.
+ 또한 특정 인터페이스의 구조를 변경해야 한다면, TypeScript를 사용하면 해당 인터페이스를 사용하는 모든 곳을 찾아 수정해야 함을 알 수 있기 때문에, 더욱 안전하고 빠른 리팩토링이 가능합니다.
-- 더블 클릭 하면 감정표현을 추가합니다.
-- 그 외 추가하고 싶은 기능이 있다면 마음껏 추가해 주세요!
+3. 코드 의도와 구조 명확화
+ 인터페이스를 통해 코드의 의도와 구조를 다른 개발자에게 명확히 전달할 수 있어 코드의 가독성이 향상됩니다.
-참고로 이번 과제는 다음주까지 이어지는 과제이므로 **확장성**을 충분히 고려해 주세요. 참고로 **4주차 과제에서는 유저 및 기능 추가와 Routing을** 진행합니다. 이를 위해 [recoil](https://recoiljs.org/ko/)이나 [redux](https://ko.redux.js.org/introduction/getting-started/)를 이용한 상태관리를 미리 해보시는 것을 추천합니다!! 모두 공식문서 많이 읽어보시고 자신만의 상태관리 조합도 찾아보면 재밌을 거에요 XD
+## 디자이너로부터 전달받은 피그마 링크 혹은, 피그마 캡처본
-## 링크 및 참고자료
+
-- [React docs - Hook](https://ko.reactjs.org/docs/hooks-intro.html)
-- [React의 Hooks 완벽 정복하기](https://velog.io/@velopert/react-hooks#1-usestate)
-- [useEffect 완벽 가이드](https://overreacted.io/ko/a-complete-guide-to-useeffect/)
-- [코딩 컨벤션](https://ui.toast.com/fe-guide/ko_CODING-CONVENTION)
-- [타입스크립트 핸드북](https://joshua1988.github.io/ts/intro.html)
-- [리액트 프로젝트에서 타입스크립트 사용하기 (시리즈)](https://velog.io/@velopert/series/react-with-typescript)
-- [디자인 시스템 구축기](https://yozm.wishket.com/magazine/detail/1830/)
-- [[영상] : 컴포넌트에 대한 이해](https://www.youtube.com/watch?v=21eiJc90ggo)
-- [Styled Component로 디자인 시스템 구축하기](https://zaat.dev/blog/building-a-design-system-in-react-with-styled-components/)
-- [ts 절대경로 설정하기](https://tesseractjh.tistory.com/232)
+## 컴포넌트를 분리한 기준은 무엇인가요?
+
+1. 각 컴포넌트를 UI 영역별 & 기능별로 분리했습니다.
+ 단일 책임 원칙에 따라 한 가지 기능만 수행하도록 설계했습니다.
+
+- **ChatHead**: 채팅방의 상단에 위치한 사용자 프로필을 표시합니다. 사용자 이름과 이미지를 포함합니다.
+- **ChatBody**: 채팅방에서의 대화 내용을 표시합니다. 메시지마다 시간과 날짜, 사용자 프로필 이미지를 표시할 수 있도록 구현했습니다.
+- **ChatBottom**: 메시지 입력창과 전송 버튼을 포함합니다. 사용자 입력을 받고, 'Enter' 키나 전송 버튼 클릭 시 메시지를 전송하는 기능을 구현했습니다.
+
+2. 또한, 버튼, 입력 필드같이, 사용자 이벤트에 따라, 특정 기능을 하고, 자주 사용되는 UI들도 재사용이 용이하게 별도의 컴포넌트로 분리했습니다.
+
+## 디자인 시스템을 적용하면서 느낀 점은 무엇인가요?
+
+디자인 시스템을 적용함으로써 UI의 일관성을 유지할 수 있었던 것 같습니다.
+또한, 개발 과정에서도 확실히 편리함을 느꼈습니다.
+우선, 디자인 시스템을 통해 개발자와 디자이너 간의 커뮤니케이션이 명확해졌고, 일관된 디자인 언어를 공유할 수 있었습니다.
+또한, UX/UI적인 고민을 덜어 개발에만 집중할 수 있어 좋았던 것 같습니다.
+디자인 시스템을 활용하면서 서비스를 만들 때는 정말 여러 UI 요소들이 있다는 것을 느꼈습니다. 이러한 UI 요소들은 모두 교체 가능성이 있으므로, 서비스의 규모가 커질수록, 나중에 UI 요소들을 교체하기 편하게 컴포넌트를 분리하고 가독성 있는 코드를 짜는 것이 중요하다는 깨달음을 얻었습니다.
+
+## 디자이너와 소통하며 느낀점은 무엇인가요?
+
+피그마에 만들어주신 UI를 가지고 개발하면서, 혼자 개발하고, UI까지 만들 때와는 퀄리티가 다른 결과물이 나온 것 같다는 생각이 듭니다.
+특히, 메시지를 입력할 때는 아이콘이 보내기 버튼이고, 입력하지 않을 때는 마이크 아이콘인 것은, 너무 당연한 UX이나, 일상 속에서는 신경쓰지 않고 지나쳤었는데, 피그마에서 UI 하나하나를 가져다 개발하면서, 정말 이는 사용자 친화적인 것 같다는 생각이 들었습니다.
+
+# 💡 느낀 점
+
+처음에는 json에 데이터를 저장한다는게, 새로 입력된 대화 내역도 업데이트해야 한다고 생각해, 어떻게 구현할지 감이 잡히지 않아,
+우선은 로컬 스토리지와 useEffect를 사용하여 대화 내역을 저장하고 관리하는 것을 구현했습니다.
+json에 더미 데이터를 저장해야하는 것을 이어서 계속 고민해보다가 백엔드도 구현해야 하는건가?...라는 생각을 하며 json-server를 통해 json 데이터를 업데이트하는 법을 계속해서 시도했었습니다.
+그런데, 초기 데이터만 json 파일에 저장하고, 이를 불러오는 것이란 걸 알고, 안심하며 초기 메시지 로드 하는 부분을 로컬 스토리지에서, -> json 파일에서 json 객체를 가져오는 것으로 수정했습니다.
+이를 통해, json에 새로 입력된 대화 내역도 업데이트해야 하는 것도 구현해보고 싶다는 생각이 너무 커져서, 중간고사 이후에 이 부분을 구현하는게 기대가 됩니다.
From 0f5786665a67c3b25e71f32973918d456c0ceafc Mon Sep 17 00:00:00 2001
From: jinnyleeis <101055312+jinnyleeis@users.noreply.github.com>
Date: Fri, 29 Mar 2024 22:37:08 +0900
Subject: [PATCH 27/72] =?UTF-8?q?feat=20README.md=20=EC=88=98=EC=A0=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 2 +-
image.png | Bin 0 -> 294367 bytes
2 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 image.png
diff --git a/README.md b/README.md
index 28c50a6..0843903 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@ https://react-messenger-19th-taupe.vercel.app/
# ⚙️ 구현 기능
-
+
![화면 기록 2024-03-29 오후 9 20 44 (1)](https://github.com/CEOS-Developers/react-messenger-19th/assets/101055312/f5128e75-1798-4afd-b183-713668a26bb6)
diff --git a/image.png b/image.png
new file mode 100644
index 0000000000000000000000000000000000000000..b085d62995edb03aa669bbd3dc854e722d5448d1
GIT binary patch
literal 294367
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