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
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,12 @@ interface Props {

function Card({ item, index, columnTitle }: Props) {
const { isOpen, openModal, isClosing, closeModal } = useModal();
const card = useCardStore((state) => state.card);
const card = useCardStore((state) =>
state.cards.find((card) => card.id === item.id)
);

useEffect(() => {
useCardStore.getState().setCard(item);
useCardStore.getState().addCard(item);
}, [item]);

if (!item || !item.id) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ interface TaskUpdateFormValues extends TaskFormValues {
columnId: number;
}

export default function UpdateTaskModal() {
export default function UpdateCardModal({ cardId }: { cardId: number }) {
const { closeModal } = useModalStore();
const {
register,
Expand All @@ -34,12 +34,15 @@ export default function UpdateTaskModal() {
const dashboard = useDashboardStore((state) => state.dashboard);
const { members } = useMember(dashboard?.id.toString() || null, 10);
const { columns } = useColumn(dashboard?.id || null);
const { card, setCard } = useCardStore();
const card = useCardStore((state) =>
state.cards.find((card) => card.id === cardId)
);
const modifyCard = useCardStore((state) => state.modifyCard);

const onSubmit = async (data: TaskUpdateFormValues) => {
if (card) {
const response = await updateCard(data, card.columnId, card.id);
setCard(response);
modifyCard(card.id, response);
closeModal();
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,31 @@ import type { Menu } from '@/types/menu';
import MenuDropdown from '@/components/MenuDropdown';
import { useMenu } from '@/hooks/useMenu';
import { deleteCard } from '@/lib/cardService';
import { useRouter } from 'next/navigation';
import useDashboardStore from '@/store/dashboardStore';
import useModalStore from '@/store/modalStore';
import UpdateTaskModal from '../UpdateCardModal';
import UpdateCardModal from '../UpdateCardModal';
import styles from './HeaderMenu.module.css';
import useTriggerStore from '@/store/triggerStore';
import useCardStore from '@/store/cardStore';

interface HeaderMenuProps {
cardId: number;
closeModal: () => void;
}

export default function HeaderMenu({ cardId, closeModal }: HeaderMenuProps) {
const router = useRouter();
const { updateTrigger } = useTriggerStore();
const { dashboard } = useDashboardStore();
const { isMenuVisible, toggleMenu } = useMenu();
const { openModal } = useModalStore();

const handleDeleteClick = async () => {
await deleteCard(cardId);
closeModal();
useCardStore.getState().removeCard(cardId);
updateTrigger.card();
router.replace(`/dashboard/${dashboard?.id}`);
Copy link
Owner Author

Choose a reason for hiding this comment

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

ν•„μš” μ—†λŠ”μ•  κ°™μ•„μ„œ μ§€μ› μ–΄μš”

};

const handleUpdateClick = () => {
openModal(<UpdateTaskModal />);
openModal(<UpdateCardModal cardId={cardId} />);
};

const cardMenus: Menu[] = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import Image from 'next/image';
import { useRouter } from 'next/navigation';
import Button from '@/components/Button';
import styles from './DashboardCard.module.css';
import useCardStore from '@/store/cardStore';

export default function DashboardCard({
id,
Expand All @@ -12,11 +13,13 @@ export default function DashboardCard({
}: Dashboard) {
const router = useRouter();

const handleClick = () => {
useCardStore.getState().clearCards();
router.push(`/dashboard/${id}`);
};
Comment on lines +16 to +19
Copy link
Owner Author

Choose a reason for hiding this comment

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

μ‚¬μ΄λ“œλ°”λž‘ λ‚΄ λŒ€μ‹œλ³΄λ“œμ—μ„œ λŒ€μ‹œλ³΄λ“œ μ„ νƒν•΄μ„œ 이동할 λ•Œ
μΉ΄λ“œ λΉ„μ›Œμ£Όκ²Œ μ²˜λ¦¬ν•΄λ’€μŠ΅λ‹ˆλ‹€.


return (
<Button
className={styles.dashboardCard}
onClick={() => router.push(`/dashboard/${id}`)}
>
<Button className={styles.dashboardCard} onClick={handleClick}>
<div className={styles.titleContainer}>
<div style={{ background: color }} className={styles.dot}></div>
<span className={styles.title}>{title}</span>
Expand Down
4 changes: 4 additions & 0 deletions src/components/sidebar/Dashboards.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import Button from '../Button';
import useDashboards from '@/app/(with-header-sidebar)/mydashboard/_hooks/useDashboards';
import useTriggerStore from '@/store/triggerStore';
import styles from './Dashboards.module.css';
import useCardStore from '@/store/cardStore';

const PAGE_SIZE = 12;

Expand Down Expand Up @@ -45,11 +46,14 @@ export default function Dashboards() {
function DashboardItem({ id, color, title, createdByMe }: Dashboard) {
const isActive = usePathname() === `/dashboard/${id}`;

const handleClick = () => useCardStore.getState().clearCards();

return (
<li>
<Link
href={`/dashboard/${id}`}
className={`link ${isActive ? styles.active : ''}`}
onClick={handleClick}
>
<div className={styles.titleContainer}>
<div style={{ background: color }} className={styles.dot}></div>
Expand Down
32 changes: 28 additions & 4 deletions src/store/cardStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,37 @@ import { create } from 'zustand';
import { Card } from '@/types/dashboardView';

interface CardState {
card: Card | null;
setCard: (newCard: Card) => void;
cards: Card[];
addCard: (newCard: Card) => void;
modifyCard: (id: number, updatedCard: Partial<Card>) => void;
removeCard: (id: number) => void;
clearCards: () => void;
}

const useCardStore = create<CardState>((set) => ({
card: null,
setCard: (newCard: Card) => set({ card: newCard }),
cards: [],
addCard: (newCard: Card) =>
set((state) => {
const exists = state.cards.some((card) => card.id === newCard.id);
if (exists) return state;
return {
cards: [...state.cards, newCard],
};
}),
modifyCard: (id, updatedCard) =>
set((state) => ({
cards: state.cards.map((card) =>
card.id === id ? { ...card, ...updatedCard } : card
),
})),
removeCard: (id) =>
set((state) => ({
cards: state.cards.filter((card) => card.id !== id),
})),
clearCards: () =>
set(() => ({
cards: [],
})),
}));

export default useCardStore;