diff --git a/src/components/CodeAndPreview.tsx b/src/components/CodeAndPreview.tsx index 7763f928..44f01b54 100644 --- a/src/components/CodeAndPreview.tsx +++ b/src/components/CodeAndPreview.tsx @@ -25,6 +25,7 @@ import { useGlobalStore } from "@/hooks/use-global-store" import { useUrlParams } from "@/hooks/use-url-params" import { getSnippetTemplate } from "@/lib/get-snippet-template" import "@/prettier" +import { useImportSnippetDialog } from "./dialogs/import-snippet-dialog" interface Props { snippet?: Snippet | null @@ -70,6 +71,8 @@ export function CodeAndPreview({ snippet }: Props) { type: snippetType, }) const qc = useQueryClient() + const { Dialog: ImportSnippetDialog, openDialog: openImportDialog } = + useImportSnippetDialog() const updateSnippetMutation = useMutation({ mutationFn: async () => { @@ -138,7 +141,7 @@ export function CodeAndPreview({ snippet }: Props) { @@ -185,6 +188,7 @@ export function CodeAndPreview({ snippet }: Props) { /> )} + ) } diff --git a/src/components/dialogs/create-use-dialog.tsx b/src/components/dialogs/create-use-dialog.tsx new file mode 100644 index 00000000..4f889bd5 --- /dev/null +++ b/src/components/dialogs/create-use-dialog.tsx @@ -0,0 +1,28 @@ +import { FunctionComponent, useState } from "react" + +export const createUseDialog = >( + DialogComponent: DialogType, +) => { + return () => { + const [open, setOpen] = useState(false) + + return { + openDialog: () => { + setOpen(true) + }, + closeDialog: () => { + setOpen(false) + }, + Dialog: ( + props: Omit, "open" | "onOpenChange">, + ) => ( + + ), + open, + } + } +} diff --git a/src/components/dialogs/import-snippet-dialog.tsx b/src/components/dialogs/import-snippet-dialog.tsx index 77a03030..806fed82 100644 --- a/src/components/dialogs/import-snippet-dialog.tsx +++ b/src/components/dialogs/import-snippet-dialog.tsx @@ -5,6 +5,7 @@ import { Button } from "../ui/button" import { useState } from "react" import { useQuery } from "react-query" import { useAxios } from "@/hooks/use-axios" +import { createUseDialog } from "./create-use-dialog" export const ImportSnippetDialog = ({ open, @@ -12,7 +13,7 @@ export const ImportSnippetDialog = ({ onSnippetSelected, }: { open: boolean - onOpenChange: (open: boolean) => void + onOpenChange: (open: boolean) => any onSnippetSelected: (snippet: Snippet) => any }) => { const [searchText, setSearchText] = useState("") @@ -56,3 +57,5 @@ export const ImportSnippetDialog = ({ ) } + +export const useImportSnippetDialog = createUseDialog(ImportSnippetDialog)