diff --git a/package-lock.json b/package-lock.json index 2fa252a..26294ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,11 @@ "version": "0.1.0", "dependencies": { "@tanstack/react-query": "^5.20.2", + "fnv-plus": "^1.3.1", "million": "^3.0.3", "minisearch": "^6.3.0", "next": "14.1.0", + "qrcode.react": "^3.1.0", "react": "^18", "react-dom": "^18", "react-icons": "^5.0.1", @@ -23,6 +25,7 @@ "devDependencies": { "@redux-devtools/extension": "^3.3.0", "@types/file-saver": "^2.0.7", + "@types/fnv-plus": "^1.3.2", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", @@ -1042,6 +1045,12 @@ "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", "dev": true }, + "node_modules/@types/fnv-plus": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/fnv-plus/-/fnv-plus-1.3.2.tgz", + "integrity": "sha512-Bgr5yn2dph2q8HZKDS002Pob6vaRTRfhqN9E+TOhjKsJvnfZXULPR3ihH8dL5ZjgxbNhqhTn9hijpbAMPtKZzw==", + "dev": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -2654,6 +2663,11 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, + "node_modules/fnv-plus": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/fnv-plus/-/fnv-plus-1.3.1.tgz", + "integrity": "sha512-Gz1EvfOneuFfk4yG458dJ3TLJ7gV19q3OM/vVvvHf7eT02Hm1DleB4edsia6ahbKgAYxO9gvyQ1ioWZR+a00Yw==" + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -4340,6 +4354,14 @@ "node": ">=6" } }, + "node_modules/qrcode.react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", + "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", diff --git a/package.json b/package.json index e7ddcd5..cd48a47 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,11 @@ }, "dependencies": { "@tanstack/react-query": "^5.20.2", + "fnv-plus": "^1.3.1", "million": "^3.0.3", "minisearch": "^6.3.0", "next": "14.1.0", + "qrcode.react": "^3.1.0", "react": "^18", "react-dom": "^18", "react-icons": "^5.0.1", @@ -25,6 +27,7 @@ "devDependencies": { "@redux-devtools/extension": "^3.3.0", "@types/file-saver": "^2.0.7", + "@types/fnv-plus": "^1.3.2", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", diff --git a/src/app/document/view/[slug]/DocumentViewer.tsx b/src/app/document/view/[slug]/DocumentViewer.tsx index bbd579a..0aeb6f2 100644 --- a/src/app/document/view/[slug]/DocumentViewer.tsx +++ b/src/app/document/view/[slug]/DocumentViewer.tsx @@ -14,6 +14,7 @@ import generateHash from '@/app/utils/hash' import { Suspense } from 'react' import { loadDocument } from '@/app/db/loaders' import { useSuspenseQuery } from '@tanstack/react-query' +import QRCode from 'qrcode.react' const zillaSlab = Zilla_Slab({ subsets: ['latin'], weight: ['500'] }) @@ -48,15 +49,20 @@ const DocumentViewer = ({ slug }: Readonly<{ slug: string }>) => { return (
-

- {title} -

+
+
+ +
+

+ {title} +

+

diff --git a/src/app/document/view/[slug]/VersionChooser.tsx b/src/app/document/view/[slug]/VersionChooser.tsx index 1dbfe5e..e3aee65 100644 --- a/src/app/document/view/[slug]/VersionChooser.tsx +++ b/src/app/document/view/[slug]/VersionChooser.tsx @@ -6,6 +6,7 @@ import { loadAuthors } from '@/app/db/loaders' import { useSuspenseQuery } from '@tanstack/react-query' import { epoch2date } from '@/app/utils/epoch2datestring' import { toast } from 'react-toastify' +import generateHash from '@/app/utils/hash' const VersionChooser = ({ doc, @@ -26,7 +27,7 @@ const VersionChooser = ({ const fileEnding = file === 'other' ? '' : `.${file}` const [selectedRevision, setSelectedRevision] = useState(latest) // Initialize the selected revision with the latest revision - const notifyCopied = () => toast('BibTeX copied to clipboard!') + const notifyCopied = (content: string) => toast.success(`${content} copied to clipboard!`) const handleClick = () => { const bibtex = `@article{ @@ -45,7 +46,13 @@ const VersionChooser = ({ url={${window.location.href}} }` navigator.clipboard.writeText(bibtex) - notifyCopied() + notifyCopied('BibTeX') + } + + const handleCopy = () => { + const id = doc.citation ? doc.citation : generateHash(slug) + navigator.clipboard.writeText(`eeXiv:${id}`) + notifyCopied('Citation') } return ( @@ -75,6 +82,9 @@ const VersionChooser = ({ +