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
4 changes: 4 additions & 0 deletions src/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import Partnership from "./pages/partnership/Parnership";
import PartnershipWrite from "./pages/partnership/PartnershipWrite";
import Data from "./pages/data/Data";
import DataWrite from "./pages/data/DataWrite";
import LinkHub from "./pages/linkhub/linkHub";
import LinkHubWrite from "./pages/linkhub/LinkHubWrite";

function App() {
return (
Expand Down Expand Up @@ -48,6 +50,8 @@ const Content = () => {
<Route path="/partnership/write" element={<PartnershipWrite/>} />
<Route path="/data" element={<Data />} />
<Route path="/data/write" element={<DataWrite />} />
<Route path="/linkHub" element={<LinkHub />} />
<Route path="/linkhub/write" element={<LinkHubWrite />} />
</Routes>
</>
);
Expand Down
2 changes: 1 addition & 1 deletion src/components/menu/menu.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const Menu = () => {
<li><a href="/qna">Q&A</a></li>
<li><a href="/agora">100인 안건 상정제</a></li>
<li><a href="/data">세칙 및 회칙</a></li>
<li><a href="/partnership">제휴백과</a></li>
<li><a href="/linkhub">Linkhub</a></li>
</ul>
</div>
);
Expand Down
107 changes: 107 additions & 0 deletions src/pages/linkhub/LinkHubWrite.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import React, { useState } from "react";
import { useNavigate } from "react-router-dom";
import axios from "axios";

import "./linkHub.css";

const apiClient = axios.create({
baseURL: process.env.REACT_APP_API_URL || 'https://api.ajouchong.com'
});

const LinkHubWrite = () => {
const [title, setTitle] = useState('');
const [link, setLink] = useState('');
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);

const navigate = useNavigate();

const handleSubmit = async (e) => {
e.preventDefault();

if (!title.trim() || !link.trim()) {
alert("제목과 링크를 입력해주세요.");
return;
}

try {
new URL(link);
} catch {
alert("올바른 URL 형식을 입력해주세요.");
return;
}

setLoading(true);
setError(null);

try {
const requestData = {
title: title,
link: link
};

const response = await apiClient.post(`/api/admin/link/upload`, requestData, {
withCredentials: true,
});

if (response.data.code === 1) {
alert("링크가 성공적으로 등록되었습니다!");
navigate("/linkHub");
} else {
alert("링크 등록에 실패했습니다.");
}
} catch (error) {
setError("링크 등록 중 오류가 발생했습니다.");
console.error("링크 등록 실패:", error);
alert("링크 등록 중 오류가 발생했습니다.");
} finally {
setLoading(false);
}
};

return (
<div className="link-write-container">
<h2>링크 등록</h2>
{error && <p className="error-message">{error}</p>}
<form onSubmit={handleSubmit} className="link-form">
<div className="form-group">
<label>링크 제목</label>
<input
type="text"
value={title}
onChange={(e) => setTitle(e.target.value)}
placeholder="링크 제목을 입력하세요"
required
/>
</div>

<div className="form-group">
<label>링크 URL</label>
<input
type="url"
value={link}
onChange={(e) => setLink(e.target.value)}
placeholder="https://example.com"
required
/>
</div>

<div className="form-actions">
<button
type="button"
className="cancel-btn"
onClick={() => navigate("/linkHub")}
disabled={loading}
>
취소
</button>
<button type="submit" className="submit-btn" disabled={loading}>
{loading ? "등록 중..." : "링크 등록"}
</button>
</div>
</form>
</div>
);
};

export default LinkHubWrite;
Loading