mirror of
https://github.com/supermemoryai/supermemory.git
synced 2026-05-19 07:42:43 +00:00
alert when deleting space
This commit is contained in:
parent
e6ea714b5c
commit
28f8149c34
7 changed files with 239 additions and 150 deletions
|
|
@ -1,7 +1,7 @@
|
|||
"use client";
|
||||
|
||||
import { Content, StoredSpace } from "@repo/db/schema";
|
||||
import { MemoriesIcon, NextIcon, SearchIcon, UrlIcon } from "@repo/ui/icons";
|
||||
import { MemoriesIcon, NextIcon, UrlIcon } from "@repo/ui/icons";
|
||||
import {
|
||||
ArrowLeftIcon,
|
||||
MenuIcon,
|
||||
|
|
@ -37,20 +37,22 @@ import { toast } from "sonner";
|
|||
import { Input } from "@repo/ui/shadcn/input";
|
||||
import { motion } from "framer-motion";
|
||||
import { useSearchParams } from "next/navigation";
|
||||
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from "@repo/ui/shadcn/alert-dialog";
|
||||
|
||||
type TMemoriesPage = {
|
||||
memoriesAndSpaces: { memories: Content[]; spaces: StoredSpace[] };
|
||||
title?: string;
|
||||
currentSpace?: StoredSpace;
|
||||
usersWithAccess?: string[];
|
||||
};
|
||||
|
||||
export function MemoriesPage({
|
||||
memoriesAndSpaces,
|
||||
title = "Your Memories",
|
||||
currentSpace,
|
||||
usersWithAccess,
|
||||
}: {
|
||||
memoriesAndSpaces: { memories: Content[]; spaces: StoredSpace[] };
|
||||
title?: string;
|
||||
currentSpace?: StoredSpace;
|
||||
usersWithAccess?: string[];
|
||||
}) {
|
||||
}: TMemoriesPage) {
|
||||
const searchParams = useSearchParams();
|
||||
|
||||
const tab = searchParams.get("tab");
|
||||
|
||||
const initialFilter = useMemo(() => {
|
||||
|
|
@ -64,7 +66,6 @@ export function MemoriesPage({
|
|||
const [filter, setFilter] = useState(initialFilter);
|
||||
const [spaces, setSpaces] = useState<StoredSpace[]>(memoriesAndSpaces.spaces);
|
||||
|
||||
// to delete a space
|
||||
const handleDeleteSpace = async (id: number) => {
|
||||
const response = await deleteSpace(id);
|
||||
|
||||
|
|
@ -72,7 +73,7 @@ export function MemoriesPage({
|
|||
setSpaces(spaces.filter((space) => space.id !== id));
|
||||
toast.success("Space deleted");
|
||||
} else {
|
||||
toast.error("Failed to delete space");
|
||||
toast.error("Failed to delete the space");
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -96,25 +97,22 @@ export function MemoriesPage({
|
|||
URL.revokeObjectURL(url);
|
||||
};
|
||||
|
||||
// Sort Both memories and spaces by their savedAt and createdAt dates respectfully.
|
||||
// The output should be just one single list of items
|
||||
// And it will look something like { item: "memory" | "space", date: Date, data: Content | StoredSpace }
|
||||
const sortedItems = useMemo(() => {
|
||||
// Merge the lists
|
||||
// merge spaces & memories to { item: "memory" | "space", date: Date, data: Content | StoredSpace }
|
||||
const unifiedItems = [
|
||||
...memoriesAndSpaces.memories.map((memory) => ({
|
||||
item: "memory",
|
||||
date: new Date(memory.savedAt), // Assuming savedAt is a string date
|
||||
date: new Date(memory.savedAt),
|
||||
data: memory,
|
||||
})),
|
||||
...spaces.map((space) => ({
|
||||
item: "space",
|
||||
date: new Date(space.createdAt), // Assuming createdAt is a string date
|
||||
date: new Date(space.createdAt),
|
||||
data: space,
|
||||
})),
|
||||
].map((item) => ({
|
||||
...item,
|
||||
date: Number(item.date), // Convert the date to a number
|
||||
date: Number(item.date),
|
||||
}));
|
||||
|
||||
// Sort the merged list
|
||||
|
|
@ -142,28 +140,22 @@ export function MemoriesPage({
|
|||
}, [memoriesAndSpaces.memories, spaces, filter]);
|
||||
|
||||
return (
|
||||
<div
|
||||
key={`${memoriesAndSpaces.memories.length + memoriesAndSpaces.spaces.length}`}
|
||||
className="px-2 md:px-32 py-36 h-full flex mx-auto w-full flex-col gap-6"
|
||||
>
|
||||
{currentSpace && (
|
||||
<Link href={"/memories"} className="flex gap-2 items-center">
|
||||
<ArrowLeftIcon className="w-3 h-3" /> Back to all memories
|
||||
</Link>
|
||||
)}
|
||||
<div className="px-2 md:px-32 py-36 h-full flex mx-auto w-full flex-col gap-6">
|
||||
<div className="space-y-2">
|
||||
{currentSpace && (
|
||||
<Link href={"/memories"}>
|
||||
<Button className="px-0 text-gray-300" variant="link">
|
||||
<ArrowLeftIcon className="w-3 h-3" /> Back to all memories
|
||||
</Button>
|
||||
</Link>
|
||||
)}
|
||||
<h2 className="text-white w-full text-3xl text-left font-semibold">
|
||||
{title}
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<h2 className="text-white w-full text-3xl text-left font-semibold">
|
||||
{title}
|
||||
</h2>
|
||||
{currentSpace && (
|
||||
<div className="flex flex-col gap-2">
|
||||
<div className="flex gap-4 items-center">
|
||||
Space
|
||||
<div className="flex items-center gap-2 bg-secondary p-2 rounded-xl">
|
||||
<Image src={MemoriesIcon} alt="Spaces icon" className="w-3 h-3" />
|
||||
<span className="text-[#fff]">{currentSpace.name}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{usersWithAccess && usersWithAccess.length > 0 && (
|
||||
<div className="flex gap-4 items-center">
|
||||
|
|
@ -202,7 +194,11 @@ export function MemoriesPage({
|
|||
}}
|
||||
className="flex gap-2 max-w-xl mt-2"
|
||||
>
|
||||
<Input name="email" placeholder="Add user by email" />
|
||||
<Input
|
||||
className="focus-visible:ring-0 border-[1px]"
|
||||
name="email"
|
||||
placeholder="Add user by email"
|
||||
/>
|
||||
<Button variant="secondary">Add</Button>
|
||||
</form>
|
||||
</div>
|
||||
|
|
@ -218,7 +214,7 @@ export function MemoriesPage({
|
|||
/>
|
||||
<button
|
||||
onClick={handleExport}
|
||||
className={`transition px-6 py-2 rounded-xl hover:text-[#369DFD]" text-[#B3BCC5] bg-secondary hover:bg-secondary hover:text-[#76a3cc]`}
|
||||
className={`transition px-4 py-2 rounded-lg text-[#B3BCC5] bg-secondary hover:bg-secondary hover:text-[#76a3cc]`}
|
||||
>
|
||||
JSON Export
|
||||
</button>
|
||||
|
|
@ -235,7 +231,7 @@ export function MemoriesPage({
|
|||
{sortedItems.map((item) => {
|
||||
if (item.item === "memory") {
|
||||
return (
|
||||
<LinkComponent
|
||||
<MemoryComponent
|
||||
type={(item.data as Content).type ?? "note"}
|
||||
content={(item.data as Content).content}
|
||||
title={(item.data as Content).title ?? "Untitled"}
|
||||
|
|
@ -256,7 +252,7 @@ export function MemoriesPage({
|
|||
|
||||
if (item.item === "space") {
|
||||
return (
|
||||
<TabComponent
|
||||
<SpaceComponent
|
||||
title={(item.data as StoredSpace).name}
|
||||
description={`${(item.data as StoredSpace).numItems} memories`}
|
||||
id={(item.data as StoredSpace).id}
|
||||
|
|
@ -272,7 +268,7 @@ export function MemoriesPage({
|
|||
);
|
||||
}
|
||||
|
||||
function TabComponent({
|
||||
function SpaceComponent({
|
||||
title,
|
||||
description,
|
||||
id,
|
||||
|
|
@ -284,7 +280,7 @@ function TabComponent({
|
|||
handleDeleteSpace: (id: number) => void;
|
||||
}) {
|
||||
return (
|
||||
<div className="flex group flex-col gap-4 bg-[#161f2a]/30 backdrop-blur-md border-2 border-border w-full rounded-xl p-4">
|
||||
<div className="flex group flex-col gap-4 bg-[#161f2a]/25 backdrop-blur-md border-[1px] shadow-md border-border w-full rounded-xl p-4">
|
||||
<div className="flex items-center gap-2 text-xs">
|
||||
<Image alt="Spaces icon" src={MemoriesIcon} className="size-3" /> Space
|
||||
</div>
|
||||
|
|
@ -296,7 +292,7 @@ function TabComponent({
|
|||
>
|
||||
<div>
|
||||
<div className="h-12 w-12 flex justify-center items-center rounded-md">
|
||||
{title.slice(0, 2).toUpperCase()} {id}
|
||||
{title.slice(0, 2).toUpperCase()}{id}
|
||||
</div>
|
||||
</div>
|
||||
<div className="grow px-2">
|
||||
|
|
@ -308,17 +304,15 @@ function TabComponent({
|
|||
</div>
|
||||
</Link>
|
||||
<div className="absolute z-40 right-3 top-3 opacity-0 group-hover:opacity-100 hover:text-red-600">
|
||||
<TrashIcon
|
||||
onClick={() => handleDeleteSpace(id)}
|
||||
className="w-4 cursor-pointer"
|
||||
/>
|
||||
|
||||
<SpaceDeleteAlert onClick={()=> {handleDeleteSpace(id)}} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function LinkComponent({
|
||||
function MemoryComponent({
|
||||
type,
|
||||
content,
|
||||
title,
|
||||
|
|
@ -445,12 +439,12 @@ function Filters({
|
|||
filterMethods: string[];
|
||||
}) {
|
||||
return (
|
||||
<div className="flex gap-4 flex-wrap">
|
||||
<div className="flex gap-3 flex-wrap">
|
||||
{filterMethods.map((i) => {
|
||||
return (
|
||||
<button
|
||||
onClick={() => setFilter(i)}
|
||||
className={`transition px-6 py-2 rounded-xl bg-border ${i === filter ? " text-[#369DFD]" : "text-[#B3BCC5] bg-secondary hover:bg-secondary hover:text-[#76a3cc]"}`}
|
||||
className={`transition px-4 py-2 shadow-md rounded-lg bg-border ${i === filter ? " text-[#369DFD]" : "text-[#B3BCC5] bg-secondary drop-shadow-md hover:bg-secondary hover:text-[#76a3cc]"}`}
|
||||
>
|
||||
{i}
|
||||
</button>
|
||||
|
|
@ -460,4 +454,26 @@ function Filters({
|
|||
);
|
||||
}
|
||||
|
||||
export default MemoriesPage;
|
||||
function SpaceDeleteAlert({onClick}: {onClick: ()=> void}){
|
||||
return (
|
||||
<AlertDialog>
|
||||
<AlertDialogTrigger> <TrashIcon
|
||||
className="w-4 cursor-pointer"
|
||||
/></AlertDialogTrigger>
|
||||
<AlertDialogContent>
|
||||
<AlertDialogHeader>
|
||||
<AlertDialogTitle>Are you absolutely sure?</AlertDialogTitle>
|
||||
<AlertDialogDescription>
|
||||
This is irreversible. This will delete the space and all memories inside it.
|
||||
</AlertDialogDescription>
|
||||
</AlertDialogHeader>
|
||||
<AlertDialogFooter>
|
||||
<AlertDialogCancel>Cancel</AlertDialogCancel>
|
||||
<AlertDialogAction onClick={onClick}>Delete</AlertDialogAction>
|
||||
</AlertDialogFooter>
|
||||
</AlertDialogContent>
|
||||
</AlertDialog>
|
||||
)
|
||||
}
|
||||
|
||||
export default MemoriesPage;
|
||||
|
|
@ -26,7 +26,7 @@ async function Layout({ children }: { children: React.ReactNode }) {
|
|||
<Header />
|
||||
</div>
|
||||
|
||||
<div className="relative flex justify-center z-40 pointer-events-none">
|
||||
<div className="relative flex justify-center z-[45] pointer-events-none">
|
||||
<div
|
||||
className="absolute -z-10 left-0 top-[10%] h-32 w-[90%] overflow-x-hidden bg-[rgb(54,157,253)] bg-opacity-100 md:bg-opacity-70 blur-[337.4px]"
|
||||
style={{ transform: "rotate(-30deg)" }}
|
||||
|
|
|
|||
|
|
@ -66,11 +66,11 @@ function Menu() {
|
|||
<>
|
||||
{/* Desktop Menu */}
|
||||
<Dialog open={dialogOpen} onOpenChange={setDialogOpen}>
|
||||
<div className="hidden lg:flex fixed h-screen pb-20 w-full p-4 items-center justify-start top-0 left-0 pointer-events-none z-[39]">
|
||||
<div className="hidden lg:flex fixed h-screen w-full p-4 items-center top-0 left-0 pointer-events-none z-[39]">
|
||||
<div className="pointer-events-auto group flex w-14 text-foreground-menu text-[15px] font-medium flex-col items-start gap-6 overflow-hidden rounded-[28px] border-2 border-border bg-secondary px-3 py-4 duration-200 hover:w-40 z-[99999]">
|
||||
<div className="border-b border-border pb-4 w-full">
|
||||
<DialogTrigger
|
||||
className={`flex w-full text-white brightness-75 hover:brightness-125 focus:brightness-125 cursor-pointer items-center gap-3 px-1 duration-200 justify-start`}
|
||||
className="flex w-full text-white brightness-75 hover:brightness-125 focus:brightness-125 cursor-pointer items-center gap-3 px-1 duration-200 justify-start"
|
||||
>
|
||||
<Image
|
||||
src={AddIcon}
|
||||
|
|
@ -86,14 +86,9 @@ function Menu() {
|
|||
</div>
|
||||
{menuItems.map((item) => (
|
||||
<Link
|
||||
aria-disabled={item.disabled}
|
||||
href={item.disabled ? "#" : item.url}
|
||||
href={item.url}
|
||||
key={item.url}
|
||||
className={`flex w-full ${
|
||||
item.disabled
|
||||
? "cursor-not-allowed opacity-30"
|
||||
: "text-white brightness-75 hover:brightness-125 cursor-pointer"
|
||||
} items-center gap-3 px-1 duration-200 hover:scale-105 active:scale-90 justify-start`}
|
||||
className="flex w-full items-center gap-3 px-1 duration-200 hover:scale-105 active:scale-90 justify-start text-white brightness-75 hover:brightness-125 cursor-pointer"
|
||||
>
|
||||
<Image
|
||||
src={item.icon}
|
||||
|
|
@ -297,6 +292,7 @@ function DialogContentMenu({setDialogClose}: {setDialogClose: ()=> void}){
|
|||
<div>
|
||||
<Label htmlFor="name">Resource (URL or content)</Label>
|
||||
<Textarea
|
||||
autoFocus
|
||||
className={`bg-[#2F353C] text-[#DBDEE1] max-h-[35vh] overflow-auto focus-visible:ring-0 border-none focus-visible:ring-offset-0 mt-2 ${/^https?:\/\/\S+$/i.test(content) && "text-[#1D9BF0] underline underline-offset-2"}`}
|
||||
id="content"
|
||||
name="content"
|
||||
|
|
|
|||
|
|
@ -11,12 +11,12 @@
|
|||
},
|
||||
"devDependencies": {
|
||||
"@clack/prompts": "^0.7.0",
|
||||
"@repo/db": "*",
|
||||
"@repo/eslint-config": "*",
|
||||
"@repo/shared-types": "*",
|
||||
"@repo/tailwind-config": "*",
|
||||
"@repo/typescript-config": "*",
|
||||
"@repo/ui": "*",
|
||||
"@repo/db": "*",
|
||||
"lint-staged": "^15.2.5",
|
||||
"prettier": "^3.3.3",
|
||||
"rxjs": "^7.8.1",
|
||||
|
|
@ -45,6 +45,7 @@
|
|||
"@million/lint": "^1.0.0-rc.81",
|
||||
"@mozilla/readability": "^0.5.0",
|
||||
"@radix-ui/react-accordion": "^1.1.2",
|
||||
"@radix-ui/react-alert-dialog": "^1.1.1",
|
||||
"@radix-ui/react-dropdown-menu": "^2.1.1",
|
||||
"@radix-ui/react-icons": "^1.3.0",
|
||||
"@radix-ui/react-label": "^2.0.2",
|
||||
|
|
@ -67,6 +68,8 @@
|
|||
"cheerio": "^1.0.0-rc.12",
|
||||
"compromise": "^14.13.0",
|
||||
"crypto-browserify": "^3.12.0",
|
||||
"drizzle-kit": "0.21.2",
|
||||
"drizzle-orm": "0.30.0",
|
||||
"eslint-config-turbo": "^2.0.6",
|
||||
"framer-motion": "^11.2.6",
|
||||
"geist": "^1.3.0",
|
||||
|
|
@ -100,9 +103,7 @@
|
|||
"turndown": "^7.2.0",
|
||||
"uploadthing": "^6.10.4",
|
||||
"vaul": "^0.9.1",
|
||||
"zod": "^3.23.8",
|
||||
"drizzle-kit": "0.21.2",
|
||||
"drizzle-orm": "0.30.0"
|
||||
"zod": "^3.23.8"
|
||||
},
|
||||
"trustedDependencies": [
|
||||
"core-js-pure",
|
||||
|
|
|
|||
141
packages/ui/shadcn/alert-dialog.tsx
Normal file
141
packages/ui/shadcn/alert-dialog.tsx
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
"use client"
|
||||
|
||||
import * as React from "react"
|
||||
import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog"
|
||||
|
||||
import { cn } from "@repo/ui/lib/utils";
|
||||
import { buttonVariants } from "@repo/ui/shadcn/button";
|
||||
|
||||
const AlertDialog = AlertDialogPrimitive.Root
|
||||
|
||||
const AlertDialogTrigger = AlertDialogPrimitive.Trigger
|
||||
|
||||
const AlertDialogPortal = AlertDialogPrimitive.Portal
|
||||
|
||||
const AlertDialogOverlay = React.forwardRef<
|
||||
React.ElementRef<typeof AlertDialogPrimitive.Overlay>,
|
||||
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<AlertDialogPrimitive.Overlay
|
||||
className={cn(
|
||||
"fixed inset-0 z-[41] bg-black/20 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
ref={ref}
|
||||
/>
|
||||
))
|
||||
AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName
|
||||
|
||||
const AlertDialogContent = React.forwardRef<
|
||||
React.ElementRef<typeof AlertDialogPrimitive.Content>,
|
||||
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<AlertDialogPortal>
|
||||
<AlertDialogOverlay />
|
||||
<AlertDialogPrimitive.Content
|
||||
ref={ref}
|
||||
className={cn(
|
||||
"fixed left-[50%] top-[50%] z-[41] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border-border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
</AlertDialogPortal>
|
||||
))
|
||||
AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName
|
||||
|
||||
const AlertDialogHeader = ({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLDivElement>) => (
|
||||
<div
|
||||
className={cn(
|
||||
"flex flex-col space-y-2 text-center sm:text-left",
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
)
|
||||
AlertDialogHeader.displayName = "AlertDialogHeader"
|
||||
|
||||
const AlertDialogFooter = ({
|
||||
className,
|
||||
...props
|
||||
}: React.HTMLAttributes<HTMLDivElement>) => (
|
||||
<div
|
||||
className={cn(
|
||||
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
)
|
||||
AlertDialogFooter.displayName = "AlertDialogFooter"
|
||||
|
||||
const AlertDialogTitle = React.forwardRef<
|
||||
React.ElementRef<typeof AlertDialogPrimitive.Title>,
|
||||
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<AlertDialogPrimitive.Title
|
||||
ref={ref}
|
||||
className={cn("text-lg font-semibold", className)}
|
||||
{...props}
|
||||
/>
|
||||
))
|
||||
AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName
|
||||
|
||||
const AlertDialogDescription = React.forwardRef<
|
||||
React.ElementRef<typeof AlertDialogPrimitive.Description>,
|
||||
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<AlertDialogPrimitive.Description
|
||||
ref={ref}
|
||||
className={cn("text-sm text-muted-foreground", className)}
|
||||
{...props}
|
||||
/>
|
||||
))
|
||||
AlertDialogDescription.displayName =
|
||||
AlertDialogPrimitive.Description.displayName
|
||||
|
||||
const AlertDialogAction = React.forwardRef<
|
||||
React.ElementRef<typeof AlertDialogPrimitive.Action>,
|
||||
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<AlertDialogPrimitive.Action
|
||||
ref={ref}
|
||||
className={cn(buttonVariants({variant: "destructive"}), className)}
|
||||
{...props}
|
||||
/>
|
||||
))
|
||||
AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName
|
||||
|
||||
const AlertDialogCancel = React.forwardRef<
|
||||
React.ElementRef<typeof AlertDialogPrimitive.Cancel>,
|
||||
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<AlertDialogPrimitive.Cancel
|
||||
ref={ref}
|
||||
className={cn(
|
||||
buttonVariants({ variant: "secondary" }),
|
||||
"mt-2 sm:mt-0",
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
))
|
||||
AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName
|
||||
|
||||
export {
|
||||
AlertDialog,
|
||||
AlertDialogPortal,
|
||||
AlertDialogOverlay,
|
||||
AlertDialogTrigger,
|
||||
AlertDialogContent,
|
||||
AlertDialogHeader,
|
||||
AlertDialogFooter,
|
||||
AlertDialogTitle,
|
||||
AlertDialogDescription,
|
||||
AlertDialogAction,
|
||||
AlertDialogCancel,
|
||||
}
|
||||
|
|
@ -11,7 +11,7 @@ const buttonVariants = cva(
|
|||
variant: {
|
||||
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
||||
destructive:
|
||||
"bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
||||
"bg-destructive text-destructive-foreground hover:bg-destructive/50",
|
||||
outline:
|
||||
"border border-input bg-background hover:bg-accent hover:text-accent-foreground",
|
||||
secondary:
|
||||
|
|
|
|||
103
pnpm-lock.yaml
generated
103
pnpm-lock.yaml
generated
|
|
@ -28,7 +28,7 @@ importers:
|
|||
version: 3.620.0
|
||||
'@babel/plugin-transform-runtime':
|
||||
specifier: ^7.24.7
|
||||
version: 7.24.7(@babel/core@7.24.6)
|
||||
version: 7.24.7(@babel/core@7.24.9)
|
||||
'@cloudflare/puppeteer':
|
||||
specifier: ^0.0.11
|
||||
version: 0.0.11
|
||||
|
|
@ -59,6 +59,9 @@ importers:
|
|||
'@radix-ui/react-accordion':
|
||||
specifier: ^1.1.2
|
||||
version: 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
'@radix-ui/react-alert-dialog':
|
||||
specifier: ^1.1.1
|
||||
version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
'@radix-ui/react-dropdown-menu':
|
||||
specifier: ^2.1.1
|
||||
version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
|
|
@ -139,7 +142,7 @@ importers:
|
|||
version: 11.3.19(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
geist:
|
||||
specifier: ^1.3.0
|
||||
version: 1.3.1(next@14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))
|
||||
version: 1.3.1(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))
|
||||
google-auth-library:
|
||||
specifier: ^9.11.0
|
||||
version: 9.11.0(encoding@0.1.13)
|
||||
|
|
@ -169,7 +172,7 @@ importers:
|
|||
version: 0.1.10(react@18.3.1)
|
||||
next-auth:
|
||||
specifier: ^5.0.0-beta.18
|
||||
version: 5.0.0-beta.19(next@14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react@18.3.1)
|
||||
version: 5.0.0-beta.19(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react@18.3.1)
|
||||
next-themes:
|
||||
specifier: ^0.3.0
|
||||
version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
|
|
@ -226,7 +229,7 @@ importers:
|
|||
version: 7.2.0
|
||||
uploadthing:
|
||||
specifier: ^6.10.4
|
||||
version: 6.13.2(express@4.19.2)(next@14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)))
|
||||
version: 6.13.2(express@4.19.2)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4)))
|
||||
vaul:
|
||||
specifier: ^0.9.1
|
||||
version: 0.9.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
|
|
@ -13346,6 +13349,7 @@ packages:
|
|||
|
||||
workbox-google-analytics@6.6.0:
|
||||
resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==}
|
||||
deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained
|
||||
|
||||
workbox-navigation-preload@6.6.0:
|
||||
resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==}
|
||||
|
|
@ -14395,17 +14399,6 @@ snapshots:
|
|||
regexpu-core: 5.3.2
|
||||
semver: 6.3.1
|
||||
|
||||
'@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.6)':
|
||||
dependencies:
|
||||
'@babel/core': 7.24.6
|
||||
'@babel/helper-compilation-targets': 7.24.8
|
||||
'@babel/helper-plugin-utils': 7.24.8
|
||||
debug: 4.3.6
|
||||
lodash.debounce: 4.0.8
|
||||
resolve: 1.22.8
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.9)':
|
||||
dependencies:
|
||||
'@babel/core': 7.24.9
|
||||
|
|
@ -15001,14 +14994,14 @@ snapshots:
|
|||
'@babel/core': 7.24.9
|
||||
'@babel/helper-plugin-utils': 7.24.8
|
||||
|
||||
'@babel/plugin-transform-runtime@7.24.7(@babel/core@7.24.6)':
|
||||
'@babel/plugin-transform-runtime@7.24.7(@babel/core@7.24.9)':
|
||||
dependencies:
|
||||
'@babel/core': 7.24.6
|
||||
'@babel/core': 7.24.9
|
||||
'@babel/helper-module-imports': 7.24.7
|
||||
'@babel/helper-plugin-utils': 7.24.8
|
||||
babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.6)
|
||||
babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.6)
|
||||
babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.6)
|
||||
babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.9)
|
||||
babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.9)
|
||||
babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.9)
|
||||
semver: 6.3.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
|
@ -20085,15 +20078,6 @@ snapshots:
|
|||
schema-utils: 4.2.0
|
||||
webpack: 5.92.1(esbuild@0.19.12)(webpack-cli@5.1.4)
|
||||
|
||||
babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.6):
|
||||
dependencies:
|
||||
'@babel/compat-data': 7.25.0
|
||||
'@babel/core': 7.24.6
|
||||
'@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.6)
|
||||
semver: 6.3.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.9):
|
||||
dependencies:
|
||||
'@babel/compat-data': 7.25.0
|
||||
|
|
@ -20103,14 +20087,6 @@ snapshots:
|
|||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.6):
|
||||
dependencies:
|
||||
'@babel/core': 7.24.6
|
||||
'@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.6)
|
||||
core-js-compat: 3.37.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.9):
|
||||
dependencies:
|
||||
'@babel/core': 7.24.9
|
||||
|
|
@ -20119,13 +20095,6 @@ snapshots:
|
|||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.6):
|
||||
dependencies:
|
||||
'@babel/core': 7.24.6
|
||||
'@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.6)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.9):
|
||||
dependencies:
|
||||
'@babel/core': 7.24.9
|
||||
|
|
@ -22670,9 +22639,9 @@ snapshots:
|
|||
- encoding
|
||||
- supports-color
|
||||
|
||||
geist@1.3.1(next@14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8)):
|
||||
geist@1.3.1(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8)):
|
||||
dependencies:
|
||||
next: 14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8)
|
||||
next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8)
|
||||
|
||||
generic-pool@3.4.2: {}
|
||||
|
||||
|
|
@ -25070,10 +25039,10 @@ snapshots:
|
|||
dependencies:
|
||||
react: 18.3.1
|
||||
|
||||
next-auth@5.0.0-beta.19(next@14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react@18.3.1):
|
||||
next-auth@5.0.0-beta.19(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react@18.3.1):
|
||||
dependencies:
|
||||
'@auth/core': 0.32.0
|
||||
next: 14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8)
|
||||
next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8)
|
||||
react: 18.3.1
|
||||
|
||||
next-pwa@5.6.0(@babel/core@7.24.9)(esbuild@0.17.19)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(webpack@5.93.0(esbuild@0.17.19)):
|
||||
|
|
@ -25101,33 +25070,6 @@ snapshots:
|
|||
|
||||
next-tick@1.1.0: {}
|
||||
|
||||
next@14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8):
|
||||
dependencies:
|
||||
'@next/env': 14.2.5
|
||||
'@swc/helpers': 0.5.5
|
||||
busboy: 1.6.0
|
||||
caniuse-lite: 1.0.30001643
|
||||
graceful-fs: 4.2.11
|
||||
postcss: 8.4.31
|
||||
react: 18.3.1
|
||||
react-dom: 18.3.1(react@18.3.1)
|
||||
styled-jsx: 5.1.1(@babel/core@7.24.6)(react@18.3.1)
|
||||
optionalDependencies:
|
||||
'@next/swc-darwin-arm64': 14.2.5
|
||||
'@next/swc-darwin-x64': 14.2.5
|
||||
'@next/swc-linux-arm64-gnu': 14.2.5
|
||||
'@next/swc-linux-arm64-musl': 14.2.5
|
||||
'@next/swc-linux-x64-gnu': 14.2.5
|
||||
'@next/swc-linux-x64-musl': 14.2.5
|
||||
'@next/swc-win32-arm64-msvc': 14.2.5
|
||||
'@next/swc-win32-ia32-msvc': 14.2.5
|
||||
'@next/swc-win32-x64-msvc': 14.2.5
|
||||
'@opentelemetry/api': 1.9.0
|
||||
sass: 1.77.8
|
||||
transitivePeerDependencies:
|
||||
- '@babel/core'
|
||||
- babel-plugin-macros
|
||||
|
||||
next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8):
|
||||
dependencies:
|
||||
'@next/env': 14.2.5
|
||||
|
|
@ -27698,13 +27640,6 @@ snapshots:
|
|||
dependencies:
|
||||
inline-style-parser: 0.2.3
|
||||
|
||||
styled-jsx@5.1.1(@babel/core@7.24.6)(react@18.3.1):
|
||||
dependencies:
|
||||
client-only: 0.0.1
|
||||
react: 18.3.1
|
||||
optionalDependencies:
|
||||
'@babel/core': 7.24.6
|
||||
|
||||
styled-jsx@5.1.1(@babel/core@7.24.9)(react@18.3.1):
|
||||
dependencies:
|
||||
client-only: 0.0.1
|
||||
|
|
@ -28545,7 +28480,7 @@ snapshots:
|
|||
transitivePeerDependencies:
|
||||
- encoding
|
||||
|
||||
uploadthing@6.13.2(express@4.19.2)(next@14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4))):
|
||||
uploadthing@6.13.2(express@4.19.2)(next@14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(tailwindcss@3.4.7(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4))):
|
||||
dependencies:
|
||||
'@effect/schema': 0.68.12(effect@3.4.5)
|
||||
'@uploadthing/mime-types': 0.2.10
|
||||
|
|
@ -28555,7 +28490,7 @@ snapshots:
|
|||
std-env: 3.7.0
|
||||
optionalDependencies:
|
||||
express: 4.19.2
|
||||
next: 14.2.5(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8)
|
||||
next: 14.2.5(@babel/core@7.24.9)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8)
|
||||
tailwindcss: 3.4.7(ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4))
|
||||
|
||||
upper-case-first@1.1.2:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue