Skip to content

Commit 87ffed7

Browse files
authored
Shows instruction message or enrolled cases only once cases finish loading (#132)
2 parents 786fe74 + 02407e9 commit 87ffed7

File tree

4 files changed

+88
-51
lines changed

4 files changed

+88
-51
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* @providesModule EnrollmentInstructions
3+
* @flow
4+
*/
5+
6+
import React from 'react'
7+
import styled from 'styled-components'
8+
import { FormattedMessage, injectIntl } from 'react-intl'
9+
10+
const EnrollmentInstructions = () => (
11+
<Container>
12+
<h5>
13+
<FormattedMessage
14+
id="catalog.chooseForYourself"
15+
defaultMessage="Choose for yourself"
16+
/>
17+
</h5>
18+
<ul>
19+
<li>
20+
<FormattedMessage
21+
id="catalog.meetStakeholders"
22+
defaultMessage="Meet different stakeholders and dive deep with a multimodal narrative."
23+
/>
24+
</li>
25+
<li>
26+
<FormattedMessage
27+
id="catalog.shortcutExperience"
28+
defaultMessage="Shortcut experience by putting principles into practice."
29+
/>
30+
</li>
31+
<li>
32+
<FormattedMessage
33+
id="catalog.joinConversation"
34+
defaultMessage="Join the conversation by asking questions and paying your learning forward."
35+
/>
36+
</li>
37+
</ul>
38+
<FormattedMessage
39+
id="catalog.enrollmentsInstruction"
40+
defaultMessage="Cases you enroll in will be presented here for easy access."
41+
/>
42+
</Container>
43+
)
44+
45+
export default injectIntl(EnrollmentInstructions)
46+
47+
const Container = styled.div.attrs({ className: 'pt-callout' })`
48+
margin-top: 1.5em;
49+
line-height: 1.4;
50+
`

app/javascript/catalog/Enrollments.jsx

Lines changed: 9 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ import { FormattedMessage, injectIntl } from 'react-intl'
1010
import { Button, Intent } from '@blueprintjs/core'
1111

1212
import { SectionTitle, CaseRow, Element } from 'catalog/shared'
13+
import EnrollmentInstructions from 'catalog/EnrollmentInstructions'
1314

1415
import type { Case } from 'redux/state'
15-
import type Catalog from 'catalog'
16+
import type Catalog, { Loading } from 'catalog'
1617

1718
type Props = {
19+
loading: Loading,
1820
enrolledCases: Case[],
1921
intl: any,
2022
onDeleteEnrollment: $PropertyType<Catalog, 'handleDeleteEnrollment'>,
@@ -31,8 +33,8 @@ class Enrollments extends Component {
3133

3234
render () {
3335
const { editing } = this.state
34-
const { intl, enrolledCases, onDeleteEnrollment } = this.props
35-
return enrolledCases.length > 0 ? (
36+
const { intl, enrolledCases, onDeleteEnrollment, loading } = this.props
37+
return loading.cases ? null : enrolledCases.length > 0 ? (
3638
<div>
3739
<CaseRow baseline>
3840
<SidebarSectionTitle>
@@ -43,17 +45,15 @@ class Enrollments extends Component {
4345
</SidebarSectionTitle>
4446
<SidebarButton
4547
aria-label={
46-
editing ? (
47-
intl.formatMessage({
48+
editing
49+
? intl.formatMessage({
4850
id: 'finishEditing',
4951
defaultMessage: 'Finish editing',
5052
})
51-
) : (
52-
intl.formatMessage({
53+
: intl.formatMessage({
5354
id: 'catalog.editEnrolled',
5455
defaultMessage: 'Edit enrolled cases',
5556
})
56-
)
5757
}
5858
iconName={editing ? 'tick' : 'cog'}
5959
onClick={this.handleToggleEditing}
@@ -91,38 +91,7 @@ class Enrollments extends Component {
9191
</UnstyledUL>
9292
</div>
9393
) : (
94-
<Callout>
95-
<h5>
96-
<FormattedMessage
97-
id="catalog.chooseForYourself"
98-
defaultMessage="Choose for yourself"
99-
/>
100-
</h5>
101-
<ul>
102-
<li>
103-
<FormattedMessage
104-
id="catalog.meetStakeholders"
105-
defaultMessage="Meet different stakeholders and dive deep with a multimodal narrative."
106-
/>
107-
</li>
108-
<li>
109-
<FormattedMessage
110-
id="catalog.shortcutExperience"
111-
defaultMessage="Shortcut experience by putting principles into practice."
112-
/>
113-
</li>
114-
<li>
115-
<FormattedMessage
116-
id="catalog.joinConversation"
117-
defaultMessage="Join the conversation by asking questions and paying your learning forward."
118-
/>
119-
</li>
120-
</ul>
121-
<FormattedMessage
122-
id="catalog.enrollmentsInstruction"
123-
defaultMessage="Cases you enroll in will be presented here for easy access."
124-
/>
125-
</Callout>
94+
<EnrollmentInstructions />
12695
)
12796
}
12897
}
@@ -143,7 +112,3 @@ const UnstyledLI = styled.li`
143112
margin: 0;
144113
padding: 0;
145114
`
146-
const Callout = styled.div.attrs({ className: 'pt-callout' })`
147-
margin-top: 1.5em;
148-
line-height: 1.4;
149-
`

app/javascript/catalog/Sidebar.jsx

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,24 @@ import SignInForm from 'utility/SignInForm'
1212
import { identiconStyle } from 'shared/Identicon'
1313

1414
import type { Case, Reader } from 'redux/state'
15-
import type Catalog from 'catalog'
15+
import type Catalog, { Loading } from 'catalog'
1616

1717
type Props = {
18-
reader: ?Reader | { loading: true },
18+
loading: Loading,
19+
reader: ?Reader,
1920
enrolledCases: Case[],
2021
onDeleteEnrollment: $PropertyType<Catalog, 'handleDeleteEnrollment'>,
2122
}
22-
const Sidebar = ({ reader, enrolledCases, onDeleteEnrollment }: Props) => (
23+
const Sidebar = ({
24+
loading,
25+
reader,
26+
enrolledCases,
27+
onDeleteEnrollment,
28+
}: Props) => (
2329
<Container>
24-
{reader == null ? (
30+
{loading.reader ? null : reader == null ? (
2531
<SignInForm />
26-
) : reader.loading ? null : (
32+
) : (
2733
<div className="pt-dark">
2834
<IdentigradientElement
2935
image={reader.imageUrl}
@@ -32,6 +38,7 @@ const Sidebar = ({ reader, enrolledCases, onDeleteEnrollment }: Props) => (
3238
hashKey={reader.email}
3339
/>
3440
<Enrollments
41+
loading={loading}
3542
enrolledCases={enrolledCases}
3643
onDeleteEnrollment={onDeleteEnrollment}
3744
/>

app/javascript/catalog/index.jsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@ import { CatalogSection, SectionTitle } from 'catalog/shared'
2020

2121
import type { Case, Enrollment, Reader } from 'redux/state'
2222

23+
export type Loading = { reader: boolean, cases: boolean }
24+
2325
class Catalog extends Component {
2426
props: { intl: any }
2527
state = {
26-
reader: ({ loading: true }: ?Reader | {| loading: true |}),
28+
loading: { reader: true, cases: true },
29+
30+
reader: (null: ?Reader),
2731
cases: ({}: { [string]: Case }),
2832
enrollments: ([]: Enrollment[]),
2933
features: ([]: string[]),
@@ -62,7 +66,17 @@ class Catalog extends Component {
6266
Orchard.harvest('profile')
6367
.then(reader => this.setState({ reader }))
6468
.catch(e => e.name === 'OrchardError' && this.setState({ reader: null }))
65-
Orchard.harvest('cases').then(cases => this.setState({ cases }))
69+
.then(() =>
70+
this.setState(({ loading }) => ({
71+
loading: { ...loading, reader: false },
72+
}))
73+
)
74+
Orchard.harvest('cases').then(cases =>
75+
this.setState(({ loading }) => ({
76+
cases,
77+
loading: { ...loading, cases: false },
78+
}))
79+
)
6680
Orchard.harvest('cases/features').then(({ features }) =>
6781
this.setState({ features })
6882
)
@@ -78,6 +92,7 @@ class Catalog extends Component {
7892
<MaxWidthContainer>
7993
<Window>
8094
<Sidebar
95+
loading={this.state.loading}
8196
reader={this.state.reader}
8297
enrolledCases={this._enrolledCases()}
8398
onDeleteEnrollment={this.handleDeleteEnrollment}

0 commit comments

Comments
 (0)