Spaces:
Running
Running
| import { useContext } from "react"; | |
| import { EditorType } from "types/editor"; | |
| import { SHAPES } from "components/svg/shapes"; | |
| import classNames from "classnames"; | |
| import { Empty } from "@/components/empty"; | |
| import { useUser } from "@/utils/auth"; | |
| import { ShapeSelected } from "./shape-selected"; | |
| import { PremiumContext } from "@/components/premium/premium"; | |
| import { FormattedMessage, useIntl } from "react-intl"; | |
| export const Shapes = ({ | |
| editor, | |
| onChange, | |
| }: { | |
| editor: EditorType; | |
| onChange: (s: any) => void; | |
| }) => { | |
| const { user } = useUser(); | |
| const intl = useIntl(); | |
| const { setOpen } = useContext(PremiumContext); | |
| return ( | |
| <> | |
| <p className="font-bold tracking-wider text-lg text-white mb-3"> | |
| <FormattedMessage id="iconsEditor.editor.shape.title" /> | |
| </p> | |
| <div className="flex items-start flex-wrap justify-start mt-3 gap-3"> | |
| {SHAPES.map((shape, k) => ( | |
| <div | |
| key={k} | |
| className={classNames( | |
| "relative flex items-center justify-center p-2 cursor-pointer rounded-lg group border border-dark-200 border-solid", | |
| { | |
| "bg-blue border-blue": editor.shape?.component === shape?.name, | |
| // "hover:border-yellow": shape?.isPremium, | |
| } | |
| )} | |
| onClick={() => { | |
| // if (!user && shape?.isPremium) { | |
| // return setOpen(true); | |
| // } | |
| onChange({ ...editor.shape, component: shape?.name }); | |
| }} | |
| > | |
| {/* {shape?.isPremium && ( | |
| <div className="w-4 h-4 bg-yellow rounded-full absolute -right-1.5 -top-1 border-[2px] border-dark-500" /> | |
| )} */} | |
| <_ShapeComponent | |
| component={shape.component} | |
| width={28} | |
| height={28} | |
| shape={shape} | |
| /> | |
| <div | |
| className={classNames( | |
| "group-hover:opacity-100 bg-opacity-20 opacity-0 rounded-lg transition-all duration-200 absolute h-full w-full left-0 top-0 pointer-events-none transform translate-y-full group-hover:translate-y-0", | |
| { | |
| // "bg-yellow": shape?.isPremium, | |
| "bg-dark-100": !shape?.isPremium, | |
| } | |
| )} | |
| /> | |
| </div> | |
| ))} | |
| </div> | |
| {editor.shape?.component ? ( | |
| <ShapeSelected | |
| shape={editor?.shape} | |
| handleChange={(shape: any) => onChange({ ...editor.shape, ...shape })} | |
| onDelete={() => onChange({ ...editor.shape, component: null })} | |
| /> | |
| ) : ( | |
| <Empty | |
| title={intl.formatMessage({ | |
| id: "iconsEditor.editor.shape.empty.title", | |
| })} | |
| description={intl.formatMessage({ | |
| id: "iconsEditor.editor.shape.empty.subtitle", | |
| })} | |
| className="mt-12" | |
| // button={<div onClick={() => onStep(0)}>Add my first Icon</div>} | |
| /> | |
| )} | |
| </> | |
| ); | |
| }; | |
| const _ShapeComponent = ({ component, shape, onClick, ...props }: any) => { | |
| const ShapeComponent = component as any; | |
| const newShape = { | |
| ...shape, | |
| component: `${shape.name}-small`, | |
| }; | |
| return <ShapeComponent shape={newShape} {...props} />; | |
| }; | |