Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
bytegen-dev committed Aug 17, 2024
1 parent 55b9e28 commit e6bfdc2
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 12 deletions.
50 changes: 50 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"lint": "next lint"
},
"dependencies": {
"html2canvas": "^1.4.1",
"next": "14.2.5",
"react": "^18",
"react-dom": "^18",
Expand Down
55 changes: 43 additions & 12 deletions src/pages/generate.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { useState } from 'react';
import html2canvas from 'html2canvas';
import { useRef, useState } from 'react';
import { FaFileDownload, FaGithub } from 'react-icons/fa';
import { FaXTwitter } from 'react-icons/fa6';
import { HiGlobeAlt } from 'react-icons/hi';
Expand All @@ -7,7 +8,38 @@ const MemeGenerator = () => {
const [topText, setTopText] = useState<string>('');
const [bottomText, setBottomText] = useState<string>('');
const [imageUrl, setImageUrl] = useState<string>('/default-meme.jpg');
const [error, setError] = useState<boolean>(false)
const [error, setError] = useState<string>("")
const [downloading, setdownloading] = useState<boolean>(false)

const elementRef = useRef(null);

const downloadImage = async () => {
try{
setdownloading(true)
setError("")
const element = elementRef.current;
if (!element) return;

const canvas = await html2canvas(element);

const dataUrl = canvas.toDataURL('image/png');

const link = document.createElement('a');
link.href = dataUrl;
const randomNo:any = Math.ceil(Math.random()*1000)
link.download = `meme-${randomNo}.png`;
link.click();
setTimeout(()=>{
setdownloading(false)
}, 2000)
} catch(error:any){
console.error(error?.message)
setError(error?.message)
setTimeout(()=>{
setdownloading(false)
}, 100)
}
};

return (
<>
Expand Down Expand Up @@ -36,12 +68,6 @@ const MemeGenerator = () => {
className="mb-4 p-2 border rounded w-full"
value={imageUrl}
required
onErrorCapture={()=>{
setError(true)
}}
onLoadedData={()=>{
setError(false)
}}
onChange={(e) => setImageUrl(e.target.value)}
/>
<div className="image-templates">
Expand All @@ -67,16 +93,21 @@ const MemeGenerator = () => {
Elon musk
</div>
</div>
{imageUrl && <div className="relative w-full h-64 dark-bg">
{imageUrl && <div className="relative w-full h-64 dark-bg" ref={elementRef}>
<img src={imageUrl} alt="Meme" className="w-full h-full object-cover rounded-lg" />
<div className="absolute top-0 left-0 w-full h-full flex flex-col justify-between text-center text-white">
<span className="font-bold text-2xl mt-2">{topText}</span>
<span className="font-bold text-2xl mb-2">{bottomText}</span>
</div>
</div>}
{error && <p className='error'>invalid image</p>}
<button className="primary-btn button" disabled={!imageUrl || error}>
Save Image <FaFileDownload />
{error && <p className='error'>{error || "an error occured"}</p>}
<button className="primary-btn button" disabled={!imageUrl} onClick={()=>{
if(downloading){
return
}
downloadImage()
}}>
{downloading ? "Downloading..." : <>Save Image <FaFileDownload /></>}
</button>
</div>
</div>
Expand Down
5 changes: 5 additions & 0 deletions src/styles/styles.scss
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,11 @@ input{
}
}

.error{
margin-top: 20px;
color: red;
}

.dark-bg{
background-color: #000;
border-radius: 10px;
Expand Down

0 comments on commit e6bfdc2

Please sign in to comment.