-
Notifications
You must be signed in to change notification settings - Fork 210
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
remove chat list, add hover and minor fixes
- Loading branch information
1 parent
2d3e650
commit fc972a3
Showing
31 changed files
with
509 additions
and
436 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
29 changes: 29 additions & 0 deletions
29
services/app/apps/codebattle/assets/js/widgets/components/ChatUserInfo.jsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
import React from 'react'; | ||
|
||
import useHover from '../utils/useHover'; | ||
|
||
import UserInfo from './UserInfo'; | ||
|
||
function ChatUserInfo({ user, displayMenu, className = '' }) { | ||
const [ref, hovered] = useHover(); | ||
|
||
return ( | ||
<div | ||
ref={ref} | ||
role="button" | ||
tabIndex={0} | ||
className={className} | ||
title={user.name} | ||
key={user.id} | ||
data-user-id={user.id} | ||
data-user-name={user.name} | ||
onContextMenu={displayMenu} | ||
onClick={displayMenu} | ||
onKeyPress={displayMenu} | ||
> | ||
<UserInfo user={user} hovered={hovered} hideInfo hideOnlineIndicator /> | ||
</div> | ||
); | ||
} | ||
|
||
export default ChatUserInfo; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
80 changes: 0 additions & 80 deletions
80
services/app/apps/codebattle/assets/js/widgets/components/ExtensionPopup.jsx
This file was deleted.
Oops, something went wrong.
16 changes: 16 additions & 0 deletions
16
services/app/apps/codebattle/assets/js/widgets/components/InfoMessage.jsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
import React from 'react'; | ||
|
||
import moment from 'moment'; | ||
|
||
function InfoMessage({ text, time }) { | ||
return ( | ||
<div className="d-flex align-items-baseline flex-wrap"> | ||
<small className="text-muted text-small">{text}</small> | ||
<small className="text-muted text-small ml-auto"> | ||
{time ? moment.unix(time).format('HH:mm:ss') : ''} | ||
</small> | ||
</div> | ||
); | ||
} | ||
|
||
export default InfoMessage; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
110 changes: 57 additions & 53 deletions
110
services/app/apps/codebattle/assets/js/widgets/components/Message.jsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,108 +1,112 @@ | ||
import React from 'react'; | ||
|
||
import cn from 'classnames'; | ||
import moment from 'moment'; | ||
|
||
import useHover from '../utils/useHover'; | ||
|
||
import InfoMessage from './InfoMessage'; | ||
import MessageTag from './MessageTag'; | ||
import MessageTimestamp from './MessageTimestamp'; | ||
import SystemMessage from './SystemMessage'; | ||
|
||
function MessageHeader({ name, time, hovered }) { | ||
const playerClassName = cn( | ||
'd-inline-block text-truncate align-top text-nowrap cb-username-max-length mr-1', | ||
{ 'text-primary': hovered }, | ||
); | ||
|
||
return ( | ||
<> | ||
<span className="font-weight-bold"> | ||
<span className={playerClassName}> | ||
{name} | ||
</span> | ||
</span> | ||
<MessageTimestamp time={time} /> | ||
</> | ||
); | ||
} | ||
|
||
function MessagePart({ part, index, name }) { | ||
if (part.slice(1) === name) { | ||
return ( | ||
<span key={index} className="font-weight-bold bg-warning"> | ||
{part} | ||
</span> | ||
); | ||
} | ||
|
||
const MessageHeader = ({ name, time }) => ( | ||
<> | ||
<span className="font-weight-bold"> | ||
<span className="d-inline-block text-truncate align-top text-nowrap cb-username-max-length mr-1"> | ||
{name} | ||
if (part.startsWith('@')) { | ||
return ( | ||
<span key={index} className="font-weight-bold text-primary"> | ||
{part} | ||
</span> | ||
</span> | ||
<MessageTimestamp time={time} /> | ||
</> | ||
); | ||
); | ||
} | ||
|
||
return part; | ||
} | ||
|
||
const Message = ({ | ||
function Message({ | ||
text = '', | ||
name = '', | ||
userId, | ||
type, | ||
time, | ||
meta, | ||
displayMenu, | ||
}) => { | ||
}) { | ||
const [chatHeaderRef, hoveredChatHeader] = useHover(); | ||
|
||
if (!text) { | ||
return null; | ||
} | ||
|
||
if (type === 'system') { | ||
const statusClassName = cn('text-small', { | ||
'text-danger': ['error', 'failure'].includes(meta?.status), | ||
'text-success': meta?.status === 'success', | ||
'text-muted': meta?.status === 'event', | ||
}); | ||
|
||
return ( | ||
<div className="d-flex align-items-baseline flex-wrap"> | ||
<small className={statusClassName}>{text}</small> | ||
</div> | ||
); | ||
return <SystemMessage text={text} meta={meta} />; | ||
} | ||
|
||
if (type === 'info') { | ||
return ( | ||
<div className="d-flex align-items-baseline flex-wrap"> | ||
<small className="text-muted text-small">{text}</small> | ||
<small className="text-muted text-small ml-auto"> | ||
{time ? moment.unix(time).format('HH:mm:ss') : ''} | ||
</small> | ||
</div> | ||
); | ||
return <InfoMessage text={text} time={time} />; | ||
} | ||
|
||
const parts = text.split(/(@+[-a-zA-Z0-9_]+\b)/g); | ||
|
||
const renderMessagePart = (part, i) => { | ||
if (part.slice(1) === name) { | ||
return ( | ||
<span key={i} className="font-weight-bold bg-warning"> | ||
{part} | ||
</span> | ||
); | ||
} | ||
if (part.startsWith('@')) { | ||
return ( | ||
<span key={i} className="font-weight-bold text-primary"> | ||
{part} | ||
</span> | ||
); | ||
} | ||
return part; | ||
}; | ||
|
||
const textPartsClassNames = cn('text-break', { | ||
'cb-private-text': meta?.type === 'private', | ||
}); | ||
|
||
return ( | ||
<div className="d-flex align-items-baseline flex-wrap mb-1"> | ||
<span className="d-flex flex-column"> | ||
<span className="d-flex flex-column w-100"> | ||
<span | ||
ref={chatHeaderRef} | ||
role="button" | ||
tabIndex={0} | ||
title={`Message (${name})`} | ||
className="d-flex justify-content-between" | ||
data-user-id={userId} | ||
data-user-name={name} | ||
onContextMenu={displayMenu} | ||
onClick={displayMenu} | ||
onKeyPress={displayMenu} | ||
> | ||
<MessageHeader name={name} time={time} /> | ||
<MessageHeader name={name} time={time} hovered={hoveredChatHeader} /> | ||
</span> | ||
<span> | ||
<MessageTag messageType={meta?.type} /> | ||
<span className={textPartsClassNames}> | ||
{parts.map((part, i) => renderMessagePart(part, i))} | ||
{parts.map( | ||
(part, i) => ( | ||
/* eslint-disable react/no-array-index-key */ | ||
<MessagePart key={i} part={part} index={i} name={name} /> | ||
), | ||
)} | ||
</span> | ||
</span> | ||
</span> | ||
</div> | ||
); | ||
}; | ||
} | ||
|
||
export default Message; |
Oops, something went wrong.