feat: message copying

This commit is contained in:
cha0s 2020-07-17 00:03:22 -05:00
parent e400ab0113
commit 2fb84959f4
6 changed files with 26 additions and 5 deletions

View File

@ -4,7 +4,7 @@ import React, {useRef, useState} from 'react';
import {useDispatch, useSelector} from 'react-redux'; import {useDispatch, useSelector} from 'react-redux';
import {v4 as uuidv4} from 'uuid'; import {v4 as uuidv4} from 'uuid';
import {addMessage} from '~/common/state/chat'; import {submitMessage} from '~/common/state/chat';
import {userSelector} from '~/common/state/user'; import {userSelector} from '~/common/state/user';
import useChannel from '~/client/hooks/useChannel'; import useChannel from '~/client/hooks/useChannel';
@ -22,7 +22,7 @@ export default function ChatSubmitMessage() {
event.preventDefault(); event.preventDefault();
const message = text.slice(0, 1000).trim(); const message = text.slice(0, 1000).trim();
if (message) { if (message) {
dispatch(addMessage({ dispatch(submitMessage({
channel, channel,
message, message,
owner: user.id, owner: user.id,

View File

@ -1,11 +1,20 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import {useDispatch} from 'react-redux';
import Message from '~/common/packets/message.packet';
import {addMessage} from '~/common/state/chat';
import useSocket from './hooks/useSocket'; import useSocket from './hooks/useSocket';
export default function Dispatcher({children}) { export default function Dispatcher({children}) {
const dispatch = useDispatch();
useSocket((socket) => { useSocket((socket) => {
const onPacket = () => {}; const onPacket = (packet) => {
if (packet instanceof Message) {
dispatch(addMessage(packet.data));
}
};
socket.on('packet', onPacket); socket.on('packet', onPacket);
socket.on('disconnect', () => socket.off('packet', onPacket)); socket.on('disconnect', () => socket.off('packet', onPacket));
socket.on('reconnect', () => socket.on('packet', onPacket)); socket.on('reconnect', () => socket.on('packet', onPacket));

View File

@ -1,10 +1,11 @@
import Message from '~/common/packets/message.packet'; import Message from '~/common/packets/message.packet';
import {addMessage, confirmMessage} from '~/common/state/chat'; import {addMessage, confirmMessage, submitMessage} from '~/common/state/chat';
import {socket} from '~/client/hooks/useSocket'; import {socket} from '~/client/hooks/useSocket';
const effects = { const effects = {
[addMessage]: ({dispatch}, {payload}) => { [submitMessage]: ({dispatch}, {payload}) => {
dispatch(addMessage(payload));
socket.send(new Message(payload), ([timestamp, current]) => { socket.send(new Message(payload), ([timestamp, current]) => {
dispatch(confirmMessage({current, previous: payload.uuid, timestamp})); dispatch(confirmMessage({current, previous: payload.uuid, timestamp}));
}); });

View File

@ -8,6 +8,9 @@ export default class Message extends Packet {
data: { data: {
channel: 'string', channel: 'string',
message: 'string', message: 'string',
owner: 'uint32',
timestamp: 'float64',
uuid: 'string',
}, },
}; };
} }

View File

@ -84,6 +84,7 @@ const slice = createSlice({
removeRecent: ({recent}, {payload: {channel}}) => { removeRecent: ({recent}, {payload: {channel}}) => {
recent.splice(recent.indexOf(channel), 1); recent.splice(recent.indexOf(channel), 1);
}, },
submitMessage: () => {},
}, },
}); });
@ -99,6 +100,7 @@ export const {
left, left,
removeMessage, removeMessage,
removeRecent, removeRecent,
submitMessage,
} = slice.actions; } = slice.actions;
export default slice.reducer; export default slice.reducer;

View File

@ -59,6 +59,12 @@ export function createSocketServer(httpServer) {
const timestamp = Date.now(); const timestamp = Date.now();
const uuid = uuidv4(); const uuid = uuidv4();
const key = `${channel}:messages:${uuid}`; const key = `${channel}:messages:${uuid}`;
socket.to(channel, new Message({
...packet.data,
owner,
timestamp,
uuid,
}));
pubClient pubClient
.multi() .multi()
.set(key, JSON.stringify({ .set(key, JSON.stringify({