Stirling-PDF/frontend/src/hooks/tools/rotate/useRotateParameters.ts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

68 lines
2.0 KiB
TypeScript
Raw Normal View History

2025-09-12 16:27:45 +01:00
import { BaseParameters } from '../../../types/parameters';
import { useBaseParameters, BaseParametersHook } from '../shared/useBaseParameters';
import { useMemo, useCallback } from 'react';
2025-09-16 11:50:15 +01:00
// Normalize angle to valid backend values (0, 90, 180, 270)
export const normalizeAngle = (angle: number): number => {
2025-09-16 14:10:22 +01:00
return ((angle % 360) + 360) % 360;
2025-09-16 11:50:15 +01:00
};
2025-09-12 16:27:45 +01:00
export interface RotateParameters extends BaseParameters {
angle: number; // Current rotation angle (0, 90, 180, 270)
}
export const defaultParameters: RotateParameters = {
angle: 0,
};
export type RotateParametersHook = BaseParametersHook<RotateParameters> & {
rotateClockwise: () => void;
rotateAnticlockwise: () => void;
hasRotation: boolean;
normalizeAngle: (angle: number) => number;
};
export const useRotateParameters = (): RotateParametersHook => {
const baseHook = useBaseParameters({
defaultParameters,
endpointName: 'rotate-pdf',
validateFn: (params) => {
// Angle must be a multiple of 90
return params.angle % 90 === 0;
},
});
// Rotate clockwise by 90 degrees
const rotateClockwise = useCallback(() => {
2025-09-16 11:50:15 +01:00
baseHook.updateParameter('angle', baseHook.parameters.angle + 90);
}, [baseHook]);
2025-09-12 16:27:45 +01:00
// Rotate anticlockwise by 90 degrees
const rotateAnticlockwise = useCallback(() => {
2025-09-16 11:50:15 +01:00
baseHook.updateParameter('angle', baseHook.parameters.angle - 90);
}, [baseHook]);
2025-09-12 16:27:45 +01:00
// Check if rotation will actually change the document
const hasRotation = useMemo(() => {
2025-09-16 11:50:15 +01:00
const normalized = normalizeAngle(baseHook.parameters.angle);
return normalized !== 0;
}, [baseHook.parameters.angle, normalizeAngle]);
2025-09-12 16:27:45 +01:00
2025-09-16 11:50:15 +01:00
// Override updateParameter - no longer normalize angles here
2025-09-12 16:27:45 +01:00
const updateParameter = useCallback(<K extends keyof RotateParameters>(
parameter: K,
value: RotateParameters[K]
) => {
2025-09-16 11:50:15 +01:00
baseHook.updateParameter(parameter, value);
}, [baseHook]);
2025-09-12 16:27:45 +01:00
return {
...baseHook,
updateParameter,
rotateClockwise,
rotateAnticlockwise,
hasRotation,
normalizeAngle,
};
};