aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/features/recent-list/actionTypes.js10
-rw-r--r--app/features/recent-list/actions.js19
-rw-r--r--app/features/recent-list/components/RecentList.js22
-rw-r--r--app/features/recent-list/reducer.js22
-rw-r--r--app/features/recent-list/styled/ConferenceCard.js6
5 files changed, 77 insertions, 2 deletions
diff --git a/app/features/recent-list/actionTypes.js b/app/features/recent-list/actionTypes.js
new file mode 100644
index 0000000..bab4c96
--- /dev/null
+++ b/app/features/recent-list/actionTypes.js
@@ -0,0 +1,10 @@
+/**
+ * The type of (redux) action that is dispatched when a conference is removed from the recents list.
+ *
+ * @type {
+* type: CONFERENCE_REMOVED,
+* conference: Object
+* }
+*/
+export const CONFERENCE_REMOVED = Symbol('CONFERENCE_REMOVED');
+
diff --git a/app/features/recent-list/actions.js b/app/features/recent-list/actions.js
new file mode 100644
index 0000000..7b4e7a1
--- /dev/null
+++ b/app/features/recent-list/actions.js
@@ -0,0 +1,19 @@
+// @flow
+
+import { CONFERENCE_REMOVED } from './actionTypes';
+
+/**
+ * Notifies that conference is removed from recents list.
+ *
+ * @param {Object} conference - Conference Details.
+ * @returns {{
+* type: CONFERENCE_REMOVED,
+* conference: Object
+* }}
+*/
+export function conferenceRemoved(conference: Object) {
+ return {
+ type: CONFERENCE_REMOVED,
+ conference
+ };
+}
diff --git a/app/features/recent-list/components/RecentList.js b/app/features/recent-list/components/RecentList.js
index 8135757..2518b93 100644
--- a/app/features/recent-list/components/RecentList.js
+++ b/app/features/recent-list/components/RecentList.js
@@ -6,6 +6,7 @@ import { connect } from 'react-redux';
import type { Dispatch } from 'redux';
import { push } from 'react-router-redux';
+import { conferenceRemoved } from '../actions';
import {
ConferenceCard,
ConferenceTitle,
@@ -13,6 +14,8 @@ import {
TruncatedText
} from '../styled';
import type { RecentListItem } from '../types';
+import Button from '@atlaskit/button';
+import CrossIcon from '@atlaskit/icon/glyph/cross';
type Props = {
@@ -59,6 +62,20 @@ class RecentList extends Component<Props, *> {
}
/**
+ * Creates a handler for removing a conference from the recents list.
+ *
+ * @param {RecentListItem} conference - Conference Details.
+ * @returns {void}
+ */
+ _onRemoveConference(conference: RecentListItem) {
+ return e => {
+ this.props.dispatch(conferenceRemoved(conference));
+ e.stopPropagation();
+ };
+ }
+
+
+ /**
* Renders the conference card.
*
* @param {RecentListItem} conference - Conference Details.
@@ -81,6 +98,11 @@ class RecentList extends Component<Props, *> {
<TruncatedText>
{ this._renderDuration(conference) }
</TruncatedText>
+ <Button
+ appearance = 'subtle'
+ iconBefore = { <CrossIcon primaryColor = 'white' /> }
+ onClick = { this._onRemoveConference(conference) }
+ spacing = 'none' />
</ConferenceCard>
);
}
diff --git a/app/features/recent-list/reducer.js b/app/features/recent-list/reducer.js
index 099fe5d..17e86db 100644
--- a/app/features/recent-list/reducer.js
+++ b/app/features/recent-list/reducer.js
@@ -1,6 +1,7 @@
// @flow
import { CONFERENCE_ENDED, CONFERENCE_JOINED } from '../conference';
+import { CONFERENCE_REMOVED } from './actionTypes';
import type { RecentListItem } from './types';
@@ -34,6 +35,12 @@ export default (state: State = DEFAULT_STATE, action: Object) => {
recentList: _insertConference(state.recentList, action.conference)
};
+ case CONFERENCE_REMOVED:
+ return {
+ ...state,
+ recentList: _removeConference(state.recentList, action.conference)
+ };
+
default:
return state;
}
@@ -66,6 +73,21 @@ function _insertConference(
}
/**
+ * Remove a conference from the recent list array.
+ *
+ * @param {Array<RecentListItem>} recentList - Previous recent list array.
+ * @param {RecentListItem} toRemove - Conference to be removed.
+ * @returns {Array<RecentListItem>} - Updated recent list array.
+ */
+function _removeConference(
+ recentList: Array<RecentListItem>,
+ toRemove: RecentListItem
+): Array<RecentListItem> {
+ return recentList.filter(
+ (conference: RecentListItem) => conference !== toRemove);
+}
+
+/**
* Update the EndTime of the last conference.
*
* @param {Array<RecentListItem>} recentList - Previous recent list array.
diff --git a/app/features/recent-list/styled/ConferenceCard.js b/app/features/recent-list/styled/ConferenceCard.js
index fff3f75..11c85b6 100644
--- a/app/features/recent-list/styled/ConferenceCard.js
+++ b/app/features/recent-list/styled/ConferenceCard.js
@@ -6,8 +6,10 @@ export default styled.div`
background: #1754A9;
border-radius: 0.5em;
color: white;
- display: flex;
- flex-direction: column;
+ display: grid;
+ grid-template-rows: repeat(4, auto);
+ grid-template-columns: 1fr auto;
+ grid-auto-flow: column;
font-size: 0.9em;
margin: 0.5em;
padding: 1em;