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: 2 additions & 2 deletions .env
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
VITE_API_URL=http://localhost:8080
VITE_GOOGLE_REDIRECT_URI=http://localhost:8080/api/v1/auth/google
VITE_API_URL=https://api.eventee.cloud
VITE_GOOGLE_REDIRECT_URI=https://api.eventee.cloud/api/v1/auth/google
VITE_GOOGLE_CLIENT_ID=1311838165-j2g0s0tnb4hr1ptsksurpultd8uk14ov.apps.googleusercontent.com
4 changes: 2 additions & 2 deletions .env.development
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
VITE_API_URL=https://api.eventee.cloud
VITE_GOOGLE_REDIRECT_URI=https://api.eventee.cloud/api/v1/auth/google
VITE_API_URL=http://localhost:8080
VITE_GOOGLE_REDIRECT_URI=http://localhost:8080/api/v1/auth/google
VITE_GOOGLE_CLIENT_ID=1311838165-j2g0s0tnb4hr1ptsksurpultd8uk14ov.apps.googleusercontent.com
31 changes: 21 additions & 10 deletions src/pages/AdminDashboard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -480,9 +480,6 @@ function GroupManagement({
);
}

/* ----------------------------------------------------
Notice Write Tab (관리자 공지 작성)
---------------------------------------------------- */
function NoticeWriteTab({ groups, event }) {
const [postType, setPostType] = useState<"TEXT" | "VOTE">("TEXT");
const [content, setContent] = useState("");
Expand All @@ -492,14 +489,20 @@ function NoticeWriteTab({ groups, event }) {
const [selectedGroups, setSelectedGroups] = useState<number[]>([]);
const API_URL = import.meta.env.VITE_API_URL;

const toggleGroup = (groupNo: number) => {
/* -----------------------------------
그룹 선택 토글 (groupId 기반)
----------------------------------- */
const toggleGroup = (groupId: number) => {
setSelectedGroups((prev) =>
prev.includes(groupNo)
? prev.filter((id) => id !== groupNo)
: [...prev, groupNo]
prev.includes(groupId)
? prev.filter((id) => id !== groupId)
: [...prev, groupId]
);
};

/* -----------------------------------
공지 등록
----------------------------------- */
const handleSubmit = async () => {
if (!content.trim()) return alert("내용을 입력하세요.");
if (selectedGroups.length === 0) return alert("공지 배포 그룹을 선택하세요.");
Expand All @@ -512,6 +515,8 @@ function NoticeWriteTab({ groups, event }) {
postType === "VOTE"
? [voteOption1, voteOption2].filter(Boolean).join("_")
: null,

// ⭐ groupId 기준으로 전달
groupNums: selectedGroups.join("_"),
};

Expand All @@ -525,6 +530,8 @@ function NoticeWriteTab({ groups, event }) {
if (!data.isSuccess) return alert("공지 등록 실패");

alert("공지 등록 완료!");

// reset
setContent("");
setVoteTitle("");
setVoteOption1("");
Expand All @@ -537,6 +544,9 @@ function NoticeWriteTab({ groups, event }) {
}
};

/* -----------------------------------
JSX
----------------------------------- */
return (
<Card className="p-6 bg-white rounded-xl border border-[#E8E4D9] shadow-sm">
<CardTitle className="text-[#67594C] text-xl mb-4">공지 작성</CardTitle>
Expand Down Expand Up @@ -615,9 +625,9 @@ function NoticeWriteTab({ groups, event }) {
{groups.map((g) => (
<button
key={g.groupId}
onClick={() => toggleGroup(g.groupNo)}
onClick={() => toggleGroup(g.groupId)} // ⭐ groupId 사용
className={`border rounded-lg p-3 text-left ${
selectedGroups.includes(g.groupNo)
selectedGroups.includes(g.groupId) // ⭐ groupId 기반 선택
? "bg-[#67594C] text-white border-[#67594C]"
: "bg-white border-gray-300 text-gray-800"
}`}
Expand All @@ -629,7 +639,7 @@ function NoticeWriteTab({ groups, event }) {
</div>
</div>

{/* 등록 */}
{/* 등록 버튼 */}
<div className="flex justify-end">
<Button
onClick={handleSubmit}
Expand All @@ -642,6 +652,7 @@ function NoticeWriteTab({ groups, event }) {
);
}


/* ----------------------------------------------------
Edit Event Modal
---------------------------------------------------- */
Expand Down
95 changes: 52 additions & 43 deletions src/pages/EventMainPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,11 @@ const uploadToS3 = async (presignedUrl: string, file: File) => {
nickname,
});

if (nickname) {
localStorage.setItem("eventNickname", nickname);
}


const convertedTeams: Team[] = (groups ?? []).map((g: any) => ({
id: String(g.groupId),
name: g.groupName,
Expand All @@ -267,6 +272,8 @@ const uploadToS3 = async (presignedUrl: string, file: File) => {
img: g.groupImg,
}));

convertedTeams.sort((a, b) => Number(a.groupNo) - Number(b.groupNo));

setTeams(convertedTeams);

const teamsWithPosts = await Promise.all(
Expand All @@ -276,6 +283,8 @@ const uploadToS3 = async (presignedUrl: string, file: File) => {
})
);

teamsWithPosts.sort((a, b) => Number(a.groupNo) - Number(b.groupNo));

setTeams(teamsWithPosts);
} catch (err) {
console.error("이벤트 그룹 API 오류:", err);
Expand Down Expand Up @@ -439,43 +448,41 @@ const handleSubmitGroupEdit = async () => {
};

const fetchGroupPosts = async (groupId: string): Promise<Post[]> => {
try {
const res = await apiFetch(
`${API_URL}/api/v1/events/${eventId}/groups/${groupId}/posts`,
{
method: "GET",
}
);

const data = await res.json();
try {
const res = await apiFetch(
`${API_URL}/api/v1/events/${eventId}/groups/${groupId}/posts`,
{
method: "GET",
}
);

console.log("posts raw data:", data.result);
const data = await res.json();
if (!data.isSuccess) return [];

if (!data.isSuccess) return [];
let rawPosts: any[] = [];

let rawPosts: any[] = [];
if (Array.isArray(data.result?.posts)) {
rawPosts = data.result.posts;
} else if (Array.isArray(data.result)) {
rawPosts = data.result;
} else if (data.result?.postId) {
rawPosts = [data.result];
}

// CASE 1: { posts: [...] }
if (Array.isArray(data.result?.posts)) {
rawPosts = data.result.posts;
}
// CASE 2: result 자체가 배열
else if (Array.isArray(data.result)) {
rawPosts = data.result;
}
// CASE 3: 단일 객체
else if (data.result?.postId) {
rawPosts = [data.result];
}
return rawPosts
.map((post: any) => convertPost(post))
.sort((a, b) => {
const da = a.createdAt ? new Date(a.createdAt).getTime() : 0;
const db = b.createdAt ? new Date(b.createdAt).getTime() : 0;
return da - db;
});

console.log("rawPosts:", rawPosts);
} catch (err) {
console.error("그룹 게시글 API 오류:", err);
return [];
}
};

return rawPosts.map((post: any) => convertPost(post));
} catch (err) {
console.error("그룹 게시글 API 오류:", err);
return [];
}
};

// 게시글 생성 / 수정
const resetPostForm = () => {
Expand Down Expand Up @@ -693,7 +700,14 @@ const handleSubmitGroupEdit = async () => {
const isEventHost =
(eventInfo?.role ?? user?.role)?.toUpperCase() === "HOST";

const displayNickname = location.state?.nickname ?? eventInfo?.nickname ?? "닉네임";
const cachedNickname = localStorage.getItem("eventNickname");

const displayNickname =
cachedNickname ??
eventInfo?.nickname ??
location.state?.nickname ??
"닉네임";



useEffect(() => {
Expand All @@ -711,21 +725,23 @@ useEffect(() => {
return {
...g,
groupId: String(g.groupId),
groupNo: Number(g.groupNo ?? g.groupNum ?? g.groupId),
posts,
};
})
);

newTeamsWithPosts.sort((a, b) => Number(a.groupNo) - Number(b.groupNo));

setTeams((prev) => {
let changed = false;

const updated = prev.map((oldTeam) => {
const newTeam = newTeamsWithPosts.find(
(t) => String(t.groupId) === String(oldTeam.id)
);
if (!newTeam) return oldTeam; // 혹시 없는 경우 그대로
if (!newTeam) return oldTeam;

// 변경 여부 체크
const oldPosts = JSON.stringify(oldTeam.posts);
const newPosts = JSON.stringify(newTeam.posts);

Expand All @@ -734,28 +750,21 @@ useEffect(() => {
return {
...oldTeam,
posts: newTeam.posts,
// 필요한 경우 description, img, leader도 업데이트 가능
};
}

return oldTeam;
});

if (changed) {
console.log("변경 감지 → 업데이트 실행");
return updated;
}
updated.sort((a, b) => Number(a.groupNo) - Number(b.groupNo));

console.log("변화 없음 → UI 재렌더 생략");
return prev;
return changed ? updated : prev;
});
}, 10000);

return () => clearInterval(interval);
}, [eventId]);



return (
<div className="h-screen flex flex-col overflow-hidden">
{/* 헤더 */}
Expand Down