feat: message copying
This commit is contained in:
parent
e400ab0113
commit
2fb84959f4
|
@ -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,
|
||||||
|
|
|
@ -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));
|
||||||
|
|
5
src/client/store/effects.js
vendored
5
src/client/store/effects.js
vendored
|
@ -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}));
|
||||||
});
|
});
|
||||||
|
|
|
@ -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',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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({
|
||||||
|
|
Loading…
Reference in New Issue
Block a user