Skip to content

Commit f50ba19

Browse files
author
Ubuntu
committed
Fix: Resolve yarn.lock merge conflict after reinstall
2 parents ab4d555 + a7457f1 commit f50ba19

File tree

14 files changed

+1370
-670
lines changed

14 files changed

+1370
-670
lines changed

package-lock.json

Lines changed: 29 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@
2222
"regenerator-runtime": "^0.14.1",
2323
"sass": "^1.85.1",
2424
"sockjs-client": "^1.6.1",
25-
"stompjs": "^2.3.3"
25+
"stompjs": "^2.3.3",
26+
"swiper": "^11.2.10"
2627
},
2728
"devDependencies": {
2829
"@eslint/js": "^9.17.0",
29-
"@types/node": "^22.13.10",
30+
"@types/node": "^22.17.0",
3031
"@types/react": "^18.3.18",
3132
"@types/react-dom": "^18.3.5",
3233
"@types/react-speech-recognition": "^3.9.6",

src/assets/imgs/icon/toltip.svg

Lines changed: 3 additions & 0 deletions
Loading
98.3 KB
Loading
236 KB
Loading
113 KB
Loading
85.9 KB
Loading

src/sass/helpers/_variables.sass

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ $gray-900: #161618
1717

1818
$purple-50: #EEE8FD
1919
$purple-100: #D3C6FA
20+
$purple-300: #9776F6
2021
$purple-400: #7C55F4
2122
$purple-500: #5E35F0
2223
$purple-600: #4F31E9

src/views/meeting/components/MindMapComponent.tsx

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import useRecordingTimer from "@/views/meeting/components/RecodingTimer";
2727
import { useEffect, useState, useRef } from "react";
2828
import { Client } from "@stomp/stompjs";
2929
import html2canvas from "html2canvas";
30-
30+
import toltip from "@/assets/imgs/icon/toltip.svg";
3131
// type
3232
import { conferenceData } from "@/types/conferanceData";
3333
import { RealTimeSummaryData } from "@/types/realTimeSummaryData";
@@ -154,17 +154,17 @@ const MindMapComponent = ({
154154
clientRef.current = client;
155155
};
156156

157-
const handleDownload = (title: string, ref: React.RefObject<HTMLDivElement>) => () => {
158-
if (!ref.current) return;
157+
// const handleDownload = (title: string, ref: React.RefObject<HTMLDivElement>) => () => {
158+
// if (!ref.current) return;
159159

160-
html2canvas(ref.current).then((canvas) => {
161-
const link = document.createElement('a');
162-
link.href = canvas.toDataURL('image/png');
163-
link.download = title === '' ? '제목없음' : title;
164-
document.body.appendChild(link);
165-
link.click();
166-
});
167-
};
160+
// html2canvas(ref.current).then((canvas) => {
161+
// const link = document.createElement('a');
162+
// link.href = canvas.toDataURL('image/png');
163+
// link.download = title === '' ? '제목없음' : title;
164+
// document.body.appendChild(link);
165+
// link.click();
166+
// });
167+
// };
168168

169169
useEffect(() => {
170170
if (finalTranscript !== "") {
@@ -191,7 +191,7 @@ const MindMapComponent = ({
191191
destination: `/app/conference/${conferenceData.projectId}/script`,
192192
body: JSON.stringify(data),
193193
});
194-
194+
195195
console.log(JSON.stringify(data))
196196

197197
setScriptList([]);
@@ -441,7 +441,15 @@ const ClickKeyword = (keyword: string) => {
441441
{mode === "live" ? (
442442
<>
443443
<div className="main-keyword-wrap">
444-
<h3>주요 키워드</h3>
444+
<h3>
445+
주요 키워드
446+
<div className="toltip-wrap">
447+
<img src={toltip} alt="" />
448+
<div className="toltip">
449+
녹음 중 자동으로 추출된 핵심 키워드예요. 대화에서 자주 언급되는 단어나 중요한 개념을 실시간으로 분석해 제공해요.
450+
</div>
451+
</div>
452+
</h3>
445453
{mainKeyword.length ? (
446454
<div className="keyword-wrap">
447455
{mainKeyword.map((x: any) => (
@@ -459,7 +467,15 @@ const ClickKeyword = (keyword: string) => {
459467
)}
460468
</div>
461469
<div className="recommend-keyword-wrap">
462-
<h3>추천 키워드</h3>
470+
<h3>
471+
추천 키워드
472+
<div className="toltip-wrap">
473+
<img src={toltip} alt="" />
474+
<div className="toltip">
475+
마인드맵에 추가하면 좋을 키워드를 추천해요. 대화의 흐름과 맥락을 분석해 관련성이 높은 키워드를 제안해요.
476+
</div>
477+
</div>
478+
</h3>
463479
{recommendKeyword.length ? (
464480
<div className="keyword-wrap">
465481
{recommendKeyword.map((x: any) => (
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import { useRef, useState } from "react";
2+
import img1 from "@/assets/imgs/meeting/tutorial/img-1.png";
3+
import img2 from "@/assets/imgs/meeting/tutorial/img-2.png";
4+
import img3 from "@/assets/imgs/meeting/tutorial/img-3.png";
5+
import img4 from "@/assets/imgs/meeting/tutorial/img-4.png";
6+
import "@/views/meeting/style/tutorial-modal.sass";
7+
import Modal from "@/views/components/modal";
8+
import { Swiper, SwiperSlide } from 'swiper/react';
9+
import { Swiper as SwiperClass } from "swiper";
10+
import { Pagination, EffectFade } from 'swiper/modules';
11+
12+
import 'swiper/css';
13+
import 'swiper/css/effect-fade';
14+
import 'swiper/css/pagination';
15+
16+
const slides = [
17+
{
18+
img: img1,
19+
title: "함께할 팀원을 초대하고 프로젝트를 시작하세요",
20+
desc: [
21+
"‘공유하기’ 버튼을 눌러 이메일 또는 링크로 팀원을 간편하게 초대해요.",
22+
"초대한 팀원은 공유 목록에서 바로 확인할 수 있어요.",
23+
"프로젝트명을 클릭해 자유롭게 수정할 수 있어요.",
24+
],
25+
},
26+
{
27+
img: img2,
28+
title: "녹음을 시작하면 자동으로 펼쳐지는 아이디어",
29+
desc: [
30+
"음성 녹음을 시작하면, 대화 중 자주 언급되거나 중요한 단어는",
31+
"키워드로 실시간 추출되며 아이디어 마인드맵이 실시간으로 정리돼요.",
32+
"또한 AI가 대화 흐름을 분석해 요약본도 함께 제공해요.",
33+
],
34+
},
35+
{
36+
img: img3,
37+
title: "마인드맵을 직접 수정하며 생각을 확장해보세요!",
38+
desc: [
39+
"라이브모드를 해제하면 마인드맵을 직접 수정할 수 있어요.",
40+
"직접 키워드를 선택해 마인드맵에 추가하거나, 추천 키워드를 참고해",
41+
"아이디어를 확장해보세요. 키워드를 추가할수록 마인드맵이 더 풍부해져요.",
42+
],
43+
},
44+
{
45+
img: img4,
46+
title: "아이디어를 정리하고, 언제든 다시 꺼내봐요",
47+
desc: [
48+
"‘회의 종료’ 버튼을 누르면 지금까지의 아이디어들이 정리돼 저장돼요.",
49+
"언제든 메인 페이지에서 프로젝트 파일을 한눈에 확인하세요.",
50+
"마인드맵, 키워드, 요약본을 각 파일로 다운로드할 수도 있어요!",
51+
],
52+
},
53+
];
54+
55+
interface TutorialModalProps {
56+
onCloseModal: () => void;
57+
}
58+
59+
const TutorialModal = ({
60+
onCloseModal,
61+
}: TutorialModalProps) => {
62+
const swiperRef = useRef<SwiperClass | null>(null);
63+
const [activeIndex, setActiveIndex] = useState(0);
64+
const isLastSlide = activeIndex === slides.length - 1;
65+
66+
return (
67+
<Modal onCloseModal={onCloseModal}>
68+
<div className="modal-wrap">
69+
<Swiper
70+
onSwiper={(swiper) => (swiperRef.current = swiper)}
71+
onSlideChange={(swiper) => setActiveIndex(swiper.activeIndex)}
72+
effect="fade"
73+
speed={500}
74+
fadeEffect={{ crossFade: true }}
75+
pagination={{ clickable: true }}
76+
allowTouchMove={false}
77+
modules={[EffectFade, Pagination]}
78+
className="mySwiper"
79+
>
80+
{slides.map((slide, index) => (
81+
<SwiperSlide key={index}>
82+
<div className="img-wrap">
83+
<img src={slide.img} alt={`slide-${index}`} />
84+
</div>
85+
<div className="desc-wrap">
86+
<b>{slide.title}</b>
87+
<p>
88+
{slide.desc.map((line, i) => (
89+
<span key={i}>
90+
{line}
91+
<br />
92+
</span>
93+
))}
94+
</p>
95+
</div>
96+
</SwiperSlide>
97+
))}
98+
</Swiper>
99+
<div className="btn-wrap">
100+
<button onClick={onCloseModal}>건너뛰기</button>
101+
<button className="btn-next" onClick={() => {
102+
if (isLastSlide) {
103+
onCloseModal();
104+
} else {
105+
swiperRef.current?.slideNext();
106+
}
107+
}}>{isLastSlide ? "시작하기" : "다음"}</button>
108+
</div>
109+
</div>
110+
</Modal>
111+
);
112+
};
113+
114+
export default TutorialModal;

0 commit comments

Comments
 (0)