Add date markers

This commit is contained in:
Ken-Håvard Lieng 2018-12-14 14:24:23 +01:00
parent 34d89c75b2
commit 50d735aaa3
7 changed files with 218 additions and 92 deletions

View file

@ -5,7 +5,8 @@ import {
messageHeight,
linkify,
timestamp,
isChannel
isChannel,
formatDate
} from 'utils';
import createReducer from 'utils/createReducer';
import { getApp } from './app';
@ -43,22 +44,71 @@ function init(state, server, tab) {
}
}
let nextID = 0;
function createDateMessage(date) {
const message = {
id: nextID,
type: 'date',
content: formatDate(date),
height: 40
};
nextID++;
return message;
}
function isSameDay(d1, d2) {
return (
d1.getDate() === d2.getDate() &&
d1.getMonth() === d2.getMonth() &&
d1.getFullYear() === d2.getFullYear()
);
}
function reducerAddMessage(message, server, tab, state, prepend) {
const messages = state[server][tab];
if (messages.length > 0) {
if (prepend) {
const firstMessage = messages[0];
if (firstMessage.date && !isSameDay(firstMessage.date, message.date)) {
messages.unshift(createDateMessage(firstMessage.date));
}
} else {
const lastMessage = messages[messages.length - 1];
if (lastMessage.date && !isSameDay(lastMessage.date, message.date)) {
messages.push(createDateMessage(message.date));
}
}
}
if (prepend) {
messages.unshift(message);
} else {
messages.push(message);
}
}
export default createReducer(
{},
{
[actions.ADD_MESSAGE](state, { server, tab, message }) {
init(state, server, tab);
state[server][tab].push(message);
reducerAddMessage(message, server, tab, state);
},
[actions.ADD_MESSAGES](state, { server, tab, messages, prepend }) {
if (prepend) {
init(state, server, tab);
state[server][tab].unshift(...messages);
for (let i = messages.length - 1; i >= 0; i--) {
reducerAddMessage(messages[i], server, tab, state, true);
}
} else {
messages.forEach(message => {
init(state, server, message.tab || tab);
state[server][message.tab || tab].push(message);
reducerAddMessage(message, server, message.tab || tab, state);
});
}
},
@ -78,6 +128,10 @@ export default createReducer(
Object.keys(state).forEach(server =>
Object.keys(state[server]).forEach(target =>
state[server][target].forEach(message => {
if (message.type === 'date') {
return;
}
message.height = messageHeight(
message,
wrapWidth,
@ -100,15 +154,15 @@ export default createReducer(
}
);
let nextID = 0;
function initMessage(message, tab, state) {
if (message.time) {
message.time = timestamp(new Date(message.time * 1000));
message.date = new Date(message.time * 1000);
} else {
message.time = timestamp();
message.date = new Date();
}
message.time = timestamp(message.date);
if (!message.id) {
message.id = nextID;
nextID++;