chore: merged main

This commit is contained in:
Catalin Pit
2023-11-23 12:05:28 +02:00
3 changed files with 27 additions and 16 deletions

View File

@@ -1,7 +1,7 @@
'use client'; 'use client';
import type { HTMLAttributes } from 'react'; import type { HTMLAttributes } from 'react';
import { useState } from 'react'; import { useEffect, useState } from 'react';
import { Search } from 'lucide-react'; import { Search } from 'lucide-react';
@@ -15,11 +15,14 @@ export type DesktopNavProps = HTMLAttributes<HTMLDivElement>;
export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { export const DesktopNav = ({ className, ...props }: DesktopNavProps) => {
// const pathname = usePathname(); // const pathname = usePathname();
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const [modifierKey, setModifierKey] = useState(() => 'Ctrl');
const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : 'unknown'; useEffect(() => {
const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : 'unknown';
const isMacOS = /Macintosh|Mac\s+OS\s+X/i.test(userAgent);
const isMacOS = /Macintosh|Mac\s+OS\s+X/i.test(userAgent); setModifierKey(isMacOS ? '⌘' : 'Ctrl');
const modifierKey = isMacOS ? '⌘' : 'Ctrl'; }, []);
return ( return (
<div <div
@@ -39,7 +42,7 @@ export const DesktopNav = ({ className, ...props }: DesktopNavProps) => {
</div> </div>
<div> <div>
<div className="text-muted-foreground bg-muted rounded-md px-1.5 py-0.5 font-mono text-xs"> <div className="text-muted-foreground bg-muted flex items-center rounded-md px-1.5 py-0.5 text-xs tracking-wider">
{modifierKey}+K {modifierKey}+K
</div> </div>
</div> </div>

View File

@@ -1,9 +1,12 @@
/// <reference types="../types/next-auth.d.ts" />
import { PrismaAdapter } from '@next-auth/prisma-adapter'; import { PrismaAdapter } from '@next-auth/prisma-adapter';
import { compare } from 'bcrypt'; import { compare } from 'bcrypt';
import { DateTime } from 'luxon'; import { DateTime } from 'luxon';
import { AuthOptions, Session, User } from 'next-auth'; import type { AuthOptions, Session, User } from 'next-auth';
import type { JWT } from 'next-auth/jwt';
import CredentialsProvider from 'next-auth/providers/credentials'; import CredentialsProvider from 'next-auth/providers/credentials';
import GoogleProvider, { GoogleProfile } from 'next-auth/providers/google'; import type { GoogleProfile } from 'next-auth/providers/google';
import GoogleProvider from 'next-auth/providers/google';
import { prisma } from '@documenso/prisma'; import { prisma } from '@documenso/prisma';
@@ -48,6 +51,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = {
id: Number(user.id), id: Number(user.id),
email: user.email, email: user.email,
name: user.name, name: user.name,
emailVerified: user.emailVerified?.toISOString() ?? null,
} satisfies User; } satisfies User;
}, },
}), }),
@@ -61,6 +65,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = {
id: Number(profile.sub), id: Number(profile.sub),
name: profile.name || `${profile.given_name} ${profile.family_name}`.trim(), name: profile.name || `${profile.given_name} ${profile.family_name}`.trim(),
email: profile.email, email: profile.email,
emailVerified: profile.email_verified ? new Date().toISOString() : null,
}; };
}, },
}), }),
@@ -70,9 +75,10 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = {
const merged = { const merged = {
...token, ...token,
...user, ...user,
}; emailVerified: user?.emailVerified ? new Date(user.emailVerified).toISOString() : null,
} satisfies JWT;
if (!merged.email) { if (!merged.email || typeof merged.emailVerified !== 'string') {
const userId = Number(merged.id ?? token.sub); const userId = Number(merged.id ?? token.sub);
const retrieved = await prisma.user.findFirst({ const retrieved = await prisma.user.findFirst({
@@ -88,7 +94,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = {
merged.id = retrieved.id; merged.id = retrieved.id;
merged.name = retrieved.name; merged.name = retrieved.name;
merged.email = retrieved.email; merged.email = retrieved.email;
merged.emailVerified = retrieved.emailVerified; merged.emailVerified = retrieved.emailVerified?.toISOString() ?? null;
} }
if ( if (
@@ -98,7 +104,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = {
) { ) {
merged.lastSignedIn = new Date().toISOString(); merged.lastSignedIn = new Date().toISOString();
await prisma.user.update({ const user = await prisma.user.update({
where: { where: {
id: Number(merged.id), id: Number(merged.id),
}, },
@@ -106,6 +112,8 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = {
lastSignedIn: merged.lastSignedIn, lastSignedIn: merged.lastSignedIn,
}, },
}); });
merged.emailVerified = user.emailVerified?.toISOString() ?? null;
} }
return { return {
@@ -114,7 +122,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = {
email: merged.email, email: merged.email,
lastSignedIn: merged.lastSignedIn, lastSignedIn: merged.lastSignedIn,
emailVerified: merged.emailVerified, emailVerified: merged.emailVerified,
}; } satisfies JWT;
}, },
session({ token, session }) { session({ token, session }) {
@@ -125,8 +133,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = {
id: Number(token.id), id: Number(token.id),
name: token.name, name: token.name,
email: token.email, email: token.email,
emailVerified: emailVerified: token.emailVerified ?? null,
typeof token.emailVerified === 'string' ? new Date(token.emailVerified) : null,
}, },
} satisfies Session; } satisfies Session;
} }

View File

@@ -6,11 +6,11 @@ declare module 'next-auth' {
user: User; user: User;
} }
interface User extends Omit<DefaultUser, 'id' | 'image'> { interface User extends Omit<DefaultUser, 'id' | 'image' | 'emailVerified'> {
id: PrismaUser['id']; id: PrismaUser['id'];
name?: PrismaUser['name']; name?: PrismaUser['name'];
email?: PrismaUser['email']; email?: PrismaUser['email'];
emailVerified?: PrismaUser['emailVerified']; emailVerified?: string | null;
} }
} }
@@ -19,6 +19,7 @@ declare module 'next-auth/jwt' {
id: string | number; id: string | number;
name?: string | null; name?: string | null;
email: string | null; email: string | null;
emailVerified?: string | null;
lastSignedIn?: string | null; lastSignedIn?: string | null;
} }
} }