Skip to content

57 image scroping in inscription form image upload error management#59

Merged
YoungMame merged 14 commits into
mainfrom
57-image-scroping-in-inscription-form-image-upload-error-management
Dec 18, 2025
Merged

57 image scroping in inscription form image upload error management#59
YoungMame merged 14 commits into
mainfrom
57-image-scroping-in-inscription-form-image-upload-error-management

Conversation

@YoungMame
Copy link
Copy Markdown
Owner

Basic profile settings page

Image upload scrop, zoom, rotate on unboarding

Image Scropper component

@YoungMame YoungMame self-assigned this Dec 1, 2025
Copilot AI review requested due to automatic review settings December 1, 2025 13:17
@YoungMame YoungMame added the enhancement New feature or request label Dec 1, 2025
@YoungMame YoungMame linked an issue Dec 1, 2025 that may be closed by this pull request
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR implements image cropping, zoom, and rotation functionality for the onboarding inscription form with improved error management. The changes enable users to customize their uploaded images before submission.

Key Changes

  • Added react-easy-crop library for interactive image cropping with zoom and rotation controls
  • Implemented crop/rotation settings storage in onboarding data structure
  • Extended backend API to accept and process crop/rotation parameters using Sharp
  • Updated gender values from male/female to men/women across frontend and backend

Reviewed changes

Copilot reviewed 36 out of 38 changed files in this pull request and generated 26 comments.

Show a summary per file
File Description
nextjs/matcha/src/utils/cropImage.ts New utility for client-side image cropping with canvas manipulation
nextjs/matcha/src/utils/getImageUrl.ts Helper to create blob URLs from File objects
nextjs/matcha/src/components/common/ImageCropper.tsx New cropper component with zoom and rotation controls
nextjs/matcha/src/components/onboarding/steps/PicturesStep.tsx Enhanced picture upload step with cropping UI integration
nextjs/matcha/src/hooks/useOnboarding.ts Updated to handle crop/rotation settings submission
nextjs/matcha/src/types/onboarding.ts Added crop and rotation settings to onboarding data type
nextjs/matcha/src/mocks/browsing_mocks.ts Updated gender values to use new men/women convention
nextjs/matcha/src/contexts/MeContext.tsx New context provider for user profile data management
nextjs/matcha/src/app/(logged)/me/page.tsx New profile settings page for viewing/editing user data
fastify/assets/srcs/controllers/private/me/profilePictures.ts Enhanced to process crop/rotation with Sharp library
fastify/assets/srcs/plugins/checkImageConformity.ts Updated validation to support crop dimensions
fastify/assets/srcs/services/UserService.ts Added firstName/lastName to profile responses
package.json Added react-easy-crop and react-image-crop dependencies
Files not reviewed (1)
  • nextjs/matcha/pnpm-lock.yaml: Language not supported
Comments suppressed due to low confidence (3)

nextjs/matcha/src/components/onboarding/steps/PicturesStep.tsx:199

  • Using == instead of === for comparison. In JavaScript/TypeScript, it's best practice to use strict equality (===) to avoid type coercion issues.
			const picture = currentCroppingIndex == 0 ? profilePicture : additionalPictures[currentCroppingIndex - 1];

nextjs/matcha/src/app/(logged)/me/page.tsx:11

  • Unused function onChange.
function onChange(field: string, value: any) {

nextjs/matcha/src/hooks/useOnboarding.ts:4

  • Unused import Fira_Sans_Extra_Condensed.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +50 to +52
const heightensAgo = today.setFullYear(today.getFullYear() - 18);

if (heightensAgo - (me.birthdate as Date).getTime() < 0)
Copy link

Copilot AI Dec 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo in variable name: heightensAgo should be eighteenYearsAgo to correctly represent "18 years ago".

Suggested change
const heightensAgo = today.setFullYear(today.getFullYear() - 18);
if (heightensAgo - (me.birthdate as Date).getTime() < 0)
const eighteenYearsAgo = today.setFullYear(today.getFullYear() - 18);
if (eighteenYearsAgo - (me.birthdate as Date).getTime() < 0)

Copilot uses AI. Check for mistakes.
{ value: "heterosexual", label: "Hétérosexuel" },
{ value: "homosexual", label: "Homosexuel" },
{ value: "bisexual", label: "Bisexuel" },
]
Copy link

