From 160561b6583e06ce798a61dae9712688f6948001 Mon Sep 17 00:00:00 2001 From: Gimnath-Perera Date: Tue, 12 Sep 2023 23:42:34 +0530 Subject: [PATCH 1/3] feat: data generation and multiple rows handled --- app/page.tsx | 4 +-- components/result/index.tsx | 27 ++++++++++++++------ config/constants.ts | 14 +++++------ utils/generate-mocks/index.ts | 46 ++++++++++++++++++++++++++++------- 4 files changed, 64 insertions(+), 27 deletions(-) diff --git a/app/page.tsx b/app/page.tsx index 248a089..168e0e8 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -12,7 +12,7 @@ import { RowNumber } from '@/types'; const Home: FC = () => { const { isOpen, onOpen, onOpenChange } = useDisclosure(); const detectedInterfaces = useRef(null); - const mockResult = useRef(JSON.stringify(Initials.DefaultMockResult)); + const mockResult = useRef(JSON.stringify(Initials.DefaultMockResult, null, 2)); const [code, setCode] = useState(Initials.DefaultInterface); const [numberOfRows, setNumberOfRows] = useState('1'); const [interfaces, setInterfaces] = useState | any>( @@ -37,7 +37,7 @@ const Home: FC = () => { }; const handleOnMockGenerate = (): void => { - const generatedMocks = generateMocks(code, Array.from(interfaces)); + const generatedMocks = generateMocks(code, Array.from(interfaces), Number(numberOfRows)); mockResult.current = JSON.stringify(generatedMocks, null, 2); onOpenChange(); diff --git a/components/result/index.tsx b/components/result/index.tsx index 200d3e6..96ccd97 100644 --- a/components/result/index.tsx +++ b/components/result/index.tsx @@ -1,21 +1,32 @@ -'use client'; -import { FC } from 'react'; +import { FC, useState, useEffect } from 'react'; import { Button } from '@nextui-org/react'; +import { Spinner } from '@nextui-org/react'; interface Props { mockResult: string; } const Result: FC = ({ mockResult }) => { + const [loading, setLoading] = useState(true); + + useEffect(() => { + const timer = setTimeout(() => { + setLoading(false); + }, 1500); + + return () => clearTimeout(timer); + }, []); + return (
- {/*
{JSON.parse(mockResult)}
*/} -
-          
-            {JSON.parse(mockResult)}
-          
-        
+ {loading ? ( + + ) : ( +
+            {mockResult}
+          
+ )}
-
From beab978365a107d3450c33737dd74d76a67781ae Mon Sep 17 00:00:00 2001 From: Gimnath-Perera Date: Wed, 13 Sep 2023 00:28:05 +0530 Subject: [PATCH 3/3] feat: download functionality added --- app/page.tsx | 13 +++++++++++++ components/footer/index.tsx | 3 ++- components/navbar/index.tsx | 4 ++-- components/result/index.tsx | 7 ++++--- config/site.ts | 1 + package.json | 1 + yarn.lock | 12 ++++++++++++ 7 files changed, 35 insertions(+), 6 deletions(-) diff --git a/app/page.tsx b/app/page.tsx index d299b04..4b02def 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -8,6 +8,7 @@ import { extractInterfaceNames, generateMocks } from '@/utils'; import { Initials } from '@/config/constants'; import InterfaceSelectModal from '@/components/interface-select-modal'; import { RowNumber } from '@/types'; +import toast, { Toaster } from 'react-hot-toast'; const Home: FC = () => { const { isOpen, onOpen, onOpenChange } = useDisclosure(); @@ -45,6 +46,16 @@ const Home: FC = () => { const handleOnCopyToClipboard = (): void => { navigator.clipboard.writeText(mockResult.current ?? ''); + toast.success('Copied to clipboard'); + }; + + const handleOnDownload = (): void => { + const element = document.createElement('a'); + const file = new Blob([mockResult.current ?? ''], { type: 'text/plain' }); + element.href = URL.createObjectURL(file); + element.download = 'mock.json'; + document.body.appendChild(element); + element.click(); }; return ( @@ -55,6 +66,7 @@ const Home: FC = () => {
@@ -69,6 +81,7 @@ const Home: FC = () => { setInterfaces={setInterfaces} handleChipClose={handleChipClose} /> + ); }; diff --git a/components/footer/index.tsx b/components/footer/index.tsx index cadd984..712cae9 100644 --- a/components/footer/index.tsx +++ b/components/footer/index.tsx @@ -1,3 +1,4 @@ +import { siteConfig } from '@/config/site'; import { Link } from '@nextui-org/link'; import { FC } from 'react'; @@ -9,7 +10,7 @@ const Footer: FC = ({}) => { Made with 💖 by diff --git a/components/navbar/index.tsx b/components/navbar/index.tsx index e0baf2e..8347ccb 100644 --- a/components/navbar/index.tsx +++ b/components/navbar/index.tsx @@ -29,7 +29,7 @@ export const Navbar: FC = () => { - + @@ -37,7 +37,7 @@ export const Navbar: FC = () => { - + diff --git a/components/result/index.tsx b/components/result/index.tsx index ff87c3d..c05bed9 100644 --- a/components/result/index.tsx +++ b/components/result/index.tsx @@ -5,9 +5,10 @@ import { Spinner } from '@nextui-org/react'; interface Props { mockResult: string; onCopyToClipboard: () => void; + onDownload: () => void; } -const Result: FC = ({ mockResult, onCopyToClipboard }) => { +const Result: FC = ({ mockResult, onCopyToClipboard, onDownload }) => { const [loading, setLoading] = useState(true); useEffect(() => { @@ -30,10 +31,10 @@ const Result: FC = ({ mockResult, onCopyToClipboard }) => { )}
- -
diff --git a/config/site.ts b/config/site.ts index 2e1e5f5..62a8e89 100644 --- a/config/site.ts +++ b/config/site.ts @@ -7,6 +7,7 @@ export const siteConfig = { navMenuItems: [], links: { github: 'https://github.com/Gimnath-Perera', + repository: 'https://github.com/Gimnath-Perera/mocktopus', twitter: 'https://twitter.com/getnextui', docs: 'https://nextui.org', discord: 'https://discord.gg/9b6yyZKmH4', diff --git a/package.json b/package.json index f65c0f9..e111208 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "postcss": "8.4.27", "react": "18.2.0", "react-dom": "18.2.0", + "react-hot-toast": "^2.4.1", "tailwind-variants": "^0.1.13", "tailwindcss": "3.3.3", "typescript": "5.0.4" diff --git a/yarn.lock b/yarn.lock index c739b3a..5531815 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3488,6 +3488,11 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" +goober@^2.1.10: + version "2.1.13" + resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.13.tgz#e3c06d5578486212a76c9eba860cbc3232ff6d7c" + integrity sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ== + gopd@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" @@ -4335,6 +4340,13 @@ react-dom@18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-hot-toast@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-2.4.1.tgz#df04295eda8a7b12c4f968e54a61c8d36f4c0994" + integrity sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ== + dependencies: + goober "^2.1.10" + react-is@^16.13.1: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"