@@ -10,6 +10,15 @@ function UrlShortner(props) {
1010 const [ error , setError ] = useState ( null ) ;
1111 const handleSubmit = async ( ) => {
1212 try {
13+ if ( ! userInput . trim ( ) ) {
14+ toast ( 'Please enter a valid URL.' , {
15+ position : 'top-center' ,
16+ type : 'error' ,
17+ autoClose : 1500
18+ } ) ;
19+
20+ return ;
21+ }
1322 setShortenedLink ( '' ) ;
1423 const response = await axios . get ( `https://tinyurl.com/api-create.php?url=${ userInput } ` ) ;
1524 if ( response . data ) {
@@ -62,9 +71,10 @@ function UrlShortner(props) {
6271 < h1 className = " text-2xl font-medium text-blue-500 mb-4" >
6372 React < span className = " text-purple-600 font-bold" > URL Shortener</ span >
6473 </ h1 >
65- < div >
74+ < div className = "w-full flex flex-col max-w-md mx-auto items-center" >
6675 < input
67- className = "outline-none border-2 border-blue-500 rounded-md backdrop-blur-xl bg-white/20 shadow-md px-3 py-3"
76+ required
77+ className = "outline-none border-2 border-blue-500 rounded-md backdrop-blur-xl bg-white/20 shadow-md px-3 py-2.5 leading-[1.5] placeholder:text-gray-400 w-full"
6878 placeholder = "Enter link to be shortened"
6979 type = "text"
7080 value = { userInput }
@@ -73,25 +83,31 @@ function UrlShortner(props) {
7383 } }
7484 />
7585 < button
76- class = "ms-4 group relative h-12 w-48 overflow-hidden rounded-lg bg-white text-lg shadow"
86+ class = "ms-4 group mt-4 relative h-12 px-6 overflow-hidden rounded-lg bg-white text-lg shadow"
7787 onClick = { handleSubmit }
7888 >
7989 < div class = "absolute inset-0 w-3 bg-[#0087fe] transition-all duration-[250ms] ease-out group-hover:w-full" />
80- < span class = "relative text-black group-hover:text-white" > Shorten This Link </ span >
90+ < span class = "relative text-black group-hover:text-white" > Shorten URL </ span >
8191 </ button >
8292 </ div >
83- < div className = "mt-5" >
84- { error && < div className = "text-red-500 mb-2" > { error } </ div > }
85- < div className = "relative px-4 py-2 bg-white shadow-lg rounded-xl bg-clip-padding bg-opacity-60 border border-gray-200 text-slate-500" >
86- { shortenedLink ? shortenedLink : 'Shorten An URL First' }
93+ { error && < div className = "text-red-500 mt-5" > { error } </ div > }
94+ { shortenedLink && (
95+ < div className = "mt-5" >
96+ < p > Here's your shortened URL:</ p >
97+
98+ < div className = "flex justify-center items-center" >
99+ < div className = "relative px-4 py-2 bg-white shadow-lg rounded-xl bg-clip-padding bg-opacity-60 border border-gray-200 text-slate-500" >
100+ { shortenedLink }
101+ </ div >
102+ < button
103+ className = "border-2 px-5 py-2 ml-4 rounded-md font-medium 'border-blue-500 text-blue-500 hover:bg-blue-500 hover:text-white cursor-pointer"
104+ onClick = { ( ) => copyTextToClipboard ( shortenedLink ) }
105+ >
106+ Copy
107+ </ button >
108+ </ div >
87109 </ div >
88- < button
89- className = "mt-5 border-2 border-blue-500 text-blue-500 font-medium px-5 py-2 ml-4 rounded-md hover:bg-blue-500 hover:text-white"
90- onClick = { ( ) => copyTextToClipboard ( shortenedLink ) }
91- >
92- Copy URL to Clipboard
93- </ button >
94- </ div >
110+ ) }
95111 </ div >
96112 </ div >
97113 </ div >
0 commit comments