diff --git a/src/pages/examples-page/example-card.tsx b/src/pages/examples-page/example-card.tsx index d44075bb..8295e423 100644 --- a/src/pages/examples-page/example-card.tsx +++ b/src/pages/examples-page/example-card.tsx @@ -1,4 +1,4 @@ -import React, { useCallback } from 'react'; +import React, { useRef } from 'react'; import type { Example } from './examples-data/examples-data'; import { randomColor } from '@/lib/colors'; import { Import } from 'lucide-react'; @@ -13,35 +13,23 @@ import { TooltipContent, TooltipTrigger, } from '@/components/tooltip/tooltip'; -import { useStorage } from '@/hooks/use-storage'; -import type { Diagram } from '@/lib/domain/diagram'; -import { useNavigate } from 'react-router-dom'; import { useTheme } from '@/hooks/use-theme'; +import { Spinner } from '@/components/spinner/spinner'; export interface ExampleCardProps { example: Example; + utilizeExample: () => void; + loading: boolean; } -export const ExampleCard: React.FC = ({ example }) => { - const navigate = useNavigate(); +export const ExampleCard: React.FC = ({ + example, + utilizeExample, + loading, +}) => { const { effectiveTheme } = useTheme(); - const { addDiagram, deleteDiagram } = useStorage(); - const { diagram } = example; - const utilizeExample = useCallback(async () => { - const { id } = diagram; + const color = useRef(randomColor()); - await deleteDiagram(id); - - const now = new Date(); - const diagramToAdd: Diagram = { - ...diagram, - createdAt: now, - updatedAt: now, - }; - - await addDiagram({ diagram: diagramToAdd }); - navigate(`/diagrams/${id}`); - }, [addDiagram, diagram, navigate, deleteDiagram]); return (
= ({ example }) => { >
@@ -78,12 +66,16 @@ export const ExampleCard: React.FC = ({ example }) => {
- + {loading ? ( + + ) : ( + + )}
diff --git a/src/pages/examples-page/examples-page.tsx b/src/pages/examples-page/examples-page.tsx index 8ea9b57a..aedfa244 100644 --- a/src/pages/examples-page/examples-page.tsx +++ b/src/pages/examples-page/examples-page.tsx @@ -1,6 +1,7 @@ -import React from 'react'; +import React, { useCallback } from 'react'; import ChartDBLogo from '@/assets/logo-light.png'; import ChartDBDarkLogo from '@/assets/logo-dark.png'; +import type { Example } from './examples-data/examples-data'; import { examples } from './examples-data/examples-data'; import { ExampleCard } from './example-card'; import { useTheme } from '@/hooks/use-theme'; @@ -8,9 +9,44 @@ import { LocalConfigProvider } from '@/context/local-config-context/local-config import { StorageProvider } from '@/context/storage-context/storage-provider'; import { ThemeProvider } from '@/context/theme-context/theme-provider'; import { Helmet } from 'react-helmet-async'; +import { useNavigate } from 'react-router-dom'; +import { useStorage } from '@/hooks/use-storage'; +import type { Diagram } from '@/lib/domain/diagram'; const ExamplesPageComponent: React.FC = () => { const { effectiveTheme } = useTheme(); + const navigate = useNavigate(); + const { addDiagram, deleteDiagram } = useStorage(); + const [loadingExampleId, setLoadingExampleId] = React.useState(); + const utilizeExample = useCallback( + async ({ example }: { example: Example }) => { + if (loadingExampleId) { + return; + } + setLoadingExampleId(example.id); + const { diagram } = example; + const { id } = diagram; + + await deleteDiagram(id); + + const now = new Date(); + const diagramToAdd: Diagram = { + ...diagram, + createdAt: now, + updatedAt: now, + }; + + await addDiagram({ diagram: diagramToAdd }); + navigate(`/diagrams/${id}`); + }, + [ + addDiagram, + navigate, + deleteDiagram, + loadingExampleId, + setLoadingExampleId, + ] + ); return ( <> @@ -54,7 +90,14 @@ const ExamplesPageComponent: React.FC = () => {
{examples.map((example) => ( - + + utilizeExample({ example }) + } + loading={loadingExampleId === example.id} + /> ))}