Skip to content

Commit 1c30ac9

Browse files
committed
refactor: Profile editing to be able to upload image directly
1 parent c5db29e commit 1c30ac9

File tree

2 files changed

+39
-28
lines changed

2 files changed

+39
-28
lines changed

src/components/account/profile/ImageUpload.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { resizeImage } from '@lib/utils';
44
import { useCallback, useRef } from 'react';
55
import toast from 'react-hot-toast';
66

7+
const ALLOWED_IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png'];
8+
79
export default function ImageUpload({
810
onSuccessfulUpload,
911
setImageLoading,
@@ -23,6 +25,17 @@ export default function ImageUpload({
2325
return;
2426
}
2527

28+
// Check if file extension is allowed
29+
const fileName = file.name.toLowerCase();
30+
const fileExtension = fileName.substring(fileName.lastIndexOf('.'));
31+
32+
if (!ALLOWED_IMAGE_EXTENSIONS.includes(fileExtension)) {
33+
toast.error('Only .jpg, .jpeg, and .png images are allowed.');
34+
setImageLoading(false);
35+
event.target.value = '';
36+
return;
37+
}
38+
2639
if (file.size > 50_000) {
2740
const resizedBlob = await resizeImage(file);
2841
console.log('Resized size (KB):', resizedBlob.size / 1024);
@@ -59,7 +72,7 @@ export default function ImageUpload({
5972
ref={inputRef}
6073
id="image-input"
6174
type="file"
62-
accept="image/*"
75+
accept=".jpg,.jpeg,.png"
6376
onChange={handleFileChange}
6477
className="hidden"
6578
/>

src/components/account/profile/PublicProfile.tsx

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -131,33 +131,18 @@ export default function PublicProfile() {
131131
/>
132132
</div>
133133

134-
{isEditing ? (
135-
<div className="col items-center gap-2">
136-
<ImageUpload
137-
onSuccessfulUpload={() => {
138-
// Bust cached image and re-attempt load
139-
setImageError(false);
140-
setImageRefreshToken(Date.now());
141-
}}
142-
setImageLoading={setImageLoading}
143-
/>
144-
145-
<div className="text-sm text-slate-500">The maximum file size allowed is 500 KB.</div>
146-
</div>
147-
) : (
148-
<div>
149-
<Button
150-
className="h-9 border-2 border-slate-200 bg-white data-[hover=true]:opacity-65!"
151-
color="default"
152-
size="sm"
153-
variant="solid"
154-
onPress={() => setEditing(true)}
155-
isDisabled={isLoading}
156-
>
157-
<div className="text-sm">Edit profile</div>
158-
</Button>
159-
</div>
160-
)}
134+
<div className="col items-center gap-2">
135+
<ImageUpload
136+
onSuccessfulUpload={() => {
137+
// Bust cached image and re-attempt load
138+
setImageError(false);
139+
setImageRefreshToken(Date.now());
140+
}}
141+
setImageLoading={setImageLoading}
142+
/>
143+
144+
<div className="text-sm text-slate-500">Only .jpg, .jpeg, and .png images are allowed.</div>
145+
</div>
161146
</div>
162147

163148
{/* Details */}
@@ -229,6 +214,19 @@ export default function PublicProfile() {
229214
</div>
230215
</DetailsCard>
231216
)}
217+
218+
<div className="center-all mt-2">
219+
<Button
220+
className="h-9 border-2 border-slate-200 bg-white data-[hover=true]:opacity-65!"
221+
color="default"
222+
size="sm"
223+
variant="solid"
224+
onPress={() => setEditing(true)}
225+
isDisabled={isLoading}
226+
>
227+
<div className="text-sm">Edit profile</div>
228+
</Button>
229+
</div>
232230
</>
233231
)}
234232
</div>

0 commit comments

Comments
 (0)