From ca4be0528b474e20579e3b0a9ef0781253d489fa Mon Sep 17 00:00:00 2001 From: Aamir Azad <82281117+aamirazad@users.noreply.github.com> Date: Tue, 6 Aug 2024 22:28:49 -0400 Subject: [PATCH] feat: Add buttons to both document and audio viewer (#85) ### TL;DR Adds a few usefull buttons to reduce the need to go to the service's web ui. --- bun.lockb | Bin 223600 -> 224176 bytes .../(.)paperless/document/[id]/page.tsx | 14 -- .../recording/{[name] => [id]}/page.tsx | 4 +- .../route.ts | 11 +- src/app/whishper/page.tsx | 4 +- .../recording/{[name] => [id]}/page.tsx | 4 +- src/components/audio-preview.tsx | 206 +++++++++++++----- src/components/document-viewer.tsx | 154 +++++++++---- src/types/index.ts | 15 +- 9 files changed, 294 insertions(+), 118 deletions(-) delete mode 100644 src/app/@modal/(.)paperless/document/[id]/page.tsx rename src/app/@modal/(.)whishper/recording/{[name] => [id]}/page.tsx (74%) rename src/app/api/{deleteWhishperRecordingByName => whishperRecording}/route.ts (67%) rename src/app/whishper/recording/{[name] => [id]}/page.tsx (72%) diff --git a/bun.lockb b/bun.lockb index 09fe7e3297f83e2667012586dcf897746da655f7..a6973b19152186313a0760a2b9d812973e3a98ca 100755 GIT binary patch delta 48160 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 - - - ); -} diff --git a/src/app/@modal/(.)whishper/recording/[name]/page.tsx b/src/app/@modal/(.)whishper/recording/[id]/page.tsx similarity index 74% rename from src/app/@modal/(.)whishper/recording/[name]/page.tsx rename to src/app/@modal/(.)whishper/recording/[id]/page.tsx index 5033e33..2d7a01f 100644 --- a/src/app/@modal/(.)whishper/recording/[name]/page.tsx +++ b/src/app/@modal/(.)whishper/recording/[id]/page.tsx @@ -4,11 +4,11 @@ import AudioPreview from "@/components/audio-preview"; export default function ModalAudioPreview({ params, }: { - params: { name: string }; + params: { id: string }; }) { return ( - + ); } diff --git a/src/app/api/deleteWhishperRecordingByName/route.ts b/src/app/api/whishperRecording/route.ts similarity index 67% rename from src/app/api/deleteWhishperRecordingByName/route.ts rename to src/app/api/whishperRecording/route.ts index 6c79ab6..0277e27 100644 --- a/src/app/api/deleteWhishperRecordingByName/route.ts +++ b/src/app/api/whishperRecording/route.ts @@ -1,12 +1,11 @@ import { getUserData } from "@/app/actions"; -import { getWhishperRecordings } from "@/app/whishper/page"; export async function DELETE(req: Request) { const url = new URL(req.url); - const name = url.searchParams.get("name"); + const id = url.searchParams.get("id"); - if (!name) { - return new Response("Name parameter is missing", { status: 400 }); + if (!id) { + return new Response("id parameter is missing", { status: 400 }); } const userData = await getUserData(); @@ -15,10 +14,8 @@ export async function DELETE(req: Request) { return new Response("Unauthorized", { status: 401 }); } - console.log(getWhishperRecordings(name)); - const response = await fetch( - `${userData.whishperURL}/api/transcriptions/${name}`, + `${userData.whishperURL}/api/transcriptions/${id}`, { method: "DELETE", }, diff --git a/src/app/whishper/page.tsx b/src/app/whishper/page.tsx index 4ab7b4a..022910f 100644 --- a/src/app/whishper/page.tsx +++ b/src/app/whishper/page.tsx @@ -46,7 +46,7 @@ import type { WhishperRecordingType } from "@/types"; const queryClient = new QueryClient(); -export async function getWhishperRecordings( +async function getWhishperRecordings( query: string, ): Promise { const userData = await getUserData(); @@ -224,7 +224,7 @@ function DataTable({ header: "Name", cell: ({ getValue, row }) => ( {getValue() as string} diff --git a/src/app/whishper/recording/[name]/page.tsx b/src/app/whishper/recording/[id]/page.tsx similarity index 72% rename from src/app/whishper/recording/[name]/page.tsx rename to src/app/whishper/recording/[id]/page.tsx index b65f9d1..7d8efbe 100644 --- a/src/app/whishper/recording/[name]/page.tsx +++ b/src/app/whishper/recording/[id]/page.tsx @@ -3,11 +3,11 @@ import AudioPreview from "@/components/audio-preview"; export default function FullAudioPage({ params, }: { - params: { name: string }; + params: { id: string }; }) { return (
- +
); } diff --git a/src/components/audio-preview.tsx b/src/components/audio-preview.tsx index b4d3f47..903e67a 100644 --- a/src/components/audio-preview.tsx +++ b/src/components/audio-preview.tsx @@ -6,21 +6,35 @@ import { QueryClient, } from "@tanstack/react-query"; import type { UsersTableType } from "@/server/db/schema"; -import { Button } from "@/components/ui/button"; +import { Button, buttonVariants } from "@/components/ui/button"; import { useRouter } from "next/navigation"; -import { ChevronLeft, ExternalLink } from "lucide-react"; +import { ChevronLeft } from "lucide-react"; +import { useState } from "react"; +import OpenExternalLink from "./external-link"; +import type { WhishperRecordingType } from "@/types"; +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogTrigger, +} from "@/components/ui/alert-dialog"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; -import { useState } from "react"; +import { toast } from "sonner"; const queryClient = new QueryClient(); const fetchUserData = async (): Promise => { - const response = await fetch(`/api/getUserData`); + const response = await fetch("/api/getUserData"); if (!response.ok) { throw new Error("Network error"); } @@ -53,30 +67,93 @@ function SkeletonLoader() { ); } -function AudioInfo(props: { name: string }) { +async function fetchWhishperRecording(searchId: string, whishperURL: string) { + const response = await fetch(`${whishperURL}/api/transcriptions`); + const data = (await response.json()) as WhishperRecordingType[]; + for (const recording of data) { + if (recording.id === searchId) { + return recording; + } + } +} + +async function deleteWhishperRecording(url: string) { + const response = await fetch(url, { + method: "DELETE", + }); + + if (!response.ok) { + throw new Error("Network error"); + } + + return response; +} + +type AudioInfoProps = { + id: string; +}; + +function AudioInfo({ id }: AudioInfoProps) { const router = useRouter(); const [isPlaying, setIsPlaying] = useState(false); const { data: userData, isLoading: isUserDataLoading, - error, + error: userDataError, } = useQuery({ queryKey: ["userData"], queryFn: fetchUserData, }); - const decodedName = decodeURIComponent(props.name); - const frontPart = decodedName.split("_WHSHPR_")[1] ?? decodedName; - const formattedName = frontPart.replace(".m4a", "") ?? decodedName; + const whishperURL = userData?.whishperURL; + + const { + data: recordingData, + isLoading: isRecordingDataLoading, + error: recordingDataError, + } = useQuery({ + queryKey: ["whishperRecording", id, whishperURL], // Include id in the query key + queryFn: () => fetchWhishperRecording(id, whishperURL!), + enabled: !!whishperURL, // Only fetch recording data when userData is available + }); if (isUserDataLoading) { return ; } - if (!userData?.whishperURL ?? error) { - return

Failed to get whishper url

; + + if (userDataError ?? !userData) { + return ( +
+
+

+ Error loading user data +

+
+
+ ); + } + + if (isRecordingDataLoading) { + return ; } + if (recordingDataError ?? !recordingData) { + return ( +
+
+

+ Error loading recording data +

+
+
+ ); + } + + const decodedName = decodeURIComponent(recordingData.fileName); + const frontPart = decodedName.split("_WHSHPR_")[1] ?? decodedName; + const formattedName = frontPart.replace(".m4a", "") ?? decodedName; + return (
@@ -104,52 +181,81 @@ function AudioInfo(props: { name: string }) { onPause={() => setIsPlaying(false)} >
- - - - - - Comming soon! - - - - - - - - Comming soon! - - - + + - - + + + Download + - Comming soon! + +

+ To download the audio file, right click and select + "Save as". +

+
+ + + + + + + + Are you absolutely sure? + + + This action cannot be undone. This will permanently delete + the recording. + + + + Cancel + { + const response = await deleteWhishperRecording( + `${userData.whishperURL}/api/transcriptions/${id}`, + ); + if (response.ok) { + toast("Recording deleted", { + description: "The recording has been deleted.", + }); + } else { + toast("Error deleting recording", { + description: + "An error occurred while deleting the recording.", + }); + } + router.back(); + }} + > + Continue + + + +
@@ -158,10 +264,10 @@ function AudioInfo(props: { name: string }) { ); } -export default function AudioPreview({ name }: { name: string }) { +export default function AudioPreview({ id }: { id: string }) { return ( - + ); } diff --git a/src/components/document-viewer.tsx b/src/components/document-viewer.tsx index 97d0f02..1f9d774 100644 --- a/src/components/document-viewer.tsx +++ b/src/components/document-viewer.tsx @@ -1,7 +1,7 @@ "use client"; import { useState, useEffect, useRef } from "react"; -import { Button } from "./ui/button"; +import { Button, buttonVariants } from "./ui/button"; import { useRouter } from "next/navigation"; import { getUserData } from "@/app/actions"; import { @@ -11,17 +11,28 @@ import { } from "@tanstack/react-query"; import type { AdviceAPIType } from "@/types"; import OpenInternalLink from "./internal-link"; +import OpenExternalLink from "./external-link"; +import type { UsersTableType } from "@/server/db/schema"; +import { Download } from "lucide-react"; +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogTrigger, +} from "@/components/ui/alert-dialog"; +import { toast } from "sonner"; const queryClient = new QueryClient(); async function getPaperlessDocument( documentId: number, + userData: UsersTableType, ): Promise { - const userData = await getUserData(); - if (!userData) { - console.error("Error getting user data"); - return null; - } try { const url = `${userData.paperlessURL}/api/documents/${documentId}/download/`; const response = await fetch(url, { @@ -85,49 +96,60 @@ function SkeletonLoader() { ); } -function DocumentViewer(props: { id: number }) { - const router = useRouter(); - - const [pdfUrl, setPdfUrl] = useState(null); - const [loading, setLoading] = useState(true); - const fetchDataCalledRef = useRef(false); +const fetchUserData = async (): Promise => { + const response = await fetch(`/api/getUserData`); + if (!response.ok) { + throw new Error("Network error"); + } + const data = (await response.json()) as UsersTableType; + return data; +}; - useEffect(() => { - if (!fetchDataCalledRef.current) { - const fetchData = async () => { - setLoading(true); +async function deleteDocument(documentId: number) { + const userData = await getUserData(); + if (!userData) { + throw new Error("User data not found"); + } + const body = { + documents: [documentId], + method: "delete", + }; + const response = await fetch( + `${userData.paperlessURL}/api/documents/bulk_edit/ `, + { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Token ${userData.paperlessToken}`, + }, + body: JSON.stringify(body), + }, + ); + return response; +} - try { - const objectUrl = await getPaperlessDocument(props.id); - if (objectUrl) { - setPdfUrl(objectUrl); - } else { - setPdfUrl(null); - } - } catch (error) { - console.error("An error occurred:", error); - setPdfUrl(null); - } finally { - setLoading(false); - } - }; +function DocumentViewer(props: { id: number }) { + const router = useRouter(); - fetchData().catch((error) => { - console.error("An error occurred:", error); - }); + const { data: userData, isLoading: isUserDataLoading } = useQuery({ + queryKey: ["userData"], + queryFn: fetchUserData, + }); - fetchDataCalledRef.current = true; // Mark as fetched - } - }, [props.id]); // Include props.id in the dependency array if refetch is needed on id change + const { data: pdfUrl, isLoading: isPdfUrlLoading } = useQuery({ + queryKey: ["pdfUrl", props.id, userData], // Include id and paperlessURL in the query key + queryFn: () => getPaperlessDocument(props.id, userData!), + enabled: !!userData, + }); - if (loading) { + if (isPdfUrlLoading ?? isUserDataLoading) { return ; } - if (!pdfUrl) { + if (!pdfUrl || !userData) { return (
-
+

Failed to get document

@@ -155,7 +177,7 @@ function DocumentViewer(props: { id: number }) {

-
+
+ + Download + + +
+ + Open + + + + + + + + Are you absolutely sure? + + This action cannot be undone. This will permanently delete + the recording. + + + + Cancel + { + const response = await deleteDocument(props.id); + if (response.ok) { + toast("Pdf deleted", { + description: "The recording has been deleted.", + }); + } else { + toast("Error deleting pdf", { + description: + "An error occurred while deleting the pdf.", + }); + } + router.back(); + }} + > + Continue + + + +
diff --git a/src/types/index.ts b/src/types/index.ts index 9dcbe4c..6d1f774 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -95,7 +95,20 @@ export type WhishperRecordingType = { }[]; text: string; }; - translations: []; + translations: Translation[]; +}; + +type Translation = { + sourceLanguage: string; + targetLanguage: string; + text: string; + segments: []; +}; + +export type SimpleWhishperTranscription = { + id: string; + duration: number; + name: string; }; export type AdviceAPIType = {