From 698bdf488a0e12f2d967589d8a05c17b9b131590 Mon Sep 17 00:00:00 2001 From: Kartik Datrika Date: Wed, 25 Mar 2026 12:15:37 +0530 Subject: [PATCH] merge conflicts resolved. --- package.json | 1 + scripts/fix-duplicate-imports.mjs | 227 ++++++++++++++++++ src/components/admin/sla-metrics.tsx | 12 +- .../base-components/nav-account-card.tsx | 12 +- .../sidebar-navigation/sidebar-dual-tier.tsx | 3 +- .../sidebar-navigation/sidebar-slim.tsx | 3 +- .../application/date-picker/calendar.tsx | 6 +- .../application/date-picker/cell.tsx | 9 +- .../application/date-picker/date-input.tsx | 3 +- .../application/date-picker/date-picker.tsx | 10 +- .../date-picker/date-range-picker.tsx | 14 +- .../date-picker/range-calendar.tsx | 6 +- .../application/empty-state/empty-state.tsx | 6 +- .../file-upload/file-upload-base.tsx | 6 +- src/components/application/modals/modal.tsx | 10 +- .../application/notifications/toaster.tsx | 3 +- .../pagination/pagination-base.tsx | 14 +- .../application/pagination/pagination-dot.tsx | 3 +- .../pagination/pagination-line.tsx | 3 +- .../application/pagination/pagination.tsx | 3 +- .../slideout-menus/slideout-menu.tsx | 13 +- src/components/application/table/table.tsx | 26 +- src/components/application/tabs/tabs.tsx | 16 +- src/components/base/badges/badge-groups.tsx | 3 +- src/components/base/badges/badges.tsx | 3 +- .../base/buttons/button-utility.tsx | 6 +- src/components/base/buttons/button.tsx | 6 +- src/components/base/buttons/social-button.tsx | 3 +- src/components/base/dropdown/dropdown.tsx | 12 +- .../file-upload-trigger.tsx | 3 +- src/components/base/input/hint-text.tsx | 3 +- src/components/base/input/input-group.tsx | 3 +- src/components/base/input/input-payment.tsx | 3 +- src/components/base/input/input.tsx | 9 +- src/components/base/input/label.tsx | 3 +- src/components/base/pin-input/pin-input.tsx | 3 +- src/components/base/select/combobox.tsx | 15 +- src/components/base/select/multi-select.tsx | 31 ++- src/components/base/select/popover.tsx | 3 +- src/components/base/select/select-item.tsx | 6 +- src/components/base/select/select.tsx | 12 +- src/components/base/slider/slider.tsx | 2 +- src/components/base/textarea/textarea.tsx | 11 +- src/components/base/toggle/toggle.tsx | 3 +- src/components/base/tooltip/tooltip.tsx | 13 +- src/components/call-desk/ai-chat-panel.tsx | 3 +- src/components/call-desk/appointment-form.tsx | 8 +- src/components/call-desk/context-panel.tsx | 4 +- src/components/dashboard/kpi-cards.tsx | 3 +- .../featured-icon/featured-icon.tsx | 3 +- .../logo/untitledui-logo-minimal.tsx | 3 +- src/components/foundations/rating-stars.tsx | 3 +- src/components/leads/lead-table.tsx | 6 +- .../marketing/header-navigation/header.tsx | 3 +- src/components/outreach/template-list.tsx | 3 +- src/components/shared-assets/qr-code.tsx | 3 +- src/hooks/use-call-assist.ts | 3 +- src/lib/icon-wrapper.ts | 3 +- src/lib/socket.ts | 3 +- src/pages/all-leads.tsx | 3 +- src/pages/call-history.tsx | 3 +- src/pages/reports.tsx | 6 +- src/providers/data-provider.tsx | 3 +- src/providers/router-provider.tsx | 3 +- src/providers/theme-provider.tsx | 3 +- 65 files changed, 458 insertions(+), 179 deletions(-) create mode 100644 scripts/fix-duplicate-imports.mjs diff --git a/package.json b/package.json index 81ef994..70d4490 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "format": "prettier --write \"src/**/*.{ts,tsx}\"", "lint": "eslint src", "lint:fix": "eslint src --fix", + "fix:imports": "node scripts/fix-duplicate-imports.mjs", "prepare": "husky" }, "dependencies": { diff --git a/scripts/fix-duplicate-imports.mjs b/scripts/fix-duplicate-imports.mjs new file mode 100644 index 0000000..1353dae --- /dev/null +++ b/scripts/fix-duplicate-imports.mjs @@ -0,0 +1,227 @@ +/** + * fix-duplicate-imports.mjs + * + * Merges duplicate import statements from the same module across all TypeScript + * source files in the project. Run this whenever `npm run lint` reports + * `no-duplicate-imports` errors. + * + * Usage: + * node scripts/fix-duplicate-imports.mjs + * + * Handles: + * import type { A, B } from 'module' — type-only imports + * import Default from 'module' — default imports + * import Default, { A, B } from 'mod' — mixed default + named + * import { A, B } from 'module' — named imports + * import {\n A,\n B\n} from 'mod' — multi-line named imports + * + * When merging a `import type` with a value import from the same module, + * type-only specifiers are inlined as `type Name` in the merged statement. + */ + +import { readFileSync, readdirSync, statSync, writeFileSync } from "fs"; +import { extname, join, resolve } from "path"; + +// --------------------------------------------------------------------------- +// Config +// --------------------------------------------------------------------------- + +const projectRoot = resolve(new URL(".", import.meta.url).pathname, ".."); +const srcDir = join(projectRoot, "src"); +const extensions = new Set([".ts", ".tsx"]); + +// --------------------------------------------------------------------------- +// File discovery — recursively find all TS/TSX files under src/ +// --------------------------------------------------------------------------- + +function findFiles(dir) { + const results = []; + for (const entry of readdirSync(dir)) { + const full = join(dir, entry); + if (statSync(full).isDirectory()) { + results.push(...findFiles(full)); + } else if (extensions.has(extname(entry))) { + results.push(full); + } + } + return results; +} + +// --------------------------------------------------------------------------- +// Import extraction +// --------------------------------------------------------------------------- + +/** + * Extracts all top-level import statements from file content. + * Returns array of { start, end, raw, module, isType, defaultImport, namedImports } + * where start/end are character positions in the content. + */ +function extractImports(content) { + const results = []; + const importRe = /^import\s+([\s\S]*?)from\s+['"]([^'"]+)['"]\s*;?/gm; + + let match; + while ((match = importRe.exec(content)) !== null) { + const raw = match[0]; + const specifierPart = match[1]; + const moduleName = match[2]; + + const isType = /^type\s+/.test(specifierPart.trimStart()); + const cleanSpec = specifierPart.replace(/^type\s+/, "").trim(); + + let defaultImport = null; + let namedStr = null; + + const namespaceMatch = cleanSpec.match(/^\*\s+as\s+(\w+)/); + if (namespaceMatch) { + defaultImport = `* as ${namespaceMatch[1]}`; + } else { + const braceIdx = cleanSpec.indexOf("{"); + if (braceIdx === -1) { + const def = cleanSpec.replace(/,$/, "").trim(); + if (def) defaultImport = def; + } else { + const beforeBrace = cleanSpec.slice(0, braceIdx).replace(/,$/, "").trim(); + if (beforeBrace) defaultImport = beforeBrace; + const closeBrace = cleanSpec.lastIndexOf("}"); + namedStr = cleanSpec.slice(braceIdx + 1, closeBrace); + } + } + + const namedImports = namedStr + ? namedStr.split(",").map((s) => s.trim()).filter(Boolean) + : []; + + results.push({ + start: match.index, + end: match.index + raw.length, + raw, + module: moduleName, + isType, + defaultImport, + namedImports, + }); + } + + return results; +} + +// --------------------------------------------------------------------------- +// Import merging +// --------------------------------------------------------------------------- + +/** + * Build a single merged import statement from multiple imports of the same module. + * + * - All type imports → merged `import type { ... }` + * - Mixed type + value → merged value import with inline `type Name` specifiers + */ +function buildMergedImport(moduleName, importList) { + const allType = importList.every((i) => i.isType); + + if (allType) { + const allNamed = new Set(importList.flatMap((i) => i.namedImports)); + const defaultImport = importList.map((i) => i.defaultImport).find(Boolean) ?? null; + const parts = []; + if (defaultImport) parts.push(defaultImport); + if (allNamed.size > 0) parts.push(`{ ${[...allNamed].join(", ")} }`); + if (parts.length === 0) return `import type "${moduleName}";`; + return `import type ${parts.join(", ")} from "${moduleName}";`; + } + + // Mixed: collect value default, type-only named, value named separately + let valueDefault = null; + const typeNamed = new Set(); + const valueNamed = new Set(); + + for (const imp of importList) { + if (imp.defaultImport && !imp.isType) valueDefault = imp.defaultImport; + for (const n of imp.namedImports) { + (imp.isType ? typeNamed : valueNamed).add(n); + } + } + + // Build named specifiers: `type X` for type-only, plain for value + const typeSpecifiers = [...typeNamed].filter((n) => !valueNamed.has(n)).map((n) => `type ${n}`); + const valueSpecifiers = [...valueNamed]; + const namedParts = [...typeSpecifiers, ...valueSpecifiers]; + + const parts = []; + if (valueDefault) parts.push(valueDefault); + if (namedParts.length > 0) parts.push(`{ ${namedParts.join(", ")} }`); + if (parts.length === 0) return `import "${moduleName}";`; + return `import ${parts.join(", ")} from "${moduleName}";`; +} + +// --------------------------------------------------------------------------- +// File fixer +// --------------------------------------------------------------------------- + +function fixFile(filePath) { + let content = readFileSync(filePath, "utf-8"); + const imports = extractImports(content); + if (imports.length === 0) return null; + + // Group by module + const byModule = new Map(); + for (const imp of imports) { + if (!byModule.has(imp.module)) byModule.set(imp.module, []); + byModule.get(imp.module).push(imp); + } + + if (![...byModule.values()].some((v) => v.length > 1)) return null; + + // Build merged text for each module + const mergedMap = new Map(); + for (const [mod, imps] of byModule) { + mergedMap.set(mod, imps.length === 1 ? imps[0].raw : buildMergedImport(mod, imps)); + } + + // Build replacement list (process in reverse order to preserve character positions) + imports.sort((a, b) => a.start - b.start); + const placedModules = new Set(); + const replacements = []; + + for (const imp of imports) { + if (!placedModules.has(imp.module)) { + replacements.push({ start: imp.start, end: imp.end, replacement: mergedMap.get(imp.module) }); + placedModules.add(imp.module); + } else { + // Remove duplicate, including its trailing newline + const end = content[imp.end] === "\n" ? imp.end + 1 : imp.end; + replacements.push({ start: imp.start, end, replacement: "" }); + } + } + + replacements.sort((a, b) => b.start - a.start); + for (const { start, end, replacement } of replacements) { + content = content.slice(0, start) + replacement + content.slice(end); + } + + return content; +} + +// --------------------------------------------------------------------------- +// Main +// --------------------------------------------------------------------------- + +const files = findFiles(srcDir); +let fixedCount = 0; + +for (const filePath of files) { + try { + const original = readFileSync(filePath, "utf-8"); + const fixed = fixFile(filePath); + if (fixed && fixed !== original) { + writeFileSync(filePath, fixed, "utf-8"); + const rel = filePath.replace(projectRoot + "/", ""); + console.log(`Fixed: ${rel}`); + fixedCount++; + } + } catch (err) { + const rel = filePath.replace(projectRoot + "/", ""); + console.error(`Error: ${rel} — ${err.message}`); + } +} + +console.log(`\nDone. Fixed ${fixedCount} file${fixedCount !== 1 ? "s" : ""}.`); diff --git a/src/components/admin/sla-metrics.tsx b/src/components/admin/sla-metrics.tsx index df3119c..b2a5b47 100644 --- a/src/components/admin/sla-metrics.tsx +++ b/src/components/admin/sla-metrics.tsx @@ -1,5 +1,4 @@ -import type { FC } from "react"; -import { useMemo } from "react"; +import { type FC, useMemo } from "react"; import { faCircleCheck, faCircleExclamation, faTriangleExclamation } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import type { Lead } from "@/types/entities"; @@ -42,7 +41,11 @@ export const SlaMetrics = ({ leads }: SlaMetricsProps) => { return { avgHours, withinSla, total, slaPercent }; }, [leads]); - const getTargetStatus = (): { icon: FC<{ className?: string }>; label: string; colorClass: string } => { + const getTargetStatus = (): { + icon: FC<{ className?: string }>; + label: string; + colorClass: string; + } => { const diff = metrics.avgHours - SLA_TARGET_HOURS; if (diff <= 0) { @@ -100,7 +103,8 @@ export const SlaMetrics = ({ leads }: SlaMetricsProps) => { /> - {metrics.withinSla} of {metrics.total} leads within SLA ({Math.round(metrics.slaPercent)}%) + {metrics.withinSla} of {metrics.total} leads within SLA ({Math.round(metrics.slaPercent)} + %) diff --git a/src/components/application/app-navigation/base-components/nav-account-card.tsx b/src/components/application/app-navigation/base-components/nav-account-card.tsx index 3bdfa92..ab66034 100644 --- a/src/components/application/app-navigation/base-components/nav-account-card.tsx +++ b/src/components/application/app-navigation/base-components/nav-account-card.tsx @@ -1,11 +1,15 @@ -import type { FC, HTMLAttributes } from "react"; -import { useCallback, useEffect, useRef } from "react"; +import { type FC, type HTMLAttributes, useCallback, useEffect, useRef } from "react"; import { faArrowRightFromBracket, faGear, faPhoneVolume, faSort, faUser } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import type { Placement } from "@react-types/overlays"; import { useFocusManager } from "react-aria"; -import type { DialogProps as AriaDialogProps } from "react-aria-components"; -import { Button as AriaButton, Dialog as AriaDialog, DialogTrigger as AriaDialogTrigger, Popover as AriaPopover } from "react-aria-components"; +import { + Button as AriaButton, + Dialog as AriaDialog, + type DialogProps as AriaDialogProps, + DialogTrigger as AriaDialogTrigger, + Popover as AriaPopover, +} from "react-aria-components"; import { AvatarLabelGroup } from "@/components/base/avatar/avatar-label-group"; import { useBreakpoint } from "@/hooks/use-breakpoint"; import { cx } from "@/utils/cx"; diff --git a/src/components/application/app-navigation/sidebar-navigation/sidebar-dual-tier.tsx b/src/components/application/app-navigation/sidebar-navigation/sidebar-dual-tier.tsx index 5910093..be9873a 100644 --- a/src/components/application/app-navigation/sidebar-navigation/sidebar-dual-tier.tsx +++ b/src/components/application/app-navigation/sidebar-navigation/sidebar-dual-tier.tsx @@ -1,5 +1,4 @@ -import type { FC, ReactNode } from "react"; -import { useState } from "react"; +import { type FC, type ReactNode, useState } from "react"; import { faMagnifyingGlass } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { AnimatePresence, motion } from "motion/react"; diff --git a/src/components/application/app-navigation/sidebar-navigation/sidebar-slim.tsx b/src/components/application/app-navigation/sidebar-navigation/sidebar-slim.tsx index f55bc61..28dccc8 100644 --- a/src/components/application/app-navigation/sidebar-navigation/sidebar-slim.tsx +++ b/src/components/application/app-navigation/sidebar-navigation/sidebar-slim.tsx @@ -1,5 +1,4 @@ -import type { FC } from "react"; -import { useState } from "react"; +import { type FC, useState } from "react"; import { faArrowRightFromBracket, faGear, faLifeRing } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { AnimatePresence, motion } from "motion/react"; diff --git a/src/components/application/date-picker/calendar.tsx b/src/components/application/date-picker/calendar.tsx index 34207d0..9daa4c8 100644 --- a/src/components/application/date-picker/calendar.tsx +++ b/src/components/application/date-picker/calendar.tsx @@ -1,9 +1,7 @@ -import type { FC, HTMLAttributes, PropsWithChildren } from "react"; -import { Fragment, useContext, useState } from "react"; +import { type FC, Fragment, type HTMLAttributes, type PropsWithChildren, useContext, useState } from "react"; import { faChevronLeft, faChevronRight } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { type CalendarDate, getLocalTimeZone, today } from "@internationalized/date"; -import type { CalendarProps as AriaCalendarProps, DateValue } from "react-aria-components"; import { Calendar as AriaCalendar, CalendarContext as AriaCalendarContext, @@ -11,8 +9,10 @@ import { CalendarGridBody as AriaCalendarGridBody, CalendarGridHeader as AriaCalendarGridHeader, CalendarHeaderCell as AriaCalendarHeaderCell, + type CalendarProps as AriaCalendarProps, CalendarStateContext as AriaCalendarStateContext, Heading as AriaHeading, + type DateValue, useSlottedContext, } from "react-aria-components"; import { Button } from "@/components/base/buttons/button"; diff --git a/src/components/application/date-picker/cell.tsx b/src/components/application/date-picker/cell.tsx index bac6d03..c429562 100644 --- a/src/components/application/date-picker/cell.tsx +++ b/src/components/application/date-picker/cell.tsx @@ -1,6 +1,11 @@ import { getDayOfWeek, getLocalTimeZone, isToday } from "@internationalized/date"; -import type { CalendarCellProps as AriaCalendarCellProps } from "react-aria-components"; -import { CalendarCell as AriaCalendarCell, RangeCalendarContext, useLocale, useSlottedContext } from "react-aria-components"; +import { + CalendarCell as AriaCalendarCell, + type CalendarCellProps as AriaCalendarCellProps, + RangeCalendarContext, + useLocale, + useSlottedContext, +} from "react-aria-components"; import { cx } from "@/utils/cx"; interface CalendarCellProps extends AriaCalendarCellProps { diff --git a/src/components/application/date-picker/date-input.tsx b/src/components/application/date-picker/date-input.tsx index 131c585..529fa3b 100644 --- a/src/components/application/date-picker/date-input.tsx +++ b/src/components/application/date-picker/date-input.tsx @@ -1,5 +1,4 @@ -import type { DateInputProps as AriaDateInputProps } from "react-aria-components"; -import { DateInput as AriaDateInput, DateSegment as AriaDateSegment } from "react-aria-components"; +import { DateInput as AriaDateInput, type DateInputProps as AriaDateInputProps, DateSegment as AriaDateSegment } from "react-aria-components"; import { cx } from "@/utils/cx"; type DateInputProps = Omit; diff --git a/src/components/application/date-picker/date-picker.tsx b/src/components/application/date-picker/date-picker.tsx index fe57212..3ebceb9 100644 --- a/src/components/application/date-picker/date-picker.tsx +++ b/src/components/application/date-picker/date-picker.tsx @@ -4,8 +4,14 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { getLocalTimeZone, today } from "@internationalized/date"; import { useControlledState } from "@react-stately/utils"; import { useDateFormatter } from "react-aria"; -import type { DatePickerProps as AriaDatePickerProps, DateValue } from "react-aria-components"; -import { DatePicker as AriaDatePicker, Dialog as AriaDialog, Group as AriaGroup, Popover as AriaPopover } from "react-aria-components"; +import { + DatePicker as AriaDatePicker, + type DatePickerProps as AriaDatePickerProps, + Dialog as AriaDialog, + Group as AriaGroup, + Popover as AriaPopover, + type DateValue, +} from "react-aria-components"; import { Button } from "@/components/base/buttons/button"; import { cx } from "@/utils/cx"; import { Calendar } from "./calendar"; diff --git a/src/components/application/date-picker/date-range-picker.tsx b/src/components/application/date-picker/date-range-picker.tsx index 2b258d9..8f26ade 100644 --- a/src/components/application/date-picker/date-range-picker.tsx +++ b/src/components/application/date-picker/date-range-picker.tsx @@ -1,12 +1,18 @@ -import type { FC } from "react"; -import { useMemo, useState } from "react"; +import { type FC, useMemo, useState } from "react"; import { faCalendar } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { endOfMonth, endOfWeek, getLocalTimeZone, startOfMonth, startOfWeek, today } from "@internationalized/date"; import { useControlledState } from "@react-stately/utils"; import { useDateFormatter } from "react-aria"; -import type { DateRangePickerProps as AriaDateRangePickerProps, DateValue } from "react-aria-components"; -import { DateRangePicker as AriaDateRangePicker, Dialog as AriaDialog, Group as AriaGroup, Popover as AriaPopover, useLocale } from "react-aria-components"; +import { + DateRangePicker as AriaDateRangePicker, + type DateRangePickerProps as AriaDateRangePickerProps, + Dialog as AriaDialog, + Group as AriaGroup, + Popover as AriaPopover, + type DateValue, + useLocale, +} from "react-aria-components"; import { Button } from "@/components/base/buttons/button"; import { cx } from "@/utils/cx"; import { DateInput } from "./date-input"; diff --git a/src/components/application/date-picker/range-calendar.tsx b/src/components/application/date-picker/range-calendar.tsx index d166eb1..6a68f52 100644 --- a/src/components/application/date-picker/range-calendar.tsx +++ b/src/components/application/date-picker/range-calendar.tsx @@ -1,16 +1,16 @@ -import type { FC, HTMLAttributes, PropsWithChildren } from "react"; -import { Fragment, useContext, useState } from "react"; +import { type FC, Fragment, type HTMLAttributes, type PropsWithChildren, useContext, useState } from "react"; import { faChevronLeft, faChevronRight } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import type { CalendarDate } from "@internationalized/date"; import { useDateFormatter } from "react-aria"; -import type { RangeCalendarProps as AriaRangeCalendarProps, DateValue } from "react-aria-components"; import { CalendarGrid as AriaCalendarGrid, CalendarGridBody as AriaCalendarGridBody, CalendarGridHeader as AriaCalendarGridHeader, CalendarHeaderCell as AriaCalendarHeaderCell, RangeCalendar as AriaRangeCalendar, + type RangeCalendarProps as AriaRangeCalendarProps, + type DateValue, RangeCalendarContext, RangeCalendarStateContext, useSlottedContext, diff --git a/src/components/application/empty-state/empty-state.tsx b/src/components/application/empty-state/empty-state.tsx index bad8242..477ba86 100644 --- a/src/components/application/empty-state/empty-state.tsx +++ b/src/components/application/empty-state/empty-state.tsx @@ -1,11 +1,9 @@ -import type { ComponentProps, ComponentPropsWithRef, FC } from "react"; -import { Children, createContext, isValidElement, useContext } from "react"; +import { Children, type ComponentProps, type ComponentPropsWithRef, type FC, createContext, isValidElement, useContext } from "react"; import { faMagnifyingGlass } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FileIcon } from "@untitledui/file-icons"; import { FeaturedIcon as FeaturedIconbase } from "@/components/foundations/featured-icon/featured-icon"; -import type { BackgroundPatternProps } from "@/components/shared-assets/background-patterns"; -import { BackgroundPattern } from "@/components/shared-assets/background-patterns"; +import { BackgroundPattern, type BackgroundPatternProps } from "@/components/shared-assets/background-patterns"; import { Illustration as Illustrations } from "@/components/shared-assets/illustrations"; import { cx } from "@/utils/cx"; diff --git a/src/components/application/file-upload/file-upload-base.tsx b/src/components/application/file-upload/file-upload-base.tsx index d56d8bf..3360d11 100644 --- a/src/components/application/file-upload/file-upload-base.tsx +++ b/src/components/application/file-upload/file-upload-base.tsx @@ -1,9 +1,7 @@ -import type { ComponentProps, ComponentPropsWithRef, FC } from "react"; -import { useId, useRef, useState } from "react"; +import { type ComponentProps, type ComponentPropsWithRef, type FC, useId, useRef, useState } from "react"; import { faCircleCheck, faCircleXmark, faCloudArrowUp, faTrash } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import type { FileIcon } from "@untitledui/file-icons"; -import { FileIcon as FileTypeIcon } from "@untitledui/file-icons"; +import { type FileIcon, FileIcon as FileTypeIcon } from "@untitledui/file-icons"; import { AnimatePresence, motion } from "motion/react"; import { Button } from "@/components/base/buttons/button"; import { ButtonUtility } from "@/components/base/buttons/button-utility"; diff --git a/src/components/application/modals/modal.tsx b/src/components/application/modals/modal.tsx index bfd3896..ac7aa72 100644 --- a/src/components/application/modals/modal.tsx +++ b/src/components/application/modals/modal.tsx @@ -1,5 +1,11 @@ -import type { DialogProps as AriaDialogProps, ModalOverlayProps as AriaModalOverlayProps } from "react-aria-components"; -import { Dialog as AriaDialog, DialogTrigger as AriaDialogTrigger, Modal as AriaModal, ModalOverlay as AriaModalOverlay } from "react-aria-components"; +import { + Dialog as AriaDialog, + type DialogProps as AriaDialogProps, + DialogTrigger as AriaDialogTrigger, + Modal as AriaModal, + ModalOverlay as AriaModalOverlay, + type ModalOverlayProps as AriaModalOverlayProps, +} from "react-aria-components"; import { cx } from "@/utils/cx"; export const DialogTrigger = AriaDialogTrigger; diff --git a/src/components/application/notifications/toaster.tsx b/src/components/application/notifications/toaster.tsx index 76051f4..d8a62ef 100644 --- a/src/components/application/notifications/toaster.tsx +++ b/src/components/application/notifications/toaster.tsx @@ -1,5 +1,4 @@ -import type { ToasterProps } from "sonner"; -import { Toaster as SonnerToaster, useSonner } from "sonner"; +import { Toaster as SonnerToaster, type ToasterProps, useSonner } from "sonner"; import { cx } from "@/utils/cx"; export const DEFAULT_TOAST_POSITION = "bottom-right"; diff --git a/src/components/application/pagination/pagination-base.tsx b/src/components/application/pagination/pagination-base.tsx index 3c4cc02..bc8df42 100644 --- a/src/components/application/pagination/pagination-base.tsx +++ b/src/components/application/pagination/pagination-base.tsx @@ -1,5 +1,15 @@ -import type { CSSProperties, FC, HTMLAttributes, ReactNode } from "react"; -import React, { cloneElement, createContext, isValidElement, useCallback, useContext, useMemo } from "react"; +import React, { + type CSSProperties, + type FC, + type HTMLAttributes, + type ReactNode, + cloneElement, + createContext, + isValidElement, + useCallback, + useContext, + useMemo, +} from "react"; type PaginationPage = { /** The type of the pagination item. */ diff --git a/src/components/application/pagination/pagination-dot.tsx b/src/components/application/pagination/pagination-dot.tsx index 544721e..e1e5b6d 100644 --- a/src/components/application/pagination/pagination-dot.tsx +++ b/src/components/application/pagination/pagination-dot.tsx @@ -1,6 +1,5 @@ import { cx } from "@/utils/cx"; -import type { PaginationRootProps } from "./pagination-base"; -import { Pagination } from "./pagination-base"; +import { Pagination, type PaginationRootProps } from "./pagination-base"; interface PaginationDotProps extends Omit { /** The size of the pagination dot. */ diff --git a/src/components/application/pagination/pagination-line.tsx b/src/components/application/pagination/pagination-line.tsx index abaae45..34774d7 100644 --- a/src/components/application/pagination/pagination-line.tsx +++ b/src/components/application/pagination/pagination-line.tsx @@ -1,6 +1,5 @@ import { cx } from "@/utils/cx"; -import type { PaginationRootProps } from "./pagination-base"; -import { Pagination } from "./pagination-base"; +import { Pagination, type PaginationRootProps } from "./pagination-base"; interface PaginationLineProps extends Omit { /** The size of the pagination line. */ diff --git a/src/components/application/pagination/pagination.tsx b/src/components/application/pagination/pagination.tsx index c50ab21..f7822f3 100644 --- a/src/components/application/pagination/pagination.tsx +++ b/src/components/application/pagination/pagination.tsx @@ -5,8 +5,7 @@ import { ButtonGroup, ButtonGroupItem } from "@/components/base/button-group/but import { Button } from "@/components/base/buttons/button"; import { useBreakpoint } from "@/hooks/use-breakpoint"; import { cx } from "@/utils/cx"; -import type { PaginationRootProps } from "./pagination-base"; -import { Pagination } from "./pagination-base"; +import { Pagination, type PaginationRootProps } from "./pagination-base"; const ArrowLeft: FC<{ className?: string }> = ({ className }) => ; const ArrowRight: FC<{ className?: string }> = ({ className }) => ; diff --git a/src/components/application/slideout-menus/slideout-menu.tsx b/src/components/application/slideout-menus/slideout-menu.tsx index c337257..2cd1d3d 100644 --- a/src/components/application/slideout-menus/slideout-menu.tsx +++ b/src/components/application/slideout-menus/slideout-menu.tsx @@ -1,10 +1,13 @@ import { type ComponentPropsWithRef, type ReactNode, type RefAttributes } from "react"; -import type { - DialogProps as AriaDialogProps, - ModalOverlayProps as AriaModalOverlayProps, - ModalRenderProps as AriaModalRenderProps, +import { + Dialog as AriaDialog, + type DialogProps as AriaDialogProps, + DialogTrigger as AriaDialogTrigger, + Modal as AriaModal, + ModalOverlay as AriaModalOverlay, + type ModalOverlayProps as AriaModalOverlayProps, + type ModalRenderProps as AriaModalRenderProps, } from "react-aria-components"; -import { Dialog as AriaDialog, DialogTrigger as AriaDialogTrigger, Modal as AriaModal, ModalOverlay as AriaModalOverlay } from "react-aria-components"; import { CloseButton } from "@/components/base/buttons/close-button"; import { cx } from "@/utils/cx"; diff --git a/src/components/application/table/table.tsx b/src/components/application/table/table.tsx index 83ddd0c..6b811f1 100644 --- a/src/components/application/table/table.tsx +++ b/src/components/application/table/table.tsx @@ -1,23 +1,31 @@ -import type { ComponentPropsWithRef, FC, HTMLAttributes, ReactNode, Ref, TdHTMLAttributes, ThHTMLAttributes } from "react"; -import { createContext, isValidElement, useContext } from "react"; +import { + type ComponentPropsWithRef, + type FC, + type HTMLAttributes, + type ReactNode, + type Ref, + type TdHTMLAttributes, + type ThHTMLAttributes, + createContext, + isValidElement, + useContext, +} from "react"; import { faArrowDown, faCircleQuestion, faCopy, faPenToSquare, faSort, faTrash } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import type { - CellProps as AriaCellProps, - ColumnProps as AriaColumnProps, - RowProps as AriaRowProps, - TableHeaderProps as AriaTableHeaderProps, - TableProps as AriaTableProps, -} from "react-aria-components"; import { Cell as AriaCell, + type CellProps as AriaCellProps, Collection as AriaCollection, Column as AriaColumn, + type ColumnProps as AriaColumnProps, Group as AriaGroup, Row as AriaRow, + type RowProps as AriaRowProps, Table as AriaTable, TableBody as AriaTableBody, TableHeader as AriaTableHeader, + type TableHeaderProps as AriaTableHeaderProps, + type TableProps as AriaTableProps, useTableOptions, } from "react-aria-components"; import { Badge } from "@/components/base/badges/badges"; diff --git a/src/components/application/tabs/tabs.tsx b/src/components/application/tabs/tabs.tsx index f7f090c..3b4b356 100644 --- a/src/components/application/tabs/tabs.tsx +++ b/src/components/application/tabs/tabs.tsx @@ -1,7 +1,15 @@ -import type { ComponentPropsWithRef, ReactNode } from "react"; -import { Fragment, createContext, useContext } from "react"; -import type { TabListProps as AriaTabListProps, TabProps as AriaTabProps, TabRenderProps as AriaTabRenderProps } from "react-aria-components"; -import { Tab as AriaTab, TabList as AriaTabList, TabPanel as AriaTabPanel, Tabs as AriaTabs, TabsContext, useSlottedContext } from "react-aria-components"; +import { type ComponentPropsWithRef, Fragment, type ReactNode, createContext, useContext } from "react"; +import { + Tab as AriaTab, + TabList as AriaTabList, + type TabListProps as AriaTabListProps, + TabPanel as AriaTabPanel, + type TabProps as AriaTabProps, + type TabRenderProps as AriaTabRenderProps, + Tabs as AriaTabs, + TabsContext, + useSlottedContext, +} from "react-aria-components"; import type { BadgeColors } from "@/components/base/badges/badge-types"; import { Badge } from "@/components/base/badges/badges"; import { cx } from "@/utils/cx"; diff --git a/src/components/base/badges/badge-groups.tsx b/src/components/base/badges/badge-groups.tsx index ac47645..2337c09 100644 --- a/src/components/base/badges/badge-groups.tsx +++ b/src/components/base/badges/badge-groups.tsx @@ -1,5 +1,4 @@ -import type { FC, ReactNode } from "react"; -import { isValidElement } from "react"; +import { type FC, type ReactNode, isValidElement } from "react"; import { faArrowRight } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { cx, sortCx } from "@/utils/cx"; diff --git a/src/components/base/badges/badges.tsx b/src/components/base/badges/badges.tsx index aa2137c..b8ff30d 100644 --- a/src/components/base/badges/badges.tsx +++ b/src/components/base/badges/badges.tsx @@ -3,8 +3,7 @@ import { faXmark } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { Dot } from "@/components/foundations/dot-icon"; import { cx } from "@/utils/cx"; -import type { BadgeColors, BadgeTypeToColorMap, BadgeTypes, FlagTypes, IconComponentType, Sizes } from "./badge-types"; -import { badgeTypes } from "./badge-types"; +import { type BadgeColors, type BadgeTypeToColorMap, type BadgeTypes, type FlagTypes, type IconComponentType, type Sizes, badgeTypes } from "./badge-types"; const CloseX: FC<{ className?: string }> = ({ className }) => ; diff --git a/src/components/base/buttons/button-utility.tsx b/src/components/base/buttons/button-utility.tsx index 7d9371b..fd3e12e 100644 --- a/src/components/base/buttons/button-utility.tsx +++ b/src/components/base/buttons/button-utility.tsx @@ -1,8 +1,6 @@ -import type { AnchorHTMLAttributes, ButtonHTMLAttributes, DetailedHTMLProps, FC, ReactNode } from "react"; -import { isValidElement } from "react"; +import { type AnchorHTMLAttributes, type ButtonHTMLAttributes, type DetailedHTMLProps, type FC, type ReactNode, isValidElement } from "react"; import type { Placement } from "react-aria"; -import type { ButtonProps as AriaButtonProps, LinkProps as AriaLinkProps } from "react-aria-components"; -import { Button as AriaButton, Link as AriaLink } from "react-aria-components"; +import { Button as AriaButton, type ButtonProps as AriaButtonProps, Link as AriaLink, type LinkProps as AriaLinkProps } from "react-aria-components"; import { Tooltip } from "@/components/base/tooltip/tooltip"; import { cx } from "@/utils/cx"; import { isReactComponent } from "@/utils/is-react-component"; diff --git a/src/components/base/buttons/button.tsx b/src/components/base/buttons/button.tsx index fb4cf36..0d76861 100644 --- a/src/components/base/buttons/button.tsx +++ b/src/components/base/buttons/button.tsx @@ -1,7 +1,5 @@ -import type { AnchorHTMLAttributes, ButtonHTMLAttributes, DetailedHTMLProps, FC, ReactNode } from "react"; -import React, { isValidElement } from "react"; -import type { ButtonProps as AriaButtonProps, LinkProps as AriaLinkProps } from "react-aria-components"; -import { Button as AriaButton, Link as AriaLink } from "react-aria-components"; +import React, { type AnchorHTMLAttributes, type ButtonHTMLAttributes, type DetailedHTMLProps, type FC, type ReactNode, isValidElement } from "react"; +import { Button as AriaButton, type ButtonProps as AriaButtonProps, Link as AriaLink, type LinkProps as AriaLinkProps } from "react-aria-components"; import { cx, sortCx } from "@/utils/cx"; import { isReactComponent } from "@/utils/is-react-component"; diff --git a/src/components/base/buttons/social-button.tsx b/src/components/base/buttons/social-button.tsx index f6963bc..ee16757 100644 --- a/src/components/base/buttons/social-button.tsx +++ b/src/components/base/buttons/social-button.tsx @@ -1,6 +1,5 @@ import type { AnchorHTMLAttributes, ButtonHTMLAttributes, DetailedHTMLProps } from "react"; -import type { ButtonProps as AriaButtonProps, LinkProps as AriaLinkProps } from "react-aria-components"; -import { Button as AriaButton, Link as AriaLink } from "react-aria-components"; +import { Button as AriaButton, type ButtonProps as AriaButtonProps, Link as AriaLink, type LinkProps as AriaLinkProps } from "react-aria-components"; import { cx, sortCx } from "@/utils/cx"; import { AppleLogo, DribbleLogo, FacebookLogo, FigmaLogo, FigmaLogoOutlined, GoogleLogo, TwitterLogo } from "./social-logos"; diff --git a/src/components/base/dropdown/dropdown.tsx b/src/components/base/dropdown/dropdown.tsx index c311fa1..66e6d19 100644 --- a/src/components/base/dropdown/dropdown.tsx +++ b/src/components/base/dropdown/dropdown.tsx @@ -1,22 +1,20 @@ import type { FC, RefAttributes } from "react"; import { faEllipsisVertical } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import type { - ButtonProps as AriaButtonProps, - MenuItemProps as AriaMenuItemProps, - MenuProps as AriaMenuProps, - PopoverProps as AriaPopoverProps, - SeparatorProps as AriaSeparatorProps, -} from "react-aria-components"; import { Button as AriaButton, + type ButtonProps as AriaButtonProps, Header as AriaHeader, Menu as AriaMenu, MenuItem as AriaMenuItem, + type MenuItemProps as AriaMenuItemProps, + type MenuProps as AriaMenuProps, MenuSection as AriaMenuSection, MenuTrigger as AriaMenuTrigger, Popover as AriaPopover, + type PopoverProps as AriaPopoverProps, Separator as AriaSeparator, + type SeparatorProps as AriaSeparatorProps, } from "react-aria-components"; import { cx } from "@/utils/cx"; diff --git a/src/components/base/file-upload-trigger/file-upload-trigger.tsx b/src/components/base/file-upload-trigger/file-upload-trigger.tsx index e4bcdea..34cb539 100644 --- a/src/components/base/file-upload-trigger/file-upload-trigger.tsx +++ b/src/components/base/file-upload-trigger/file-upload-trigger.tsx @@ -1,5 +1,4 @@ -import type { DetailedReactHTMLElement, HTMLAttributes, ReactNode } from "react"; -import React, { cloneElement, useRef } from "react"; +import React, { type DetailedReactHTMLElement, type HTMLAttributes, type ReactNode, cloneElement, useRef } from "react"; import { filterDOMProps } from "@react-aria/utils"; interface FileTriggerProps { diff --git a/src/components/base/input/hint-text.tsx b/src/components/base/input/hint-text.tsx index b2d1e3e..758cd8e 100644 --- a/src/components/base/input/hint-text.tsx +++ b/src/components/base/input/hint-text.tsx @@ -1,6 +1,5 @@ import type { ReactNode, Ref } from "react"; -import type { TextProps as AriaTextProps } from "react-aria-components"; -import { Text as AriaText } from "react-aria-components"; +import { Text as AriaText, type TextProps as AriaTextProps } from "react-aria-components"; import { cx } from "@/utils/cx"; interface HintTextProps extends AriaTextProps { diff --git a/src/components/base/input/input-group.tsx b/src/components/base/input/input-group.tsx index 09d34df..a52bfa8 100644 --- a/src/components/base/input/input-group.tsx +++ b/src/components/base/input/input-group.tsx @@ -1,7 +1,6 @@ import { type HTMLAttributes, type ReactNode } from "react"; import { HintText } from "@/components/base/input/hint-text"; -import type { InputBaseProps } from "@/components/base/input/input"; -import { TextField } from "@/components/base/input/input"; +import { type InputBaseProps, TextField } from "@/components/base/input/input"; import { Label } from "@/components/base/input/label"; import { cx, sortCx } from "@/utils/cx"; diff --git a/src/components/base/input/input-payment.tsx b/src/components/base/input/input-payment.tsx index f25457b..9a64058 100644 --- a/src/components/base/input/input-payment.tsx +++ b/src/components/base/input/input-payment.tsx @@ -1,7 +1,6 @@ import { useControlledState } from "@react-stately/utils"; import { HintText } from "@/components/base/input/hint-text"; -import type { InputBaseProps } from "@/components/base/input/input"; -import { InputBase, TextField } from "@/components/base/input/input"; +import { InputBase, type InputBaseProps, TextField } from "@/components/base/input/input"; import { Label } from "@/components/base/input/label"; import { AmexIcon, DiscoverIcon, MastercardIcon, UnionPayIcon, VisaIcon } from "@/components/foundations/payment-icons"; diff --git a/src/components/base/input/input.tsx b/src/components/base/input/input.tsx index afd4335..2bd3bb8 100644 --- a/src/components/base/input/input.tsx +++ b/src/components/base/input/input.tsx @@ -1,8 +1,13 @@ import { type ComponentType, type HTMLAttributes, type ReactNode, type Ref, createContext, useContext } from "react"; import { faCircleExclamation, faCircleQuestion } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import type { InputProps as AriaInputProps, TextFieldProps as AriaTextFieldProps } from "react-aria-components"; -import { Group as AriaGroup, Input as AriaInput, TextField as AriaTextField } from "react-aria-components"; +import { + Group as AriaGroup, + Input as AriaInput, + type InputProps as AriaInputProps, + TextField as AriaTextField, + type TextFieldProps as AriaTextFieldProps, +} from "react-aria-components"; import { HintText } from "@/components/base/input/hint-text"; import { Label } from "@/components/base/input/label"; import { Tooltip, TooltipTrigger } from "@/components/base/tooltip/tooltip"; diff --git a/src/components/base/input/label.tsx b/src/components/base/input/label.tsx index 11c8a17..d0a9106 100644 --- a/src/components/base/input/label.tsx +++ b/src/components/base/input/label.tsx @@ -1,8 +1,7 @@ import type { ReactNode, Ref } from "react"; import { faCircleQuestion } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import type { LabelProps as AriaLabelProps } from "react-aria-components"; -import { Label as AriaLabel } from "react-aria-components"; +import { Label as AriaLabel, type LabelProps as AriaLabelProps } from "react-aria-components"; import { Tooltip, TooltipTrigger } from "@/components/base/tooltip/tooltip"; import { cx } from "@/utils/cx"; diff --git a/src/components/base/pin-input/pin-input.tsx b/src/components/base/pin-input/pin-input.tsx index 0f01d45..ff076cf 100644 --- a/src/components/base/pin-input/pin-input.tsx +++ b/src/components/base/pin-input/pin-input.tsx @@ -1,5 +1,4 @@ -import type { ComponentPropsWithRef } from "react"; -import { createContext, useContext, useId } from "react"; +import { type ComponentPropsWithRef, createContext, useContext, useId } from "react"; import { OTPInput, OTPInputContext } from "input-otp"; import { cx } from "@/utils/cx"; diff --git a/src/components/base/select/combobox.tsx b/src/components/base/select/combobox.tsx index cfb657c..9cd18b8 100644 --- a/src/components/base/select/combobox.tsx +++ b/src/components/base/select/combobox.tsx @@ -1,9 +1,16 @@ -import type { FocusEventHandler, PointerEventHandler, RefAttributes, RefObject } from "react"; -import { useCallback, useContext, useRef, useState } from "react"; +import { type FocusEventHandler, type PointerEventHandler, type RefAttributes, type RefObject, useCallback, useContext, useRef, useState } from "react"; import { faMagnifyingGlass } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import type { ComboBoxProps as AriaComboBoxProps, GroupProps as AriaGroupProps, ListBoxProps as AriaListBoxProps } from "react-aria-components"; -import { ComboBox as AriaComboBox, Group as AriaGroup, Input as AriaInput, ListBox as AriaListBox, ComboBoxStateContext } from "react-aria-components"; +import { + ComboBox as AriaComboBox, + type ComboBoxProps as AriaComboBoxProps, + Group as AriaGroup, + type GroupProps as AriaGroupProps, + Input as AriaInput, + ListBox as AriaListBox, + type ListBoxProps as AriaListBoxProps, + ComboBoxStateContext, +} from "react-aria-components"; import { HintText } from "@/components/base/input/hint-text"; import { Label } from "@/components/base/input/label"; import { Popover } from "@/components/base/select/popover"; diff --git a/src/components/base/select/multi-select.tsx b/src/components/base/select/multi-select.tsx index 44d2075..3d97745 100644 --- a/src/components/base/select/multi-select.tsx +++ b/src/components/base/select/multi-select.tsx @@ -1,12 +1,31 @@ -import type { FC, FocusEventHandler, KeyboardEvent, PointerEventHandler, RefAttributes, RefObject } from "react"; -import { createContext, useCallback, useContext, useRef, useState } from "react"; +import { + type FC, + type FocusEventHandler, + type KeyboardEvent, + type PointerEventHandler, + type RefAttributes, + type RefObject, + createContext, + useCallback, + useContext, + useRef, + useState, +} from "react"; import { faMagnifyingGlass } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FocusScope, useFilter, useFocusManager } from "react-aria"; -import type { ComboBoxProps as AriaComboBoxProps, GroupProps as AriaGroupProps, ListBoxProps as AriaListBoxProps, Key } from "react-aria-components"; -import { ComboBox as AriaComboBox, Group as AriaGroup, Input as AriaInput, ListBox as AriaListBox, ComboBoxStateContext } from "react-aria-components"; -import type { ListData } from "react-stately"; -import { useListData } from "react-stately"; +import { + ComboBox as AriaComboBox, + type ComboBoxProps as AriaComboBoxProps, + Group as AriaGroup, + type GroupProps as AriaGroupProps, + Input as AriaInput, + ListBox as AriaListBox, + type ListBoxProps as AriaListBoxProps, + ComboBoxStateContext, + type Key, +} from "react-aria-components"; +import { type ListData, useListData } from "react-stately"; import { Avatar } from "@/components/base/avatar/avatar"; import type { IconComponentType } from "@/components/base/badges/badge-types"; import { HintText } from "@/components/base/input/hint-text"; diff --git a/src/components/base/select/popover.tsx b/src/components/base/select/popover.tsx index b9e4fd6..4b558b2 100644 --- a/src/components/base/select/popover.tsx +++ b/src/components/base/select/popover.tsx @@ -1,6 +1,5 @@ import type { RefAttributes } from "react"; -import type { PopoverProps as AriaPopoverProps } from "react-aria-components"; -import { Popover as AriaPopover } from "react-aria-components"; +import { Popover as AriaPopover, type PopoverProps as AriaPopoverProps } from "react-aria-components"; import { cx } from "@/utils/cx"; interface PopoverProps extends AriaPopoverProps, RefAttributes { diff --git a/src/components/base/select/select-item.tsx b/src/components/base/select/select-item.tsx index 9a19390..5108623 100644 --- a/src/components/base/select/select-item.tsx +++ b/src/components/base/select/select-item.tsx @@ -1,13 +1,11 @@ import { isValidElement, useContext } from "react"; import { faCheck } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import type { ListBoxItemProps as AriaListBoxItemProps } from "react-aria-components"; -import { ListBoxItem as AriaListBoxItem, Text as AriaText } from "react-aria-components"; +import { ListBoxItem as AriaListBoxItem, type ListBoxItemProps as AriaListBoxItemProps, Text as AriaText } from "react-aria-components"; import { Avatar } from "@/components/base/avatar/avatar"; import { cx } from "@/utils/cx"; import { isReactComponent } from "@/utils/is-react-component"; -import type { SelectItemType } from "./select"; -import { SelectContext } from "./select"; +import { SelectContext, type SelectItemType } from "./select"; const sizes = { sm: "p-2 pr-2.5", diff --git a/src/components/base/select/select.tsx b/src/components/base/select/select.tsx index 79d254b..122282f 100644 --- a/src/components/base/select/select.tsx +++ b/src/components/base/select/select.tsx @@ -1,9 +1,13 @@ -import type { FC, ReactNode, Ref, RefAttributes } from "react"; -import { createContext, isValidElement } from "react"; +import { type FC, type ReactNode, type Ref, type RefAttributes, createContext, isValidElement } from "react"; import { faChevronDown } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import type { SelectProps as AriaSelectProps } from "react-aria-components"; -import { Button as AriaButton, ListBox as AriaListBox, Select as AriaSelect, SelectValue as AriaSelectValue } from "react-aria-components"; +import { + Button as AriaButton, + ListBox as AriaListBox, + Select as AriaSelect, + type SelectProps as AriaSelectProps, + SelectValue as AriaSelectValue, +} from "react-aria-components"; import { Avatar } from "@/components/base/avatar/avatar"; import { HintText } from "@/components/base/input/hint-text"; import { Label } from "@/components/base/input/label"; diff --git a/src/components/base/slider/slider.tsx b/src/components/base/slider/slider.tsx index 6136f27..d71f9be 100644 --- a/src/components/base/slider/slider.tsx +++ b/src/components/base/slider/slider.tsx @@ -1,8 +1,8 @@ -import type { SliderProps as AriaSliderProps } from "react-aria-components"; import { Label as AriaLabel, Slider as AriaSlider, SliderOutput as AriaSliderOutput, + type SliderProps as AriaSliderProps, SliderThumb as AriaSliderThumb, SliderTrack as AriaSliderTrack, } from "react-aria-components"; diff --git a/src/components/base/textarea/textarea.tsx b/src/components/base/textarea/textarea.tsx index 8fe7dc9..109a749 100644 --- a/src/components/base/textarea/textarea.tsx +++ b/src/components/base/textarea/textarea.tsx @@ -1,7 +1,10 @@ -import type { ReactNode, Ref } from "react"; -import React from "react"; -import type { TextAreaProps as AriaTextAreaProps, TextFieldProps as AriaTextFieldProps } from "react-aria-components"; -import { TextArea as AriaTextArea, TextField as AriaTextField } from "react-aria-components"; +import React, { type ReactNode, type Ref } from "react"; +import { + TextArea as AriaTextArea, + type TextAreaProps as AriaTextAreaProps, + TextField as AriaTextField, + type TextFieldProps as AriaTextFieldProps, +} from "react-aria-components"; import { HintText } from "@/components/base/input/hint-text"; import { Label } from "@/components/base/input/label"; import { cx } from "@/utils/cx"; diff --git a/src/components/base/toggle/toggle.tsx b/src/components/base/toggle/toggle.tsx index 0a938a1..70f6a6d 100644 --- a/src/components/base/toggle/toggle.tsx +++ b/src/components/base/toggle/toggle.tsx @@ -1,6 +1,5 @@ import type { ReactNode } from "react"; -import type { SwitchProps as AriaSwitchProps } from "react-aria-components"; -import { Switch as AriaSwitch } from "react-aria-components"; +import { Switch as AriaSwitch, type SwitchProps as AriaSwitchProps } from "react-aria-components"; import { cx } from "@/utils/cx"; interface ToggleBaseProps { diff --git a/src/components/base/tooltip/tooltip.tsx b/src/components/base/tooltip/tooltip.tsx index c85aae6..0da1bfc 100644 --- a/src/components/base/tooltip/tooltip.tsx +++ b/src/components/base/tooltip/tooltip.tsx @@ -1,10 +1,13 @@ import type { ReactNode } from "react"; -import type { - ButtonProps as AriaButtonProps, - TooltipProps as AriaTooltipProps, - TooltipTriggerComponentProps as AriaTooltipTriggerComponentProps, +import { + Button as AriaButton, + type ButtonProps as AriaButtonProps, + OverlayArrow as AriaOverlayArrow, + Tooltip as AriaTooltip, + type TooltipProps as AriaTooltipProps, + TooltipTrigger as AriaTooltipTrigger, + type TooltipTriggerComponentProps as AriaTooltipTriggerComponentProps, } from "react-aria-components"; -import { Button as AriaButton, OverlayArrow as AriaOverlayArrow, Tooltip as AriaTooltip, TooltipTrigger as AriaTooltipTrigger } from "react-aria-components"; import { cx } from "@/utils/cx"; interface TooltipProps extends AriaTooltipTriggerComponentProps, Omit { diff --git a/src/components/call-desk/ai-chat-panel.tsx b/src/components/call-desk/ai-chat-panel.tsx index dda4055..ad360d6 100644 --- a/src/components/call-desk/ai-chat-panel.tsx +++ b/src/components/call-desk/ai-chat-panel.tsx @@ -1,5 +1,4 @@ -import type { ReactNode } from "react"; -import { useCallback, useEffect, useRef, useState } from "react"; +import { type ReactNode, useCallback, useEffect, useRef, useState } from "react"; import { faPaperPlaneTop, faRobot, faSparkles, faUserHeadset } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { apiClient } from "@/lib/api-client"; diff --git a/src/components/call-desk/appointment-form.tsx b/src/components/call-desk/appointment-form.tsx index be6052f..79bc7d1 100644 --- a/src/components/call-desk/appointment-form.tsx +++ b/src/components/call-desk/appointment-form.tsx @@ -104,9 +104,9 @@ export const AppointmentForm = ({ isOpen, onOpenChange, callerNumber, leadName, // Fetch doctors on mount useEffect(() => { if (!isOpen) return; - // eslint-disable-next-line @typescript-eslint/no-explicit-any + apiClient - .graphql<{ doctors: { edges: Array<{ node: any }> } }>( + .graphql<{ doctors: { edges: Array<{ node: unknown }> } }>( `{ doctors(first: 50) { edges { node { id name fullName { firstName lastName } department clinic { id name clinicName } } } } }`, @@ -131,9 +131,9 @@ export const AppointmentForm = ({ isOpen, onOpenChange, callerNumber, leadName, } setLoadingSlots(true); - // eslint-disable-next-line @typescript-eslint/no-explicit-any + apiClient - .graphql<{ appointments: { edges: Array<{ node: any }> } }>( + .graphql<{ appointments: { edges: Array<{ node: unknown }> } }>( `{ appointments(filter: { doctorId: { eq: "${doctor}" }, scheduledAt: { gte: "${date}T00:00:00", lte: "${date}T23:59:59" } diff --git a/src/components/call-desk/context-panel.tsx b/src/components/call-desk/context-panel.tsx index c45550f..c238bd2 100644 --- a/src/components/call-desk/context-panel.tsx +++ b/src/components/call-desk/context-panel.tsx @@ -98,9 +98,9 @@ const Lead360Tab = ({ lead, activities }: { lead: Lead | null; activities: LeadA } setLoadingPatient(true); - // eslint-disable-next-line @typescript-eslint/no-explicit-any + apiClient - .graphql<{ patients: { edges: Array<{ node: any }> } }>( + .graphql<{ patients: { edges: Array<{ node: unknown }> } }>( `query GetPatient($id: UUID!) { patients(filter: { id: { eq: $id } }) { edges { node { id fullName { firstName lastName } dateOfBirth gender patientType phones { primaryPhoneNumber } emails { primaryEmail } diff --git a/src/components/dashboard/kpi-cards.tsx b/src/components/dashboard/kpi-cards.tsx index 56c8d29..2845a00 100644 --- a/src/components/dashboard/kpi-cards.tsx +++ b/src/components/dashboard/kpi-cards.tsx @@ -1,6 +1,5 @@ import type { IconDefinition } from "@fortawesome/fontawesome-svg-core"; -import { faPhone, faPhoneArrowDownLeft, faPhoneArrowUpRight, faPhoneMissed } from "@fortawesome/pro-duotone-svg-icons"; -import { faCircleInfo } from "@fortawesome/pro-duotone-svg-icons"; +import { faCircleInfo, faPhone, faPhoneArrowDownLeft, faPhoneArrowUpRight, faPhoneMissed } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import type { Call, Lead } from "@/types/entities"; diff --git a/src/components/foundations/featured-icon/featured-icon.tsx b/src/components/foundations/featured-icon/featured-icon.tsx index cf22650..31cd92e 100644 --- a/src/components/foundations/featured-icon/featured-icon.tsx +++ b/src/components/foundations/featured-icon/featured-icon.tsx @@ -1,5 +1,4 @@ -import type { FC, ReactNode, Ref } from "react"; -import { isValidElement } from "react"; +import { type FC, type ReactNode, type Ref, isValidElement } from "react"; import { cx, sortCx } from "@/utils/cx"; import { isReactComponent } from "@/utils/is-react-component"; diff --git a/src/components/foundations/logo/untitledui-logo-minimal.tsx b/src/components/foundations/logo/untitledui-logo-minimal.tsx index 2807e48..38ff7c6 100644 --- a/src/components/foundations/logo/untitledui-logo-minimal.tsx +++ b/src/components/foundations/logo/untitledui-logo-minimal.tsx @@ -1,5 +1,4 @@ -import type { SVGProps } from "react"; -import { useId } from "react"; +import { type SVGProps, useId } from "react"; import { cx } from "@/utils/cx"; export const UntitledLogoMinimal = (props: SVGProps) => { diff --git a/src/components/foundations/rating-stars.tsx b/src/components/foundations/rating-stars.tsx index baab09f..461c143 100644 --- a/src/components/foundations/rating-stars.tsx +++ b/src/components/foundations/rating-stars.tsx @@ -1,5 +1,4 @@ -import type { HTMLAttributes, SVGProps } from "react"; -import { useId } from "react"; +import { type HTMLAttributes, type SVGProps, useId } from "react"; import { cx } from "@/utils/cx"; // eslint-disable-next-line react-refresh/only-export-components diff --git a/src/components/leads/lead-table.tsx b/src/components/leads/lead-table.tsx index 1454827..c9db0b3 100644 --- a/src/components/leads/lead-table.tsx +++ b/src/components/leads/lead-table.tsx @@ -1,9 +1,7 @@ -import type { FC } from "react"; -import { useMemo, useState } from "react"; +import { type FC, useMemo, useState } from "react"; import { faEllipsisVertical } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { TableBody as AriaTableBody } from "react-aria-components"; -import type { Selection, SortDescriptor } from "react-aria-components"; +import { TableBody as AriaTableBody, type Selection, type SortDescriptor } from "react-aria-components"; import { Table } from "@/components/application/table/table"; import { Badge } from "@/components/base/badges/badges"; import { Button } from "@/components/base/buttons/button"; diff --git a/src/components/marketing/header-navigation/header.tsx b/src/components/marketing/header-navigation/header.tsx index 47ca3e0..45eb70b 100644 --- a/src/components/marketing/header-navigation/header.tsx +++ b/src/components/marketing/header-navigation/header.tsx @@ -1,5 +1,4 @@ -import type { ReactNode } from "react"; -import { useRef, useState } from "react"; +import { type ReactNode, useRef, useState } from "react"; import { faChevronDown } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { Button as AriaButton, Dialog as AriaDialog, DialogTrigger as AriaDialogTrigger, Popover as AriaPopover } from "react-aria-components"; diff --git a/src/components/outreach/template-list.tsx b/src/components/outreach/template-list.tsx index b724fa2..e823d52 100644 --- a/src/components/outreach/template-list.tsx +++ b/src/components/outreach/template-list.tsx @@ -1,5 +1,4 @@ -import type { FC } from "react"; -import { useState } from "react"; +import { type FC, useState } from "react"; import { faMagnifyingGlass } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { Tab, TabList, TabPanel, Tabs } from "@/components/application/tabs/tabs"; diff --git a/src/components/shared-assets/qr-code.tsx b/src/components/shared-assets/qr-code.tsx index ac4309a..6ea8340 100644 --- a/src/components/shared-assets/qr-code.tsx +++ b/src/components/shared-assets/qr-code.tsx @@ -1,5 +1,4 @@ -import type { HTMLAttributes } from "react"; -import { useEffect, useRef, useState } from "react"; +import { type HTMLAttributes, useEffect, useRef, useState } from "react"; import QRCodeStyling, { type Options as QRCodeStylingOptions } from "qr-code-styling"; import { cx } from "@/utils/cx"; diff --git a/src/hooks/use-call-assist.ts b/src/hooks/use-call-assist.ts index 07bfcab..e2d7344 100644 --- a/src/hooks/use-call-assist.ts +++ b/src/hooks/use-call-assist.ts @@ -1,6 +1,5 @@ import { useCallback, useEffect, useRef, useState } from "react"; -import type { Socket } from "socket.io-client"; -import { io } from "socket.io-client"; +import { type Socket, io } from "socket.io-client"; import { startAudioCapture, stopAudioCapture } from "@/lib/audio-capture"; import { getSipClient } from "@/state/sip-manager"; diff --git a/src/lib/icon-wrapper.ts b/src/lib/icon-wrapper.ts index c1f3012..fa0f846 100644 --- a/src/lib/icon-wrapper.ts +++ b/src/lib/icon-wrapper.ts @@ -1,5 +1,4 @@ -import type { FC } from "react"; -import { createElement } from "react"; +import { type FC, createElement } from "react"; import type { IconDefinition } from "@fortawesome/fontawesome-svg-core"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; diff --git a/src/lib/socket.ts b/src/lib/socket.ts index 3b69cad..a82253f 100644 --- a/src/lib/socket.ts +++ b/src/lib/socket.ts @@ -1,5 +1,4 @@ -import type { Socket } from "socket.io-client"; -import { io } from "socket.io-client"; +import { type Socket, io } from "socket.io-client"; const SIDECAR_URL = import.meta.env.VITE_SIDECAR_URL ?? "http://localhost:4100"; diff --git a/src/pages/all-leads.tsx b/src/pages/all-leads.tsx index e21d548..f59a828 100644 --- a/src/pages/all-leads.tsx +++ b/src/pages/all-leads.tsx @@ -1,5 +1,4 @@ -import type { FC } from "react"; -import { useMemo, useState } from "react"; +import { type FC, useMemo, useState } from "react"; import { faArrowDownToLine, faArrowLeft, faArrowUpArrowDown, faFilterList, faMagnifyingGlass } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useSearchParams } from "react-router"; diff --git a/src/pages/call-history.tsx b/src/pages/call-history.tsx index 8ef40e9..9933f23 100644 --- a/src/pages/call-history.tsx +++ b/src/pages/call-history.tsx @@ -1,5 +1,4 @@ -import { useMemo, useRef, useState } from "react"; -import type { FC } from "react"; +import { type FC, useMemo, useRef, useState } from "react"; import { faMagnifyingGlass, faPause, faPhoneArrowDown, faPhoneArrowUp, faPhoneXmark, faPlay } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { Table, TableCard } from "@/components/application/table/table"; diff --git a/src/pages/reports.tsx b/src/pages/reports.tsx index be5a31e..87ba50a 100644 --- a/src/pages/reports.tsx +++ b/src/pages/reports.tsx @@ -1,7 +1,5 @@ -import { useMemo } from "react"; -import type { FC } from "react"; -import { faPercent, faPhoneArrowDownLeft, faPhoneArrowUpRight, faPhoneVolume } from "@fortawesome/pro-duotone-svg-icons"; -import { faArrowDown, faArrowUp } from "@fortawesome/pro-duotone-svg-icons"; +import { type FC, useMemo } from "react"; +import { faArrowDown, faArrowUp, faPercent, faPhoneArrowDownLeft, faPhoneArrowUpRight, faPhoneVolume } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import ReactECharts from "echarts-for-react"; import { BadgeWithIcon } from "@/components/base/badges/badges"; diff --git a/src/providers/data-provider.tsx b/src/providers/data-provider.tsx index 61b549a..15eaf47 100644 --- a/src/providers/data-provider.tsx +++ b/src/providers/data-provider.tsx @@ -1,5 +1,4 @@ -import type { ReactNode } from "react"; -import { createContext, useCallback, useContext, useEffect, useState } from "react"; +import { type ReactNode, createContext, useCallback, useContext, useEffect, useState } from "react"; import { apiClient } from "@/lib/api-client"; import { ADS_QUERY, CALLS_QUERY, CAMPAIGNS_QUERY, FOLLOW_UPS_QUERY, LEADS_QUERY, LEAD_ACTIVITIES_QUERY, PATIENTS_QUERY } from "@/lib/queries"; import { diff --git a/src/providers/router-provider.tsx b/src/providers/router-provider.tsx index 1669a61..fdf71ac 100644 --- a/src/providers/router-provider.tsx +++ b/src/providers/router-provider.tsx @@ -1,7 +1,6 @@ import { type PropsWithChildren } from "react"; import { RouterProvider } from "react-aria-components"; -import { useNavigate } from "react-router"; -import type { NavigateOptions } from "react-router"; +import { type NavigateOptions, useNavigate } from "react-router"; declare module "react-aria-components" { interface RouterConfig { diff --git a/src/providers/theme-provider.tsx b/src/providers/theme-provider.tsx index 1b69cff..c17616b 100644 --- a/src/providers/theme-provider.tsx +++ b/src/providers/theme-provider.tsx @@ -1,5 +1,4 @@ -import type { ReactNode } from "react"; -import { createContext, useContext, useEffect, useState } from "react"; +import { type ReactNode, createContext, useContext, useEffect, useState } from "react"; type Theme = "light" | "dark" | "system";