From d09bc1c362130d832d06c74ad827ec9ee66674c5 Mon Sep 17 00:00:00 2001 From: spencerwooo Date: Fri, 25 Jun 2021 19:22:22 +0100 Subject: [PATCH] finish raw file redirect on server side, close #4 --- components/FileListing.tsx | 25 ++++++++++++++++++------- config/site.json | 1 + pages/_app.tsx | 17 ++++++++++++++--- pages/api/index.ts | 17 +++++++++++++++-- 4 files changed, 48 insertions(+), 12 deletions(-) diff --git a/components/FileListing.tsx b/components/FileListing.tsx index 4aef5a6..9883db0 100644 --- a/components/FileListing.tsx +++ b/components/FileListing.tsx @@ -10,12 +10,12 @@ import useSWR from 'swr' import { useRouter } from 'next/router' import dynamic from 'next/dynamic' -import Loading from './Loading' - +import config from '../config/site.json' import { getExtension, getFileIcon, hasKey } from '../utils/getFileIcon' import { extensions, preview } from '../utils/getPreviewType' import { VideoPreview } from './previews/VideoPreview' import { AudioPreview } from './previews/AudioPreview' +import Loading from './Loading' import FourOhFour from './FourOhFour' import TextPreview from './previews/TextPreview' import MarkdownPreview from './previews/MarkdownPreview' @@ -161,13 +161,20 @@ const FileListing: FunctionComponent<{ query?: ParsedUrlQuery }> = ({ query }) = setImageViewerVisibility(false) }} customToolbar={toolbars => { + toolbars[0].render = + toolbars[1].render = + toolbars[2].render = + toolbars[4].render = + toolbars[9].render = return toolbars.concat([ { key: 'copy', - render: , + render: , onClick: i => { - navigator.clipboard.writeText(i.downloadUrl ? i.downloadUrl : '') - toast.success('Copied to clipboard.') + navigator.clipboard.writeText( + i.alt ? `${config.baseUrl}/api?path=${encodeURIComponent(path + '/' + i.alt)}&raw=true` : '' + ) + toast.success('Copied image permanent link to clipboard.') }, }, ]) @@ -203,8 +210,12 @@ const FileListing: FunctionComponent<{ query?: ParsedUrlQuery }> = ({ query }) = if (hasKey(extensions, fileExtension)) { switch (extensions[fileExtension]) { case preview.image: - router.push(downloadUrl) - return <> + return ( +
+ {/* eslint-disable-next-line @next/next/no-img-element */} + {fileName} +
+ ) case preview.text: return diff --git a/config/site.json b/config/site.json index f1a93a1..bf5dd2b 100644 --- a/config/site.json +++ b/config/site.json @@ -1,3 +1,4 @@ { + "baseUrl": "https://onedrive-vercel-index.vercel.app", "title": "Spencer's OneDrive Index" } diff --git a/pages/_app.tsx b/pages/_app.tsx index e4d2cc8..8d18132 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -14,9 +14,17 @@ import { faFileAlt, faFile, faFolder, - faCopy } from '@fortawesome/free-regular-svg-icons' -import { faMusic, faArrowLeft, faArrowRight, faFileDownload } from '@fortawesome/free-solid-svg-icons' +import { + faPlus, + faMinus, + faDownload, + faMusic, + faArrowLeft, + faArrowRight, + faFileDownload, + faCopy +} from '@fortawesome/free-solid-svg-icons' import { faGithub, faMarkdown } from '@fortawesome/free-brands-svg-icons' import type { AppProps } from 'next/app' @@ -40,7 +48,10 @@ library.add( faArrowLeft, faArrowRight, faFileDownload, - faCopy + faCopy, + faPlus, + faMinus, + faDownload ) function MyApp({ Component, pageProps }: AppProps) { diff --git a/pages/api/index.ts b/pages/api/index.ts index 62032ea..897d410 100644 --- a/pages/api/index.ts +++ b/pages/api/index.ts @@ -39,9 +39,10 @@ const getAccessToken = async () => { } export default async function handler(req: NextApiRequest, res: NextApiResponse) { - const { path = '/' } = req.query + const { path = '/', raw = false } = req.query if (path === '[...path]') { - res.status(400).json({ error: 'Path query invalid.' }) + res.status(400).json({ error: 'No path specified.' }) + return } if (typeof path === 'string') { @@ -55,9 +56,21 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) }, }) + if (raw) { + if ('folder' in data) { + res.status(400).json({ error: "Folders doesn't have raw download urls." }) + return + } + if ('file' in data) { + res.redirect(data['@microsoft.graph.downloadUrl']) + return + } + } + res.status(200).json({ path, data }) return } res.status(404).json({ error: 'Path query invalid.' }) + return }