Skip to content

Commit

Permalink
refactor:modal created
Browse files Browse the repository at this point in the history
  • Loading branch information
ademsuslu committed Nov 17, 2024
1 parent 93c99a7 commit 09d6bc1
Show file tree
Hide file tree
Showing 10 changed files with 330 additions and 9 deletions.
1 change: 0 additions & 1 deletion app/(dashboard)/opportunity/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ export default async function OpportunityPage() {
const url = "https://crm-backend-production-e80f.up.railway.app/api";
const response = await fetch(`${url}/opportunity`,{ cache: 'no-cache' });
const data = await response.json();
console.log(data)

return (
<div>
Expand Down
2 changes: 2 additions & 0 deletions app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export const metadata: Metadata = {

import { ClerkProvider } from '@clerk/nextjs'
import { Providers } from '@/components/provider/provider'
import { ModalProvider } from '@/components/provider/modal-providers'

export default function RootLayout({
children,
Expand All @@ -27,6 +28,7 @@ export default function RootLayout({

<body className={`${roboto.className}`} suppressHydrationWarning>
<Providers>
<ModalProvider />
{children}
<Toaster />
</Providers>
Expand Down
76 changes: 76 additions & 0 deletions components/modals/store-modal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
"use client"
import * as z from "zod"
import { useForm } from "react-hook-form"
import { zodResolver } from "@hookform/resolvers/zod"
import { useStoreModal } from "@/hooks/use-store-modal"
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"
import { Input } from "../ui/input"
import { Button } from "../ui/button"
import { useState } from "react"
import { Modal } from "../ui/modal"

const formSchema = z.object({
name: z.string().min(1)
})


export const StoreModal = () => {
const storeModal = useStoreModal()

const [loading, setLoading] = useState(false)

const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
name: ""
}
})


const onSubmit = async (data: z.infer<typeof formSchema>) => {
// try {
// setLoading(true);
// let respon
// // const response = await axios.post("/api/store", data);
// window.location.assign(`/${response?.data?.id}`)
// window.location.reload();
// } catch (error: any) {
// toast.error("Bir şeyler yanlış gitti: " + error.message);
// console.log(error);
// } finally {
// setLoading(false);
// }
};



return <Modal
title="Create Store"
description="Add a new store to manage products and categories"
isOpen={storeModal.isOpen}
onClose={storeModal.onClose}>
<div>
<div className="space-y-4 py-2 pb-2">
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)}>
{/* @ts-ignore */}
<FormField control={form.control} name="name" render={({ field }) => {
return <FormItem>
<FormLabel>Name</FormLabel>

<FormControl>
<Input disabled={loading} placeholder="E-commerce" {...field} />
</FormControl>
<FormMessage />
</FormItem>
}} />
<div className="pt-6 space-x-2 flex items-center justify-end w-full">
<Button disabled={loading} onClick={storeModal.onClose} variant="outline">Cancel</Button>
<Button disabled={loading} type="submit">Continue</Button>
</div>
</form>
</Form>
</div>
</div>
</Modal>
}
17 changes: 17 additions & 0 deletions components/provider/modal-providers.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"use client"

import { StoreModal } from "@/components/modals/store-modal";
import { useEffect, useState } from "react"

export const ModalProvider = () => {
const [isMounted, setIsMounted] = useState(false);


useEffect(() => {
setIsMounted(true)
}, [])

if (!isMounted) { return null }
return <StoreModal />

}
4 changes: 3 additions & 1 deletion components/shared/drag_drop/Tables.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { motion } from "framer-motion";
import { Opportunity } from "@/types/Opportunity/model";
import { MdOutlineDragIndicator } from "react-icons/md";
import { Button } from "@/components/ui/button";
import { useStoreModal } from "@/hooks/use-store-modal";

// Aşamalar için sabit liste
const stages = ["İletişim", "Teklif", "Görüşme", "Kapalı", "Kazandı", "Kaybetti"] as const;
Expand All @@ -17,6 +18,7 @@ interface Props {
}

const KanbanTable: React.FC<Props> = ({ data }) => {
const storeModal = useStoreModal()
const [opportunities, setOpportunities] = useState<Opportunity[]>(data);

// PUT isteği gönderme fonksiyonu
Expand Down Expand Up @@ -56,7 +58,7 @@ const KanbanTable: React.FC<Props> = ({ data }) => {
return (
<div className="flex flex-col space-y-2 w-full">
<div className="">
<Button variant={"secondary"}>Add to cart</Button>
<Button onClick={()=>storeModal.onOpen()} variant={"secondary"}>Add to cart</Button>
</div>
<div className="flex gap-4 p-4 scrollbar overflow-x-scroll max-w-[1070px] app-scrollbar app-scrollbar--dark space-x-4 border rounded ">
{stages.map((stage) => (
Expand Down
121 changes: 121 additions & 0 deletions components/ui/dialog.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
"use client"

import * as React from "react"
import * as DialogPrimitive from "@radix-ui/react-dialog"
import { cn } from "@/lib/utils"
import { Cross2Icon } from "@radix-ui/react-icons"

const Dialog = DialogPrimitive.Root

const DialogTrigger = DialogPrimitive.Trigger

const DialogPortal = DialogPrimitive.Portal

const DialogClose = DialogPrimitive.Close

const DialogOverlay = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Overlay>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Overlay
ref={ref}
className={cn(
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
className
)}
{...props}
/>
))
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName

const DialogContent = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>
>(({ className, children, ...props }, ref) => (
<DialogPortal>
<DialogOverlay />
<DialogPrimitive.Content
ref={ref}
className={cn(
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 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}
>
{children}
<DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
<Cross2Icon className="h-4 w-4" />
<span className="sr-only">Close</span>
</DialogPrimitive.Close>
</DialogPrimitive.Content>
</DialogPortal>
))
DialogContent.displayName = DialogPrimitive.Content.displayName

const DialogHeader = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col space-y-1.5 text-center sm:text-left",
className
)}
{...props}
/>
)
DialogHeader.displayName = "DialogHeader"

const DialogFooter = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
className
)}
{...props}
/>
)
DialogFooter.displayName = "DialogFooter"

const DialogTitle = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Title>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Title
ref={ref}
className={cn(
"text-lg font-semibold leading-none tracking-tight",
className
)}
{...props}
/>
))
DialogTitle.displayName = DialogPrimitive.Title.displayName

