Skip to content

Commit d359ca6

Browse files
authored
Feat/#197-K: 회의록 제목 수정 기능 (#198)
1 parent 0b71434 commit d359ca6

File tree

10 files changed

+63
-19
lines changed

10 files changed

+63
-19
lines changed

client/src/components/Mom/index.tsx

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { useEffect, useState } from 'react';
1+
import { useEffect, useRef, useState } from 'react';
22
import SOCKET_MESSAGE from 'src/constants/socket-message';
33
import { useCRDT } from 'src/hooks/useCRDT';
4+
import useDebounce from 'src/hooks/useDebounce';
45
import useSelectedMom from 'src/hooks/useSelectedMom';
56
import useSocketContext from 'src/hooks/useSocketContext';
67
import { v4 as uuid } from 'uuid';
@@ -22,16 +23,18 @@ function Mom() {
2223
remoteDeleteCRDT,
2324
} = useCRDT();
2425

25-
const onTitleChange: React.FormEventHandler<HTMLHeadingElement> = (e) => {
26-
/*
27-
제목 변경하는 요청
28-
const title = e.target as HTMLHeadingElement;
29-
title.innerText
30-
OR
31-
titleRef.current.innerText
32-
*/
33-
const title = e.target as HTMLHeadingElement;
34-
};
26+
const titleRef = useRef<HTMLHeadingElement>(null);
27+
28+
const onTitleUpdate: React.FormEventHandler<HTMLHeadingElement> = useDebounce(
29+
(e) => {
30+
if (!titleRef.current) return;
31+
32+
const title = titleRef.current.innerText;
33+
34+
socket.emit(SOCKET_MESSAGE.MOM.UPDATE_TITLE, title);
35+
},
36+
500,
37+
);
3538

3639
const [blocks, setBlocks] = useState<string[]>([]);
3740

@@ -80,6 +83,12 @@ function Mom() {
8083
}, [selectedMom]);
8184

8285
useEffect(() => {
86+
socket.on(SOCKET_MESSAGE.MOM.UPDATE_TITLE, (title) => {
87+
if (!titleRef.current) return;
88+
89+
titleRef.current.innerText = title;
90+
});
91+
8392
socket.on(SOCKET_MESSAGE.MOM.UPDATED, () => setBlocks(spreadCRDT()));
8493

8594
socket.on(SOCKET_MESSAGE.MOM.INSERT_BLOCK, (op) => {
@@ -106,6 +115,7 @@ function Mom() {
106115

107116
return () => {
108117
[
118+
SOCKET_MESSAGE.MOM.UPDATE_TITLE,
109119
SOCKET_MESSAGE.MOM.UPDATED,
110120
SOCKET_MESSAGE.MOM.INSERT_BLOCK,
111121
SOCKET_MESSAGE.MOM.DELETE_BLOCK,
@@ -123,11 +133,12 @@ function Mom() {
123133
<>
124134
<div className={style['mom-header']}>
125135
<h1
136+
ref={titleRef}
126137
contentEditable={true}
127138
suppressContentEditableWarning={true}
128-
onInput={onTitleChange}
139+
onInput={onTitleUpdate}
129140
>
130-
{selectedMom.name}
141+
{selectedMom.title}
131142
</h1>
132143
<span>{new Date(selectedMom.createdAt).toLocaleString()}</span>
133144
</div>

client/src/components/Sidebar/MomList.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ function MomList({ moms, setSelectedMom }: MomListProps) {
4747
<div className={style['mom-list-container']}>
4848
<h2>회의록</h2>
4949
<ul className={style['mom-list']}>
50-
{momList.map(({ _id: id, name }) => (
50+
{momList.map(({ _id: id, title }) => (
5151
<li key={id} onClick={() => onSelect(id)}>
52-
{name}
52+
{title}
5353
</li>
5454
))}
5555
</ul>

client/src/constants/socket-message.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const SOCKET_MESSAGE = {
22
MOM: {
33
CREATE: 'create',
44
SELECT: 'select',
5+
UPDATE_TITLE: 'update-mom-title',
56
INIT: 'init-mom',
67
INSERT_BLOCK: 'insert-block',
78
DELETE_BLOCK: 'delete-block',

client/src/hooks/useDebounce.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { useRef } from 'react';
2+
3+
function useDebounce<T extends unknown[]>(
4+
callback: (...params: T) => void,
5+
time: number,
6+
) {
7+
const timer = useRef<ReturnType<typeof setTimeout> | null>(null);
8+
return (...params: T) => {
9+
if (timer.current) clearTimeout(timer.current);
10+
11+
timer.current = setTimeout(() => {
12+
callback(...params);
13+
timer.current = null;
14+
}, time);
15+
};
16+
}
17+
18+
export default useDebounce;

client/src/types/mom.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export type TMom = {
22
_id: string;
3-
name: string;
3+
title: string;
44
createdAt: Date;
55
};

server/apis/mom/model.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ import autoIncrement from 'mongoose-auto-increment';
55

66
export interface Mom extends LinkedList {
77
id: number;
8-
name: string;
8+
title: string;
99
createdAt: Date;
1010
}
1111

1212
const momSchema = new Schema<Mom>({
1313
id: { type: Number, required: true },
14-
name: { type: String, default: '제목 없음' },
14+
title: { type: String, default: '제목 없음' },
1515
createdAt: { type: Date, default: new Date() },
1616
head: { type: Object, default: null },
1717
nodeMap: { type: Object, default: {} },

server/apis/mom/service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ export const createMom = async (workspaceId: string) => {
3232
return mom;
3333
};
3434

35+
export const putMomTitle = async (id: string, title: string) => {
36+
await momModel.updateOne({ _id: id }, { title });
37+
};
38+
3539
export const putMom = async (id: string, data: LinkedList) => {
3640
await momModel.updateOne(
3741
{ _id: id },

server/apis/workspace/service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export const info = async (workspaceId: number) => {
6060
)) || [];
6161

6262
const moms: string[] = momsIds.length
63-
? await momModel.find({ id: { $in: momsIds } }, { name: 1 })
63+
? await momModel.find({ id: { $in: momsIds } }, { title: 1 })
6464
: [];
6565

6666
return { name, members, moms };

server/constants/socket-message.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const SOCKET_MESSAGE = {
22
MOM: {
33
CREATE: 'create',
44
SELECT: 'select',
5+
UPDATE_TITLE: 'update-mom-title',
56
INIT: 'init-mom',
67
INSERT_BLOCK: 'insert-block',
78
DELETE_BLOCK: 'delete-block',

server/socket/mom.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import * as Questions from '@apis/mom/questions/service';
2+
import { putMomTitle } from '@apis/mom/service';
23
import { createVote, endVote, updateVote } from '@apis/mom/vote/service';
34
import SOCKET_MESSAGE from '@constants/socket-message';
45
import CrdtManager from '@utils/crdt-manager';
@@ -44,6 +45,14 @@ async function momSocketServer(io: Server) {
4445
socket.emit(SOCKET_MESSAGE.MOM.SELECT, mom);
4546
});
4647

48+
socket.on(SOCKET_MESSAGE.MOM.UPDATE_TITLE, async (title: string) => {
49+
const momId = socket.data.momId;
50+
51+
await putMomTitle(momId, title);
52+
53+
socket.to(momId).emit(SOCKET_MESSAGE.MOM.UPDATE_TITLE, title);
54+
});
55+
4756
/* crdt for Mom */
4857
socket.on(SOCKET_MESSAGE.MOM.INIT, async () => {
4958
const momId = socket.data.momId;

0 commit comments

Comments
 (0)