webapp/src/components/_shared/ImageCropper/ImageCropper.tsx

79 lines
1.9 KiB
TypeScript
Raw Normal View History

2024-01-25 12:41:25 +00:00
import 'cropperjs/dist/cropper.css'
import { UploadFile } from '@solid-primitives/upload'
2024-01-29 09:10:30 +00:00
import Cropper from 'cropperjs'
import { createSignal, onMount, Show } from 'solid-js'
2024-01-25 12:41:25 +00:00
import { useLocalize } from '../../../context/localize'
import { Button } from '../Button'
2024-01-22 11:06:32 +00:00
import styles from './ImageCropper.module.scss'
2024-01-25 12:41:25 +00:00
interface CropperProps {
uploadFile: UploadFile
onSave: (any) => void
onDecline?: () => void
}
export const ImageCropper = (props: CropperProps) => {
const { t } = useLocalize()
const imageTagRef: { current: HTMLImageElement } = {
current: null,
}
const [cropper, setCropper] = createSignal(null)
onMount(() => {
if (imageTagRef.current) {
setCropper(
new Cropper(imageTagRef.current, {
viewMode: 1,
aspectRatio: 1,
guides: false,
background: false,
rotatable: false,
2024-01-27 11:41:00 +00:00
autoCropArea: 1,
2024-01-25 12:41:25 +00:00
modal: true,
}),
)
2024-01-22 11:06:32 +00:00
}
2024-01-25 12:41:25 +00:00
})
2024-01-22 11:06:32 +00:00
return (
2024-01-25 12:41:25 +00:00
<div>
2024-01-27 11:41:00 +00:00
<div class={styles.cropperContainer}>
2024-01-25 12:41:25 +00:00
<img
ref={(el) => (imageTagRef.current = el)}
src={props.uploadFile.source}
alt="image crop panel"
/>
</div>
<div class={styles.cropperControls}>
<Show when={props.onDecline}>
<Button variant="secondary" onClick={props.onDecline} value={t('Decline')} />
</Show>
<Button
variant="primary"
onClick={() => {
cropper()
.getCroppedCanvas()
.toBlob((blob) => {
const formData = new FormData()
formData.append('media', blob, props.uploadFile.file.name)
props.onSave({
...props.uploadFile,
file: formData.get('media'),
})
})
}}
value={t('Save')}
/>
</div>
</div>
2024-01-22 11:06:32 +00:00
)
}