thinkful-ui
Version:
Shared navigation and UI resources for Thinkful.
253 lines (234 loc) • 8.22 kB
JSX
const cx = require('classnames');
const Link = require('react-router').Link;
const moment = require('moment-timezone');
const React = require('react');
const _ = require('lodash');
const {Icon} = require('../Icon');
const {Tag} = require('../Tag');
require('./open-session-overview.less');
class OverviewContent extends React.Component {
render() {
const {session} = this.props;
const {description, host, title} = session;
return (
<div className="overview-content">
<h3 className="title">{title}</h3>
<p className="host-name">with {host.name}</p>
<p className="overview-description">
{session.isWorkshop() ? description : host.about}
</p>
</div>
);
}
}
/**
* OpenSessionOverview component
*/
class OpenSessionOverview extends React.Component {
constructor(props) {
super(props);
this._renderQASessionCtas = this._renderQASessionCtas.bind(this);
this._renderWorkshopCta = this._renderWorkshopCta.bind(this);
this._shouldRenderMobile = this._shouldRenderMobile.bind(this);
}
static displayName = "OpenSessionOverview"
static propTypes = {
attending: React.PropTypes.bool,
config: React.PropTypes.object,
handleCancelRSVPClick: React.PropTypes.func,
handleRSVPClick: React.PropTypes.func,
handleCancelSessionClick: React.PropTypes.func,
handleCancelAllSessionsClick: React.PropTypes.func,
handleEditSessionClick: React.PropTypes.func,
hosting: React.PropTypes.bool,
previewing: React.PropTypes.bool,
session: React.PropTypes.object.isRequired,
user: React.PropTypes.object
}
static defaultProps = {
attending: false,
hosting: false,
linkToCalendar: false,
previewing: false,
tags: []
}
_shouldRenderMobile() {
return this.props.previewing;
}
render() {
const {
attending, className, config, hosting, linkTo,
linkedSession, previewing, session, user
} = this.props;
const {
background_image_url, description, detail_page_url, duration_minutes,
host, id, project, rsvp_contact_ids, session_type, start_dt_utc, tags,
title, title_slug
} = session;
const style = {
workshop: {
backgroundImage: `url(${background_image_url || host.image_url})`,
backgroundPosition: "50% 50%"},
qaSession: {backgroundImage: `url(${host.image_url})`}
}
return (
<div
className={cx(
"session", {
"session__past": session.isPast(),
"render-mobile": this._shouldRenderMobile()
}, className)}>
<div className="session-image-wrapper">
{session.isStartingSoon() &&
<div className="session-time-alert">Starting soon!</div>
}
{session.isHappeningNow() &&
<div className="session-time-alert">Happening now!</div>
}
{linkedSession ?
<Icon name="navigateright" className="linked-session-icon"/>
: (attending && <Icon name="alarmclock" className="alarm-icon"/>)
}
{!session.isPast() &&
<div className="session-time">
{session.startDtLocal(user).format('h:mm A')} –
{session.endDtLocal(user).format('h:mm A')}<br/>
{session.startDtLocal(user).format('MMM Do')}
</div>
}
<div
className="image-primary"
style={session.isWorkshop() ? style.workshop : style.qaSession}/>
{session.isWorkshop() && background_image_url &&
<img className="image-secondary" src={host.image_url}/>
}
</div>
<div className="session-overview-wrapper">
{linkTo ?
<Link
params={{slug: title_slug, id: id}}
to={linkTo}>
<OverviewContent session={session}/>
</Link>
: <a href={detail_page_url}>
<OverviewContent session={session}/>
</a>
}
<div className="session-cta">
{session.isWorkshop() ?
this._renderWorkshopCta()
: this._renderQASessionCtas()
}
{!!tags.length &&
<div className="session-tags">
{tags.map(
(t, idx) => <Tag
key={idx}
displayName={t}
url={`${config.projects.url}/search?q=${t}`}/>)
}
</div>
}
{rsvp_contact_ids && !!rsvp_contact_ids.length &&
<div className="session-attendees">
<Icon name="users"></Icon>
<span> {rsvp_contact_ids.length} attendee{rsvp_contact_ids.length !== 1 && 's'}</span>
</div>}
</div>
</div>
</div>
)
}
_renderWorkshopCta() {
const {linkTo, session} = this.props;
const {detail_page_url, id, session_type, title_slug} = session;
return (
<div className="workshop-cta">
{linkTo ?
<Link
className="button"
params={{slug: title_slug, id: id}}
to={linkTo}>
View details
<Icon name="navigateright" className="button-right-icon"/>
</Link>
: <a
className="button"
href={detail_page_url}>
View details
<Icon name="navigateright" className="button-right-icon"/>
</a>
}
</div>
)
}
_renderQASessionCtas() {
const {
attending, config, handleCancelRSVPClick, handleRSVPClick,
handleCancelSessionClick, handleCancelAllSessionsClick,
handleEditSessionClick, hosting, linkToCalendar,
previewing, session, user
} = this.props;
const {detail_page_url, id} = session;
const userIsActive = !_.isEmpty(user) && user.account_status === 'active';
return (
<div className="qa-session-ctas">
{linkToCalendar ?
<a
className="button"
href={detail_page_url}>
View on calendar
<Icon name="navigateright" className="button-right-icon"/>
</a>
: (
!userIsActive ?
<a className="button" href={`${config.tfl_enroll.url}?rel=qa-session-details`}>
RSVP
<Icon name="navigateright" className="button-right-icon"/>
</a>
: hosting ?
<div className="host-ctas">
<a
className={cx(
"button button__black button__black__host",
{"disabled": previewing})}
href={session.session_room_url}>
Go to room
<Icon name="navigateright" className="button-right-icon"/>
</a>
{!previewing &&
<div>
<a onClick={e => handleEditSessionClick(id)}>Edit</a>{' / '}
<a onClick={e => handleCancelSessionClick(id)}>Cancel</a>
{!!session.blueprint_id &&
<span>{' / '}
<a onClick={e => handleCancelAllSessionsClick(id)}>
Cancel all
</a>
</span>
}
</div>
}
</div>
: session.isUpcoming() ?
<a className="button button__black" href={session.session_room_url}>
Go to room
<Icon name="navigateright" className="button-right-icon"/>
</a>
: attending ?
<div className="user-attending">
<h5>Your spot is reserved</h5>
<a href={session.session_room_url}>Go to room</a>
{' / '}
<a onClick={e => handleCancelRSVPClick(id)}>Cancel reservation</a>
</div>
: <div className="button" onClick={e => handleRSVPClick(id)}>
RSVP
<Icon name="navigateright" className="button-right-icon"/>
</div>
)}
</div>
)
}
}
module.exports = {OpenSessionOverview};