actionsMessages.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. import { actionPromise } from "./actionsPromise";
  2. import { gql } from "../helpers/gql";
  3. import { actionAddAllMediaChat, actionUploadFiles } from "./actionsMedia";
  4. import { addUploadDate } from "../helpers/addUploadDate";
  5. import { actionGetOneChat, actionSetDropMedia, actionSetMessageEditor } from "./actionsForChats";
  6. import { actionGetAllMediaFromChat } from "./actionsMedia";
  7. import { actionOpenModal } from "./actionsForModal";
  8. export const actionAddMessages = (data, id) => ({type: 'MSG', data, id});
  9. const actionAddMessage = (message, id) => ({type: 'MSG', data: [message], id});
  10. export const actionGetAllMessage = (_id) =>
  11. actionPromise('allMessages', gql(`query findAllMes($chatId: String) {
  12. MessageFind(query: $chatId) {
  13. media {
  14. url
  15. _id
  16. type
  17. originalFileName
  18. }
  19. }
  20. }`, {chatId: JSON.stringify([{"chat._id": _id}, {limit: [200]}])}))
  21. const actionGetOneMessage = (_id) =>
  22. actionPromise('oneMessage', gql(`query getOneMes($mesId: String){
  23. MessageFindOne(query: $mesId){
  24. _id
  25. text
  26. createdAt
  27. chat{
  28. _id
  29. }
  30. media {
  31. url
  32. _id
  33. type
  34. originalFileName
  35. }
  36. replyTo{
  37. _id
  38. text
  39. createdAt
  40. media {
  41. url
  42. _id
  43. type
  44. }
  45. owner {
  46. nick
  47. }
  48. }
  49. replies{
  50. _id text
  51. chat{
  52. _id
  53. }
  54. }
  55. forwarded{
  56. _id
  57. text
  58. createdAt
  59. owner {
  60. nick
  61. }
  62. media {
  63. originalFileName
  64. url
  65. _id
  66. type
  67. }
  68. }
  69. forwardWith{
  70. _id
  71. text
  72. chat{
  73. _id
  74. }
  75. }
  76. owner {
  77. _id
  78. nick
  79. avatar {
  80. url
  81. }
  82. }
  83. }
  84. }`, {mesId: JSON.stringify([{_id}])}))
  85. export const actionUpsertMSG = (message) =>
  86. actionPromise('sendMSG', gql(`mutation MessageUpsert($message: MessageInput) {
  87. MessageUpsert(message: $message) {
  88. _id
  89. createdAt
  90. text
  91. media {
  92. url
  93. _id
  94. type
  95. }
  96. replyTo{
  97. _id
  98. }
  99. forwarded{
  100. _id
  101. }
  102. owner {
  103. nick
  104. avatar {
  105. url
  106. }
  107. }
  108. chat{
  109. _id
  110. }
  111. }
  112. }`, {
  113. message
  114. }))
  115. export const actionSendMessage = (messageId, chatId, text, media, replyTo, forwarded) =>
  116. async (dispatch, getState) => {
  117. // media.map((item) => item?.name || (item.name = 'record'))
  118. let newMedia = null
  119. if(media){
  120. let checkedMedia = media.filter(item => !item?._id && item)
  121. let uploadedFiles = checkedMedia.length !== 0 ? await dispatch(actionUploadFiles(checkedMedia)) : null;
  122. newMedia = uploadedFiles ? [...uploadedFiles, ...media.filter(item => item._id && item)].map(({_id}) => ({_id})) : null;
  123. }
  124. const mes = Object.fromEntries(Object.entries({
  125. _id: messageId, chat: (chatId ? {_id: chatId} : chatId), text: text, media: newMedia, replyTo: (replyTo ? {_id: replyTo} : replyTo), forwarded: (forwarded ? {_id: forwarded} : forwarded)
  126. }).filter(([_, v]) => v != null));
  127. let message = await dispatch(actionUpsertMSG(mes))
  128. return message
  129. }
  130. export const actionGetMessageFromSocket = (msg) =>
  131. async (dispatch, getState) => {
  132. let message = await dispatch(actionGetOneMessage(msg._id));
  133. dispatch(actionAddMessage(message, message.chat._id));
  134. dispatch(actionGetOneChat(msg.chat._id));
  135. ////////check all replies and forwardWith (if message has them to send changes)
  136. const {replies, forwardWith} = message;
  137. const state = getState();
  138. // const [,route, histId] = history.location.pathname.split('/');
  139. if(replies){
  140. replies.forEach(async ({_id, chat}) => {
  141. if(state.chats[chat._id].messages?.hasOwnProperty(_id)){
  142. let mes = await dispatch(actionGetOneMessage(_id))
  143. dispatch(actionAddMessage(mes, chat._id));
  144. }
  145. })
  146. }
  147. if(forwardWith){
  148. forwardWith.forEach(async ({_id, chat}) => {
  149. if(state.chats[chat._id].messages?.hasOwnProperty(_id)){
  150. let mes = await dispatch(actionGetOneMessage(_id))
  151. dispatch(actionAddMessage(mes, chat._id));
  152. }
  153. })
  154. }
  155. const {media} = msg;
  156. if(media){
  157. dispatch(actionAddAllMediaChat(msg.chat._id, media))
  158. }
  159. }
  160. export const actionEditMessage = (chatId, message) =>
  161. (dispatch, getState) => {
  162. dispatch(actionSetMessageEditor(chatId, {message: message, value: message.text}))
  163. if (message.media){
  164. let files = addUploadDate([...message.media])
  165. console.log(files)
  166. dispatch(actionSetDropMedia(chatId, files))
  167. dispatch(actionOpenModal('messageEditorMediaModal'))
  168. }
  169. }
  170. export const actionGetMessageForChat = (_id, fromChatItem) =>
  171. async (dispatch,getState) => {
  172. let messLen = fromChatItem ? 0 : Object.values(getState().chats[_id]?.messages || {}).length;
  173. let messages = await dispatch(
  174. actionPromise('messages', gql(`query FindMessChat($chat: String) {
  175. MessageFind(query: $chat) {
  176. _id
  177. text
  178. createdAt
  179. chat{
  180. _id
  181. }
  182. media {
  183. url
  184. _id
  185. type
  186. text
  187. originalFileName
  188. }
  189. replyTo{
  190. _id
  191. text
  192. media {
  193. url
  194. _id
  195. type
  196. }
  197. owner {
  198. nick
  199. }
  200. }
  201. replies{
  202. _id text
  203. }
  204. forwarded{
  205. _id
  206. text
  207. createdAt
  208. owner {
  209. nick
  210. }
  211. media {
  212. originalFileName
  213. url
  214. _id
  215. type
  216. }
  217. }
  218. forwardWith{
  219. _id
  220. text
  221. }
  222. owner {
  223. _id
  224. nick
  225. avatar {
  226. url
  227. }
  228. }
  229. }
  230. }`, {chat: JSON.stringify(
  231. [{"chat._id": _id},
  232. {
  233. sort: [{_id: -1}], limit: [20], skip: [messLen]
  234. }
  235. ]
  236. )}
  237. ))
  238. )
  239. if(messages){
  240. dispatch(actionAddMessages([...messages], _id));
  241. dispatch(actionGetAllMediaFromChat(_id))
  242. }
  243. return messages
  244. }