Skip to content

Commit 58147ce

Browse files
Add feed badge. Close #214
1 parent d4902f2 commit 58147ce

File tree

15 files changed

+191
-96
lines changed

15 files changed

+191
-96
lines changed

electron_app/src/DBManager.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1090,6 +1090,13 @@ const getAllFeedItems = () => {
10901090
return db.select('*').from(Table.FEEDITEM);
10911091
};
10921092

1093+
const getFeedItemsCounterBySeen = (seen = 0) => {
1094+
const query = `SELECT COUNT(DISTINCT ${Table.FEEDITEM}.id) AS count
1095+
FROM ${Table.FEEDITEM}
1096+
WHERE ${Table.FEEDITEM}.seen = ${seen}`;
1097+
return db.raw(query);
1098+
};
1099+
10931100
const updateFeedItems = ({ ids, seen }) => {
10941101
const params = {};
10951102
if (typeof seen === 'boolean') params.seen = seen;
@@ -1296,6 +1303,7 @@ module.exports = {
12961303
getEmailsToDeleteByThreadIdAndLabelId,
12971304
getEmailsUnredByLabelId,
12981305
getEmailLabelsByEmailId,
1306+
getFeedItemsCounterBySeen,
12991307
getFilesByEmailId,
13001308
getPendingEvents,
13011309
getIdentityKeyRecord,

electron_app/src/ipc/database.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ ipc.answerRenderer('db-get-emails-unread-by-labelid', params =>
131131
dbManager.getEmailsUnredByLabelId(params)
132132
);
133133

134+
ipc.answerRenderer('db-get-feeditems-counter-by-seen', seen =>
135+
dbManager.getFeedItemsCounterBySeen(seen)
136+
);
137+
134138
ipc.answerRenderer('db-get-files-by-emailid', emailId =>
135139
dbManager.getFilesByEmailId(emailId)
136140
);

email_mailbox/src/actions/app.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,10 @@ export const loadApp = params => {
4040
...params,
4141
limit: INIT_LIMIT_THREADS
4242
});
43-
const feeditems = await defineFeedItems();
44-
43+
const { feedItems, badge } = await defineFeedItems();
4544
const activity = stopLoadThread();
4645
const contact = addContacts(contacts);
47-
const feeditem = addFeedItems(feeditems, true);
46+
const feeditem = addFeedItems(feedItems, badge, true);
4847
const label = addLabels(labels);
4948
const thread = addThreads(params.labelId, threads, true);
5049

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,49 @@
11
import { FeedItem } from './types';
22
import {
33
deleteFeedItemById,
4+
getFeedItemsCounterBySeen,
45
updateFeedItems as updateFeedItemsDB
56
} from './../utils/ipc';
67
import { defineFeedItems } from '../utils/FeedItemUtils';
78

8-
export const addFeedItems = (feeds, clear) => {
9+
export const addFeedItems = (feeds, badge, clear) => {
910
return {
1011
type: FeedItem.ADD_BATCH,
12+
badge,
1113
feeds,
1214
clear
1315
};
1416
};
1517

16-
export const removeFeedItemSuccess = feedItemId => {
17-
return {
18-
type: FeedItem.REMOVE_SUCCESS,
19-
feed: { id: feedItemId }
20-
};
21-
};
22-
23-
export const updateFeedItemSuccess = ({ id, seen }) => {
24-
return {
25-
type: FeedItem.UPDATE,
26-
feed: { id, seen }
27-
};
28-
};
29-
30-
export const updateFeedItems = ({ ids, seen }) => {
18+
export const loadFeedItems = clear => {
3119
return async dispatch => {
3220
try {
33-
await updateFeedItemsDB({ ids, seen });
34-
dispatch(updateFeedItemsSuccess({ ids, seen }));
21+
const { feedItems, badge } = await defineFeedItems();
22+
dispatch(addFeedItems(feedItems, badge, clear));
3523
} catch (e) {
3624
// TO DO
3725
}
3826
};
3927
};
4028

41-
export const updateFeedItemsSuccess = ({ ids, seen }) => {
42-
return {
43-
type: FeedItem.UPDATE_FEED_ITEMS,
44-
feed: { ids, seen }
45-
};
46-
};
47-
48-
export const loadFeedItems = clear => {
29+
export const removeFeedItem = feedItemId => {
4930
return async dispatch => {
5031
try {
51-
const feedItems = await defineFeedItems();
52-
dispatch(addFeedItems(feedItems, clear));
32+
await deleteFeedItemById(feedItemId);
33+
dispatch(removeFeedItemSuccess(feedItemId));
5334
} catch (e) {
5435
// TO DO
5536
}
5637
};
5738
};
5839

40+
export const removeFeedItemSuccess = feedItemId => {
41+
return {
42+
type: FeedItem.REMOVE_SUCCESS,
43+
feed: { id: feedItemId }
44+
};
45+
};
46+
5947
export const updateFeedItem = ({ id, seen }) => {
6048
return async dispatch => {
6149
try {
@@ -67,13 +55,29 @@ export const updateFeedItem = ({ id, seen }) => {
6755
};
6856
};
6957

70-
export const removeFeedItem = feedItemId => {
58+
export const updateFeedItemSuccess = ({ id, seen }) => {
59+
return {
60+
type: FeedItem.UPDATE,
61+
feed: { id, seen }
62+
};
63+
};
64+
65+
export const updateFeedItems = ({ ids, seen }) => {
7166
return async dispatch => {
7267
try {
73-
await deleteFeedItemById(feedItemId);
74-
dispatch(removeFeedItemSuccess(feedItemId));
68+
await updateFeedItemsDB({ ids, seen });
69+
const badge = await getFeedItemsCounterBySeen(0);
70+
dispatch(updateFeedItemsSuccess({ ids, seen, badge: badge[0].count }));
7571
} catch (e) {
7672
// TO DO
7773
}
7874
};
7975
};
76+
77+
export const updateFeedItemsSuccess = ({ ids, seen, badge }) => {
78+
return {
79+
type: FeedItem.UPDATE_FEED_ITEMS,
80+
badge,
81+
feed: { ids, seen }
82+
};
83+
};

email_mailbox/src/actions/threads.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { Thread } from './types';
22
import {
33
addDataApp,
4+
addContacts,
5+
loadFeedItems,
6+
removeEmails,
47
startLoadSync,
58
stopLoadThread,
69
stopAll,
@@ -30,12 +33,9 @@ import {
3033
sendUpdateThreadLabelsErrorMessage,
3134
sendUpdateUnreadThreadsErrorMessage
3235
} from './../utils/electronEventInterface';
33-
import { loadFeedItems } from './feeditems';
3436
import { SocketCommand } from '../utils/const';
35-
import { removeEmails } from './emails';
3637
import { filterTemporalThreadIds } from '../utils/EmailUtils';
3738
import { defineThreads } from '../utils/ThreadUtils';
38-
import { addContacts } from '.';
3939

4040
export const addThreads = (labelId, threads, clear) => ({
4141
type: Thread.ADD_BATCH,

email_mailbox/src/components/ActivityPanelShortCut.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,17 @@ const ActivityPanelShortCut = props => (
99
>
1010
<div className="activity-panel-shortcut-content">
1111
<i className="icon-bell" />
12+
{!!props.badge && (
13+
<div className="activity-panel-shortcut-badge">
14+
<span>{props.badge}</span>
15+
</div>
16+
)}
1217
</div>
1318
</div>
1419
);
1520

1621
ActivityPanelShortCut.propTypes = {
22+
badge: PropTypes.number,
1723
onClick: PropTypes.func
1824
};
1925

email_mailbox/src/components/HeaderHOC.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { Component } from 'react';
22
import PropTypes from 'prop-types';
3-
import ActivityPanelShortCut from './ActivityPanelShortCut';
3+
import ActivityPanelShortCut from './../containers/ActivityPanelShortCut';
44
import './headerhoc.scss';
55

66
const HeaderHOC = InComponent =>

email_mailbox/src/components/activitypanelshortcut.scss

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,32 @@
2525
position: relative;
2626
width: 61px;
2727

28-
&:before{
29-
content: '';
30-
height: 0;
31-
width: 0;
32-
position: absolute;
33-
left: -8px;
34-
top: 24px;
35-
border-right: 8px solid #373a45;
36-
border-top: 8px solid transparent;
37-
border-bottom: 8px solid transparent;
38-
}
39-
4028
i{
4129
background-color: transparent;
4230
color: white;
4331
font-size: 25px;
4432
margin: 0 auto;
4533
}
34+
35+
.activity-panel-shortcut-badge{
36+
align-items: center;
37+
background-color: #ff3366;
38+
border: 2px solid #373a45;
39+
border-radius: 12px;
40+
display: flex;
41+
height: 19px;
42+
min-width: 19px;
43+
position: absolute;
44+
left: 31px;
45+
top: 10px;
46+
width: auto;
47+
48+
span{
49+
color: white;
50+
font-size: 11px;
51+
font-weight: 300;
52+
margin: 0 auto;
53+
padding: 0 4px;
54+
}
55+
}
4656
}

email_mailbox/src/containers/ActivityPanel.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ const populateFeeds = (state, feeds) => {
5858
};
5959

6060
const mapStateToProps = state => {
61-
const feeds = state.get('feeditems').toList();
61+
const feedItems = state.get('feeditems');
62+
const feeds = feedItems.get('list').toList();
6263
const orderedFeeds = orderFeedsByDate(feeds);
6364
const populated = populateFeeds(state, orderedFeeds);
6465
const { newFeeds, oldFeeds } = clasifyFeeds(populated);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { connect } from 'react-redux';
2+
import ActivityPanelShortCutView from '../components/ActivityPanelShortCut';
3+
4+
const mapStateToProps = state => {
5+
const feedItems = state.get('feeditems');
6+
const badge = feedItems.get('badge');
7+
return {
8+
badge
9+
};
10+
};
11+
12+
const ActivityPanelShortCut = connect(mapStateToProps)(
13+
ActivityPanelShortCutView
14+
);
15+
16+
export default ActivityPanelShortCut;

0 commit comments

Comments
 (0)