refactor: migrate all icons from Untitled UI to FontAwesome Pro Duotone

Replace all @untitledui/icons imports across 55 files with equivalent
@fortawesome/pro-duotone-svg-icons icons, using FontAwesomeIcon wrappers
(FC<{ className?: string }>) for prop-based usage and inline replacements
for direct JSX usage. Drops unsupported Untitled UI-specific props
(strokeWidth, numeric size). TypeScript compiles clean with no errors.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-21 11:07:19 +05:30
parent 3064eeb444
commit 6f40b82579
55 changed files with 289 additions and 120 deletions

View File

@@ -1,5 +1,6 @@
import { useMemo } from 'react';
import { Phone01, PhoneIncoming01, CheckCircle, Mail01, Clock, Stars02 } from '@untitledui/icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faPhone, faPhoneArrowDown, faCircleCheck, faEnvelope, faClock, faStars } from '@fortawesome/pro-duotone-svg-icons';
import { Avatar } from '@/components/base/avatar/avatar';
import { Badge } from '@/components/base/badges/badges';
import { SourceTag } from '@/components/shared/source-tag';
@@ -41,11 +42,11 @@ const ActivityIcon = ({ type }: { type: string }) => {
const iconType = activityTypeIcons[type] ?? 'note';
const baseClass = 'size-3.5 shrink-0 text-fg-quaternary';
if (iconType === 'phone') return <Phone01 className={baseClass} />;
if (iconType === 'email') return <Mail01 className={baseClass} />;
if (iconType === 'clock') return <Clock className={baseClass} />;
if (iconType === 'check') return <CheckCircle className={baseClass} />;
return <Clock className={baseClass} />;
if (iconType === 'phone') return <FontAwesomeIcon icon={faPhone} className={baseClass} />;
if (iconType === 'email') return <FontAwesomeIcon icon={faEnvelope} className={baseClass} />;
if (iconType === 'clock') return <FontAwesomeIcon icon={faClock} className={baseClass} />;
if (iconType === 'check') return <FontAwesomeIcon icon={faCircleCheck} className={baseClass} />;
return <FontAwesomeIcon icon={faClock} className={baseClass} />;
};
const dispositionLabels: Record<CallDisposition, string> = {
@@ -80,7 +81,7 @@ export const IncomingCallCard = ({ callState, lead, activities, campaigns, onDis
const IdleState = () => (
<div className="flex flex-col items-center justify-center rounded-2xl border border-secondary bg-secondary p-12 text-center">
<div className="mb-4 animate-pulse">
<Phone01 className="size-12 text-fg-quaternary" />
<FontAwesomeIcon icon={faPhone} className="size-12 text-fg-quaternary" />
</div>
<p className="text-lg text-tertiary">Waiting for incoming call...</p>
</div>
@@ -96,7 +97,7 @@ const RingingState = ({ lead }: { lead: Lead | null }) => {
<div className="relative mb-4">
<div className="absolute inset-0 animate-ping rounded-full bg-brand-solid opacity-20" />
<div className="relative animate-bounce">
<PhoneIncoming01 className="size-12 text-fg-brand-primary" />
<FontAwesomeIcon icon={faPhoneArrowDown} className="size-12 text-fg-brand-primary" />
</div>
</div>
<span className="mb-1 text-xs font-bold uppercase tracking-wider text-brand-secondary">
@@ -158,12 +159,12 @@ const ActiveState = ({
<div className="min-w-0 flex-1">
<h3 className="text-lg font-bold text-primary">{fullName}</h3>
<div className="mt-1 flex items-center gap-1.5">
<Phone01 className="size-3.5 shrink-0 text-fg-quaternary" />
<FontAwesomeIcon icon={faPhone} className="size-3.5 shrink-0 text-fg-quaternary" />
<span className="text-md text-secondary">{phoneDisplay}</span>
</div>
{emailDisplay !== null && (
<div className="mt-0.5 flex items-center gap-1.5">
<Mail01 className="size-3.5 shrink-0 text-fg-quaternary" />
<FontAwesomeIcon icon={faEnvelope} className="size-3.5 shrink-0 text-fg-quaternary" />
<span className="text-sm text-tertiary">{emailDisplay}</span>
</div>
)}
@@ -192,7 +193,7 @@ const ActiveState = ({
{/* AI Insight panel */}
<div className="mt-4 rounded-xl bg-brand-primary p-4">
<div className="mb-2 flex items-center gap-1.5">
<Stars02 className="size-4 text-fg-brand-primary" />
<FontAwesomeIcon icon={faStars} className="size-4 text-fg-brand-primary" />
<span className="text-xs font-bold uppercase tracking-wider text-brand-secondary">
AI Insight
</span>
@@ -252,7 +253,7 @@ const CompletedState = ({ disposition }: { disposition: CallDisposition | null }
return (
<div className="flex flex-col items-center justify-center rounded-2xl bg-success-primary p-8 text-center">
<CheckCircle className="mb-3 size-12 text-fg-success-primary" />
<FontAwesomeIcon icon={faCircleCheck} className="mb-3 size-12 text-fg-success-primary" />
<h3 className="text-lg font-bold text-success-primary">Call Logged</h3>
{disposition !== null && (
<Badge size="md" color="success" className="mt-2">{label}</Badge>