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'
|
2024-02-04 11:25:21 +00:00
|
|
|
import { Show, createSignal, onMount } 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
|
|
|
)
|
|
|
|
}
|