Skip to content
Open
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
7 changes: 4 additions & 3 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@ <h1>LINKHU<span>-NEWS</span></h1>
</div>
<div id="modal" class="modal">
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

모달 html요소를 직접적으로 html 내에 작성하기 보다는 별도로 js파일을 만들어 작성하는걸 추천드립니다.
html내에는 <div id="root-modal"> 과 같이 진입점만 존재해도 될 것 같아요

<div class="modal-content">
<span class="close-modal">&times;</span>
<div class="close-modal">&times;</div>
<div id="modal-header" class="modal-header"></div>
<h2>의견 남기기</h2>
<div class="model-section">
<div class="modal-section">
<form id="opinion-form">
<div>
<label for="opinion-title">제목</label>
Expand All @@ -29,7 +30,7 @@ <h2>의견 남기기</h2>
<div>
<label for="opinion-content">내용</label>
<div>
<textarea id="opinion-content" name="opinion-content" rows="4%" cols="45%" required></textarea>
<textarea id="opinion-content" name="opinion-content" rows="20%" cols="45%" required></textarea>
</div>
</div>
<button type="button" id="save-opinion">저장</button>
Expand Down
115 changes: 115 additions & 0 deletions src/assets/modal.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
export function openModal(article) {
const modal = document.getElementById("modal");
const closeModal = document.querySelector(".close-modal");

modal.classList.add("open");

closeModal.addEventListener("click", () => {
modal.classList.remove("open");
});

window.addEventListener("click", (event) => {
if (event.target === modal) {
modal.classList.remove("open");
}
});

const storedOpinion = localStorage.getItem(article);
DisplayOpinion(article, storedOpinion);
}

function DisplayOpinion(article, storedOpinion) {
const opinionForm = document.getElementById("opinion-form");
const opinionTitle = document.getElementById("opinion-title");
const opinionContent = document.getElementById("opinion-content");

if (storedOpinion) {
const parseOpinion = JSON.parse(storedOpinion);

const SavedOpinion = document.getElementById("modal-header");
SavedOpinion.innerHTML = `
<h3>${parseOpinion.title}</h3>
<p>${parseOpinion.content}</p>
`;

opinionTitle.value = parseOpinion.title;
opinionContent.value = parseOpinion.content;

const saveButton = document.getElementById("save-opinion");
let editButton = document.getElementById("edit-opinion");
let deleteButton = document.getElementById("delete-opinion");

if(saveButton) {
saveButton.remove();
}

if (!editButton) {
editButton = document.createElement("button");
editButton.textContent = "edit";
editButton.id = "edit-opinion";

editButton.addEventListener("click", () => {
event.preventDefault();

const editedTitle = opinionTitle.value;
const editedContent = opinionContent.value;

if (editedTitle !== "" && editedContent !== "") {
localStorage.removeItem(article);

const opinion = { title:editedTitle, content:editedContent };
localStorage.setItem(article, JSON.stringify(opinion));
modal.classList.remove("open");
} else {
alert("제목과 내용을 모두 입력하세요.");
}
});

opinionForm.appendChild(editButton);
}

if (!deleteButton) {
deleteButton = document.createElement("button");
deleteButton.textContent = "delete";
deleteButton.id = "delete-opinion";

deleteButton.addEventListener("click", () => {
localStorage.removeItem(article);
modal.classList.remove("open");
});

opinionForm.appendChild(deleteButton);
}
} else {
opinionTitle.value = "";
opinionContent.value = "";

const saveButton = document.getElementById("save-opinion");
const editButton = document.getElementById("edit-opinion");
const deleteButton = document.getElementById("delete-opinion");

saveButton.textContent = "save";
saveButton.addEventListener("click", () => {
const savedTitle = opinionTitle.value;
const savedContent = opinionContent.value;

if (savedTitle !== "" && savedContent !== "") {
localStorage.removeItem(article);

const opinion = { title: savedTitle, content: savedContent };
localStorage.setItem(article, JSON.stringify(opinion));
modal.classList.remove("open");
} else {
alert("제목과 내용을 모두 입력하세요.");
}
});

if (editButton) {
editButton.remove();
}

if (deleteButton) {
deleteButton.remove();
}
}
}
64 changes: 2 additions & 62 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import "./styles";
import TAB_NAME from "./assets/TAB_NAME";
import { fetchNews } from "./api/api";
import Tab from "./assets/tab";
import { openModal } from "./assets/modal";
require("dotenv").config();

