11"use client" ;
22
3- import { useState } from "react" ;
3+ import {
4+ GitBadges ,
5+ GitHubDetail ,
6+ GitHubImages ,
7+ GitHubImagesSize ,
8+ GitHubTechStack ,
9+ ReadmeRow ,
10+ } from "@/type" ;
11+ import { FormEvent , useCallback , useState } from "react" ;
412import {
513 AiOutlineDownload ,
614 AiOutlineEye ,
715 AiOutlineFileDone ,
816} from "react-icons/ai" ;
917import { BiArrowBack , BiCopy } from "react-icons/bi" ;
18+ import { BsFiletypeJson } from "react-icons/bs" ;
1019import { toast } from "react-toastify" ;
1120
1221type Props = {
1322 setIsShow : ( value : boolean ) => void ;
1423 setIsMdPreview : ( value : boolean ) => void ;
1524 isMdPreview : boolean ;
25+ gitHubDetail : GitHubDetail ;
26+ gitHubTechStack : GitHubTechStack ;
27+ readmeRow : ReadmeRow ;
28+ images : GitHubImages ;
29+ size : GitHubImagesSize ;
30+ displayBadges : GitBadges ;
1631} ;
1732
18- function ButtonActions ( { setIsShow, setIsMdPreview, isMdPreview } : Props ) {
33+ function ButtonActions ( {
34+ setIsShow,
35+ setIsMdPreview,
36+ isMdPreview,
37+ gitHubDetail,
38+ gitHubTechStack,
39+ readmeRow,
40+ images,
41+ size,
42+ displayBadges,
43+ } : Props ) {
1944 const [ isCopy , setIsCopy ] = useState ( false ) ;
2045
21- const handleDownloadMarkdown = ( event : React . FormEvent < HTMLFormElement > ) => {
22- event . preventDefault ( ) ;
46+ const handleDownloadMarkdown = useCallback (
47+ ( event : FormEvent ) => {
48+ event . preventDefault ( ) ;
49+
50+ if ( isMdPreview ) {
51+ const markdownContent : any =
52+ document . getElementById ( "markdown-content" ) ;
53+ const tempElement = document . createElement ( "a" ) ;
54+ tempElement . setAttribute (
55+ "href" ,
56+ `data:text/markdown;charset=utf-8,${ encodeURIComponent (
57+ markdownContent . innerText
58+ ) } `
59+ ) ;
60+ tempElement . setAttribute ( "download" , "README.md" ) ;
61+ tempElement . style . display = "none" ;
62+ document . body . appendChild ( tempElement ) ;
63+ tempElement . click ( ) ;
64+ document . body . removeChild ( tempElement ) ;
65+ } else {
66+ toast . warn ( "Please Switch Preview Mode" ) ;
67+ }
68+ } ,
69+ [ isMdPreview ]
70+ ) ;
71+
72+ const handleDownloadJson = useCallback (
73+ ( event : FormEvent ) => {
74+ event . preventDefault ( ) ;
2375
24- if ( isMdPreview ) {
25- const markdownContent : any = document . getElementById ( "markdown-content" ) ;
2676 const tempElement = document . createElement ( "a" ) ;
2777 tempElement . setAttribute (
2878 "href" ,
29- `data:text/markdown;charset=utf-8,${ encodeURIComponent (
30- markdownContent . innerText
79+ `data:text/json;charset=utf-8,${ encodeURIComponent (
80+ JSON . stringify ( {
81+ gitHubDetail,
82+ gitHubTechStack,
83+ readmeRow,
84+ images,
85+ size,
86+ displayBadges,
87+ } )
3188 ) } `
3289 ) ;
33- tempElement . setAttribute ( "download" , "README.md " ) ;
90+ tempElement . setAttribute ( "download" , "data.json " ) ;
3491 tempElement . style . display = "none" ;
3592 document . body . appendChild ( tempElement ) ;
3693 tempElement . click ( ) ;
3794 document . body . removeChild ( tempElement ) ;
38- } else {
39- toast . warn ( "Please Switch Preview Mode" ) ;
40- }
41- } ;
95+ } ,
96+ [ displayBadges , gitHubDetail , gitHubTechStack , images , readmeRow , size ]
97+ ) ;
4298
43- const handleCopyToClipboard = ( event : React . FormEvent < HTMLFormElement > ) => {
44- event . preventDefault ( ) ;
99+ const handleCopyToClipboard = useCallback (
100+ ( event : FormEvent ) => {
101+ event . preventDefault ( ) ;
45102
46- if ( isMdPreview ) {
47- setIsCopy ( true ) ;
103+ if ( isMdPreview ) {
104+ setIsCopy ( true ) ;
48105
49- const range = document . createRange ( ) ;
50- range . selectNode ( document . getElementById ( "markdown-content" ) as any ) ;
51- window . getSelection ( ) ?. removeAllRanges ( ) ;
52- window . getSelection ( ) ?. addRange ( range ) ;
53- document . execCommand ( "copy" ) ;
54- window . getSelection ( ) ?. removeAllRanges ( ) ;
106+ const range = document . createRange ( ) ;
107+ range . selectNode ( document . getElementById ( "markdown-content" ) as any ) ;
108+ window . getSelection ( ) ?. removeAllRanges ( ) ;
109+ window . getSelection ( ) ?. addRange ( range ) ;
110+ document . execCommand ( "copy" ) ;
111+ window . getSelection ( ) ?. removeAllRanges ( ) ;
55112
56- setTimeout ( ( ) => {
57- setIsCopy ( false ) ;
58- } , 1000 ) ;
59- } else {
60- toast . warn ( "Please Switch Preview Mode" ) ;
61- }
62- } ;
113+ setTimeout ( ( ) => {
114+ setIsCopy ( false ) ;
115+ } , 1000 ) ;
116+ } else {
117+ toast . warn ( "Please Switch Preview Mode" ) ;
118+ }
119+ } ,
120+ [ isMdPreview ]
121+ ) ;
63122
64123 return (
65124 < div className = "flex justify-between items-center py-2.5" >
66125 < button
67126 onClick = { ( ) => setIsShow ( true ) }
68- className = "bg-gray-300 hover:bg-gray-400 text-gray-800 font-bold py-2 px-4 rounded inline-flex items-center gap-2"
127+ className = "bg-gray-700 text-gray- 300 hover:bg-slate-600 dark:bg- gray-300 dark:hover:bg-gray- 400 dark: text-gray-800 font-bold py-2 px-4 rounded inline-flex items-center gap-2"
69128 >
70129 < BiArrowBack size = { 20 } />
71130 < span > Back To Edit</ span >
72131 </ button >
73132 < button
74- onClick = { ( e : any ) => handleCopyToClipboard ( e ) }
75- className = "bg-gray-300 hover:bg-gray-400 text-gray-800 font-bold py-2 px-4 rounded inline-flex items-center gap-2"
133+ onClick = { handleCopyToClipboard }
134+ className = "bg-gray-700 text-gray- 300 hover:bg-slate-600 dark:bg- gray-300 dark:hover:bg-gray- 400 dark: text-gray-800 font-bold py-2 px-4 rounded inline-flex items-center gap-2"
76135 >
77136 { isCopy ? (
78137 < >
@@ -87,24 +146,24 @@ function ButtonActions({ setIsShow, setIsMdPreview, isMdPreview }: Props) {
87146 ) }
88147 </ button >
89148 < button
90- onClick = { ( e : any ) => handleDownloadMarkdown ( e ) }
91- className = "bg-gray-300 hover:bg-gray-400 text-gray-800 font-bold py-2 px-4 rounded inline-flex items-center gap-2"
149+ onClick = { handleDownloadMarkdown }
150+ className = "bg-gray-700 text-gray- 300 hover:bg-slate-600 dark:bg- gray-300 dark:hover:bg-gray- 400 dark: text-gray-800 font-bold py-2 px-4 rounded inline-flex items-center gap-2"
92151 >
93152 < AiOutlineDownload size = { 20 } />
94153 < span > Download Markdown</ span >
95154 </ button >
96- { /* <button
97- onClick={() => toast.info("This feature will be coming soon") }
98- className="bg-gray-300 hover:bg-gray-400 text-gray-800 font-bold py-2 px-4 rounded inline-flex items-center gap-2"
155+ < button
156+ onClick = { handleDownloadJson }
157+ className = "bg-gray-700 text-gray- 300 hover:bg-slate-600 dark:bg- gray-300 dark:hover:bg-gray- 400 dark: text-gray-800 font-bold py-2 px-4 rounded inline-flex items-center gap-2"
99158 >
100- <AiOutlineSave size={20} />
101- <span>Save Markdown </span>
102- </button> */ }
159+ < BsFiletypeJson size = { 20 } />
160+ < span > Download Backup </ span >
161+ </ button >
103162 < button
104163 onClick = { ( ) =>
105164 isMdPreview ? setIsMdPreview ( false ) : setIsMdPreview ( true )
106165 }
107- className = "bg-gray-300 hover:bg-gray-400 text-gray-800 font-bold py-2 px-4 rounded inline-flex items-center gap-2"
166+ className = "bg-gray-700 text-gray- 300 hover:bg-slate-600 dark:bg- gray-300 dark:hover:bg-gray- 400 dark: text-gray-800 font-bold py-2 px-4 rounded inline-flex items-center gap-2"
108167 >
109168 { isMdPreview ? (
110169 < >
@@ -123,18 +182,3 @@ function ButtonActions({ setIsShow, setIsMdPreview, isMdPreview }: Props) {
123182}
124183
125184export default ButtonActions ;
126-
127- /* const handleDownloadJson = () => {
128- const tempElement = document.createElement("a");
129- tempElement.setAttribute(
130- "href",
131- `data:text/json;charset=utf-8,${encodeURIComponent(
132- JSON.stringify({ gitHubTechStack })
133- )}`
134- );
135- tempElement.setAttribute("download", "data.json");
136- tempElement.style.display = "none";
137- document.body.appendChild(tempElement);
138- tempElement.click();
139- document.body.removeChild(tempElement);
140- }; */
0 commit comments