const DialogDescription = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Description>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Description
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
))
DialogDescription.displayName = DialogPrimitive.Description.displayName

export {
Dialog,
DialogPortal,
DialogOverlay,
DialogTrigger,
DialogClose,
DialogContent,
DialogHeader,
DialogFooter,
DialogTitle,
DialogDescription,
}
44 changes: 44 additions & 0 deletions components/ui/modal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
"use client"

import {
Dialog,
DialogHeader,
DialogContent,
DialogDescription,
DialogTitle
} from "@/components/ui/dialog";

interface ModalProps {
title: string;
description: string;
isOpen: boolean;
onClose: () => void;
children?: React.ReactNode;
}


export const Modal: React.FC<ModalProps> = ({
title,
description,
isOpen,
onClose,
children,
}) => {

const onChange = (open: boolean) => {
if (!open) {
onClose()
}
}
return (
<Dialog open={isOpen} onOpenChange={onChange}>
<DialogContent>
<DialogHeader>
<DialogTitle>{title}</DialogTitle>
<DialogDescription>{description}</DialogDescription>
</DialogHeader>
<div>{children}</div>
</DialogContent>
</Dialog>
)
}
14 changes: 14 additions & 0 deletions hooks/use-store-modal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { create } from "zustand"


interface useStoreModalStore {
isOpen: boolean;
onOpen: () => void
onClose: () => void
}

export const useStoreModal = create<useStoreModalStore>((set: any) => ({
isOpen: false,
onOpen: () => set({ isOpen: true }),
onClose: () => set({ isOpen: false }),
}))
Loading

0 comments on commit 09d6bc1

Please sign in to comment.