class App {
Expand Down Expand Up @@ -47,7 +48,7 @@ class App {
`;

const opinionButton = articleElement.querySelector(".button-arrow");
opinionButton.addEventListener("click", () => this.openModal(article.title));
opinionButton.addEventListener("click", () => openModal(article.url));

newsSection.appendChild(articleElement);
});
Expand All @@ -63,67 +64,6 @@ class App {
selectedTab.classList.add('selected');
}
}

openModal(articleTitle) {
const modal = document.getElementById("modal");
const closeModal = document.querySelector(".close-modal");
const opinionForm = document.getElementById("opinion-form");
const opinionTitleInput = document.getElementById("opinion-title");
const opinionContentTextArea = document.getElementById("opinion-content");

modal.style.display = "block";

const storedOpinion = localStorage.getItem(articleTitle);
if (storedOpinion) {
const parseOpinion = JSON.parse(storedOpinion);

opinionTitleInput.value = parseOpinion.title || "";
opinionContentTextArea.value = parseOpinion.content || "";
} else {
opinionTitleInput.value = "";
opinionContentTextArea.value = "";
}
closeModal.addEventListener("click", () => {
modal.style.display = "none";
});

const saveOpinionButton = document.getElementById("save-opinion");
saveOpinionButton.addEventListener("click", () => {
const opinion = { title: opinionTitleInput.value, content: opinionContentTextArea.value };

localStorage.setItem(articleTitle, JSON.stringify(opinion));
modal.style.display = "none";

});

window.addEventListener("click", (event) => {
if (event.target === modal) {
modal.style.display = "none";
}
});

const editOpinionButton = document.getElementById("edit-opinion");
if (editOpinionButton) {
editOpinionButton.remove();
}

const editButton = document.createElement("button");
editButton.textContent = "수정하기";
editButton.id = "edit-opinion";

editButton.addEventListener("click", () => {
editButton.remove();

opinionTitleInput.disabled = false;
opinionContentTextArea.disabled = false;

saveOpinionButton.textContent = "수정 완료";
});

saveOpinionButton.textContent = "저장";

opinionForm.appendChild(editButton);
}
}

const app = new App();
27 changes: 23 additions & 4 deletions src/styles/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,10 @@ section {
background-color: rgba(0,0,0,0.4);
}

.modal.open {
display: block;
}

.modal-content h2 {
margin-bottom: 20px;
}
Expand Down Expand Up @@ -153,11 +157,11 @@ section {
background-color: #005fcc;
color:#ffffff;
border: none;
border-radius: 15px;
border-radius: 12px;
padding: 10px;
min-height:10px;
min-width: 60px;
width: 40%;
width: 100%;
}

#save-opinion:hover {
Expand All @@ -168,17 +172,32 @@ section {
background-color: #005fcc;
color:#ffffff;
border: none;
border-radius: 15px;
border-radius: 12px;
padding: 10px;
min-height:10px;
min-width: 60px;
width: 40%;
width: 50%;
}

#edit-opinion:hover {
background-color:#002ead;
}

#delete-opinion {
background-color: #b30000;
color:#ffffff;
border: none;
border-radius: 12px;
padding: 10px;
min-height:10px;
min-width: 60px;
width: 50%;
}

#delete-opinion:hover {
background-color:#8a0000;
}

#opinion-title {
margin-bottom: 30px;
}
Expand Down