Skip to content

Commit 4d07424

Browse files
authored
Merge branch 'main' into play/steps
2 parents 1a6c5e1 + a2c399a commit 4d07424

File tree

2 files changed

+41
-20
lines changed

2 files changed

+41
-20
lines changed

src/plays/expenses-tracker/ExpensesTracker.tsx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,14 @@ function ExpensesTracker(props: any) {
2020

2121
const handleNewExpense = () => {
2222
const expense = localStoreExpenses[localStoreExpenses.length - 1];
23-
data['id'] = expense !== undefined ? parseInt(expense.id) + 1 : 1;
24-
setLocalStoreExpenses([...localStoreExpenses, data]);
25-
setLocalStoreTotal(parseFloat(localStoreTotal) + parseFloat(data.amount));
23+
// Ensure `amount` has a default value of 0 if not present
24+
const sanitizedData = {
25+
...data,
26+
amount: data.amount || 0
27+
};
28+
sanitizedData['id'] = expense !== undefined ? parseInt(expense.id) + 1 : 1;
29+
setLocalStoreExpenses([...localStoreExpenses, sanitizedData]);
30+
setLocalStoreTotal(parseFloat(localStoreTotal) + parseFloat(sanitizedData.amount));
2631
setOpen(false);
2732
setData(null);
2833
};
@@ -97,14 +102,14 @@ function ExpensesTracker(props: any) {
97102
<td className="p-1 text-center">{expense.date}</td>
98103
<td className="p-1 text-center">{expense.amount}</td>
99104
<td className="p-1 flex justify-center space-x-2">
100-
<div className="bg-green-500 rounded-full p-[6px]">
105+
<div className="bg-green-500 cursor-pointer rounded-full p-[6px]">
101106
<FiEdit
102107
className="text-white"
103108
size={16}
104109
onClick={() => openEditModal(expense)}
105110
/>
106111
</div>
107-
<div className="bg-red-500 rounded-full p-[6px]">
112+
<div className="bg-red-500 cursor-pointer rounded-full p-[6px]">
108113
<AiOutlineDelete
109114
className="text-white"
110115
size={16}

src/plays/url-shortner/UrlShortner.jsx

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)