-
-
-
- {activeConversations
- ? activeConversations.map(conversation => (
-
- ))
- : null}
+
+
+
+
+
+ {activeConversations
+ ? activeConversations.map(conversation => (
+
+ ))
+ : null}
+
);
diff --git a/client/src/components/chat-send-message/chat-send-message.component.jsx b/client/src/components/chat-send-message/chat-send-message.component.jsx
index 24bff6664..940de722f 100644
--- a/client/src/components/chat-send-message/chat-send-message.component.jsx
+++ b/client/src/components/chat-send-message/chat-send-message.component.jsx
@@ -1,5 +1,6 @@
-import { Input } from "antd";
-import React, { useState } from "react";
+import { Input, Spin } from "antd";
+import { LoadingOutlined } from "@ant-design/icons";
+import React, { useState, useEffect } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
@@ -15,6 +16,12 @@ const mapDispatchToProps = dispatch => ({
function ChatSendMessageComponent({ conversation, bodyshop, sendMessage }) {
const [message, setMessage] = useState("");
+
+ useEffect(() => {
+ if (conversation.isSending === false) {
+ setMessage("");
+ }
+ }, [conversation, setMessage]);
const { t } = useTranslation();
const handleEnter = () => {
@@ -24,22 +31,35 @@ function ChatSendMessageComponent({ conversation, bodyshop, sendMessage }) {
messagingServiceSid: bodyshop.messagingservicesid,
conversationid: conversation.id
});
- setMessage("");
};
return (
a}
autoSize={{ minRows: 1, maxRows: 4 }}
value={message}
+ disabled={conversation.isSending}
placeholder={t("messaging.labels.typeamessage")}
- // enterButton={}
onChange={e => setMessage(e.target.value)}
onPressEnter={event => {
+ event.preventDefault();
if (!!!event.shiftKey) handleEnter();
}}
/>
+
+ }
+ />
);
}
diff --git a/client/src/components/dashboard-grid/dashboard-grid.component.jsx b/client/src/components/dashboard-grid/dashboard-grid.component.jsx
index 787842fc8..353799588 100644
--- a/client/src/components/dashboard-grid/dashboard-grid.component.jsx
+++ b/client/src/components/dashboard-grid/dashboard-grid.component.jsx
@@ -13,10 +13,11 @@ const Sdiv = styled.div`
width: 80%;
top: 10%;
left: 10%;
- // background-color: #ffcc00;
+ // background-color: #ffcc00;
`;
const ResponsiveReactGridLayout = WidthProvider(Responsive);
+
export default function DashboardGridComponent() {
const [state, setState] = useState({
layout: [
@@ -38,19 +39,18 @@ export default function DashboardGridComponent() {
console.log("breakpoint, cols", breakpoint, cols);
// setState({ ...state, breakpoint: breakpoint, cols: cols });
};
-
+ if (true) return null;
return (
The Grid.
{
console.log("layout", layout);
setState({ ...state, layout });
- }}
- >
+ }}>
{state.layout.map((item, index) => {
return (
diff --git a/client/src/graphql/messages.queries.js b/client/src/graphql/messages.queries.js
index 83dc52d12..f44ebbd4b 100644
--- a/client/src/graphql/messages.queries.js
+++ b/client/src/graphql/messages.queries.js
@@ -2,7 +2,10 @@ import { gql } from "apollo-boost";
export const MESSAGES_SUBSCRIPTION = gql`
subscription MESSAGES_SUBSCRIPTION($conversationId: uuid!) {
- messages(where: { conversationid: { _eq: $conversationId } }) {
+ messages(
+ where: { conversationid: { _eq: $conversationId } }
+ order_by: { created_at: asc }
+ ) {
text
created_at
id
diff --git a/client/src/redux/messaging/messaging.actions.js b/client/src/redux/messaging/messaging.actions.js
index dc8f2bc0e..dfa0f7748 100644
--- a/client/src/redux/messaging/messaging.actions.js
+++ b/client/src/redux/messaging/messaging.actions.js
@@ -25,6 +25,11 @@ export const sendMessage = message => ({
payload: message
});
+export const sendMessageSuccess = message => ({
+ type: MessagingActionTypes.SEND_MESSAGE_SUCCESS,
+ payload: message
+});
+
export const sendMessageFailure = error => ({
type: MessagingActionTypes.SEND_MESSAGE_FAILURE,
payload: error
diff --git a/client/src/redux/messaging/messaging.reducer.js b/client/src/redux/messaging/messaging.reducer.js
index 123b88d95..cf1e8b65a 100644
--- a/client/src/redux/messaging/messaging.reducer.js
+++ b/client/src/redux/messaging/messaging.reducer.js
@@ -7,12 +7,16 @@ const INITIAL_STATE = {
{
phone_num: "6049992002",
id: "519ba10d-6467-4fa5-9c22-59ae891edeb6",
- open: false
+ open: false,
+ isSending: false,
+ sendingError: null
},
{
phone_num: "6049992991",
id: "ab57deba-eeb9-40db-b5ae-23f3ce8d7c7b",
- open: false
+ open: false,
+ isSending: false,
+ sendingError: null
}
],
error: null
@@ -30,6 +34,31 @@ const messagingReducer = (state = INITIAL_STATE, action) => {
...state,
visible: true
};
+ case MessagingActionTypes.SEND_MESSAGE:
+ return {
+ ...state,
+ conversations: state.conversations.map(c =>
+ c.id === action.payload.conversationid ? { ...c, isSending: true } : c
+ )
+ };
+ case MessagingActionTypes.SEND_MESSAGE_SUCCESS:
+ return {
+ ...state,
+ conversations: state.conversations.map(c =>
+ c.id === action.payload.conversationid
+ ? { ...c, isSending: false }
+ : c
+ )
+ };
+ case MessagingActionTypes.SEND_MESSAGE_FAILURE:
+ return {
+ ...state,
+ conversations: state.conversations.map(c =>
+ c.id === action.payload.conversationid
+ ? { ...c, isSending: false, sendingError: action.payload.error }
+ : c
+ )
+ };
case MessagingActionTypes.OPEN_CONVERSATION:
if (
state.conversations.find(c => c.phone_num === action.payload.phone_num)
@@ -48,7 +77,9 @@ const messagingReducer = (state = INITIAL_STATE, action) => {
{
phone_num: action.payload.phone_num,
id: action.payload.id,
- open: true
+ open: true,
+ isSending: false,
+ sendingError: null
}
]
};
@@ -66,8 +97,7 @@ const messagingReducer = (state = INITIAL_STATE, action) => {
c.phone_num === action.payload ? { ...c, open: !c.open } : c
)
};
- case MessagingActionTypes.SEND_MESSAGE_FAILURE:
- return { ...state, error: action.payload };
+
default:
return state;
}
diff --git a/client/src/redux/messaging/messaging.sagas.js b/client/src/redux/messaging/messaging.sagas.js
index b5af1f479..f167b42f6 100644
--- a/client/src/redux/messaging/messaging.sagas.js
+++ b/client/src/redux/messaging/messaging.sagas.js
@@ -1,20 +1,22 @@
import { all, call, put, takeLatest } from "redux-saga/effects";
-import { sendMessageFailure } from "./messaging.actions";
+import { sendMessageFailure, sendMessageSuccess } from "./messaging.actions";
import MessagingActionTypes from "./messaging.types";
import axios from "axios";
+import { sendEmailFailure } from "../email/email.actions";
export function* onSendMessage() {
yield takeLatest(MessagingActionTypes.SEND_MESSAGE, sendMessage);
}
export function* sendMessage({ payload }) {
- console.log("In the saga.");
try {
- console.log("Message Contents", payload);
- axios.post("/sms/send", payload).then(response => {
- console.log(JSON.stringify(response));
- });
+ const response = yield call(axios.post, "/sms/send", payload);
+ if (response.status === 200) {
+ yield put(sendMessageSuccess(payload));
+ } else {
+ yield put(sendEmailFailure(response.data));
+ }
} catch (error) {
- console.log("Error in sendMessage saga.");
+ console.log("Error in sendMessage saga.", error);
yield put(sendMessageFailure(error));
}
}
diff --git a/client/src/redux/messaging/messaging.types.js b/client/src/redux/messaging/messaging.types.js
index 83d0403b1..59a35590a 100644
--- a/client/src/redux/messaging/messaging.types.js
+++ b/client/src/redux/messaging/messaging.types.js
@@ -5,6 +5,7 @@ const MessagingActionTypes = {
CLOSE_CONVERSATION: "CLOSE_CONVERSATION",
TOGGLE_CONVERSATION_VISIBLE: "TOGGLE_CONVERSATION_VISIBLE",
SEND_MESSAGE: "SEND_MESSAGE",
+ SEND_MESSAGE_SUCCESS: "SEND_MESSAGE_SUCCESS",
SEND_MESSAGE_FAILURE: "SEND_MESSAGE_FAILURE"
};
export default MessagingActionTypes;
diff --git a/client/src/redux/user/user.sagas.js b/client/src/redux/user/user.sagas.js
index a9b5aa396..6d9e54612 100644
--- a/client/src/redux/user/user.sagas.js
+++ b/client/src/redux/user/user.sagas.js
@@ -14,21 +14,9 @@ import {
} from "./user.actions";
import UserActionTypes from "./user.types";
-// export function* getSnapshotFromUserAuth(userAuth) {
-// try {
-// const userRef = yield call(createUserProfileDocument, userAuth);
-// //const userSnapshot = yield userRef.get();
-// } catch (error) {
-// yield put(signInFailure(error));
-// }
-// }
-
export function* signInWithEmail({ payload: { email, password } }) {
try {
const { user } = yield auth.signInWithEmailAndPassword(email, password);
- let token = yield user.getIdToken();
- // localStorage.setItem("token", token);
- //window.sessionStorage.setItem(`lastTokenRefreshTime`, new Date());
yield put(
signInSuccess({
uid: user.uid,
@@ -54,10 +42,6 @@ export function* isUserAuthenticated() {
yield put(unauthorizedUser());
return;
}
- let token = yield user.getIdToken();
- //localStorage.setItem("token", token);
- //window.sessionStorage.setItem(`lastTokenRefreshTime`, new Date());
-
yield put(
signInSuccess({
uid: user.uid,
diff --git a/server/sms/receive.js b/server/sms/receive.js
index c73f2d881..7f5f3c733 100644
--- a/server/sms/receive.js
+++ b/server/sms/receive.js
@@ -5,8 +5,13 @@ const phone = require("phone");
exports.receive = (req, res) => {
//Perform request validation
- if (!req.body || !req.body.MessagingServiceSid || !req.body.SmsMessageSid) {
- res.sendStatus(400);
+ if (
+ !!!req.body ||
+ !!!req.body.MessagingServiceSid ||
+ !!!req.body.SmsMessageSid
+ ) {
+ res.status(400);
+ res.json({ success: false, error: "Malformed Request" });
} else {
client
.request(queries.FIND_BODYSHOP_BY_MESSAGING_SERVICE_SID, {
@@ -43,17 +48,17 @@ exports.receive = (req, res) => {
client
.request(queries.INSERT_MESSAGE, { msg: newMessage })
.then(r2 => {
- res.sendStatus(200);
+ res.status(200).end();
})
.catch(e2 => {
console.log("e2", e2);
- res.json(e2);
+ res.status(500).json(e2);
});
}
})
.catch(e1 => {
console.log("e1", e1);
- res.json(e1);
+ res.status(500).json(e1);
});
}
};
diff --git a/server/sms/send.js b/server/sms/send.js
index 46b500c00..51d418980 100644
--- a/server/sms/send.js
+++ b/server/sms/send.js
@@ -10,15 +10,8 @@ const client = twilio(
const gqlClient = require("../graphql-client/graphql-client").client;
exports.send = (req, res) => {
- console.log("Sending an SMS!");
const { to, messagingServiceSid, body, conversationid } = req.body;
- console.log(
- "to, messagingServiceSid, body, conversationid",
- to,
- messagingServiceSid,
- body,
- conversationid
- );
+ console.log("[Sending Sms] " + conversationid + " | " + body);
if (!!to && !!messagingServiceSid && !!body && !!conversationid) {
client.messages
.create({
@@ -36,6 +29,7 @@ exports.send = (req, res) => {
gqlClient
.request(queries.INSERT_MESSAGE, { msg: newMessage })
.then(r2 => {
+ console.log("Responding GQL Message ID", JSON.stringify(r2));
res.sendStatus(200);
})
.catch(e2 => {
@@ -48,6 +42,8 @@ exports.send = (req, res) => {
console.log("e1", e1);
});
} else {
- res.json({ success: false, message: "Missing required parameter(s)." });
+ res
+ .status(400)
+ .json({ success: false, message: "Missing required parameter(s)." });
}
};