import clsx from "clsx" import { useMemo } from "react" import { Controller, FieldArrayWithId, useFieldArray, useWatch, } from "react-hook-form" import { FormImage } from "../../../../types/shared" import { NestedForm } from "../../../../utils/nested-form" import FileUploadField from "../../../atoms/file-upload-field" import Button from "../../../fundamentals/button" import CheckCircleFillIcon from "../../../fundamentals/icons/check-circle-fill-icon" import TrashIcon from "../../../fundamentals/icons/trash-icon" import Actionables, { ActionType } from "../../../molecules/actionables" type ImageType = { selected: boolean } & FormImage export type MediaFormType = { images: ImageType[] } type Props = { form: NestedForm } const MediaForm = ({ form }: Props) => { const { control, path, setValue } = form const { fields, append, remove } = useFieldArray({ control: control, name: path("images"), }) const handleFilesChosen = (files: File[]) => { if (files.length) { const toAppend = files.map((file) => ({ url: URL.createObjectURL(file), name: file.name, size: file.size, nativeFile: file, selected: false, })) append(toAppend) } } const images = useWatch({ control, name: path("images"), defaultValue: [], }) const selected = useMemo(() => { const selected: number[] = [] images.forEach((i, index) => { if (i.selected) { selected.push(index) } }) return selected }, [images]) const handleRemove = () => { remove(selected) } const handleDeselect = () => { selected.forEach((i) => { setValue(path(`images.${i}.selected`), false) }) } return (
{fields.length > 0 && (

Uploads

{fields.map((field, index) => { return ( ) })}
)}
) } type ImageProps = { image: FieldArrayWithId index: number remove: (index: number) => void form: NestedForm } const Image = ({ image, index, form, remove }: ImageProps) => { const { control, path } = form const actions: ActionType[] = [ { label: "Delete", onClick: () => remove(index), icon: , variant: "danger", }, ] return ( { return (
) }} /> ) } type ModalActionsProps = { number: number onRemove: () => void onDeselect: () => void } const ModalActions = ({ number, onRemove, onDeselect }: ModalActionsProps) => { return (
{number} selected
) } export default MediaForm