diff --git a/middleware/app/api/routes/upload.py b/middleware/app/api/routes/upload.py index a4abeab..60832a6 100644 --- a/middleware/app/api/routes/upload.py +++ b/middleware/app/api/routes/upload.py @@ -321,7 +321,7 @@ def post_upload_return_link_qr( return { "url": file_url, "QR": qr_download_url, - "expiration_date": formatted_expires_at, + "expiration_date": expires_at.isoformat(), "downloads_allowed": str(upload_metadata["max_download"]), } diff --git a/ui/package-lock.json b/ui/package-lock.json index 67e2086..aa8e2fb 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -29,6 +29,7 @@ "axios": "^1.6.7", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "date-fns-tz": "^3.1.3", "file-saver": "^2.0.5", "framer-motion": "^11.1.7", "jszip": "^3.10.1", @@ -3701,6 +3702,24 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-fns-tz": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-3.1.3.tgz", + "integrity": "sha512-ZfbMu+nbzW0mEzC8VZrLiSWvUIaI3aRHeq33mTe7Y38UctKukgqPR4nTDwcwS4d64Gf8GghnVsroBuMY3eiTeA==", + "peerDependencies": { + "date-fns": "^3.0.0" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", diff --git a/ui/package.json b/ui/package.json index b136500..3a929c0 100644 --- a/ui/package.json +++ b/ui/package.json @@ -35,6 +35,7 @@ "axios": "^1.6.7", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "date-fns-tz": "^3.1.3", "file-saver": "^2.0.5", "framer-motion": "^11.1.7", "jszip": "^3.10.1", diff --git a/ui/src/app/(pages)/(protected)/history/page.tsx b/ui/src/app/(pages)/(protected)/history/page.tsx index 3b07c0a..5f010e9 100644 --- a/ui/src/app/(pages)/(protected)/history/page.tsx +++ b/ui/src/app/(pages)/(protected)/history/page.tsx @@ -109,7 +109,10 @@ function HistoryPage() { const responseData = await historyResponse.json() for (const fileName of responseData) { - const created = fileName['created_at'] + let created = fileName['created_at'] + const userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone + created = created.toLocaleString('en-US', { timeZone: userTimezone }) + const date = new Date(created) const options = { year: '2-digit', diff --git a/ui/src/app/(pages)/page.tsx b/ui/src/app/(pages)/page.tsx index 7f04412..c1bbe34 100644 --- a/ui/src/app/(pages)/page.tsx +++ b/ui/src/app/(pages)/page.tsx @@ -35,6 +35,7 @@ import { UploadIcon, } from '@radix-ui/react-icons' import axios from 'axios' +import { formatInTimeZone } from 'date-fns-tz' import { motion } from 'framer-motion' import Image from 'next/image' import { useRouter } from 'next/navigation' @@ -385,9 +386,15 @@ export default function Home() { const data = await postUploadResponse.json() const shareURL = data.url const shareQR = data.QR - const expirationDate = data.expiration_date const downloadsAllowed = data.downloads_allowed + const userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone + const expirationDate = formatInTimeZone( + data.expiration_date, + userTimezone, + 'yyyy-MM-dd HH:mm:ss zzz', + ) + return { shareURL, shareQR, expirationDate, downloadsAllowed } } @@ -477,7 +484,7 @@ export default function Home() { duration: 0.5, ease: [0.4, 0.0, 0.2, 1], }} - className=" px-4 text-sm lg:text-lg font-bold text-white dark:text-white max-w-xl leading-relaxed lg:leading-snug text-center mx-auto " + className="px-4 text-xs lg:text-lg font-bold text-white dark:text-white max-w-xl leading-relaxed lg:leading-snug text-center mx-auto " > Experience seamless file sharing with ByteShare.