diff --git a/package.json b/package.json index 96cdd3b..e6b90c7 100644 --- a/package.json +++ b/package.json @@ -28,9 +28,9 @@ "@upstash/ratelimit": "^0.4.4", "@upstash/redis": "^1.22.0", "autoprefixer": "^10.4.15", + "csv42": "^4.0.0", "dotenv": "^16.3.1", "drizzle-orm": "^0.28.5", - "json2csv": "6.0.0-alpha.2", "next": "^13.4.19", "nextjs-cors": "^2.1.2", "postcss": "^8.4.29", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3ec743..fbeccbb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,15 +50,15 @@ dependencies: autoprefixer: specifier: ^10.4.15 version: 10.4.15(postcss@8.4.29) + csv42: + specifier: ^4.0.0 + version: 4.0.0 dotenv: specifier: ^16.3.1 version: 16.3.1 drizzle-orm: specifier: ^0.28.5 version: 0.28.5(@neondatabase/serverless@0.6.0)(pg@8.11.3) - json2csv: - specifier: 6.0.0-alpha.2 - version: 6.0.0-alpha.2 next: specifier: ^13.4.19 version: 13.4.19(react-dom@18.2.0)(react@18.2.0) @@ -1122,10 +1122,6 @@ packages: engines: {node: '>=10'} dev: false - /@streamparser/json@0.0.6: - resolution: {integrity: sha512-vL9EVn/v+OhZ+Wcs6O4iKE9EUpwHUqHmCtNUMWjqp+6dr85+XPOSGTEsqYNq1Vn04uk9SWlOVmx9J48ggJVT2Q==} - dev: false - /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} dependencies: @@ -2114,11 +2110,6 @@ packages: engines: {node: '>= 6'} dev: false - /commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - dev: false - /commander@9.4.1: resolution: {integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==} engines: {node: ^12.20.0 || >=14} @@ -2201,6 +2192,10 @@ packages: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: true + /csv42@4.0.0: + resolution: {integrity: sha512-9sHplbzkaJ1MIbitR+w381TjUl2xFWVDby0bvbf1Qg5EYHNBJEQmFRuA/3tmO/sdzlgA2O1wpTulXDoo3Z1rwQ==} + dev: false + /d@1.0.1: resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dependencies: @@ -3835,16 +3830,6 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json2csv@6.0.0-alpha.2: - resolution: {integrity: sha512-nJ3oP6QxN8z69IT1HmrJdfVxhU1kLTBVgMfRnNZc37YEY+jZ4nU27rBGxT4vaqM/KUCavLRhntmTuBFqZLBUcA==} - engines: {node: '>= 12', npm: '>= 6.13.0'} - hasBin: true - dependencies: - '@streamparser/json': 0.0.6 - commander: 6.2.1 - lodash.get: 4.4.2 - dev: false - /json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -3936,10 +3921,6 @@ packages: p-locate: 5.0.0 dev: true - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: false - /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true diff --git a/src/app/_components/VoteUI.tsx b/src/app/_components/VoteUI.tsx index fe7853f..50b8cc0 100644 --- a/src/app/_components/VoteUI.tsx +++ b/src/app/_components/VoteUI.tsx @@ -21,11 +21,10 @@ import Link from "next/link"; import { FaShieldAlt } from "react-icons/fa"; import { RiVipCrownFill } from "react-icons/ri"; import { env } from "@/env.mjs"; -import { isAdmin, isVIP } from "@/utils/helpers"; +import { isAdmin, isVIP, jsonToCsv } from "@/utils/helpers"; import type { PresenceItem } from "@/utils/types"; import { trpc } from "@/app/_trpc/client"; import Loading from "@/app/_components/Loading"; -import { parse } from "json2csv"; import { User } from "@clerk/nextjs/dist/types/server"; export const dynamic = "force-dynamic"; @@ -162,16 +161,7 @@ const VoteUI = ({ user }: { user: Partial }) => { }), }); - const csv = parse(jsonObject); - const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" }); - const url = URL.createObjectURL(blob); - const link = document.createElement("a"); - link.setAttribute("href", url); - link.setAttribute("download", `sp_${roomId}.csv`); - link.style.visibility = "hidden"; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); + jsonToCsv(jsonObject, `sp_${roomId}.csv`); } }; diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index 1a11ff9..eb8a04f 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -4,9 +4,8 @@ import { GiStarFormation } from "react-icons/gi"; import { isAdmin, isVIP } from "@/utils/helpers"; import { currentUser } from "@clerk/nextjs"; -export const dynamic = "force-dynamic"; -export const revalidate = 0; -export const fetchCache = "force-no-store"; +export const runtime = "edge"; +export const preferredRegion = ["pdx1"]; export default async function Dashboard() { const user = await currentUser(); diff --git a/src/app/room/[id]/page.tsx b/src/app/room/[id]/page.tsx index b0a6fd7..5bba21f 100644 --- a/src/app/room/[id]/page.tsx +++ b/src/app/room/[id]/page.tsx @@ -2,7 +2,8 @@ import { currentUser } from "@clerk/nextjs"; import Loading from "@/app/_components/Loading"; import VoteUI from "@/app/_components/VoteUI"; -export const dynamic = "force-dynamic"; +export const runtime = "edge"; +export const preferredRegion = ["pdx1"]; export default async function Room() { const user = await currentUser(); diff --git a/src/utils/helpers.ts b/src/utils/helpers.ts index 1c2e9c7..f9dad9a 100644 --- a/src/utils/helpers.ts +++ b/src/utils/helpers.ts @@ -1,3 +1,19 @@ +import { json2csv } from "csv42"; + +export function jsonToCsv(jsonObject: Array, fileName: string) { + const csv = json2csv(jsonObject); + const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" }); + + const url = URL.createObjectURL(blob); + const link = document.createElement("a"); + link.setAttribute("href", url); + link.setAttribute("download", fileName); + link.style.visibility = "hidden"; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); +} + export function isAdmin(meta: UserPublicMetadata | undefined) { return (meta?.isAdmin as boolean | undefined) || false; }