123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- import { actionPromise } from "./actionsPromise";
- import { gql } from "../helpers/gql";
- import { actionAddAllMediaChat, actionUploadFiles } from "./actionsMedia";
- import { addUploadDate } from "../helpers/addUploadDate";
- import { actionGetOneChat, actionSetDropMedia, actionSetMessageEditor } from "./actionsForChats";
- import { actionGetAllMediaFromChat } from "./actionsMedia";
- import { actionOpenModal } from "./actionsForModal";
- export const actionAddMessages = (data, id) => ({type: 'MSG', data, id});
- const actionAddMessage = (message, id) => ({type: 'MSG', data: [message], id});
- export const actionGetAllMessage = (_id) =>
- actionPromise('allMessages', gql(`query findAllMes($chatId: String) {
- MessageFind(query: $chatId) {
- media {
- url
- _id
- type
- originalFileName
- }
- }
- }`, {chatId: JSON.stringify([{"chat._id": _id}, {limit: [200]}])}))
- const actionGetOneMessage = (_id) =>
- actionPromise('oneMessage', gql(`query getOneMes($mesId: String){
- MessageFindOne(query: $mesId){
- _id
- text
- createdAt
- chat{
- _id
- }
- media {
- url
- _id
- type
- originalFileName
- }
- replyTo{
- _id
- text
- createdAt
- media {
- url
- _id
- type
- }
- owner {
- nick
- }
- }
- replies{
- _id text
- chat{
- _id
- }
- }
- forwarded{
- _id
- text
- createdAt
- owner {
- nick
- }
- media {
- originalFileName
- url
- _id
- type
- }
- }
- forwardWith{
- _id
- text
- chat{
- _id
- }
- }
- owner {
- _id
- nick
- avatar {
- url
- }
- }
- }
- }`, {mesId: JSON.stringify([{_id}])}))
- export const actionUpsertMSG = (message) =>
- actionPromise('sendMSG', gql(`mutation MessageUpsert($message: MessageInput) {
- MessageUpsert(message: $message) {
- _id
- createdAt
- text
- media {
- url
- _id
- type
- }
- replyTo{
- _id
- }
- forwarded{
- _id
- }
- owner {
- nick
- avatar {
- url
- }
- }
- chat{
- _id
- }
- }
- }`, {
- message
- }))
- export const actionSendMessage = (messageId, chatId, text, media, replyTo, forwarded) =>
- async (dispatch, getState) => {
- // media.map((item) => item?.name || (item.name = 'record'))
- let newMedia = null
- if(media){
- let checkedMedia = media.filter(item => !item?._id && item)
- let uploadedFiles = checkedMedia.length !== 0 ? await dispatch(actionUploadFiles(checkedMedia)) : null;
- newMedia = uploadedFiles ? [...uploadedFiles, ...media.filter(item => item._id && item)].map(({_id}) => ({_id})) : null;
- }
-
- const mes = Object.fromEntries(Object.entries({
- _id: messageId, chat: (chatId ? {_id: chatId} : chatId), text: text, media: newMedia, replyTo: (replyTo ? {_id: replyTo} : replyTo), forwarded: (forwarded ? {_id: forwarded} : forwarded)
- }).filter(([_, v]) => v != null));
- let message = await dispatch(actionUpsertMSG(mes))
- return message
- }
- export const actionGetMessageFromSocket = (msg) =>
- async (dispatch, getState) => {
- let message = await dispatch(actionGetOneMessage(msg._id));
- dispatch(actionAddMessage(message, message.chat._id));
- dispatch(actionGetOneChat(msg.chat._id));
- ////////check all replies and forwardWith (if message has them to send changes)
- const {replies, forwardWith} = message;
- const state = getState();
- // const [,route, histId] = history.location.pathname.split('/');
- if(replies){
- replies.forEach(async ({_id, chat}) => {
- if(state.chats[chat._id].messages?.hasOwnProperty(_id)){
- let mes = await dispatch(actionGetOneMessage(_id))
- dispatch(actionAddMessage(mes, chat._id));
- }
- })
- }
- if(forwardWith){
- forwardWith.forEach(async ({_id, chat}) => {
- if(state.chats[chat._id].messages?.hasOwnProperty(_id)){
- let mes = await dispatch(actionGetOneMessage(_id))
- dispatch(actionAddMessage(mes, chat._id));
- }
- })
- }
- const {media} = msg;
- if(media){
- dispatch(actionAddAllMediaChat(msg.chat._id, media))
- }
- }
- export const actionEditMessage = (chatId, message) =>
- (dispatch, getState) => {
- dispatch(actionSetMessageEditor(chatId, {message: message, value: message.text}))
- if (message.media){
- let files = addUploadDate([...message.media])
- console.log(files)
- dispatch(actionSetDropMedia(chatId, files))
- dispatch(actionOpenModal('messageEditorMediaModal'))
- }
- }
- export const actionGetMessageForChat = (_id, fromChatItem) =>
- async (dispatch,getState) => {
- let messLen = fromChatItem ? 0 : Object.values(getState().chats[_id]?.messages || {}).length;
- let messages = await dispatch(
- actionPromise('messages', gql(`query FindMessChat($chat: String) {
- MessageFind(query: $chat) {
- _id
- text
- createdAt
- chat{
- _id
- }
- media {
- url
- _id
- type
- text
- originalFileName
- }
- replyTo{
- _id
- text
- media {
- url
- _id
- type
- }
- owner {
- nick
- }
- }
-
- replies{
- _id text
- }
- forwarded{
- _id
- text
- createdAt
- owner {
- nick
- }
- media {
- originalFileName
- url
- _id
- type
- }
- }
- forwardWith{
- _id
- text
- }
- owner {
- _id
- nick
- avatar {
- url
- }
- }
- }
- }`, {chat: JSON.stringify(
- [{"chat._id": _id},
- {
- sort: [{_id: -1}], limit: [20], skip: [messLen]
- }
- ]
- )}
- ))
- )
- if(messages){
- dispatch(actionAddMessages([...messages], _id));
- dispatch(actionGetAllMediaFromChat(_id))
- }
- return messages
- }
|