Spaces:
Running
Running
import { useState } from "react"; | |
import { FormattedMessage, useIntl } from "react-intl"; | |
import { FontFamilySelector } from "@/components/font-family"; | |
import { FontWeight } from "@/components/font-weight"; | |
import { Switch } from "@/components/switch"; | |
import { BadgeType } from "@/types/badge"; | |
import { ColorPicker } from "components/color-picker"; | |
import { Label } from "@/components/label"; | |
import { Input } from "@/components/input"; | |
import classNames from "classnames"; | |
import { SelectShapes } from "../../select-shapes"; | |
import { IconPicker } from "@/components/icon-picker"; | |
export const MainForm = ({ | |
badge, | |
setBadge, | |
}: { | |
badge: BadgeType; | |
setBadge: (b: BadgeType) => void; | |
}) => { | |
const intl = useIntl(); | |
return ( | |
<div className="grid grid-cols-1 gap-4 px-6 pb-6 pt-5"> | |
<SelectShapes badge={badge} onChange={setBadge} /> | |
<div> | |
<Label className="mb-2">Text</Label> | |
<Input | |
value={badge?.text?.value} | |
placeholder="Badge text" | |
className="bg-dark-600 rounded px-3 py-3 text-sm text-white placeholder-dark-200 w-full" | |
onChange={(value) => { | |
setBadge({ | |
...badge, | |
text: { ...badge.text, value: value as string }, | |
}); | |
}} | |
/> | |
</div> | |
<div className="grid grid-cols-1 lg:grid-cols-2 gap-4"> | |
<div className="lg:col-span-2"> | |
<Label>Colors</Label> | |
</div> | |
<div> | |
<p className="font-semibold uppercase text-dark-200 text-xs mb-2"> | |
<FormattedMessage id="Background" /> | |
</p> | |
<ColorPicker | |
data={badge} | |
full | |
value={badge?.stringColor ?? badge?.colour} | |
gradients={badge?.type === "circle"} | |
onChange={(c: any, datas) => { | |
let newBadge = { ...badge, stringColor: c }; | |
if (c.includes("gradient")) { | |
const { colors, degrees } = datas; | |
const gradientType = c?.startsWith("linear") | |
? "linearGradient" | |
: "radialGradient"; | |
const anglePI = | |
Number(degrees ? degrees?.replace("deg", "") : 90) * | |
(Math.PI / 180); | |
const angleCoords = { | |
x1: Math.round(50 + Math.sin(anglePI) * 50) + "%", | |
y1: Math.round(50 + Math.cos(anglePI) * 50) + "%", | |
x2: Math.round(50 + Math.sin(anglePI + Math.PI) * 50) + "%", | |
y2: Math.round(50 + Math.cos(anglePI + Math.PI) * 50) + "%", | |
}; | |
newBadge["gradient"] = { | |
...newBadge.gradient, | |
enabled: true, | |
colours: colors, | |
angle: angleCoords, | |
type: gradientType, | |
}; | |
} else { | |
newBadge = { | |
...newBadge, | |
colour: c, | |
gradient: { | |
...newBadge?.gradient, | |
enabled: false, | |
}, | |
}; | |
} | |
setBadge(newBadge); | |
}} | |
/> | |
</div> | |
<div> | |
<p className="font-semibold uppercase text-dark-200 text-xs mb-2"> | |
<FormattedMessage id="Text" /> | |
</p> | |
<ColorPicker | |
data={badge?.text} | |
value={badge?.text?.stringColor ?? badge?.text?.colour} | |
full | |
onChange={(c: any, datas) => { | |
let newBadge = { | |
...badge, | |
text: { ...badge.text, stringColor: c }, | |
}; | |
if (c.includes("gradient")) { | |
const { colors, degrees } = datas; | |
const gradientType = c?.startsWith("linear") | |
? "linearGradient" | |
: "radialGradient"; | |
const anglePI = | |
Number(degrees ? degrees?.replace("deg", "") : 90) * | |
(Math.PI / 180); | |
const angleCoords = { | |
x1: Math.round(50 + Math.sin(anglePI) * 50) + "%", | |
y1: Math.round(50 + Math.cos(anglePI) * 50) + "%", | |
x2: Math.round(50 + Math.sin(anglePI + Math.PI) * 50) + "%", | |
y2: Math.round(50 + Math.cos(anglePI + Math.PI) * 50) + "%", | |
}; | |
newBadge["text"]["gradient"] = { | |
...newBadge?.text?.gradient, | |
enabled: true, | |
colours: colors, | |
angle: angleCoords, | |
type: gradientType, | |
}; | |
} else { | |
newBadge = { | |
...newBadge, | |
text: { | |
...newBadge?.text, | |
colour: c, | |
gradient: { | |
...newBadge?.text?.gradient, | |
enabled: false, | |
}, | |
}, | |
}; | |
} | |
setBadge(newBadge); | |
}} | |
/> | |
</div> | |
</div> | |
<div className="grid grid-cols-1 lg:grid-cols-4 gap-4"> | |
<div className="lg:col-span-4 flex items-center justify-start gap-3"> | |
<Label>Icon</Label> | |
<Switch | |
value={badge?.icon?.enabled} | |
onChange={(enabled: boolean) => | |
setBadge({ | |
...badge, | |
icon: { | |
...badge.icon, | |
position: badge?.icon?.position ?? "left", | |
enabled, | |
}, | |
}) | |
} | |
/> | |
</div> | |
<div> | |
<p className="font-semibold uppercase text-dark-200 text-xs mb-2"> | |
<FormattedMessage id="Color" /> | |
</p> | |
<ColorPicker | |
data={badge?.icon} | |
full | |
className="h-[38px]" | |
value={badge?.icon?.stringColor ?? badge?.icon?.colour} | |
gradients={false} | |
onChange={(c: any, datas) => { | |
setBadge({ | |
...badge, | |
icon: { | |
...badge?.icon, | |
position: badge?.icon?.position ?? "left", | |
colour: c, | |
stringColor: c, | |
}, | |
}); | |
}} | |
/> | |
</div> | |
<div className="flex items-start justify-start gap-4 lg:col-span-3"> | |
<div> | |
<p className="font-semibold uppercase text-dark-200 text-xs mb-2"> | |
<FormattedMessage id="Icon" /> | |
</p> | |
<IconPicker | |
icon={badge?.icon?.component} | |
onSelect={(component) => { | |
setBadge({ | |
...badge, | |
icon: { | |
...badge?.icon, | |
position: badge?.icon?.position ?? "left", | |
enabled: true, | |
component, | |
}, | |
}); | |
}} | |
/> | |
</div> | |
<div className="w-full"> | |
<p className="font-semibold uppercase text-dark-200 text-xs mb-2"> | |
<FormattedMessage id="Position" /> | |
</p> | |
<div className="flex items-center justify-between"> | |
<div | |
className={classNames( | |
"w-full h-[40px] text-sm p-2 text-dark-100 rounded-l-lg border-l border-t border-b border-dark-300 text-center font-semibold cursor-pointer", | |
{ | |
"bg-green !text-white bg-opacity-30 border-green": | |
badge?.icon?.position === "left", | |
} | |
)} | |
onClick={() => | |
setBadge({ | |
...badge, | |
icon: { ...badge?.icon, position: "left" }, | |
}) | |
} | |
> | |
Left | |
</div> | |
<div | |
className={classNames( | |
"w-full h-[40px] text-sm p-2 text-dark-100 border-t border-b border-dark-300 text-center font-semibold cursor-pointer", | |
{ | |
"bg-green !text-white bg-opacity-30 border-green": | |
badge?.icon?.position === "right", | |
} | |
)} | |
onClick={() => | |
setBadge({ | |
...badge, | |
icon: { ...badge?.icon, position: "right" }, | |
}) | |
} | |
> | |
Right | |
</div> | |
<div | |
className={classNames( | |
"w-full h-[40px] text-sm p-2 text-dark-100 rounded-r-lg border-t border-r border-b border-dark-300 text-center font-semibold cursor-pointer", | |
{ | |
"bg-green !text-white bg-opacity-30 border-green": | |
badge?.icon?.position === "left-right", | |
} | |
)} | |
onClick={() => | |
setBadge({ | |
...badge, | |
icon: { ...badge?.icon, position: "left-right" }, | |
}) | |
} | |
> | |
Left & Right | |
</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
); | |
}; | |