Copilot AI Dec 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing semicolon at the end of the ORIENTATION_OPTIONS array declaration.

Copilot uses AI. Check for mistakes.
Comment on lines +48 to +55
onClick={() => setRotation((rotation + 90) % 180)}
size="small"
aria-label="Rotate right"
>
<div>\-</div>
</IconButton>
<IconButton
onClick={() => setRotation((rotation + 90) % 180)}
Copy link

Copilot AI Dec 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The rotation button handlers both use the same logic (rotation + 90) % 180, which will cause both buttons to rotate in the same direction. Additionally, the modulo 180 means rotations will jump from 90° to -90° instead of completing a full rotation. Consider:

  • Using (rotation - 90) % 360 for one button and (rotation + 90) % 360 for the other
  • Or using different increment/decrement values to differentiate the buttons' behavior
Suggested change
onClick={() => setRotation((rotation + 90) % 180)}
size="small"
aria-label="Rotate right"
>
<div>\-</div>
</IconButton>
<IconButton
onClick={() => setRotation((rotation + 90) % 180)}
onClick={() => setRotation((rotation - 90 + 360) % 360)}
size="small"
aria-label="Rotate left"
>
<div>\-</div>
</IconButton>
<IconButton
onClick={() => setRotation((rotation + 90) % 360)}

Copilot uses AI. Check for mistakes.
);
}

export function useMe() {
Copy link

Copilot AI Dec 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Debug console.log statements should be removed from production code.

Copilot uses AI. Check for mistakes.
Comment on lines +11 to +13
function onChange(field: string, value: any) {
console.log(`Field ${field} changed to`, value);
}
Copy link

Copilot AI Dec 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The function onChange on lines 11-13 is defined but never used. Consider removing it or implementing its functionality if it was meant to be used in the form fields.

Suggested change
function onChange(field: string, value: any) {
console.log(`Field ${field} changed to`, value);
}

Copilot uses AI. Check for mistakes.
crop: Area;
}

const CROP_AREA_ASPECT = 9 / 16;
Copy link

Copilot AI Dec 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused variable CROP_AREA_ASPECT.

Suggested change
const CROP_AREA_ASPECT = 9 / 16;

Copilot uses AI. Check for mistakes.

import { createContext, useContext, ReactNode, useState, useEffect } from "react";
import { Location } from "../types/location";
import axios, { Axios } from "axios";
Copy link

Copilot AI Dec 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused import Axios.

Copilot uses AI. Check for mistakes.
Comment on lines +56 to +58
let rotation = Number((request.body as { rotation?: { value: string } }).rotation?.value) || 0;
if (rotation > 180) rotation = 180;
if (rotation < -180) rotation = -180;
Copy link

Copilot AI Dec 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The value assigned to rotation here is unused.

Suggested change
let rotation = Number((request.body as { rotation?: { value: string } }).rotation?.value) || 0;
if (rotation > 180) rotation = 180;
if (rotation < -180) rotation = -180;

Copilot uses AI. Check for mistakes.

const onCropComplete = (croppedArea: Area, croppedAreaPixels: Area) => {
setCroppedAreaPixels(croppedAreaPixels)
}
Copy link

Copilot AI Dec 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoid automated semicolon insertion (91% of all statements in the enclosing function have an explicit semicolon).

Suggested change
}
};

