fix: address code review findings — data loss, race condition, broken features
- TopBar: call closeBoard() before navigating back to prevent data loss - board-store: guard debouncedSave against race condition when board is closed during an in-flight save - board-store: add missing updatedAt to setColumnWidth - useKeyboardShortcuts: remove duplicate Ctrl+K handler that prevented command palette from toggling closed - AttachmentSection: wire up Tauri file dialog for adding attachments with link/copy mode support
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
import { FileIcon, X, Plus } from "lucide-react";
|
||||
import { open } from "@tauri-apps/plugin-dialog";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { useBoardStore } from "@/stores/board-store";
|
||||
import { copyAttachment } from "@/lib/storage";
|
||||
import type { Attachment } from "@/types/board";
|
||||
|
||||
interface AttachmentSectionProps {
|
||||
@@ -12,11 +14,29 @@ export function AttachmentSection({
|
||||
cardId,
|
||||
attachments,
|
||||
}: AttachmentSectionProps) {
|
||||
const addAttachment = useBoardStore((s) => s.addAttachment);
|
||||
const removeAttachment = useBoardStore((s) => s.removeAttachment);
|
||||
|
||||
function handleAdd() {
|
||||
// Placeholder: Tauri file dialog will be wired in a later task
|
||||
console.log("Add attachment (file dialog not yet wired)");
|
||||
async function handleAdd() {
|
||||
const selected = await open({
|
||||
multiple: false,
|
||||
title: "Select attachment",
|
||||
});
|
||||
if (!selected) return;
|
||||
|
||||
const fileName = selected.split(/[\\/]/).pop() ?? "attachment";
|
||||
|
||||
const board = useBoardStore.getState().board;
|
||||
if (!board) return;
|
||||
|
||||
const mode = board.settings.attachmentMode;
|
||||
|
||||
if (mode === "copy") {
|
||||
const destPath = await copyAttachment(board.id, selected, fileName);
|
||||
addAttachment(cardId, { name: fileName, path: destPath, mode: "copy" });
|
||||
} else {
|
||||
addAttachment(cardId, { name: fileName, path: selected, mode: "link" });
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
|
||||
@@ -75,7 +75,10 @@ export function TopBar() {
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
onClick={() => setView({ type: "board-list" })}
|
||||
onClick={() => {
|
||||
useBoardStore.getState().closeBoard();
|
||||
setView({ type: "board-list" });
|
||||
}}
|
||||
className="text-pylon-text-secondary hover:text-pylon-text"
|
||||
>
|
||||
<ArrowLeft className="size-4" />
|
||||
|
||||
Reference in New Issue
Block a user