Skip to content

Commit a42cf55

Browse files
committed
✨ feat: (FE) - 같은 시점의 첫 번째 box만 시간 표현
1 parent 993cf54 commit a42cf55

File tree

6 files changed

+42
-32
lines changed

6 files changed

+42
-32
lines changed

frontend/src/components/EditableFeedbackBox/EditableFeedbackBox.tsx

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useEffect, useRef } from 'react';
22
import { useRecoilValue, useSetRecoilState } from 'recoil';
33

44
import useCrudFeedback from '@hooks/useCrudFeedback';
5-
import { feedbackState, isFbClickedState, isFbSyncState } from '@store/feedback.store';
5+
import { isFbClickedState, isFbSyncState } from '@store/feedback.store';
66
import { currentVideoTimeState } from '@store/currentVideoTime.store';
77

88
import { ReactComponent as DeleteIcon } from '@assets/icon/delete.svg';
@@ -15,26 +15,27 @@ import {
1515
fbStartTimeStyle,
1616
} from './EditableFeedbackBox.style';
1717
import { iconSmStyle } from '@styles/commonStyle';
18+
import { FeedbackItemType } from '@customType/feedback';
1819

1920
interface PropsType {
20-
feedbackId: string;
21+
feedback: FeedbackItemType;
22+
//TODO ref type any
2123
feedbackRef: React.MutableRefObject<any[]>;
2224
index: number;
2325
}
24-
const EditableFeedbackBox = ({ feedbackId, feedbackRef, index }: PropsType) => {
26+
const EditableFeedbackBox = ({ feedback, feedbackRef, index }: PropsType) => {
2527
const textareaRef = useRef<HTMLTextAreaElement>(null);
26-
const feedback = useRecoilValue(feedbackState(feedbackId));
2728
const isFbSync = useRecoilValue(isFbSyncState);
2829
const setIsFbClicked = useSetRecoilState(isFbClickedState);
2930
const setCurrentVideoTime = useSetRecoilState(currentVideoTimeState);
3031
const { handleStartEditFeedback, handleEndEditFeedback, handleFbChange, handleDeleteFeedback } =
31-
useCrudFeedback(feedbackId);
32+
useCrudFeedback(feedback.id);
3233

3334
useEffect(() => {
3435
feedbackRef.current[index].style.height = textareaRef.current.scrollHeight + 'px';
3536
});
3637

37-
const { startTime, innerIndex, content, readOnly } = feedback;
38+
const { startTime, isFirst, content, readOnly } = feedback;
3839

3940
const handleClickFeedback = () => {
4041
if (!isFbSync) return;
@@ -44,8 +45,9 @@ const EditableFeedbackBox = ({ feedbackId, feedbackRef, index }: PropsType) => {
4445

4546
return (
4647
<div ref={(el) => (feedbackRef.current[index] = el)} css={feedbackBoxStyle}>
47-
{/* TODO: find first innerIndex */}
48-
<div css={fbStartTimeStyle}>{startTime}</div>
48+
<div css={fbStartTimeStyle} style={{ visibility: isFirst ? 'visible' : 'hidden' }}>
49+
{startTime}
50+
</div>
4951
<textarea
5052
ref={textareaRef}
5153
value={content}

frontend/src/components/FeedbackArea/FeedbackArea.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import React, { useEffect, useRef } from 'react';
22
import FeedbackForm from '@components/FeedbackForm/FeedbackForm';
33
import EditableFeedbackBox from '@components/EditableFeedbackBox/EditableFeedbackBox';
44
import { useRecoilValue } from 'recoil';
5-
import { feedbackIdsState, isFbSyncState } from '@store/feedback.store';
5+
import { feedbackListSelector, isFbSyncState } from '@store/feedback.store';
66
import { focusIndexSelector } from '@store/currentVideoTime.store';
77

88
import { feedbackAreaStyle, feedbackListStyle } from './FeedbackArea.style';
99

1010
const FeedbackArea = () => {
1111
const feedbackRef = useRef([]);
12-
const feedbackIds = useRecoilValue(feedbackIdsState);
12+
const feedbackList = useRecoilValue(feedbackListSelector);
1313
const focusIndex = useRecoilValue(focusIndexSelector);
1414
const isFbSync = useRecoilValue(isFbSyncState);
1515

@@ -24,10 +24,10 @@ const FeedbackArea = () => {
2424
return (
2525
<div css={feedbackAreaStyle}>
2626
<div css={feedbackListStyle}>
27-
{feedbackIds.map((feedbackId, idx) => (
27+
{feedbackList.map((feedback, idx) => (
2828
<EditableFeedbackBox
29-
key={feedbackId}
30-
feedbackId={feedbackId}
29+
key={feedback.id}
30+
feedback={feedback}
3131
feedbackRef={feedbackRef}
3232
index={idx}
3333
/>

frontend/src/components/FeedbackForm/FeedbackForm.tsx

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,7 @@ import { feedbackIdsState, feedbackIdxMapState, feedbackState } from '@store/fee
44
import React, { useState } from 'react';
55
import { useRecoilTransaction_UNSTABLE, useRecoilValue } from 'recoil';
66

7-
import {
8-
fbFormStyle,
9-
fbFormWrapperStyle,
10-
fbInputStyle,
11-
fbStartTimeStyle,
12-
} from './FeedbackForm.style';
7+
import { fbFormWrapperStyle, fbInputStyle, fbStartTimeStyle } from './FeedbackForm.style';
138

149
const FeedbackForm = () => {
1510
const [inputVal, setInputVal] = useState('');
@@ -27,14 +22,16 @@ const FeedbackForm = () => {
2722
const handleAddFeedback = () => {
2823
feedbackIdxMap.set(startTime, feedbackIdxMap.get(startTime) + 1 || 1);
2924
const nextInnerIdx = feedbackIdxMap.get(startTime);
25+
const newFeedbackId = generateFeedbackId(startTime, nextInnerIdx);
3026
const newFeedback = {
27+
id: newFeedbackId,
3128
startTime: startTime,
3229
innerIndex: nextInnerIdx,
3330
content: inputVal,
3431
readOnly: true,
3532
};
3633

37-
insertFeedback(newFeedback);
34+
insertFeedback(newFeedback, newFeedbackId);
3835
setInputVal('');
3936
};
4037

@@ -44,11 +41,7 @@ const FeedbackForm = () => {
4441

4542
const insertFeedback = useRecoilTransaction_UNSTABLE(
4643
({ set }) =>
47-
(newFeedback: EditableFeedbackType) => {
48-
const newFeedbackId = generateFeedbackId(
49-
newFeedback.startTime,
50-
newFeedback.innerIndex
51-
);
44+
(newFeedback: EditableFeedbackType, newFeedbackId: string) => {
5245
set(feedbackIdsState, (todoId) => todoId.concat(newFeedbackId).sort());
5346
set(feedbackState(newFeedbackId), newFeedback);
5447
},
Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export interface FeedbackType {
2+
id: string;
23
startTime: number;
34
innerIndex: number;
45
content: string;
@@ -8,8 +9,6 @@ export interface EditableFeedbackType extends FeedbackType {
89
readOnly: boolean;
910
}
1011

11-
export interface FeedbackDTO {
12-
docsUUID: string;
13-
feedbackList: FeedbackType[];
12+
export interface FeedbackItemType extends EditableFeedbackType {
13+
isFirst: boolean;
1414
}
15-

frontend/src/pages/Feedback/Feedback.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import BottomBar from '@components/BottomBar/BottomBar';
88
import RoundButton from '@components/@shared/RoundButton/RoundButton';
99
import usePreventLeave from '@hooks/usePreventLeave';
1010
import useSafeNavigate from '@hooks/useSafeNavigate';
11-
import { feedbackSelector, isFbSyncState } from '@store/feedback.store';
11+
import { feedbackDtoSelector, isFbSyncState } from '@store/feedback.store';
1212
import { completedFbCntState, docsUUIDState, meInRoomState } from '@store/room.store';
1313

1414
import { ReactComponent as LinkIcon } from '@assets/icon/link.svg';
@@ -29,7 +29,7 @@ const Feedback = () => {
2929
const [isFbSync, setIsFbSync] = useRecoilState(isFbSyncState);
3030
const [videoUrl, setVideoUrl] = useState('');
3131
const docsUUID = useRecoilValue(docsUUIDState);
32-
const feedbackList = useRecoilValue(feedbackSelector);
32+
const feedbackList = useRecoilValue(feedbackDtoSelector);
3333
const me = useRecoilValue(meInRoomState);
3434

3535
const handleEndFeedback = useCallback(() => {

frontend/src/store/feedback.store.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,23 @@ export const isFbSyncState = atom({
2626
default: true,
2727
});
2828

29-
export const feedbackSelector = selector({
29+
export const feedbackListSelector = selector({
30+
key: 'feedbackListSelector',
31+
get: ({ get }) => {
32+
let prev = -1;
33+
const fbList = get(feedbackIdsState).map((id) => {
34+
const fb = { ...get(feedbackState(id)), isFirst: false };
35+
if (fb.startTime > prev) {
36+
prev = fb.startTime;
37+
fb.isFirst = true;
38+
}
39+
return fb;
40+
});
41+
return fbList;
42+
},
43+
});
44+
45+
export const feedbackDtoSelector = selector({
3046
key: 'feedbackSelector',
3147
get: ({ get }) => {
3248
return get(feedbackIdsState).map((id) => {

0 commit comments

Comments
 (0)