Spaces:
Running
Running
import { useState } from "react"; | |
import { PlusIcon } from "@heroicons/react/solid"; | |
import { EditorType, IconType } from "@/types/editor"; | |
import { Empty } from "@/components/empty"; | |
import { IconSelected } from "./icon-selected"; | |
import { FormattedMessage, useIntl } from "react-intl"; | |
export const Icons = ({ | |
editor, | |
onChange, | |
onStep, | |
}: { | |
editor: EditorType; | |
onChange: (e: EditorType) => void; | |
onStep: (step: number, multiple?: boolean) => void; | |
}) => { | |
const [opened, setOpened] = useState<number | null>(0); | |
const intl = useIntl(); | |
const handleChange = (index: number, icon: any) => { | |
const newIcons = [...editor.icons]; | |
newIcons[index] = icon; | |
onChange({ | |
...editor, | |
icons: newIcons, | |
}); | |
}; | |
const handleDeleteIcon = (index: number) => { | |
const newIcons = [...editor.icons]; | |
newIcons.splice(index, 1); | |
onChange({ | |
...editor, | |
icons: newIcons, | |
}); | |
}; | |
const handleChangeOrder = (index: number, value: number) => { | |
const newIcons = [...editor.icons]; | |
const [removed] = newIcons.splice(index, 1); | |
newIcons.splice(value, 0, removed); | |
onChange({ | |
...editor, | |
icons: newIcons, | |
}); | |
}; | |
return ( | |
<div className="grid grid-cols-1 gap-4"> | |
<p className="font-bold tracking-wider text-lg text-white"> | |
<FormattedMessage id="iconsEditor.editor.icons.title" /> | |
</p> | |
{editor?.icons?.length > 0 ? ( | |
<> | |
<div | |
className="border-2 border-dark-300 border-dashed w-full rounded-lg pl-4 py-4 pr-6 group cursor-pointer transition-all duration-200 hover:border-blue group flex items-center justify-start" | |
onClick={() => onStep(0, true)} | |
> | |
<div className="flex items-center justify-start gap-4"> | |
<div className="w-10 h-10 flex items-center justify-center bg-dark-200 bg-opacity-20 rounded-lg group-hover:bg-blue transition-all duration-200"> | |
<PlusIcon className="text-white w-6" /> | |
</div> | |
<div> | |
<p className="text-white font-semibold"> | |
<FormattedMessage id="iconsEditor.editor.icons.add.title" /> | |
</p> | |
<p className="text-xs text-dark-200"> | |
<FormattedMessage id="iconsEditor.editor.icons.add.subtitle" /> | |
</p> | |
</div> | |
</div> | |
</div> | |
{editor?.icons?.map((icon: IconType, k) => { | |
return ( | |
<IconSelected | |
key={k} | |
totalIcons={editor?.icons?.length} | |
index={k} | |
icon={icon} | |
current={opened} | |
setCurrent={setOpened} | |
onDelete={handleDeleteIcon} | |
onChange={handleChange} | |
onChangeOrder={handleChangeOrder} | |
/> | |
); | |
})} | |
</> | |
) : ( | |
<Empty | |
title={intl.formatMessage({ | |
id: "iconsEditor.editor.icons.empty.title", | |
})} | |
description={intl.formatMessage({ | |
id: "iconsEditor.editor.icons.empty.subtitle", | |
})} | |
button={intl.formatMessage({ | |
id: "iconsEditor.editor.icons.empty.cta", | |
})} | |
action={() => onStep(0)} | |
/> | |
)} | |
</div> | |
); | |
}; | |