Copilot uses AI. Check for mistakes.
setRotation(0);
setZoom(1);
} catch (e) {
console.error(e)
Copy link

Copilot AI Dec 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoid automated semicolon insertion (91% of all statements in the enclosing function have an explicit semicolon).

Suggested change
console.error(e)
console.error(e);

Copilot uses AI. Check for mistakes.
ValentinMalassigne and others added 3 commits December 18, 2025 06:50
* Initial plan

* Fix image rotation to use 360 degrees instead of 180

Co-authored-by: YoungMame <134452452+YoungMame@users.noreply.github.com>

* Remove package-lock.json from tracking

Co-authored-by: YoungMame <134452452+YoungMame@users.noreply.github.com>

* Address code review feedback: use strict equality, proper types, and rotation icons

Co-authored-by: YoungMame <134452452+YoungMame@users.noreply.github.com>

* Remove npm package-lock.json (project uses pnpm)

Co-authored-by: YoungMame <134452452+YoungMame@users.noreply.github.com>

* Extract image selection logic and add configurable output format

Co-authored-by: YoungMame <134452452+YoungMame@users.noreply.github.com>

* Restore original package-lock.json from main branch

Co-authored-by: YoungMame <134452452+YoungMame@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: YoungMame <134452452+YoungMame@users.noreply.github.com>
Co-authored-by: ValentinMalassigne <valentin.malassigne3@gmail.com>
Copilot AI review requested due to automatic review settings December 18, 2025 06:21
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 34 out of 37 changed files in this pull request and generated 16 comments.

Files not reviewed (1)
  • nextjs/matcha/pnpm-lock.yaml: Language not supported
Comments suppressed due to low confidence (3)

nextjs/matcha/src/hooks/useOnboarding.ts:5

  • Unused import Fira_Sans_Extra_Condensed.
    fastify/assets/srcs/routes/private/user/me/profile.ts:64
  • This property is overwritten by another property in the same object literal.
						firstName: { type: 'string' },

fastify/assets/srcs/routes/private/user/me/profile.ts:65

						lastName: { type: 'string' },

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 64 to 65
firstName: { type: 'string' },
lastName: { type: 'string' },
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate property definitions for 'firstName' and 'lastName' in the schema. Lines 64-65 duplicate lines 67-68, which will cause validation issues.

Suggested change
firstName: { type: 'string' },
lastName: { type: 'string' },

Copilot uses AI. Check for mistakes.
];

