+
diff --git a/src/components/header/skeleton/UserInfoSkeleton.module.css b/src/components/header/skeleton/UserInfoSkeleton.module.css
index 4afea0f..7b0fcef 100644
--- a/src/components/header/skeleton/UserInfoSkeleton.module.css
+++ b/src/components/header/skeleton/UserInfoSkeleton.module.css
@@ -8,6 +8,34 @@
background-color: var(--gray-300);
}
+.userIcon::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: -100%;
+ width: 50%;
+ height: 100%;
+ background: linear-gradient(
+ 90deg,
+ rgba(255, 255, 255, 0.2) 0%,
+ rgba(255, 255, 255, 0.6) 50%,
+ rgba(255, 255, 255, 0.2) 100%
+ );
+ animation: shine 1.5s infinite;
+}
+
+@keyframes shine {
+ 0% {
+ left: -100%;
+ }
+ 50% {
+ left: 100%;
+ }
+ 100% {
+ left: -100%;
+ }
+}
+
@media screen and (min-width: 768px) {
.userInfo {
display: flex;
diff --git a/src/components/sidebar/Dashboards.tsx b/src/components/sidebar/Dashboards.tsx
index e688f85..ff02fc3 100644
--- a/src/components/sidebar/Dashboards.tsx
+++ b/src/components/sidebar/Dashboards.tsx
@@ -6,13 +6,22 @@ import Button from '../Button';
import useDashboards from '@/app/(with-header-sidebar)/mydashboard/_hooks/useDashboards';
import useDashboardStore from '@/store/dashboardStore';
import styles from './Dashboards.module.css';
+import { useEffect } from 'react';
+import useDashboardTriggerStore from '@/store/dashboardTriggerStore';
const PAGE_SIZE = 12;
export default function Dashboards() {
- const { page, dashboards, totalPages, handlePageChange } = useDashboards({
- pageSize: PAGE_SIZE,
- });
+ const { trigger } = useDashboardTriggerStore();
+
+ const { page, dashboards, totalPages, handlePageChange, refetch } =
+ useDashboards({
+ pageSize: PAGE_SIZE,
+ });
+
+ useEffect(() => {
+ refetch();
+ }, [trigger]);
if (dashboards.length === 0) {
return null;
diff --git a/src/hooks/useClickOutside.ts b/src/hooks/useClickOutside.ts
new file mode 100644
index 0000000..5e743fb
--- /dev/null
+++ b/src/hooks/useClickOutside.ts
@@ -0,0 +1,23 @@
+import { useEffect } from 'react';
+
+type ClickOutsideCallback = () => void;
+
+function useClickOutside(
+ ref: React.RefObject,
+ callback: ClickOutsideCallback
+) {
+ useEffect(() => {
+ const handleClickOutside = (event: MouseEvent) => {
+ if (ref.current && !ref.current.contains(event.target as Node)) {
+ callback();
+ }
+ };
+
+ document.addEventListener('mousedown', handleClickOutside);
+ return () => {
+ document.removeEventListener('mousedown', handleClickOutside);
+ };
+ }, [ref, callback]);
+}
+
+export default useClickOutside;
diff --git a/src/lib/boardService.ts b/src/lib/boardService.ts
index 0f730ba..a391173 100644
--- a/src/lib/boardService.ts
+++ b/src/lib/boardService.ts
@@ -24,7 +24,7 @@ export const updateBoard = async (
title,
color,
});
- toast.success({ message: '변경되었습니다.' });
+ toast.success({ message: '대시보드가 수정되었습니다.' });
return response.data;
} catch (error) {
if (error instanceof Error) {
@@ -42,6 +42,7 @@ export const createDashboard = async ({
title,
color,
});
+ toast.success({ message: '대시보드가 생성되었습니다.' });
return response.data;
} catch (error) {
throw error;
diff --git a/src/lib/commentService.ts b/src/lib/commentService.ts
index 88316aa..86cb584 100644
--- a/src/lib/commentService.ts
+++ b/src/lib/commentService.ts
@@ -1,4 +1,5 @@
import axiosInstance from '@/lib/axiosInstance';
+import { toast } from '@/store/toastStore';
import type {
CreateCommentRequestBody,
Comment,
@@ -50,6 +51,8 @@ export const updateComment = async ({
const response = await axiosInstance.put(`/comments/${commentId}`, {
...data,
});
+ toast.success({ message: '댓글이 수정되었습니다.' });
+
return response.data;
} catch (error) {
throw error;
@@ -59,6 +62,7 @@ export const updateComment = async ({
export const deleteComment = async (commentId: number) => {
try {
await axiosInstance.delete(`/comments/${commentId}`);
+ toast.success({ message: '댓글이 삭제되었습니다.' });
} catch (error) {
throw error;
}
diff --git a/src/store/dashboardTriggerStore.ts b/src/store/dashboardTriggerStore.ts
new file mode 100644
index 0000000..46f30ce
--- /dev/null
+++ b/src/store/dashboardTriggerStore.ts
@@ -0,0 +1,13 @@
+import { create } from 'zustand';
+
+interface DashboardTriggerStore {
+ trigger: boolean;
+ updateTrigger: () => void;
+}
+
+const useDashboardTriggerStore = create((set) => ({
+ trigger: false,
+ updateTrigger: () => set((state) => ({ trigger: !state.trigger })),
+}));
+
+export default useDashboardTriggerStore;
diff --git a/src/store/toastStore.ts b/src/store/toastStore.ts
index c2e360e..6a8928c 100644
--- a/src/store/toastStore.ts
+++ b/src/store/toastStore.ts
@@ -34,7 +34,7 @@ const useToastStore = create((set) => ({
type: ToastState['type'],
duration = 2000,
showButton = true,
- theme = 'dark'
+ theme = 'light'
) => {
const id = Date.now();
@@ -158,7 +158,7 @@ const createToast =
message,
duration = 2000,
showButton = true,
- theme = 'dark',
+ theme = 'light',
}: CreateToastProps) =>
useToastStore
.getState()