actionsMessages.jsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import { actionPromise } from "./actionsPromise";
  2. import { gql } from "../helpers/gql";
  3. import { actionUploadFiles } from "./actionsMedia";
  4. import { history } from "../App";
  5. import { actionSetDropMedia, actionSetMessageEditor } from "../reducers/chatReducer";
  6. import { addUploadDate } from "../components/utils/addUploadDate";
  7. import { actionOpenModal } from "../reducers/modalReducer";
  8. import { actionGetOneChat } from "./actionsForChats";
  9. export const actionAddMessages = (data, id) => ({type: 'MSG', data, id});
  10. const actionAddMessage = (message, id) => ({type: 'MSG', data: [message], id});
  11. const actionGetOneMessage = (_id) =>
  12. actionPromise('oneMessage', gql(`query getOneMes($mesId: String){
  13. MessageFindOne(query: $mesId){
  14. _id
  15. text
  16. createdAt
  17. chat{
  18. _id
  19. }
  20. media {
  21. url
  22. _id
  23. type
  24. originalFileName
  25. }
  26. replyTo{
  27. _id
  28. text
  29. media {
  30. url
  31. _id
  32. type
  33. }
  34. owner {
  35. nick
  36. }
  37. }
  38. replies{
  39. _id text
  40. chat{
  41. _id
  42. }
  43. }
  44. forwarded{
  45. _id
  46. text
  47. owner {
  48. nick
  49. }
  50. media {
  51. url
  52. _id
  53. type
  54. }
  55. }
  56. forwardWith{
  57. _id
  58. text
  59. chat{
  60. _id
  61. }
  62. }
  63. owner {
  64. _id
  65. nick
  66. avatar {
  67. url
  68. }
  69. }
  70. }
  71. }`, {mesId: JSON.stringify([{_id}])}))
  72. export const actionUpsertMSG = (message) =>
  73. actionPromise('sendMSG', gql(`mutation MessageUpsert($message: MessageInput) {
  74. MessageUpsert(message: $message) {
  75. _id
  76. createdAt
  77. text
  78. media {
  79. url
  80. _id
  81. type
  82. }
  83. replyTo{
  84. _id
  85. }
  86. forwarded{
  87. _id
  88. }
  89. owner {
  90. nick
  91. avatar {
  92. url
  93. }
  94. }
  95. chat{
  96. _id
  97. }
  98. }
  99. }`, {
  100. message
  101. }))
  102. export const actionSendMessage = (messageId, chatId, text, media, replyTo, forwarded) =>
  103. async (dispatch, getState) => {
  104. let newMedia = null
  105. if(media){
  106. let checkedMedia = media.filter(item => !item._id && item)
  107. console.log(media, checkedMedia)
  108. let uploadedFiles = checkedMedia.length !== 0 ? await dispatch(actionUploadFiles(checkedMedia)) : null;
  109. newMedia = uploadedFiles ? [...uploadedFiles, ...media.filter(item => item._id && item)].map(({_id}) => ({_id})) : null;
  110. console.log(uploadedFiles)
  111. }
  112. const mes = Object.fromEntries(Object.entries({
  113. _id: messageId, chat: (chatId ? {_id: chatId} : chatId), text: text, media: newMedia, replyTo: (replyTo ? {_id: replyTo} : replyTo), forwarded: (forwarded ? {_id: forwarded} : forwarded)
  114. }).filter(([_, v]) => v != null));
  115. console.log(mes)
  116. let message = await dispatch(actionUpsertMSG(mes))
  117. return message
  118. }
  119. export const actionGetMessageFromSocket = (msg) =>
  120. async (dispatch, getState) => {
  121. let message = await dispatch(actionGetOneMessage(msg._id));
  122. dispatch(actionAddMessage(message, message.chat._id));
  123. dispatch(actionGetOneChat(msg.chat._id));
  124. ////////check all replies and forwardWith (if message has them to send changes)
  125. const {replies, forwardWith} = message;
  126. const state = getState();
  127. // const [,route, histId] = history.location.pathname.split('/');
  128. if(replies){
  129. replies.forEach(async ({_id, chat}) => {
  130. if(state.chats[chat._id].messages?.hasOwnProperty(_id)){
  131. let mes = await dispatch(actionGetOneMessage(_id))
  132. dispatch(actionAddMessage(mes, chat._id));
  133. }
  134. })
  135. }
  136. if(forwardWith){
  137. forwardWith.forEach(async ({_id, chat}) => {
  138. if(state.chats[chat._id].messages?.hasOwnProperty(_id)){
  139. let mes = await dispatch(actionGetOneMessage(_id))
  140. dispatch(actionAddMessage(mes, chat._id));
  141. }
  142. })
  143. }
  144. }
  145. export const actionEditMessage = (chatId, message) =>
  146. (dispatch, getState) => {
  147. dispatch(actionSetMessageEditor(chatId, {message: message, value: message.text}))
  148. if (message.media){
  149. let files = addUploadDate([...message.media])
  150. console.log(files)
  151. dispatch(actionSetDropMedia(chatId, files))
  152. dispatch(actionOpenModal('messageEditorMediaModal'))
  153. }
  154. }