Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 3 additions & 28 deletions src/components/recording/TranscriptArea.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,19 @@
import { useEffect, useRef } from 'react';
import type { TranscriptEntry } from '@/types/recording';
import participant1Image from '@/assets/avatars/participant1.png';
import TranscriptItem from './TranscriptItem';

interface TranscriptAreaProps {
entries: TranscriptEntry[];
liveText?: string;
liveTimestamp?: string;
}

export default function TranscriptArea({ entries, liveText, liveTimestamp }: TranscriptAreaProps) {
export default function TranscriptArea({ entries }: TranscriptAreaProps) {
const bottomRef = useRef<HTMLDivElement>(null);

useEffect(() => {
bottomRef.current?.scrollIntoView({ behavior: 'smooth' });
}, [entries, liveText]);
}, [entries]);

if (entries.length === 0 && !liveText) {
if (entries.length === 0) {
return (
<div className="px-[71px] pt-[38px]">
<p className="text-[16px] leading-normal text-[#959595]">
Expand All @@ -33,28 +30,6 @@ export default function TranscriptArea({ entries, liveText, liveTimestamp }: Tra
{entries.map((entry, index) => (
<TranscriptItem key={index} entry={entry} />
))}
{liveText && (
<div className="flex flex-col gap-[8px]">
<p className="text-[16px] leading-normal font-bold text-[#c4c4c4]">
{liveTimestamp}
</p>
<div className="flex gap-[16px]">
<div className="flex shrink-0 flex-col items-center gap-[2px]">
<img
src={participant1Image}
alt="참석자 1"
className="size-[30px] rounded-full object-cover"
/>
<span className="text-[10px] font-medium text-[#4A90D9]">
참석자 1
</span>
</div>
<p className="text-[14px] leading-normal font-medium whitespace-pre-wrap text-[#4A90D9]">
{liveText}
</p>
</div>
</div>
)}
<div ref={bottomRef} />
</div>
);
Expand Down
11 changes: 1 addition & 10 deletions src/hooks/useSocket.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,16 @@ interface UseSocketReturn {
}

export function useSocket(
onSubtitleLive: (text: string) => void,
onSubtitleFinal: (text: string) => void,
): UseSocketReturn {
const socketRef = useRef<SocketIOClient.Socket | null>(null);
const [isConnected, setIsConnected] = useState(false);

const onSubtitleLiveRef = useRef(onSubtitleLive);
const onSubtitleFinalRef = useRef(onSubtitleFinal);

useEffect(() => {
onSubtitleLiveRef.current = onSubtitleLive;
onSubtitleFinalRef.current = onSubtitleFinal;
}, [onSubtitleLive, onSubtitleFinal]);
}, [onSubtitleFinal]);

const connect = useCallback(() => {
if (socketRef.current?.connected) return;
Expand All @@ -44,12 +41,6 @@ export function useSocket(
setIsConnected(false);
});

socket.on('stt:subtitle_live', (...args: unknown[]) => {
const text = args[0] as string;
console.log('[Socket] subtitle_live:', text);
onSubtitleLiveRef.current(text);
});

socket.on('stt:subtitle_final', (...args: unknown[]) => {
const text = args[0] as string;
console.log('[Socket] subtitle_final:', text);
Expand Down
19 changes: 1 addition & 18 deletions src/pages/RecordingPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,6 @@ function formatElapsed(ms: number): string {

export default function RecordingPage() {
const [entries, setEntries] = useState<TranscriptEntry[]>([]);
const [liveText, setLiveText] = useState('');
const [liveTimestamp, setLiveTimestamp] = useState('');
const [isRecording, setIsRecording] = useState(false);
const [isPaused, setIsPaused] = useState(false);

Expand All @@ -50,12 +48,6 @@ export default function RecordingPage() {
}, [isPaused]);

const { sendAudio, connect, disconnect } = useSocket(
// onSubtitleLive
(text) => {
setLiveText(text);
setLiveTimestamp((prev) => prev || formatElapsed(getElapsed()));
},
// onSubtitleFinal
(text) => {
const elapsed = getElapsed();
setEntries((prev) => [
Expand All @@ -67,8 +59,6 @@ export default function RecordingPage() {
text,
},
]);
setLiveText('');
setLiveTimestamp('');
},
);

Expand All @@ -86,7 +76,6 @@ export default function RecordingPage() {
setIsRecording(true);
setIsPaused(false);
setEntries([]);
setLiveText('');
}, [connect, sendAudio]);

const handleTogglePause = useCallback(() => {
Expand All @@ -109,7 +98,6 @@ export default function RecordingPage() {
disconnect();
setIsRecording(false);
setIsPaused(false);
setLiveText('');
}, [disconnect]);

const handleCancel = useCallback(() => {
Expand All @@ -119,7 +107,6 @@ export default function RecordingPage() {
setIsRecording(false);
setIsPaused(false);
setEntries([]);
setLiveText('');
}, [disconnect]);

return (
Expand All @@ -138,11 +125,7 @@ export default function RecordingPage() {
{/* 하단 분할 영역 */}
<div className="flex min-h-0 flex-1">
<div className="flex-1 overflow-y-auto">
<TranscriptArea
entries={entries}
liveText={liveText}
liveTimestamp={liveTimestamp}
/>
<TranscriptArea entries={entries} />
</div>
<RightPanel memos={[]} defaultTab="summary" />
</div>
Expand Down
Loading