Fix anticlockwise rotation animation

This commit is contained in:
James Brunton 2025-09-16 11:50:15 +01:00
parent eee9d3b022
commit a1d0ceef14
2 changed files with 19 additions and 21 deletions

View File

@ -1,13 +1,14 @@
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useToolOperation, ToolType } from '../shared/useToolOperation'; import { useToolOperation, ToolType } from '../shared/useToolOperation';
import { createStandardErrorHandler } from '../../../utils/toolErrorHandler'; import { createStandardErrorHandler } from '../../../utils/toolErrorHandler';
import { RotateParameters, defaultParameters } from './useRotateParameters'; import { RotateParameters, defaultParameters, normalizeAngle } from './useRotateParameters';
// Static configuration that can be used by both the hook and automation executor // Static configuration that can be used by both the hook and automation executor
export const buildRotateFormData = (parameters: RotateParameters, file: File): FormData => { export const buildRotateFormData = (parameters: RotateParameters, file: File): FormData => {
const formData = new FormData(); const formData = new FormData();
formData.append("fileInput", file); formData.append("fileInput", file);
formData.append("angle", parameters.angle.toString()); // Normalize angle for backend (0, 90, 180, 270)
formData.append("angle", normalizeAngle(parameters.angle).toString());
return formData; return formData;
}; };

View File

@ -2,6 +2,12 @@ import { BaseParameters } from '../../../types/parameters';
import { useBaseParameters, BaseParametersHook } from '../shared/useBaseParameters'; import { useBaseParameters, BaseParametersHook } from '../shared/useBaseParameters';
import { useMemo, useCallback } from 'react'; import { useMemo, useCallback } from 'react';
// Normalize angle to valid backend values (0, 90, 180, 270)
export const normalizeAngle = (angle: number): number => {
const normalized = angle % 360;
return normalized < 0 ? normalized + 360 : normalized;
};
export interface RotateParameters extends BaseParameters { export interface RotateParameters extends BaseParameters {
angle: number; // Current rotation angle (0, 90, 180, 270) angle: number; // Current rotation angle (0, 90, 180, 270)
} }
@ -27,38 +33,29 @@ export const useRotateParameters = (): RotateParametersHook => {
}, },
}); });
// Normalize angle to valid backend values (0, 90, 180, 270)
const normalizeAngle = useCallback((angle: number): number => {
const normalized = angle % 360;
return normalized < 0 ? normalized + 360 : normalized;
}, []);
// Rotate clockwise by 90 degrees // Rotate clockwise by 90 degrees
const rotateClockwise = useCallback(() => { const rotateClockwise = useCallback(() => {
baseHook.updateParameter('angle', normalizeAngle(baseHook.parameters.angle + 90)); baseHook.updateParameter('angle', baseHook.parameters.angle + 90);
}, [baseHook, normalizeAngle]); }, [baseHook]);
// Rotate anticlockwise by 90 degrees // Rotate anticlockwise by 90 degrees
const rotateAnticlockwise = useCallback(() => { const rotateAnticlockwise = useCallback(() => {
baseHook.updateParameter('angle', normalizeAngle(baseHook.parameters.angle - 90)); baseHook.updateParameter('angle', baseHook.parameters.angle - 90);
}, [baseHook, normalizeAngle]); }, [baseHook]);
// Check if rotation will actually change the document // Check if rotation will actually change the document
const hasRotation = useMemo(() => { const hasRotation = useMemo(() => {
return baseHook.parameters.angle !== 0; const normalized = normalizeAngle(baseHook.parameters.angle);
}, [baseHook.parameters.angle]); return normalized !== 0;
}, [baseHook.parameters.angle, normalizeAngle]);
// Override updateParameter to normalize angles // Override updateParameter - no longer normalize angles here
const updateParameter = useCallback(<K extends keyof RotateParameters>( const updateParameter = useCallback(<K extends keyof RotateParameters>(
parameter: K, parameter: K,
value: RotateParameters[K] value: RotateParameters[K]
) => { ) => {
if (parameter === 'angle') {
baseHook.updateParameter(parameter, normalizeAngle(value as number) as RotateParameters[K]);
} else {
baseHook.updateParameter(parameter, value); baseHook.updateParameter(parameter, value);
} }, [baseHook]);
}, [baseHook, normalizeAngle]);
return { return {
...baseHook, ...baseHook,