๐ฅ ๋ฌธ์ ์ํฉ: Webamp๊ฐ ์ฌ๋ฌ ๊ฐ ์คํ๋๊ณ ๋น ๋ชจ๋ฌ์ด ๋จ๋ ๋ฌธ์
React์์ Webamp๋ฅผ ์คํํ ๋, ์ฌ๋ฌ ๊ฐ๊ฐ ์ค๋ณต ์คํ๋๊ฑฐ๋ ๋น ๋ชจ๋ฌ์ด ๋จ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ Webamp๋ฅผ ํ ๋ฒ๋ง ์คํํ๊ณ , Taskbar์์ ์ง์ Webamp๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
์ ์ญ ๋ณ์๋ ๋ฌด์์ธ๊ฐ?
์ ์ญ ๋ณ์(Global Variable)๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ์ ๊ทผํ ์ ์๋ ๋ณ์์ ๋๋ค. React์์๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ๋ด๋ถ ๋ณ์๋ค์ด ์ด๊ธฐํ๋์ง๋ง, ์ ์ญ ๋ณ์๋ ๊ฐ์ด ์ ์ง๋ฉ๋๋ค.
๐ ์ง์ญ ๋ณ์ vs. ์ ์ญ ๋ณ์
๋ณ์ ์์น | ํน์ง | Webamp ์ ์ฉ |
์ง์ญ ๋ณ์ (์ปดํฌ๋ํธ ๋ด๋ถ ๋ณ์) | ํจ์ ์คํ๋ ๋๋ง๋ค ์๋ก ์์ฑ๋จ | startWebamp() ํธ์ถ ์ Webamp๊ฐ ๊ณ์ ์๋ก ์์ฑ๋จ |
์ ์ญ ๋ณ์ (let webampInstance) | ํ ๋ฒ ์์ฑ๋๋ฉด ๊ณ์ ์ ์ง๋จ | ์ด๋ฏธ ์คํ๋ Webamp๊ฐ ์์ผ๋ฉด ์๋ก ์์ฑํ์ง ์์ |
ํด๊ฒฐ ๋ฐฉ๋ฒ: Webamp๋ฅผ ์ ์ญ ๋ณ์๋ก ๊ด๋ฆฌํ๊ธฐ
startWebamp.js์์ Webamp๋ฅผ ์ ์ญ ๋ณ์๋ก ์ ์ฅ
import Webamp from "webamp";
let webampInstance = null; // โ
Webamp ์ธ์คํด์ค๋ฅผ ์ ์ญ ๋ณ์๋ก ์ ์ฅ
const startWebamp = () => {
if (!Webamp.browserIsSupported()) return;
// โ
์ด๋ฏธ ์คํ ์ค์ธ Webamp๊ฐ ์๋ค๋ฉด ์ข
๋ฃ ํ ์๋ก ์์ฑ
if (webampInstance) {
try {
const audio = webampInstance.getMediaElement();
if (audio) {
audio.pause(); // โ
๋จผ์ ์ค๋์ค ์ ์ง
audio.src = ""; // โ
๊ธฐ์กด ์ค๋์ค ์คํธ๋ฆผ์ ์์ ํ ์ด๊ธฐํ
}
webampInstance.dispose(); // โ
์คํธ๋ฆผ์ ์์ ํ ๋ซ์ ํ Webamp ์ข
๋ฃ
webampInstance = null;
} catch (error) {
console.warn("Webamp dispose error:", error);
}
}
// โ
์๋ก์ด Webamp ์ธ์คํด์ค ์์ฑ
webampInstance = new Webamp({
initialTracks: [
{
metadata: { artist: "AJR", title: "Bang!" },
url: "/AJR-bang!.mp3", // โ
ํ์ผ ๊ฒฝ๋ก ํ์ธ ํ์
},
],
});
webampInstance.onClose(() => {
try {
const audio = webampInstance.getMediaElement();
if (audio) {
audio.pause();
audio.src = ""; // โ
์ค๋์ค ์คํธ๋ฆผ์ ์ด๊ธฐํ
}
webampInstance.dispose();
webampInstance = null;
} catch (error) {
console.warn("Webamp dispose error:", error);
}
});
webampInstance.renderWhenReady(document.getElementById("winamp-container"));
};
export { startWebamp };
- Webamp๊ฐ ํ๋๋ง ์คํ๋๋๋ก ์์
- Webamp๋ฅผ ๋ซ์ผ๋ฉด ์ ์ญ ๋ณ์๋ฅผ null๋ก ์ด๊ธฐํํ์ฌ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋๋ก ํจ
- ๊ธฐ์กด Webamp๊ฐ ์๋ค๋ฉด dispose() ํ ์ ๊ฑฐํ๊ณ ์๋ก ์์ฑ
ModalContext.js์์ media ๋ชจ๋ฌ ์ญ์
Taskbar์์ ์ง์ Webamp๋ฅผ ์คํํ๋ ค๋ฉด, ModalContext์์ media ๊ด๋ จ ์ํ๋ฅผ ์ ๊ฑฐํด์ผ ํฉ๋๋ค.
const ModalProvider = ({ children }) => {
const [modals, setModals] = useState({
contact: false, // โ
media ๊ด๋ จ ์ํ ์ ๊ฑฐ
});
return (
<ModalContext.Provider value={{ modals, openModal, closeModal }}>
{children}
</ModalContext.Provider>
);
};
- ์ด์ ๋น ๋ชจ๋ฌ์ด ๋จ์ง ์์
- ๋ชจ๋ฌ ์์ด Webamp๊ฐ ์คํ๋ ์ ์๋๋ก ๋ณ๊ฒฝ
Taskbar.js์์ Webamp ์ง์ ์คํํ๊ธฐ
import React, { useState } from "react";
import { TaskBar as React95Taskbar, List } from "@react95/core";
import { Cdplayer107 } from "@react95/icons";
import Player from "../components/Player"; // โ
Player ์ง์ ๋ถ๋ฌ์ค๊ธฐ
const CustomTaskbar = () => {
const [showPlayer, setShowPlayer] = useState(false); // โ
Player ์ํ ๊ด๋ฆฌ
return (
<>
<React95Taskbar
list={
<List>
<List.Item icon={<Cdplayer107 variant="32x32_4" />} onClick={() => setShowPlayer(true)}>
Media
</List.Item>
</List>
}
/>
{/* โ
Taskbar์์ ์ง์ Player ์คํ */}
{showPlayer && <Player closeModal={() => setShowPlayer(false)} />}
</>
);
};
export default CustomTaskbar;
- Taskbar์์ openModal("media") ๋์ setShowPlayer(true)๋ก ์ง์ ์คํ
- Webamp๋ฅผ ModalContext๊ฐ ์๋ Taskbar์์ ์ง์ ๊ด๋ฆฌ
Player.js์์ Modal์ ์ ๊ฑฐํ๊ณ Webamp๋ง ์คํ
import React, { useEffect } from "react";
import { startWebamp } from "../utils/startWebamp";
const Player = ({ closeModal }) => {
useEffect(() => {
startWebamp(); // โ
Webamp ์คํ
}, []);
return (
<div id="winamp-container" style={{ width: "100%", height: "100%" }}></div>
);
};
export default Player;
- Modal์ ๊ฐ์ธ์ง ์๊ณ Webamp๋ง ์คํ
- ๋น ๋ชจ๋ฌ ์์ด Webamp๊ฐ ์คํ๋๋๋ก ๋ณ๊ฒฝ
๐ฏ ์ต์ข ์ ๋ฆฌ
๋ฌธ์ | ํด๊ฒฐ ๋ฐฉ๋ฒ |
โ Webamp๊ฐ ์ฌ๋ฌ ๊ฐ ์คํ๋จ | Webamp๋ฅผ ์ ์ญ ๋ณ์(let webampInstance)๋ก ๊ด๋ฆฌํ์ฌ ํ ๊ฐ๋ง ์คํ |
โ Taskbar์์ Media ํด๋ฆญ ์ ๋น ๋ชจ๋ฌ์ด ๋ธ | ModalContext.js์์ media ๊ด๋ จ ์ํ๋ฅผ ์ญ์ |
โ Taskbar์์ Webamp๋ฅผ ์คํํ๊ณ ์ถ์ | openModal("media")๋ฅผ ์ ๊ฑฐํ๊ณ setShowPlayer(true)๋ก ์ง์ ์คํ |
โ Player.js์์ ๋ชจ๋ฌ ์์ด Webamp๋ง ์คํํ๊ณ ์ถ์ | Modal์ ๊ฐ์ธ์ง ์๊ณ Webamp๋ง ์คํ๋๋๋ก ์์ |
์ด์ Taskbar์์ Webamp๊ฐ ์ค๋ณต ์์ด ํ ๋ฒ๋ง ์คํ๋๊ณ , ๋น ๋ชจ๋ฌ ์์ด ์ ์ ์๋๋ฉ๋๋ค!
'Genie' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์๊ณผ ๊ฐ๋ฐ (0) | 2025.03.04 |
---|---|
๋ธ๋ก๊ทธ๋ฅผ ์ด๋ฉฐ (0) | 2024.11.22 |