finish raw file redirect on server side, close #4

This commit is contained in:
spencerwooo
2021-06-25 19:22:22 +01:00
parent 1cbb33644f
commit d09bc1c362
4 changed files with 48 additions and 12 deletions
+18 -7
View File
@@ -10,12 +10,12 @@ import useSWR from 'swr'
import { useRouter } from 'next/router' import { useRouter } from 'next/router'
import dynamic from 'next/dynamic' import dynamic from 'next/dynamic'
import Loading from './Loading' import config from '../config/site.json'
import { getExtension, getFileIcon, hasKey } from '../utils/getFileIcon' import { getExtension, getFileIcon, hasKey } from '../utils/getFileIcon'
import { extensions, preview } from '../utils/getPreviewType' import { extensions, preview } from '../utils/getPreviewType'
import { VideoPreview } from './previews/VideoPreview' import { VideoPreview } from './previews/VideoPreview'
import { AudioPreview } from './previews/AudioPreview' import { AudioPreview } from './previews/AudioPreview'
import Loading from './Loading'
import FourOhFour from './FourOhFour' import FourOhFour from './FourOhFour'
import TextPreview from './previews/TextPreview' import TextPreview from './previews/TextPreview'
import MarkdownPreview from './previews/MarkdownPreview' import MarkdownPreview from './previews/MarkdownPreview'
@@ -161,13 +161,20 @@ const FileListing: FunctionComponent<{ query?: ParsedUrlQuery }> = ({ query }) =
setImageViewerVisibility(false) setImageViewerVisibility(false)
}} }}
customToolbar={toolbars => { customToolbar={toolbars => {
toolbars[0].render = <FontAwesomeIcon icon="plus" />
toolbars[1].render = <FontAwesomeIcon icon="minus" />
toolbars[2].render = <FontAwesomeIcon icon="arrow-left" />
toolbars[4].render = <FontAwesomeIcon icon="arrow-right" />
toolbars[9].render = <FontAwesomeIcon icon="download" />
return toolbars.concat([ return toolbars.concat([
{ {
key: 'copy', key: 'copy',
render: <FontAwesomeIcon icon={['far', 'copy']} />, render: <FontAwesomeIcon icon="copy" />,
onClick: i => { onClick: i => {
navigator.clipboard.writeText(i.downloadUrl ? i.downloadUrl : '') navigator.clipboard.writeText(
toast.success('Copied to clipboard.') 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)) { if (hasKey(extensions, fileExtension)) {
switch (extensions[fileExtension]) { switch (extensions[fileExtension]) {
case preview.image: case preview.image:
router.push(downloadUrl) return (
return <></> <div className="shadow bg-white rounded p-3 w-full">
{/* eslint-disable-next-line @next/next/no-img-element */}
<img className="mx-auto" src={downloadUrl} alt={fileName} />
</div>
)
case preview.text: case preview.text:
return <TextPreview file={resp} /> return <TextPreview file={resp} />
+1
View File
@@ -1,3 +1,4 @@
{ {
"baseUrl": "https://onedrive-vercel-index.vercel.app",
"title": "Spencer's OneDrive Index" "title": "Spencer's OneDrive Index"
} }
+14 -3
View File
@@ -14,9 +14,17 @@ import {
faFileAlt, faFileAlt,
faFile, faFile,
faFolder, faFolder,
faCopy
} from '@fortawesome/free-regular-svg-icons' } 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 { faGithub, faMarkdown } from '@fortawesome/free-brands-svg-icons'
import type { AppProps } from 'next/app' import type { AppProps } from 'next/app'
@@ -40,7 +48,10 @@ library.add(
faArrowLeft, faArrowLeft,
faArrowRight, faArrowRight,
faFileDownload, faFileDownload,
faCopy faCopy,
faPlus,
faMinus,
faDownload
) )
function MyApp({ Component, pageProps }: AppProps) { function MyApp({ Component, pageProps }: AppProps) {
+15 -2
View File
@@ -39,9 +39,10 @@ const getAccessToken = async () => {
} }
export default async function handler(req: NextApiRequest, res: NextApiResponse) { export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const { path = '/' } = req.query const { path = '/', raw = false } = req.query
if (path === '[...path]') { if (path === '[...path]') {
res.status(400).json({ error: 'Path query invalid.' }) res.status(400).json({ error: 'No path specified.' })
return
} }
if (typeof path === 'string') { 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 }) res.status(200).json({ path, data })
return return
} }
res.status(404).json({ error: 'Path query invalid.' }) res.status(404).json({ error: 'Path query invalid.' })
return
} }