happychat-service
Advanced tools
Comparing version 0.10.7 to 0.10.8-0
@@ -6,8 +6,8 @@ 'use strict'; | ||
}); | ||
exports.membersView = exports.timestampView = exports.operatorView = exports.chatView = exports.statusView = exports.STATUS_CUSTOMER_DISCONNECT = exports.STATUS_ABANDONED = exports.STATUS_ASSIGNING = exports.STATUS_ASSIGNED = exports.STATUS_MISSED = exports.STATUS_PENDING = exports.STATUS_NEW = undefined; | ||
exports.membersView = exports.timestampView = exports.operatorView = exports.chatView = exports.statusView = exports.STATUS_CLOSED = exports.STATUS_CUSTOMER_DISCONNECT = exports.STATUS_ABANDONED = exports.STATUS_ASSIGNING = exports.STATUS_ASSIGNED = exports.STATUS_MISSED = exports.STATUS_PENDING = exports.STATUS_NEW = undefined; | ||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; | ||
var _ramda = require('ramda'); | ||
var _util = require('../util'); | ||
var _actions = require('./actions'); | ||
@@ -24,2 +24,3 @@ | ||
var STATUS_CUSTOMER_DISCONNECT = exports.STATUS_CUSTOMER_DISCONNECT = 'customer-disconnect'; | ||
var STATUS_CLOSED = exports.STATUS_CLOSED = 'closed'; | ||
@@ -44,7 +45,2 @@ var statusLens = (0, _ramda.lensIndex)(0); | ||
var typeOf = function typeOf(v) { | ||
return typeof v === 'undefined' ? 'undefined' : _typeof(v); | ||
}; | ||
var asString = (0, _ramda.when)((0, _ramda.compose)((0, _ramda.equals)('number'), typeOf), (0, _ramda.invoker)(0, 'toString')); | ||
var timestamp = function timestamp() { | ||
@@ -61,2 +57,4 @@ return new Date().getTime(); | ||
return (0, _ramda.compose)(setStatus(STATUS_PENDING), setTimestamp(timestamp()), setChat(action.chat))(state); | ||
case _actions.CLOSE_CHAT: | ||
return setStatus(STATUS_CLOSED, state); | ||
case _actions.SET_CHAT_OPERATOR: | ||
@@ -72,4 +70,5 @@ case _actions.SET_CHATS_RECOVERED: | ||
case _actions2.OPERATOR_CHAT_LEAVE: | ||
case _actions2.SET_USER_OFFLINE: | ||
case _actions2.REMOVE_USER: | ||
return setMembers((0, _ramda.dissoc)(asString(action.user.id), membersView(state)), state); | ||
return setMembers((0, _ramda.dissoc)((0, _util.asString)(action.user.id), membersView(state)), state); | ||
case _actions2.OPERATOR_CHAT_JOIN: | ||
@@ -103,2 +102,3 @@ return setMembers((0, _ramda.set)((0, _ramda.lensProp)(action.user.id), true, membersView(state)), state); | ||
case _actions.SET_CHAT_CUSTOMER_DISCONNECT: | ||
case _actions.CLOSE_CHAT: | ||
var chatIdLens = (0, _ramda.lensProp)(action.chat_id); | ||
@@ -111,4 +111,2 @@ return (0, _ramda.set)(chatIdLens, chat((0, _ramda.view)(chatIdLens, state), action))(state); | ||
return (0, _ramda.set)(lens, chat((0, _ramda.view)(lens, state), action))(state); | ||
case _actions.CLOSE_CHAT: | ||
return (0, _ramda.dissoc)(asString(action.chat_id), state); | ||
case _actions.SET_CHATS_RECOVERED: | ||
@@ -123,2 +121,3 @@ return (0, _ramda.reduce)(function (chats, chat_id) { | ||
case _actions2.REMOVE_USER: | ||
case _actions2.SET_USER_OFFLINE: | ||
return (0, _ramda.map)(function (chatState) { | ||
@@ -125,0 +124,0 @@ return chat(chatState, action); |
@@ -6,3 +6,3 @@ 'use strict'; | ||
}); | ||
exports.isAssigningChat = exports.getNextMissedChat = exports.haveMissedChat = exports.getNextPendingChat = exports.havePendingChat = exports.haveChatWithStatus = exports.isChatStatusNew = exports.getChatStatus = exports.getChats = exports.getChat = exports.getChatOperator = exports.getMissedChats = exports.getAbandonedChats = exports.getOperatorAbandonedChats = exports.getChatsWithStatus = exports.getAllChats = exports.getChatMembers = exports.getChatsForOperator = undefined; | ||
exports.isAssigningChat = exports.getNextMissedChat = exports.haveMissedChat = exports.getNextPendingChat = exports.havePendingChat = exports.haveChatWithStatus = exports.isChatStatusClosed = exports.isChatStatusNew = exports.getChatStatus = exports.getChats = exports.getChat = exports.getChatOperator = exports.getMissedChats = exports.getAbandonedChats = exports.getOperatorAbandonedChats = exports.getChatsWithStatus = exports.getAllChats = exports.getOpenChatMembers = exports.getChatMembers = exports.getChatsForOperator = undefined; | ||
@@ -19,3 +19,3 @@ var _ramda = require('ramda'); | ||
}; | ||
var filterClosed = (0, _ramda.compose)(_ramda.not, (0, _ramda.whereEq)({ status: _reducer.STATUS_CLOSED })); | ||
/* | ||
@@ -39,2 +39,3 @@ Selects all chats assigned/associated with given operator id | ||
var getChatMembers = exports.getChatMembers = (0, _ramda.compose)(mapToMembers, _ramda.values, selectChatlist); | ||
var getOpenChatMembers = exports.getOpenChatMembers = (0, _ramda.compose)(mapToMembers, filterClosed, _ramda.values, selectChatlist); | ||
var getAllChats = exports.getAllChats = (0, _ramda.compose)(mapToChat, _ramda.values, selectChatlist); | ||
@@ -76,2 +77,6 @@ var getChatsWithStatus = exports.getChatsWithStatus = function getChatsWithStatus(status, state) { | ||
var isChatStatusClosed = exports.isChatStatusClosed = function isChatStatusClosed(chat_id, state) { | ||
return (0, _ramda.equals)(_reducer.STATUS_CLOSED, getChatStatus(chat_id, state)); | ||
}; | ||
var haveChatWithStatus = exports.haveChatWithStatus = function haveChatWithStatus(status, state) { | ||
@@ -78,0 +83,0 @@ return !(0, _ramda.isEmpty)(getChatsWithStatus(status, state)); |
@@ -311,9 +311,17 @@ 'use strict'; | ||
var state = store.getState(); | ||
debug('see if we should assign?', (0, _selectors.getChatStatus)(chat.id, state)); | ||
var operator = (0, _selectors.getChatOperator)(chat.id, state); | ||
var isNew = (0, _selectors.isChatStatusNew)(chat.id, state); | ||
if (!operator || isNew) { | ||
var isClosed = (0, _selectors.isChatStatusClosed)(chat.id, state); | ||
if (operator && (0, _selectors2.isOperatorAcceptingChats)(operator.id, state) && isClosed) { | ||
debug('reassign chat to operator', operator.id); | ||
store.dispatch((0, _actions.setChatOperator)(chat.id, operator)); | ||
return; | ||
} | ||
if (!operator || isNew || isClosed) { | ||
store.dispatch((0, _actions.insertPendingChat)(chat)); | ||
return; | ||
} | ||
// TODO: check if there is an operator in the room | ||
@@ -376,3 +384,3 @@ debug('chat exists time to make sure someone is home'); | ||
var list = (0, _selectors2.getAvailableOperators)(store.getState()); | ||
debug('anyone home?', list); | ||
if ((0, _ramda.isEmpty)(list)) { | ||
@@ -467,3 +475,3 @@ return store.dispatch((0, _actions.setChatMissed)(chat.id, new Error('no operators available'))); | ||
case _actions.NOTIFY_CHAT_STATUS_CHANGED: | ||
debug('NOTIFY_CHAT_STATUS_CHANGED', action.chat_id); | ||
debug('NOTIFY_CHAT_STATUS_CHANGED', action.chat_id, action.status, action.lastStatus); | ||
var status = (0, _selectors.getChatStatus)(action.chat_id, store.getState()); | ||
@@ -491,2 +499,3 @@ customer_io.to((0, _index.customerRoom)(action.chat_id)).emit('status', status); | ||
case _actions2.REMOVE_USER: | ||
case _actions2.SET_USER_OFFLINE: | ||
handleOperatorDisconnect(action); | ||
@@ -493,0 +502,0 @@ return next(action); |
@@ -68,3 +68,3 @@ 'use strict'; | ||
} | ||
store.dispatch((0, _actions2.removeUser)(user)); | ||
store.dispatch((0, _actions2.setUserOffline)(user)); | ||
}); | ||
@@ -74,5 +74,5 @@ }); | ||
socket.join(user_room, function () { | ||
socket.emit('init', user); | ||
store.dispatch((0, _actions2.updateIdentity)(socket, user)); | ||
store.dispatch((0, _actions2.operatorReady)(user, socket, user_room)); | ||
socket.emit('init', user); | ||
}); | ||
@@ -79,0 +79,0 @@ |
@@ -31,3 +31,3 @@ 'use strict'; | ||
}; | ||
var reducer = (0, _ramda.compose)((0, _ramda.reduce)(sumMemberships, {}), _selectors.getChatMembers); | ||
var reducer = (0, _ramda.compose)((0, _ramda.reduce)(sumMemberships, {}), _selectors.getOpenChatMembers); | ||
@@ -83,2 +83,3 @@ var handleSetUserLoads = function handleSetUserLoads(_ref, next, action) { | ||
case _actions2.REMOVE_USER: | ||
case _actions2.SET_USER_OFFLINE: | ||
var result = next(action); | ||
@@ -85,0 +86,0 @@ dispatch((0, _actions2.setUserLoads)(reducer(getState()))); |
@@ -35,3 +35,10 @@ 'use strict'; | ||
var SET_OPERATOR_STATUS = exports.SET_OPERATOR_STATUS = 'SET_OPERATOR_STATUS'; | ||
var SET_USER_OFFLINE = exports.SET_USER_OFFLINE = 'SET_USER_OFFLINE'; | ||
var setUserOffline = exports.setUserOffline = function setUserOffline(user) { | ||
return { | ||
type: SET_USER_OFFLINE, user: user | ||
}; | ||
}; | ||
var operatorTyping = exports.operatorTyping = function operatorTyping(id, user, text) { | ||
@@ -38,0 +45,0 @@ return { type: OPERATOR_TYPING, id: id, user: user, text: text }; |
@@ -19,6 +19,2 @@ 'use strict'; | ||
var _defaults = require('lodash/defaults'); | ||
var _defaults2 = _interopRequireDefault(_defaults); | ||
var _concat = require('lodash/concat'); | ||
@@ -42,2 +38,4 @@ | ||
var _util = require('../util'); | ||
var _actions = require('./actions'); | ||
@@ -67,16 +65,37 @@ | ||
var userPropUpdater = function userPropUpdater(prop) { | ||
return function (action, state) { | ||
var val = (0, _get2.default)(action, prop); | ||
var user = action.user; | ||
var DEFAULT_CAPACITY = 3; | ||
var newProp = (0, _set2.default)({}, prop, val); | ||
var updatedUser = (0, _assign2.default)({}, (0, _get2.default)(state, user.id), newProp); | ||
// set and assign on new objects to prevent modifying existing state | ||
return (0, _assign2.default)({}, state, (0, _set2.default)({}, user.id, updatedUser)); | ||
}; | ||
var identity = function identity() { | ||
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { load: 0, capacity: DEFAULT_CAPACITY, online: false }; | ||
var action = arguments[1]; | ||
switch (action.type) { | ||
case _actions.UPDATE_IDENTITY: | ||
return (0, _ramda.merge)(state, action.user, { online: true }); | ||
case _actions.UPDATE_USER_STATUS: | ||
return (0, _ramda.merge)(state, { status: action.status, online: true }); | ||
case _actions.UPDATE_USER_CAPACITY: | ||
return (0, _ramda.merge)(state, { capacity: action.capacity, online: true }); | ||
case _actions.SET_OPERATOR_STATUS: | ||
return (0, _ramda.merge)(state, { status: action.status, online: true }); | ||
case _actions.SET_OPERATOR_CAPACITY: | ||
var capacity = parseInt(action.capacity); | ||
if (isNaN(capacity)) { | ||
return state; | ||
} | ||
return (0, _ramda.merge)(state, { capacity: capacity, online: true }); | ||
case _actions.SET_USER_OFFLINE: | ||
return (0, _ramda.merge)(state, { online: false }); | ||
} | ||
return state; | ||
}; | ||
var setStatus = userPropUpdater('status'); | ||
var setCapacity = userPropUpdater('capacity'); | ||
var lensUser = function lensUser(action) { | ||
return (0, _ramda.lensProp)((0, _ramda.compose)(_util.asString, (0, _ramda.view)((0, _ramda.lensPath)(['user', 'id'])))(action)); | ||
}; | ||
var lensRemoteUser = function lensRemoteUser(action) { | ||
return (0, _ramda.lensProp)((0, _ramda.compose)(_util.asString, (0, _ramda.view)((0, _ramda.lensPath)([_broadcast.REMOTE_USER_KEY, 'id'])))(action)); | ||
}; | ||
var identities = function identities() { | ||
@@ -89,16 +108,9 @@ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
case _actions.UPDATE_IDENTITY: | ||
var userWithDefaults = (0, _defaults2.default)((0, _get2.default)(state, user.id, {}), user, { load: 0, capacity: 0 }); | ||
return (0, _assign2.default)({}, state, (0, _set2.default)({}, user.id, userWithDefaults)); | ||
case _actions.UPDATE_USER_STATUS: | ||
return setStatus(action, state); | ||
case _actions.UPDATE_USER_CAPACITY: | ||
case _actions.SET_USER_OFFLINE: | ||
return (0, _ramda.set)(lensUser(action), identity((0, _ramda.view)(lensUser(action), state), action))(state); | ||
case _actions.SET_OPERATOR_STATUS: | ||
return (0, _ramda.set)((0, _ramda.lensPath)([action[_broadcast.REMOTE_USER_KEY].id, 'status']), action.status, state); | ||
case _actions.SET_OPERATOR_CAPACITY: | ||
var capacity = parseInt(action.capacity); | ||
if (isNaN(capacity)) { | ||
return state; | ||
} | ||
return (0, _ramda.set)((0, _ramda.lensPath)([action[_broadcast.REMOTE_USER_KEY].id, 'capacity']), capacity, state); | ||
case _actions.UPDATE_USER_CAPACITY: | ||
return setCapacity(action, state); | ||
return (0, _ramda.set)(lensRemoteUser(action), identity((0, _ramda.view)(lensRemoteUser(action), state), action))(state); | ||
case _actions.REMOVE_USER: | ||
@@ -105,0 +117,0 @@ return (0, _omit2.default)(state, user.id); |
@@ -6,3 +6,3 @@ 'use strict'; | ||
}); | ||
exports.isSystemAcceptingCustomers = exports.getSystemAcceptsCustomers = exports.haveAvailableCapacity = exports.getAvailableCapacity = exports.selectTotalCapacity = exports.selectUser = exports.selectSocketIdentity = exports.selectIdentities = exports.getAvailableOperators = undefined; | ||
exports.isOperatorAcceptingChats = exports.isOperatorOnline = exports.isOperatorStatusAvailable = exports.getOperatorOnline = exports.getOperatorIdentity = exports.isSystemAcceptingCustomers = exports.getSystemAcceptsCustomers = exports.haveAvailableCapacity = exports.getAvailableCapacity = exports.selectTotalCapacity = exports.selectUser = exports.selectSocketIdentity = exports.selectIdentities = exports.getAvailableOperators = undefined; | ||
@@ -19,2 +19,4 @@ var _get = require('lodash/get'); | ||
var _util = require('../util'); | ||
var _socketIo = require('../middlewares/socket-io'); | ||
@@ -44,4 +46,5 @@ | ||
var capacity = _ref2.capacity; | ||
var online = _ref2.online; | ||
if (status !== _socketIo.STATUS_AVAILABLE) { | ||
if (!online || status !== _socketIo.STATUS_AVAILABLE) { | ||
return false; | ||
@@ -101,2 +104,17 @@ } | ||
var isSystemAcceptingCustomers = exports.isSystemAcceptingCustomers = (0, _ramda.both)(haveAvailableCapacity, getSystemAcceptsCustomers); | ||
var isSystemAcceptingCustomers = exports.isSystemAcceptingCustomers = (0, _ramda.both)(haveAvailableCapacity, getSystemAcceptsCustomers); | ||
var getOperatorIdentity = exports.getOperatorIdentity = function getOperatorIdentity(id, state) { | ||
return (0, _ramda.view)((0, _ramda.lensPath)(['operators', 'identities', (0, _util.asString)(id)]), state); | ||
}; | ||
var getOperatorOnline = exports.getOperatorOnline = function getOperatorOnline(id, state) { | ||
return (0, _ramda.view)((0, _ramda.lensPath)(['operators', 'identities', (0, _util.asString)(id), 'online']), state); | ||
}; | ||
var isOperatorStatusAvailable = exports.isOperatorStatusAvailable = function isOperatorStatusAvailable(id, state) { | ||
return (0, _ramda.equals)((0, _ramda.view)((0, _ramda.lensPath)(['operators', 'identities', (0, _util.asString)(id), 'status']), state), _socketIo.STATUS_AVAILABLE); | ||
}; | ||
var isOperatorOnline = exports.isOperatorOnline = getOperatorOnline; | ||
var isOperatorAcceptingChats = exports.isOperatorAcceptingChats = function isOperatorAcceptingChats(id, state) { | ||
return isOperatorOnline(id, state) && isOperatorStatusAvailable(id, state); | ||
}; |
@@ -6,6 +6,10 @@ 'use strict'; | ||
}); | ||
exports.makeEventMessage = exports.timestamp = undefined; | ||
exports.asString = exports.makeEventMessage = exports.timestamp = undefined; | ||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; | ||
var _uuid = require('uuid'); | ||
var _ramda = require('ramda'); | ||
var timestamp = exports.timestamp = function timestamp() { | ||
@@ -23,2 +27,7 @@ return Math.ceil(new Date().getTime() / 1000); | ||
}; | ||
}; | ||
}; | ||
var typeOf = function typeOf(v) { | ||
return typeof v === 'undefined' ? 'undefined' : _typeof(v); | ||
}; | ||
var asString = exports.asString = (0, _ramda.when)((0, _ramda.compose)((0, _ramda.equals)('number'), typeOf), (0, _ramda.invoker)(0, 'toString')); |
{ | ||
"name": "happychat-service", | ||
"version": "0.10.7", | ||
"version": "0.10.8-0", | ||
"description": "Socket.IO based chat server for happychat.", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
88792
2037