mirror of
https://github.com/LukeHagar/better-auth.git
synced 2025-12-06 12:27:44 +00:00
* fix(email-verification): improve email verification logic to check session and user email consistency (#3042) * docs(passkey): Fixed signIn passkey props (#3014) callbackURL doesn't exist. * fix(email-otp): auto-verify on email otp reset (#3022) * fix: delete user should respect freshAge config (#3075) * fix: delete user needs to enforced through fresh age * cleanup * cleanup * chore(org): add comments explaining what shimContext does (#3098) * feat: Allow passing `id` in DB hook `create` (#3048) * feat(database-hooks): Allow passing `id` in DB hook `create` It's the same to using a custom `idGenerator`, except configurable by the database hook which would in theory provide more data. A use-case is to generate the id based on user info in the user before DB hook. Solves https://discord.com/channels/1288403910284935179/1379190465588367540/1384217435535835216 * chore: lint * fix: tests failing * docs: basic errs with svg props (#3102) * docs: corrected github user email scope name (#3099) * docs: corrected github user email scope name * docs: cubic dev suggestion * fix: use correct refresh token endpoint for github (#3095) * chore: fix typo in authorize comment (#3106) * docs: fix session parameter spelling (#3108) * docs: input field usage on additional fields (#2991) * fix: onLinkAccount trigger on phone number verification (#3007) * fix: expose headers override in jwt plugin (#3019) * expose headers override in jwt plugin * clean up * lint * fix(expo): remove duplicated trusted origins * feat: link account with idToken (#1830) * add idToken to link account * add docs * Implemented linking accounts based on idToken * fix: tests * docs: prevent diff * docs: prevent diff --------- Co-authored-by: kzlar <120426485+kzlar@users.noreply.github.com> * feat: add Hugging Face provider (#3089) * feat: add huggingface provider * Add hugging face to doc * chore: update hugging face logo * chore: release v1.2.10 * docs: fix builder failing to open * docs(NextJS): Improve middleware example to be more secure (#3135) * docs(NextJS): Improve middleware example to be more secure Users can skim code without reading the text, and LLMs can read code and miss-understand context correctly. Our current middleware example only checks for existence of a cookie, and doesn't validate it. While we do warn users this isn't secure, some users has raised concern in a Github issue saying it's not obvious enough for users who skim. Also we don't provide examples on how to authenticate users on each route, we only show middleware optimistic check examples. * Update docs/content/docs/integrations/next.mdx Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --------- Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> * fix(username): log the correct username (#3127) * docs: fix typo in plugin (#3122) * typo * typo * typo * typo * typo * docs: fix typos on mcp guide (#3146) * docs: update TanStack Start integration guide (#3142) * fix(sveltekit): only dynamic import $app/environment once (#3152) Co-authored-by: Work <work@Jasons-MacBook-Pro.local> * docs: fix typo in oauth proxy documentation (#3151) * blog: seed round announcement (#3168) * init * cleanup * fix seed round announcemnt * fix seed round announcemnt * seed round blog * add nav mobile * fix typo * Update docs/content/blogs/seed-round.mdx Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> * Update docs/app/blog/[[...slug]]/page.tsx Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> * Update docs/app/blog/[[...slug]]/page.tsx Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> * update og * cleanup --------- Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> * docs: fix email address * refactor(mongo-adapter): migrate to createAdapter (#3170) In the past we didn't have mongoDb adapter move over to createAdapter since we've seen users running into issues. However some time ago I've merged a PR which I believe fixed the issue, and after testing the org plugin with the mongo adapter that uses `createAdapter` I don't see any issues. * fix(api-key): update should only use by ID * docs: fix blog page layout (#3176) * fix/blog-page-layouts * clean up * docs: update contact email in seed round blog * init * cleanup * feat(better-auth): add test utilities and update dependencies - Introduced a new test utility module in `src/test-utils/index.ts` for better testing support. - Updated `package.json` to include new test utilities in the build configuration. - Added `oauth2-mock-server` dependency to `pnpm-lock.yaml` and `sso/package.json` for OAuth2 testing. - Enhanced the SSO provider registration process with improved error handling. * docs update --------- Co-authored-by: Maxwell <145994855+ping-maxwell@users.noreply.github.com> Co-authored-by: KinfeMichael Tariku <65047246+Kinfe123@users.noreply.github.com> Co-authored-by: Undefined Ninja <74867549+0xCodeMaieutics@users.noreply.github.com> Co-authored-by: artemoire <18062266+artemoire@users.noreply.github.com> Co-authored-by: reslear <12596485+reslear@users.noreply.github.com> Co-authored-by: kzlar <120426485+kzlar@users.noreply.github.com> Co-authored-by: Eliott C. <coyotte508@protonmail.com> Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> Co-authored-by: Alessandro Bortolin <bortolin.alessandro@outlook.it> Co-authored-by: Lakshya Thakur <lapstjup@gmail.com> Co-authored-by: Usman S. (Max Programming) <51731966+max-programming@users.noreply.github.com> Co-authored-by: Jason Venable <jason.venable@gmail.com> Co-authored-by: Work <work@Jasons-MacBook-Pro.local> Co-authored-by: Dan McGrath <daniel.mcgrath9@gmail.com>
229 lines
5.6 KiB
TypeScript
229 lines
5.6 KiB
TypeScript
"use client";
|
|
import { ChevronRight, Menu } from "lucide-react";
|
|
import Link from "next/link";
|
|
import { Fragment, createContext, useContext, useState } from "react";
|
|
import {
|
|
Accordion,
|
|
AccordionContent,
|
|
AccordionItem,
|
|
AccordionTrigger,
|
|
} from "@/components/ui/accordion";
|
|
import { contents, examples } from "./sidebar-content";
|
|
import { usePathname } from "next/navigation";
|
|
import { cn } from "@/lib/utils";
|
|
|
|
interface NavbarMobileContextProps {
|
|
isOpen: boolean;
|
|
toggleNavbar: () => void;
|
|
isDocsOpen: boolean;
|
|
toggleDocsNavbar: () => void;
|
|
}
|
|
|
|
const NavbarContext = createContext<NavbarMobileContextProps | undefined>(
|
|
undefined,
|
|
);
|
|
|
|
export const NavbarProvider = ({ children }: { children: React.ReactNode }) => {
|
|
const [isOpen, setIsOpen] = useState(false);
|
|
const [isDocsOpen, setIsDocsOpen] = useState(false);
|
|
|
|
const toggleNavbar = () => {
|
|
setIsOpen((prevIsOpen) => !prevIsOpen);
|
|
};
|
|
const toggleDocsNavbar = () => {
|
|
setIsDocsOpen((prevIsOpen) => !prevIsOpen);
|
|
};
|
|
// @ts-ignore
|
|
return (
|
|
<NavbarContext.Provider
|
|
value={{ isOpen, toggleNavbar, isDocsOpen, toggleDocsNavbar }}
|
|
>
|
|
{children}
|
|
</NavbarContext.Provider>
|
|
);
|
|
};
|
|
|
|
export const useNavbarMobile = (): NavbarMobileContextProps => {
|
|
const context = useContext(NavbarContext);
|
|
if (!context) {
|
|
throw new Error(
|
|
"useNavbarMobile must be used within a NavbarMobileProvider",
|
|
);
|
|
}
|
|
return context;
|
|
};
|
|
|
|
export const NavbarMobileBtn: React.FC = () => {
|
|
const { toggleNavbar } = useNavbarMobile();
|
|
|
|
return (
|
|
<div className="flex items-center">
|
|
<button
|
|
className="overflow-hidden px-2.5 block md:hidden"
|
|
onClick={() => {
|
|
toggleNavbar();
|
|
}}
|
|
>
|
|
<Menu className="size-5" />
|
|
</button>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export const NavbarMobile = () => {
|
|
const { isOpen, toggleNavbar } = useNavbarMobile();
|
|
const pathname = usePathname();
|
|
const isDocs = pathname.startsWith("/docs");
|
|
|
|
return (
|
|
<div
|
|
className={cn(
|
|
"fixed top-[50px] inset-x-0 transform-gpu z-[100] bg-background grid grid-rows-[0fr] duration-300 transition-all md:hidden",
|
|
isOpen &&
|
|
"shadow-lg border-b border-[rgba(255,255,255,.1)] grid-rows-[1fr]",
|
|
)}
|
|
>
|
|
<div
|
|
className={cn(
|
|
"px-9 min-h-0 overflow-y-auto max-h-[80vh] divide-y [mask-image:linear-gradient(to_top,transparent,white_40px)] transition-all duration-300",
|
|
isOpen ? "py-5" : "invisible",
|
|
isDocs && "px-4",
|
|
)}
|
|
>
|
|
{navMenu.map((menu) => (
|
|
<Fragment key={menu.name}>
|
|
{menu.child ? (
|
|
<Accordion type="single" collapsible>
|
|
<AccordionItem value={menu.name}>
|
|
<AccordionTrigger
|
|
className={cn(
|
|
"font-normal text-foreground",
|
|
!isDocs && "text-2xl",
|
|
)}
|
|
>
|
|
{menu.name}
|
|
</AccordionTrigger>
|
|
<AccordionContent className="pl-5 divide-y">
|
|
{menu.child.map((child, j) => (
|
|
<Link
|
|
href={child.path}
|
|
key={child.name}
|
|
className={cn(
|
|
"block py-2 border-b first:pt-0 last:pb-0 last:border-0 text-muted-foreground",
|
|
!isDocs && "text-xl",
|
|
)}
|
|
onClick={toggleNavbar}
|
|
>
|
|
{child.name}
|
|
</Link>
|
|
))}
|
|
</AccordionContent>
|
|
</AccordionItem>
|
|
</Accordion>
|
|
) : (
|
|
<Link
|
|
href={menu.path}
|
|
className={cn(
|
|
"group flex items-center gap-2.5 first:pt-0 last:pb-0 text-2xl py-4",
|
|
isDocs && "text-base py-2",
|
|
)}
|
|
onClick={toggleNavbar}
|
|
>
|
|
{isDocs && (
|
|
<ChevronRight className="ml-0.5 size-4 text-muted-foreground md:hidden" />
|
|
)}
|
|
{menu.name}
|
|
</Link>
|
|
)}
|
|
</Fragment>
|
|
))}
|
|
<DocsNavBarContent />
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
function DocsNavBarContent() {
|
|
const pathname = usePathname();
|
|
const { toggleNavbar } = useNavbarMobile();
|
|
if (!pathname.startsWith("/docs")) return null;
|
|
|
|
const content = pathname.startsWith("/docs/examples") ? examples : contents;
|
|
|
|
return (
|
|
<>
|
|
{content.map((menu) => (
|
|
<Accordion type="single" collapsible key={menu.title}>
|
|
<AccordionItem value={menu.title}>
|
|
<AccordionTrigger className="font-normal text-foreground">
|
|
<div className="flex items-center gap-2">
|
|
{!!menu.Icon && <menu.Icon className="w-5 h-5" />}
|
|
{menu.title}
|
|
</div>
|
|
</AccordionTrigger>
|
|
<AccordionContent className="pl-5 divide-y">
|
|
{menu.list.map((child) => (
|
|
<Link
|
|
href={child.href}
|
|
key={child.title}
|
|
className="block py-2 text-sm border-b first:pt-0 last:pb-0 last:border-0 text-muted-foreground"
|
|
onClick={toggleNavbar}
|
|
>
|
|
{child.group ? (
|
|
<div className="flex flex-row items-center gap-2 ">
|
|
<div className="flex-grow h-px bg-gradient-to-r from-stone-800/90 to-stone-800/60" />
|
|
<p className="text-sm text-transparent bg-gradient-to-tr dark:from-gray-100 dark:to-stone-200 bg-clip-text from-gray-900 to-stone-900">
|
|
{child.title}
|
|
</p>
|
|
</div>
|
|
) : (
|
|
<div className="flex items-center gap-2">
|
|
<child.icon />
|
|
{child.title}
|
|
</div>
|
|
)}
|
|
</Link>
|
|
))}
|
|
</AccordionContent>
|
|
</AccordionItem>
|
|
</Accordion>
|
|
))}
|
|
</>
|
|
);
|
|
}
|
|
|
|
export const navMenu: {
|
|
name: string;
|
|
path: string;
|
|
child?: {
|
|
name: string;
|
|
path: string;
|
|
}[];
|
|
}[] = [
|
|
{
|
|
name: "_helo",
|
|
path: "/",
|
|
},
|
|
|
|
{
|
|
name: "docs",
|
|
path: "/docs",
|
|
},
|
|
{
|
|
name: "examples",
|
|
path: "/docs/examples/next-js",
|
|
},
|
|
{
|
|
name: "changelogs",
|
|
path: "/changelogs",
|
|
},
|
|
{
|
|
name: "blogs",
|
|
path: "/blog",
|
|
},
|
|
{
|
|
name: "community",
|
|
path: "/community",
|
|
},
|
|
];
|