Merge branch 'dev'

This commit is contained in:
Atridad Lahiji 2023-09-01 20:38:45 -06:00
commit a27ff9dfb6
No known key found for this signature in database
11 changed files with 67 additions and 102 deletions

View file

@ -17,7 +17,6 @@
"@clerk/nextjs": "^4.23.3",
"@neondatabase/serverless": "^0.6.0",
"@paralleldrive/cuid2": "^2.2.2",
"@react-email/components": "^0.0.7",
"@t3-oss/env-nextjs": "^0.6.1",
"@tanstack/react-query": "^4.33.0",
"@trpc/client": "10.38.1",
@ -45,7 +44,7 @@
"devDependencies": {
"@types/eslint": "^8.44.2",
"@types/json2csv": "^5.0.3",
"@types/node": "^20.5.7",
"@types/node": "^20.5.8",
"@types/react": "^18.2.21",
"@typescript-eslint/eslint-plugin": "^6.5.0",
"@typescript-eslint/parser": "^6.5.0",

44
pnpm-lock.yaml generated
View file

@ -98,8 +98,8 @@ devDependencies:
specifier: ^5.0.3
version: 5.0.3
'@types/node':
specifier: ^20.5.7
version: 20.5.7
specifier: ^20.5.8
version: 20.5.8
'@types/react':
specifier: ^18.2.21
version: 18.2.21
@ -1392,7 +1392,7 @@ packages:
resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==}
dependencies:
'@types/connect': 3.4.35
'@types/node': 20.5.7
'@types/node': 20.5.8
dev: false
/@types/cacheable-request@6.0.3:
@ -1400,14 +1400,14 @@ packages:
dependencies:
'@types/http-cache-semantics': 4.0.1
'@types/keyv': 3.1.4
'@types/node': 20.5.7
'@types/node': 20.5.8
'@types/responselike': 1.0.0
dev: false
/@types/connect@3.4.35:
resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==}
dependencies:
'@types/node': 20.5.7
'@types/node': 20.5.8
dev: false
/@types/cookies@0.7.7:
@ -1416,7 +1416,7 @@ packages:
'@types/connect': 3.4.35
'@types/express': 4.17.14
'@types/keygrip': 1.0.2
'@types/node': 20.5.7
'@types/node': 20.5.8
dev: false
/@types/eslint@8.44.2:
@ -1433,7 +1433,7 @@ packages:
/@types/express-serve-static-core@4.17.36:
resolution: {integrity: sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==}
dependencies:
'@types/node': 20.5.7
'@types/node': 20.5.8
'@types/qs': 6.9.8
'@types/range-parser': 1.2.4
'@types/send': 0.17.1
@ -1463,7 +1463,7 @@ packages:
/@types/json2csv@5.0.3:
resolution: {integrity: sha512-ZJEv6SzhPhgpBpxZU4n/TZekbZqI4EcyXXRwms1lAITG2kIAtj85PfNYafUOY1zy8bWs5ujaub0GU4copaA0sw==}
dependencies:
'@types/node': 20.5.7
'@types/node': 20.5.8
dev: true
/@types/json5@0.0.29:
@ -1477,7 +1477,7 @@ packages:
/@types/keyv@3.1.4:
resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
dependencies:
'@types/node': 20.5.7
'@types/node': 20.5.8
dev: false
/@types/mime@1.3.2:
@ -1491,7 +1491,7 @@ packages:
/@types/node-fetch@2.6.2:
resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==}
dependencies:
'@types/node': 20.5.7
'@types/node': 20.5.8
form-data: 3.0.1
dev: false
@ -1503,8 +1503,8 @@ packages:
resolution: {integrity: sha512-vmYJF0REqDyyU0gviezF/KHq/fYaUbFhkcNbQCuPGFQj6VTbXuHZoxs/Y7mutWe73C8AC6l9fFu8mSYiBAqkGA==}
dev: false
/@types/node@20.5.7:
resolution: {integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==}
/@types/node@20.5.8:
resolution: {integrity: sha512-eajsR9aeljqNhK028VG0Wuw+OaY5LLxYmxeoXynIoE6jannr9/Ucd1LL0hSSoafk5LTYG+FfqsyGt81Q6Zkybw==}
/@types/normalize-package-data@2.4.1:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
@ -1513,7 +1513,7 @@ packages:
/@types/pg@8.6.6:
resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==}
dependencies:
'@types/node': 20.5.7
'@types/node': 20.5.8
pg-protocol: 1.6.0
pg-types: 2.2.0
dev: false
@ -1541,7 +1541,7 @@ packages:
/@types/responselike@1.0.0:
resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
dependencies:
'@types/node': 20.5.7
'@types/node': 20.5.8
dev: false
/@types/scheduler@0.16.3:
@ -1556,7 +1556,7 @@ packages:
resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==}
dependencies:
'@types/mime': 1.3.2
'@types/node': 20.5.7
'@types/node': 20.5.8
dev: false
/@types/serve-static@1.15.2:
@ -1564,7 +1564,7 @@ packages:
dependencies:
'@types/http-errors': 2.0.1
'@types/mime': 3.0.1
'@types/node': 20.5.7
'@types/node': 20.5.8
dev: false
/@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2):
@ -1943,7 +1943,7 @@ packages:
dependencies:
browserslist: 4.21.10
caniuse-lite: 1.0.30001525
fraction.js: 4.3.4
fraction.js: 4.3.6
normalize-range: 0.1.2
picocolors: 1.0.0
postcss: 8.4.29
@ -2044,7 +2044,7 @@ packages:
hasBin: true
dependencies:
caniuse-lite: 1.0.30001525
electron-to-chromium: 1.4.506
electron-to-chromium: 1.4.508
node-releases: 2.0.13
update-browserslist-db: 1.0.11(browserslist@4.21.10)
dev: false
@ -2687,8 +2687,8 @@ packages:
semver: 7.5.4
dev: false
/electron-to-chromium@1.4.506:
resolution: {integrity: sha512-xxGct4GPAKSRlrLBtJxJFYy74W11zX6PO9GyHgl/U+2s3Dp0ZEwAklDfNHXOWcvH7zWMpsmgbR0ggEuaYAVvHA==}
/electron-to-chromium@1.4.508:
resolution: {integrity: sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==}
dev: false
/emoji-regex@9.2.2:
@ -3352,8 +3352,8 @@ packages:
mime-types: 2.1.35
dev: false
/fraction.js@4.3.4:
resolution: {integrity: sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==}
/fraction.js@4.3.6:
resolution: {integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==}
dev: false
/fs-constants@1.0.0:

