Skip to content

Instantly share code, notes, and snippets.

View koss-lebedev's full-sized avatar

Konstantin koss-lebedev

View GitHub Profile
type Props = {
items: Array<Video | LiveStream>
}
const VideoList = ({ items }) => {
return (
<ul>
{items.map(item => {
if ('coverUrl' in item) {
// it's a video
type LiveStream = {
name: string
previewUrl: string
}
type Props = {
video: Video
}
const Thumbnail = ({ video }: Props) => {
return <img src={video.coverUrl} />
}
const knownTypes = {}
export const messageFactory = {
registerType: (type, Component) => knownTypes[type] = Component,
render: (message) => {
const Component = knownTypes[message.type]
if (!Component) {
throw new Error('Unknown message type')
export const Chat = (messages, props) => {
// ...
return (
<ul>
{messages.map(message => {
const MessageComponent = messageFactory.render(message)
return <MessageComponent key={message.id} />
})}
</ul>
const TextMessage = ({ message }) => {
// ...
return <div>{message.text}</div>
}
messageFactory.registerType('text', TextMessage)
export const Chat = (messages, props) => {
// ...
return (
<ul>
{messages.map(message => {
switch (message.type) {
case 'text': return <TextMessage message={message} />
case 'image': return <ImageMessage message={message} />
case 'audio': return <AudioMessage message={message} />
const Header = () => {
const { pathname } = useRouter()
return (
<header>
<Logo />
<Actions>
{pathname === '/dashboard' && <Link to="/events/new">Create event</Link>}
{pathname === '/' && <Link to="/dashboard">Go to dashboard</Link>}
</Actions>
const Header = ({ children }) => (
<header>
<Logo />
<Actions>
{children}
</Actions>
</header>
)
const HomePage = () => (
const ActiveUsersList = () => {
const [users, setUsers] = useState([])
useEffect(() => {
const loadUsers = async () => {
const response = await fetch('/some-api')
const data = await response.json()
setUsers(data)
}