const MALE_PICTURES = [
const men_PICTURES = [
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inconsistent naming convention: 'men_PICTURES' mixes snake_case with UPPER_CASE. Should be either 'MALE_PICTURES' or 'menPictures' to match the codebase style.

Copilot uses AI. Check for mistakes.
Comment on lines +61 to +65
// console.log('width', width);
// console.log('width > maxWidth', width > maxWidth);
// console.log('width < minWidth', width < minWidth);
// console.log(ratio)
// console.log(expectedRatio)
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Commented out console.log statements should be removed rather than left in the code. This clutters the codebase.

Suggested change
// console.log('width', width);
// console.log('width > maxWidth', width > maxWidth);
// console.log('width < minWidth', width < minWidth);
// console.log(ratio)
// console.log(expectedRatio)

Copilot uses AI. Check for mistakes.
@@ -0,0 +1,105 @@
/**
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's a typo in the PR title: "scroping" should be "cropping".

Copilot uses AI. Check for mistakes.
Comment on lines +109 to +110
formData.append('rotation', data.additionalPicturesSettings[data.additionalPictures.indexOf(picture)].rotation.toString());
formData.append('crop', JSON.stringify(data.additionalPicturesSettings[data.additionalPictures.indexOf(picture)].crop));
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using indexOf inside a loop is inefficient and can return incorrect indices. If the same picture appears multiple times in the array, indexOf will always return the first occurrence. Store the index separately or use map with index parameter instead.

Copilot uses AI. Check for mistakes.
try {
if (currentCroppingIndex === null || croppedAreaPixels === null) return;

const picture = currentCroppingIndex == 0 ? profilePicture : additionalPictures[currentCroppingIndex - 1];
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using loose equality (==) instead of strict equality (===). This should use === for type-safe comparison.

Copilot uses AI. Check for mistakes.
}

update = async (id: number, user: UserProfile, location?: UserLocation) => {
console.log("Updating user ID:", id, "with data:", user, "and location:", location);
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Debug console.log statement left in production code. This should be removed or wrapped in a development-only check.

Suggested change
console.log("Updating user ID:", id, "with data:", user, "and location:", location);
if (process.env.NODE_ENV !== 'production') {
console.debug("Updating user ID:", id, "with data:", user, "and location:", location);
}

Copilot uses AI. Check for mistakes.
throw new BadRequestError('Failed to process image with given crop/rotation');
}

console.log('Saving new profile picture to', newFilePath);
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Debug console.log statement left in production code. This should be removed or wrapped in a development-only check.

Suggested change
console.log('Saving new profile picture to', newFilePath);
if (process.env.NODE_ENV !== 'production') {
console.log('Saving new profile picture to', newFilePath);
}

Copilot uses AI. Check for mistakes.
Comment on lines +26 to 27
const CROP_AREA_ASPECT = 9 / 16;

Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused variable CROP_AREA_ASPECT.

Suggested change
const CROP_AREA_ASPECT = 9 / 16;

Copilot uses AI. Check for mistakes.
} catch (e) {
console.error(e)
}
}
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoid automated semicolon insertion (91% of all statements in the enclosing function have an explicit semicolon).

Copilot uses AI. Check for mistakes.
Copilot AI review requested due to automatic review settings December 18, 2025 13:42
@YoungMame YoungMame merged commit 9ec8382 into main Dec 18, 2025
1 check failed
@YoungMame YoungMame deleted the 57-image-scroping-in-inscription-form-image-upload-error-management branch December 18, 2025 13:46
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 37 out of 40 changed files in this pull request and generated 11 comments.

Files not reviewed (1)
  • nextjs/matcha/pnpm-lock.yaml: Language not supported
Comments suppressed due to low confidence (2)

nextjs/matcha/src/app/(logged)/me/page.tsx:170

  • These console.log statements on lines 148, 170, and should be removed before merging to production. Debug logging statements clutter the production console and may expose sensitive information.
  const { data: profile, isLoading, error, refetch } = useMyProfile();
  
  const [isUpdating, setIsUpdating] = useState(false);
  const [isUploading, setIsUploading] = useState(false);
  const [isDeleting, setIsDeleting] = useState(false);
  const [isSettingMain, setIsSettingMain] = useState(false);

  const [isEditing, setIsEditing] = useState(false);
  const [validationError, setValidationError] = useState<string | null>(null);
  const [formData, setFormData] = useState({
    firstName: "",
    lastName: "",
    email: "",
    bio: "",
    tags: [] as string[],
    gender: "",
    orientation: "",
    bornAt: "",
  });

  useEffect(() => {
    if (profile) {
      setFormData({

nextjs/matcha/src/hooks/useOnboarding.ts:5

  • Unused import Fira_Sans_Extra_Condensed.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

{ value: "heterosexual", label: "Hétérosexuel" },
{ value: "homosexual", label: "Homosexuel" },
{ value: "bisexual", label: "Bisexuel" },
]
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing semicolon at the end of the array. This violates JavaScript/TypeScript coding standards and could cause issues with automatic semicolon insertion.

Copilot uses AI. Check for mistakes.
Comment on lines +10 to +14
firstName: { type: 'string', minLength: 1, maxLength: 50, pattern: '[a-zA-Z-\' ]' },
lastName: { type: 'string', minLength: 1, maxLength: 50, pattern: '[a-zA-Z-\' ]' },
email: { type: 'string', format: 'email' },
bio: { type: 'string', minLength: 50, maxLength: 100 },
tags: { type: 'array', items: { type: 'string' }, minItems: 1 },
bio: { type: 'string', minLength: 50, maxLength: 500 },
tags: { type: 'array', items: { type: 'string', minLength: 1, maxLength: 30, pattern: '[a-zA-Z_]' }, minItems: 3 },
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The regex patterns in the schema definitions are missing delimiters. Patterns like '[a-zA-Z-' ]' and '[a-zA-Z_]' should be '^[a-zA-Z-' ]+$' and '^[a-zA-Z_]+$' respectively to properly validate the entire string. Without anchors, these patterns will match if any part of the string contains valid characters, allowing invalid input to pass validation.

Copilot uses AI. Check for mistakes.
}

update = async (id: number, user: UserProfile, location?: UserLocation) => {
console.log("Updating user ID:", id, "with data:", user, "and location:", location);
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Console.log statement should be removed before merging to production. This debug log on line 135 exposes potentially sensitive user data and should not be in production code.

Suggested change
console.log("Updating user ID:", id, "with data:", user, "and location:", location);

Copilot uses AI. Check for mistakes.
import { OnboardingData, OnboardingStep } from '@/types/onboarding';
import { STEPS, MIN_INTERESTS } from '@/constants/onboarding';
import { profileApi } from '@/lib/api/profile';
import { Fira_Sans_Extra_Condensed } from 'next/font/google';
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This import of 'Fira_Sans_Extra_Condensed' from 'next/font/google' appears to be unused. There's no reference to this font anywhere in the file. This should be removed to keep the codebase clean.

Copilot uses AI. Check for mistakes.
Comment on lines +4 to +5
export default function getImageUrl(file: File | null): string | null {
return file ? URL.createObjectURL(file) : null;
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's a potential memory leak here. URL.createObjectURL creates a blob URL that needs to be explicitly revoked with URL.revokeObjectURL when no longer needed. Otherwise, the browser will keep the blob in memory until the page is closed. Consider implementing cleanup logic or using a useEffect hook with cleanup in components that use this function.

Copilot uses AI. Check for mistakes.
Comment on lines +79 to +81
if (query.error) {
query.error = new Error("Failed to fetch user profile");
}
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The error assignment on line 80 is incorrect. You're trying to assign to a readonly property. The query.error property from useQuery is readonly and cannot be reassigned. This code will cause a runtime error. Instead, handle the error appropriately in the component or remove this line.

Copilot uses AI. Check for mistakes.
Comment on lines +32 to +35
firstName: { type: 'string', minLength: 1, maxLength: 50, pattern: '[a-zA-Z-\' ]' },
lastName: { type: 'string', minLength: 1, maxLength: 50, pattern: '[a-zA-Z-\' ]' },
bio: { type: 'string', minLength: 50, maxLength: 500 },
tags: { type: 'array', items: { type: 'string', minLength: 1, maxLength: 30, pattern: '[a-zA-Z_]' }, minItems: 3 },
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The regex patterns in the schema definitions are missing delimiters. Patterns like '[a-zA-Z-' ]' should be '^[a-zA-Z-' ]+$' to properly validate the entire string. Without anchors (^ and $), the pattern will match if any part of the string contains valid characters, not the entire string.

Suggested change
firstName: { type: 'string', minLength: 1, maxLength: 50, pattern: '[a-zA-Z-\' ]' },
lastName: { type: 'string', minLength: 1, maxLength: 50, pattern: '[a-zA-Z-\' ]' },
bio: { type: 'string', minLength: 50, maxLength: 500 },
tags: { type: 'array', items: { type: 'string', minLength: 1, maxLength: 30, pattern: '[a-zA-Z_]' }, minItems: 3 },
firstName: { type: 'string', minLength: 1, maxLength: 50, pattern: '^[a-zA-Z-\' ]+$' },
lastName: { type: 'string', minLength: 1, maxLength: 50, pattern: '^[a-zA-Z-\' ]+$' },
bio: { type: 'string', minLength: 50, maxLength: 500 },
tags: { type: 'array', items: { type: 'string', minLength: 1, maxLength: 30, pattern: '^[a-zA-Z_]+' + '$' }, minItems: 3 },

Copilot uses AI. Check for mistakes.
Comment on lines +370 to +371
const gender = Math.random() > 0.5 ? "female" : "men";
const interestedInGenders = gender === "female" ? ["men"] : ["female"];
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's a logic error in the gender assignment. Line 370 assigns either "female" or "men" to the gender variable, mixing the old and new gender values. This should consistently use either the old values ("male"/"female") or new values ("men"/"women"). Based on other changes in the PR, it should be "women" instead of "female".

Copilot uses AI. Check for mistakes.
const router = useRouter();
const queryClient = useQueryClient();
const { data: profile, isLoading, error } = useMyProfile();
const { data: profile, isLoading, error, refetch } = useMyProfile();
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused variable refetch.

Suggested change
const { data: profile, isLoading, error, refetch } = useMyProfile();
const { data: profile, isLoading, error } = useMyProfile();

Copilot uses AI. Check for mistakes.
Comment on lines +11 to +16
import IconButton from "@/components/common/IconButton";
import ImageCropper from "@/components/common/ImageCropper";

declare type Area = {
width: number;
height: number;
Copy link

Copilot AI Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused import IconButton.

Suggested change
import IconButton from "@/components/common/IconButton";
import ImageCropper from "@/components/common/ImageCropper";
declare type Area = {
width: number;
height: number;
import ImageCropper from "@/components/common/ImageCropper";
declare type Area = {
width: number;
height: number;
height: number;

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Image scroping in inscription form + Image upload error management

4 participants