View file

@ -6,8 +6,7 @@ import packagejson from "../../../package.json";
const Footer = () => {
return (
<footer className="footer footer-center h-12 p-2 bg-base-100 text-base-content">
<div>
<p>
<div className="block">
Made with{" "}
<GiTechnoHeart className="inline-block text-primary text-lg animate-pulse" />{" "}
by{" "}
@ -22,13 +21,12 @@ const Footer = () => {
-{" "}
<a
className="link link-primary link-hover"
href={`https://github.com/atridadl/sprintpadawan/releases/tag/${packagejson.version}`}
href={`https://github.com/atridadl/Atash/releases/tag/${packagejson.version}`}
rel="noreferrer"
target="_blank"
>
v{packagejson.version}
</a>
</p>
</div>
</footer>
);

View file

@ -5,27 +5,30 @@ import Image from "next/image";
import Link from "next/link";
import { useRouter, usePathname } from "next/navigation";
import { env } from "@/env.mjs";
import Loading from "./Loading";
interface NavbarProps {
title: string;
}
export const dynamic = "force-dynamic";
const Navbar = ({ title }: NavbarProps) => {
const { isSignedIn } = useUser();
const { isLoaded, isSignedIn } = useUser();
const router = useRouter();
const pathname = usePathname();
const navigationMenu = () => {
if (pathname !== "/dashboard" && isSignedIn) {
return (
<Link className="btn btn-secondary btn-outline mx-2" href="/dashboard">
<Link className="btn btn-primary btn-outline mx-2" href="/dashboard">
Dashboard
</Link>
);
} else if (!isSignedIn) {
return (
<button
className="btn btn-secondary"
className="btn btn-primary"
onClick={() => void router.push("/sign-in")}
>
Sign In
@ -57,9 +60,8 @@ const Navbar = ({ title }: NavbarProps) => {
</Link>
</div>
{navigationMenu()}
<UserButton afterSignOutUrl="/" />
{!isLoaded ? <Loading /> : navigationMenu()}
<UserButton afterSignOutUrl="/" userProfileMode="modal" />
</nav>
);
};

View file

@ -1,7 +1,11 @@
"use client";
const Loading = () => {
return <Loading />;
return (
<div className="flex items-center justify-center">
<span className="loading loading-dots loading-lg"></span>
</div>
);
};
export default Loading;

View file

@ -2,10 +2,9 @@
import Link from "next/link";
import { configureAbly, useChannel } from "@ably-labs/react-hooks";
import { useEffect, useState } from "react";
import { useState } from "react";
import { IoEnterOutline, IoTrashBinOutline } from "react-icons/io5";
import { env } from "@/env.mjs";
import { useOrganization } from "@clerk/nextjs";
import { trpc } from "../_trpc/client";
import Loading from "./Loading";
@ -14,8 +13,6 @@ export const revalidate = 0;
export const fetchCache = "force-no-store";
const RoomList = ({ userId }: { userId: string }) => {
const { organization } = useOrganization();
configureAbly({
key: env.NEXT_PUBLIC_ABLY_PUBLIC_KEY,
clientId: userId,
@ -25,7 +22,7 @@ const RoomList = ({ userId }: { userId: string }) => {
});
useChannel(
`${env.NEXT_PUBLIC_APP_ENV}-${organization ? organization.id : userId}`,
`${env.NEXT_PUBLIC_APP_ENV}-${userId}`,
() => void refetchRoomsFromDb()
);
@ -50,10 +47,6 @@ const RoomList = ({ userId }: { userId: string }) => {
deleteRoom.mutate({ id: roomId });
};
useEffect(() => {
void refetchRoomsFromDb();
}, [organization]);
return (
<div className="flex flex-col items-center justify-center gap-8">
{/* Modal for Adding Rooms */}

View file

@ -6,6 +6,10 @@ import { createTRPCContext } from "@/server/trpc/trpc";
export const runtime = "edge";
export const preferredRegion = ["pdx1"];
export const dynamic = "force-dynamic";
export const revalidate = 0;
export const fetchCache = "force-no-store";
const handler = (req: Request) =>
fetchRequestHandler({
endpoint: "/api/trpc",

View file

@ -19,7 +19,7 @@ export default function RootLayout({
<html lang="en" className="h-[100%] w-[100%] fixed overflow-y-auto">
<body className="h-[100%] w-[100%] fixed overflow-y-auto">
<ClerkLoaded>
<Header title="Sprint Padawan" />
<Header title={metadata.title} />
<div className="flex flex-row items-center justify-center min-h-[calc(100%-114px)]">
<Provider>{children}</Provider>
</div>

View file

@ -1,18 +1,8 @@
export const dynamic = "force-static";
const Home = () => {
export default function Home() {
return (
<div className="flex flex-col text-center items-center justify-center px-4 py-16 gap-4">
<HomePageBody />
</div>
);
};
export default Home;
const HomePageBody = () => {
return (
<>
<h1 className="text-3xl sm:text-6xl font-bold">
Sprint{" "}
<span className="bg-gradient-to-br from-pink-600 to-cyan-400 bg-clip-text text-transparent box-decoration-clone">
@ -47,6 +37,6 @@ const HomePageBody = () => {
</ul>
</div>
</div>
</>
</div>
);
};
}

View file

@ -31,7 +31,6 @@ export const roomRouter = createTRPCRouter({
const success = room.length > 0;
if (room) {
await invalidateCache(`kv_roomcount`);
await invalidateCache(`kv_roomlist_${ctx.auth.userId}`);
await publishToChannel(
@ -39,12 +38,6 @@ export const roomRouter = createTRPCRouter({
EventTypes.ROOM_LIST_UPDATE,
JSON.stringify(room)
);
await publishToChannel(
`stats`,
EventTypes.STATS_UPDATE,
JSON.stringify(room)
);
}
return success;
}),

View file

@ -1,21 +1,3 @@
import { parse } from "json2csv";
export function downloadCSV(
data: Record<string, unknown>[],
filename: string
): void {
const csv = parse(data);
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;
}