import React from "react"; import z from "zod"; import Handlebars from "handlebars"; import { defineComponent } from "../define-component.js"; import { urlComponent } from "./url.js"; import { basicsSectionComponent } from "../sections/basics-section-component.js"; const defaultOrder = [ "email", "phone", "url", "profiles", "location", "highlights", ]; const defaultIcons = { mail: { suite: "md", icon: "MdOutlineEmail", }, phone: { suite: "bs", icon: "BsTelephone", }, url: { suite: "sl", icon: "SlGlobe", }, location: { suite: "md", icon: "MdOutlinePersonPinCircle", }, github: { suite: "fa", icon: "FaGithub", }, linkedin: { suite: "ai", icon: "AiOutlineLinkedin", }, }; export const basicsItemsComponent = defineComponent({ name: "basicsItems" as const, additionalProps: z.object({ renderItem: z .function() .args(z.any(), z.any(), z.number()) .returns(z.any()), }), schema: basicsSectionComponent.schema, component: ({ spec, getComponent, renderItem }) => { const Url = getComponent(urlComponent); const location = spec.basics.location ? Handlebars.create().compile(spec.basics.locationFormat ?? "{{city}}")( spec.basics.location, ) : null; const items = { email: spec.basics.email ? [ { text: `[${spec.basics.email}](mailto:${spec.basics.email})`, icon: "mail", }, ] : [], phone: spec.basics.phone ? [ { text: `[${spec.basics.phone}](tel:${spec.basics.phone.replaceAll(/[^\d]/g, "")})`, icon: "phone", }, ] : [], url: spec.basics.url ? [{ text: , icon: "url" }] : [], profiles: spec.basics.profiles?.map((profile) => ({ text: , icon: profile.network, })) ?? [], location: location ? [{ text: location, icon: "location" }] : [], highlights: spec.basics.highlights?.map((text) => ({ text })) ?? [], }; const iconMap = { ...defaultIcons, ...(spec.basics.icons ?? {}), }; const orderedItems = (spec.basics.order ?? defaultOrder) .map((key) => (key in items ? items[key as keyof typeof items] : [])) .flat(); return orderedItems .filter(Boolean) .map(({ text, icon }: any, index) => renderItem(text, (iconMap as any)[icon?.toLowerCase()], index), ); }, defaultStyles: {} as const, });