feat: add FileDescriptionContainer for managing file descriptions and integrate with FileActions
This commit is contained in:
parent
344334592e
commit
1d302eb217
@ -1,5 +1,6 @@
|
||||
'use client';
|
||||
import {useFileActions} from "~/app/_components/FileActions";
|
||||
import { useRef, useState } from "react";
|
||||
import { useFileActions } from "~/app/_components/FileActions";
|
||||
|
||||
export function FileActionsContainer({
|
||||
fileId,
|
||||
@ -12,7 +13,7 @@ export function FileActionsContainer({
|
||||
fileUrl: string;
|
||||
isOwner: boolean;
|
||||
}) {
|
||||
const { handleDownload, handleCopyUrl, handleRemove } = useFileActions(() => fileId, (description: string) => {
|
||||
const { handleDownload, handleCopyUrl, handleRemove} = useFileActions(() => fileId, (description: string) => {
|
||||
if (isOwner) {
|
||||
console.log(description);
|
||||
}
|
||||
@ -85,3 +86,35 @@ export function FileActionsContainer({
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export function FileDescriptionContainer({
|
||||
fileId,
|
||||
fileDescriprtion,
|
||||
}: {
|
||||
fileId: string;
|
||||
fileDescriprtion?: string;
|
||||
}) {
|
||||
|
||||
const [description, setDescription] = useState(fileDescriprtion || ""); // Add state for description
|
||||
const { handleDescriptionChange } = useFileActions(() => {}, (description: string) => {
|
||||
setDescription(description);
|
||||
return undefined;
|
||||
}, fileId); // Wrap setDescription in a function
|
||||
const debounceTimer = useRef<NodeJS.Timeout | null>(null); // Initialize debounce timer
|
||||
|
||||
const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
|
||||
handleDescriptionChange(e, debounceTimer); // Pass the debounce timer
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="flex self-center gap-2">
|
||||
<textarea
|
||||
className="w-full h-24 p-2 border rounded-md bg-gray-800 text-white"
|
||||
value={description} // Use state value
|
||||
onChange={handleChange}
|
||||
placeholder="Enter file description..."
|
||||
maxLength={200} // Limit to 200 characters
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -4,7 +4,7 @@ import { notifyClients } from "~/utils/notifyClients";
|
||||
|
||||
export const useFileActions = (
|
||||
setFiles: (callback: (prevFiles: any[]) => any[]) => void,
|
||||
setDescription?: (description: string) => void,
|
||||
setDescription?: (description: string) => undefined,
|
||||
fileId?: string
|
||||
) => {
|
||||
const pageUrl = `${env.NEXT_PUBLIC_PAGE_URL}`;
|
||||
@ -75,7 +75,9 @@ export const useFileActions = (
|
||||
e: React.ChangeEvent<HTMLTextAreaElement>,
|
||||
debounceTimer: React.RefObject<NodeJS.Timeout | null>
|
||||
) => {
|
||||
if (!setDescription) return;
|
||||
if (setDescription === undefined) {console.error("setDescription function is not provided")
|
||||
return;
|
||||
};
|
||||
|
||||
const newDescription = e.target.value;
|
||||
setDescription(newDescription);
|
||||
@ -83,7 +85,9 @@ export const useFileActions = (
|
||||
if (debounceTimer.current) {
|
||||
clearTimeout(debounceTimer.current);
|
||||
}
|
||||
|
||||
debounceTimer.current = setTimeout(() => {
|
||||
console.log("Calling handleDescriptionSave"); // Debug log
|
||||
handleDescriptionSave(newDescription);
|
||||
}, 1000);
|
||||
};
|
||||
@ -99,7 +103,8 @@ export const useFileActions = (
|
||||
const response = await fetch(`/api/files/share?id=${encodeURIComponent(fileId)}`, {
|
||||
method: "PUT",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ description }),
|
||||
// pass the fileId and description in the request body
|
||||
body: JSON.stringify({ description, id: fileId }),
|
||||
});
|
||||
|
||||
if (response.status === 403) {
|
||||
|
||||
@ -48,7 +48,8 @@ export async function PUT(req: Request) {
|
||||
|
||||
try {
|
||||
const body = (await req.json()) as { id: string; description: string } | null;
|
||||
if (!body?.id || !body.description) {
|
||||
if (!body?.id || body.description === undefined) {
|
||||
// Allow empty description but ensure id is present
|
||||
return NextResponse.json({ error: "Invalid request body" }, { status: 400 });
|
||||
}
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@ import { notFound } from "next/navigation";
|
||||
import { FilePreview } from "~/app/_components/FilePreview";
|
||||
import { HomeButton } from "~/app/_components/HomeButton"; // Import the client component
|
||||
import { Toaster } from "react-hot-toast";
|
||||
import { FileActionsContainer } from "~/app/_components/ActionButtons"; // Import the client component
|
||||
import { FileActionsContainer, FileDescriptionContainer } from "~/app/_components/ActionButtons"; // Import the client component
|
||||
import Head from "next/head";
|
||||
|
||||
interface FileDetails {
|
||||
@ -143,10 +143,10 @@ export default async function FilePreviewContainer({
|
||||
<strong>Upload Date:</strong>{" "}
|
||||
{new Date(fileDetails.uploadDate).toLocaleString()}
|
||||
</p>
|
||||
<p>
|
||||
<div>
|
||||
<strong>Description:</strong>{" "}
|
||||
{fileDetails.description || "No description available"}
|
||||
</p>
|
||||
<FileDescriptionContainer fileId={fileDetails.id} fileDescriprtion={fileDetails.description}/>
|
||||
</div>
|
||||
<div className="mt-4 flex justify-center">
|
||||
<FileActionsContainer
|
||||
fileId={fileDetails.id}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user