byId: ({ message_id }) => createSelector( selectors.all(), messages => { const result = messages.find(message => message.message_id === message_id); if (!result) { throw `no message found for ${message_id}`; } return result; } ),
byQuery: ({ offset = 0, limit = 20, discussion_id, is_draft, is_received }) => createSelector( [discussion_id ? selectors.byDiscussionId({ discussion_id }) : selectors.all()], messages => { const end = new Number(offset) + new Number(limit); return messages.filter(message => { if (is_draft !== undefined && message.is_draft.toString() !== is_draft) { return false; } if (is_received !== undefined && message.is_received.toString() !== is_received) { return false; } return true; }).slice(offset, end); } ),
byId: ({ providerName }) => createSelector( selectors.all(), providers => { const result = providers.find(provider => provider.name === providerName); if (!result) { throw new Error('provider not found'); } return { ...result, oauth_callback_uri: `/api/v2/providers/${providerName}/callback`, oauth_request_url: `${oauthUrlCallbackHost}/api/oauth-mock/${providerName}`, }; } ),
location: () => createSelector( selectors.last(), device => ({ location: `/api/v2/devices/${device.device_id}` }) ),
byId: ({ device_id }) => createSelector( selectors.all(), devices => devices.find(device => device.device_id === device_id) ),
lastLocation: () => createSelector( selectors.last(), message => ({ location: `/api/v2/messages/${message.message_id}` }) ),
byDiscussionId: ({ discussion_id }) => createSelector( selectors.all(), messages => messages.filter(message => message.discussion_id === discussion_id) ),