처리해야하는 작업이 남아 있다면 아이콘을 활성화하여 사용자가 알 수 있도록 인터페이스(알림)을 제공하는 기능을 구현해보자.
{
"code": 200,
"creator_application": true,
"message": "SUCCESS"
}
export default function AdminSidebarContainer() {
const { data: session } = useSession();
const { data: newRequest } = useSWR(session ? `/main/side` : null, () =>
session ? checkSidebar(session.user.token) : null
);
return (
<div className="flex flex-col">
<AdminSidebar menus={SIDEBAR_LIST} newRequest={newRequest} />
</div>
);
}
// AdminSidebar
// ...
// 새로운 요청 사항 있으면 아이콘 활성화
{newData?.creator_application &&
subitem.href === "/admin/account/creator" && (
<span
className={` text-red-500 ${
isSubmenuItemActive(subitem)
? "text-white "
: ""
},`}
>
<WarningIcon />
</span>
)}
- 기획상 실시간 알림까지의 필요성을 없다.
- 최대한 서버의 부담이 적은 방향으로 30분 간격의 확인으로 협의.
커스텀훅으로 구현하여 여러 컴포넌트에서 동일한 요청이 가능하도록 구현
// hooks/useAdminSidebar.js
import useSWR from "swr";
import { checkSidebar } from "../services/adminSidebar.service";
import { useSession } from "next-auth/react";
export function useAdminSidebar() {
const { data: session } = useSession();
const { data, mutate } = useSWR(
session ? `/admin/side` : null, // key
() => (session ? checkSidebar(session.user.token) : null), // fetcher
{ refreshInterval: 1800000 } // 30분 간격으로 리플레쉬
);
return { data, refresh: mutate };
}
useSWR
의 refreshInterval
옵션으로 30분 간격으로 데이터를 새로고침한다.import { AdminSidebar } from "@/admin/components/sidebar/AdminSidebar";
import { SIDEBAR_LIST } from "@/admin/constants/sidebarList";
import { useAdminSidebar } from "@/admin/hooks/useAdminSidebar";
export default function AdminSidebarContainer() {
const { data: newData } = useAdminSidebar();
return (
<div className="flex flex-col">
<AdminSidebar menus={SIDEBAR_LIST} newData={newData} />
</div>
);
}
export default function EditCreatorContainer({
applyId,
offStateSettingModal,
}: EditCreatorContainerProps) {
// useAdminSidebar 커스텀훅의 refresh 가져오기
const { refresh } = useAdminSidebar();
// 이벤트 핸들러
const handleUpdate = async (data: FormData) => {
if (!session) return;
try {
const response = await updateCreator(session.user.token, data);
if (response) {
mutate();
offStateSettingModal();
toast({
title: "크리에이터 승인 요청이 처리 되었습니다.",
className: "bg-white",
});
}
} catch (error) {
if (error instanceof Error && "response" in error) {
const responseError = error as any;
let errorMessage = "크리에이터 승인 요청 처리에 실패했습니다.";
if (
responseError.response &&
responseError.response.data &&
responseError.response.data.message
) {
errorMessage = responseError.response.data.message;
}
toast({
title: errorMessage,
className: "bg-red-500 text-white",
});
} else {
toast({
title: "알 수 없는 오류가 발생했습니다.",
className: "bg-red-500 text-white",
});
}
}
refresh(); // 작업이 처리되면 남은 작업 여부 데이터를 새로고침 해준다.
};