diff --git a/apps/web/lib/rewardful/import-affiliates.ts b/apps/web/lib/rewardful/import-affiliates.ts index 0681b2c9352..cefdd793578 100644 --- a/apps/web/lib/rewardful/import-affiliates.ts +++ b/apps/web/lib/rewardful/import-affiliates.ts @@ -2,7 +2,7 @@ import { prisma } from "@dub/prisma"; import { Program } from "@dub/prisma/client"; import { nanoid } from "@dub/utils"; import { createId } from "../api/create-id"; -import { bulkCreateLinks } from "../api/links"; +import { bulkCreateLinks } from "../api/links/bulk-create-links"; import { RewardfulApi } from "./api"; import { MAX_BATCHES, rewardfulImporter } from "./importer"; import { RewardfulAffiliate } from "./types"; diff --git a/apps/web/lib/rewardful/import-commissions.ts b/apps/web/lib/rewardful/import-commissions.ts index b7b684070b3..46d2b823bca 100644 --- a/apps/web/lib/rewardful/import-commissions.ts +++ b/apps/web/lib/rewardful/import-commissions.ts @@ -4,7 +4,7 @@ import { prisma } from "@dub/prisma"; import { nanoid } from "@dub/utils"; import { CommissionStatus, Program } from "@prisma/client"; import { createId } from "../api/create-id"; -import { getLeadEvent } from "../tinybird"; +import { getLeadEvent } from "../tinybird/get-lead-event"; import { recordSaleWithTimestamp } from "../tinybird/record-sale"; import { clickEventSchemaTB } from "../zod/schemas/clicks"; import { RewardfulApi } from "./api"; diff --git a/apps/web/lib/tinybird/record-click.ts b/apps/web/lib/tinybird/record-click.ts index 109be2de1b2..410cbe46573 100644 --- a/apps/web/lib/tinybird/record-click.ts +++ b/apps/web/lib/tinybird/record-click.ts @@ -9,15 +9,13 @@ import { geolocation, ipAddress } from "@vercel/functions"; import { userAgent } from "next/server"; import { clickCache } from "../api/links/click-cache"; import { ExpandedLink, transformLink } from "../api/links/utils/transform-link"; -import { - detectBot, - detectQr, - getFinalUrlForRecordClick, - getIdentityHash, -} from "../middleware/utils"; -import { conn } from "../planetscale"; +import { detectBot } from "../middleware/utils/detect-bot"; +import { detectQr } from "../middleware/utils/detect-qr"; +import { getFinalUrlForRecordClick } from "../middleware/utils/get-final-url"; +import { getIdentityHash } from "../middleware/utils/get-identity-hash"; +import { conn } from "../planetscale/connection"; import { WorkspaceProps } from "../types"; -import { redis } from "../upstash"; +import { redis } from "../upstash/redis"; import { webhookCache } from "../webhook/cache"; import { sendWebhooks } from "../webhook/qstash"; import { transformClickEventData } from "../webhook/transform"; diff --git a/apps/web/lib/tinybird/record-link.ts b/apps/web/lib/tinybird/record-link.ts index 0c51f59bd7b..23da8bc0d60 100644 --- a/apps/web/lib/tinybird/record-link.ts +++ b/apps/web/lib/tinybird/record-link.ts @@ -1,5 +1,5 @@ import z from "@/lib/zod"; -import { ExpandedLink } from "../api/links"; +import { ExpandedLink } from "../api/links/utils/transform-link"; import { decodeKeyIfCaseSensitive } from "../api/links/case-sensitivity"; import { prefixWorkspaceId } from "../api/workspace-id"; import { tb } from "./client"; diff --git a/apps/web/scripts/backfill-partner-links.ts b/apps/web/scripts/backfill-partner-links.ts index 17150d5864a..15f9474bffd 100644 --- a/apps/web/scripts/backfill-partner-links.ts +++ b/apps/web/scripts/backfill-partner-links.ts @@ -2,7 +2,7 @@ import { prisma } from "@dub/prisma"; import "dotenv-flow/config"; import { includeTags } from "../lib/api/links/include-tags"; import { backfillLinkCommissions } from "../lib/api/partners/backfill-link-commissions"; -import { recordLink } from "../lib/tinybird"; +import { recordLink } from "../lib/tinybird/record-link"; // script to backfill partner links (including sales events if present) async function main() { diff --git a/apps/web/scripts/migrate-program-invites.ts b/apps/web/scripts/migrate-program-invites.ts index 7eebefbeaa5..7117c98e785 100644 --- a/apps/web/scripts/migrate-program-invites.ts +++ b/apps/web/scripts/migrate-program-invites.ts @@ -8,7 +8,7 @@ import { prisma } from "@dub/prisma"; import { EventType } from "@prisma/client"; import "dotenv-flow/config"; import { getEvents } from "../lib/analytics/get-events"; -import { recordLink } from "../lib/tinybird"; +import { recordLink } from "../lib/tinybird/record-link"; async function main() { const programInvites = await prisma.programInvite.findMany({ diff --git a/apps/web/scripts/move-links-to-folder.ts b/apps/web/scripts/move-links-to-folder.ts index 796d404702f..f7fed95789c 100644 --- a/apps/web/scripts/move-links-to-folder.ts +++ b/apps/web/scripts/move-links-to-folder.ts @@ -1,7 +1,7 @@ import { prisma } from "@dub/prisma"; import "dotenv-flow/config"; import { includeTags } from "../lib/api/links/include-tags"; -import { recordLink } from "../lib/tinybird"; +import { recordLink } from "../lib/tinybird/record-link"; // Move the program links to a folder. async function main() { diff --git a/apps/web/scripts/partners/backfill-attribution.ts b/apps/web/scripts/partners/backfill-attribution.ts index 3deef0fa32a..ad6e9d3e624 100644 --- a/apps/web/scripts/partners/backfill-attribution.ts +++ b/apps/web/scripts/partners/backfill-attribution.ts @@ -3,7 +3,8 @@ import { generateRandomName } from "@/lib/names"; import { prisma } from "@dub/prisma"; import { DUB_WORKSPACE_ID, nanoid } from "@dub/utils"; import "dotenv-flow/config"; -import { getClickEvent, recordLeadWithTimestamp } from "../../lib/tinybird"; +import { getClickEvent } from "../../lib/tinybird/get-click-event"; +import { recordLeadWithTimestamp } from "../../lib/tinybird/record-lead"; const referredUserEmail = "xxx@x.com"; const referredWorkspaceSlug = "xxx"; diff --git a/apps/web/scripts/purge-old-link-cache.ts b/apps/web/scripts/purge-old-link-cache.ts index d75e3564ddd..94dc22b9344 100644 --- a/apps/web/scripts/purge-old-link-cache.ts +++ b/apps/web/scripts/purge-old-link-cache.ts @@ -1,6 +1,6 @@ import { prisma } from "@dub/prisma"; import "dotenv-flow/config"; -import { redis } from "../lib/upstash"; +import { redis } from "../lib/upstash/redis"; const batch = 3; diff --git a/apps/web/scripts/sitemap-importer.ts b/apps/web/scripts/sitemap-importer.ts index a028cfd1646..71c34b83b2b 100644 --- a/apps/web/scripts/sitemap-importer.ts +++ b/apps/web/scripts/sitemap-importer.ts @@ -1,7 +1,7 @@ import { createId } from "@/lib/api/create-id"; import "dotenv-flow/config"; import { XMLParser } from "fast-xml-parser"; -import { bulkCreateLinks } from "../lib/api/links"; +import { bulkCreateLinks } from "../lib/api/links/bulk-create-links"; async function fetchSitemap(url: string) { const response = await fetch(url); diff --git a/apps/web/scripts/testimonial/update-links.ts b/apps/web/scripts/testimonial/update-links.ts index 27026157a51..979247bd9f7 100644 --- a/apps/web/scripts/testimonial/update-links.ts +++ b/apps/web/scripts/testimonial/update-links.ts @@ -2,7 +2,7 @@ import { prisma } from "@dub/prisma"; import "dotenv-flow/config"; import { linkCache } from "../../lib/api/links/cache"; import { includeTags } from "../../lib/api/links/include-tags"; -import { recordLink } from "../../lib/tinybird"; +import { recordLink } from "../../lib/tinybird/record-link"; // update links async function main() { diff --git a/apps/web/ui/analytics/analytics-options.tsx b/apps/web/ui/analytics/analytics-options.tsx index 7063923bfe3..fd144efef23 100644 --- a/apps/web/ui/analytics/analytics-options.tsx +++ b/apps/web/ui/analytics/analytics-options.tsx @@ -1,7 +1,7 @@ import { Popover } from "@dub/ui"; import { cn } from "@dub/utils"; import { useState } from "react"; -import { ThreeDots } from "../shared/icons"; +import ThreeDots from "../shared/icons/three-dots"; import ExportButton from "./export-button"; export default function AnalyticsOptions() { diff --git a/apps/web/ui/analytics/events/events-options.tsx b/apps/web/ui/analytics/events/events-options.tsx index c1d03f81d40..ba648479c81 100644 --- a/apps/web/ui/analytics/events/events-options.tsx +++ b/apps/web/ui/analytics/events/events-options.tsx @@ -1,6 +1,6 @@ import { Button, Popover } from "@dub/ui"; import { useContext, useState } from "react"; -import { ThreeDots } from "../../shared/icons"; +import ThreeDots from "../../shared/icons/three-dots"; import { EventsContext } from "./events-provider"; import ExportButton from "./export-button"; diff --git a/apps/web/ui/domains/free-dot-link-banner.tsx b/apps/web/ui/domains/free-dot-link-banner.tsx index da48b7bbb67..363376f59ae 100644 --- a/apps/web/ui/domains/free-dot-link-banner.tsx +++ b/apps/web/ui/domains/free-dot-link-banner.tsx @@ -2,7 +2,7 @@ import useWorkspace from "@/lib/swr/use-workspace"; import { Grid, useLocalStorage } from "@dub/ui"; import { LinkBroken } from "@dub/ui/icons"; import { useRegisterDomainModal } from "../modals/register-domain-modal"; -import { X } from "../shared/icons"; +import X from "../shared/icons/x"; export function FreeDotLinkBanner() { const { id: workspaceId } = useWorkspace(); diff --git a/apps/web/ui/domains/register-domain-form.tsx b/apps/web/ui/domains/register-domain-form.tsx index 0b04bc829f0..6696cfa7b31 100644 --- a/apps/web/ui/domains/register-domain-form.tsx +++ b/apps/web/ui/domains/register-domain-form.tsx @@ -15,7 +15,8 @@ import Link from "next/link"; import { FormEvent, useEffect, useState } from "react"; import { toast } from "sonner"; import { useDebounce } from "use-debounce"; -import { AlertCircleFill, CheckCircleFill } from "../shared/icons"; +import AlertCircleFill from "../shared/icons/alert-circle-fill"; +import CheckCircleFill from "../shared/icons/check-circle-fill"; import { ProBadgeTooltip } from "../shared/pro-badge-tooltip"; interface DomainSearchResult { diff --git a/apps/web/ui/folders/folder-actions.tsx b/apps/web/ui/folders/folder-actions.tsx index c2e00a29f37..ff4a3ffbf72 100644 --- a/apps/web/ui/folders/folder-actions.tsx +++ b/apps/web/ui/folders/folder-actions.tsx @@ -20,7 +20,9 @@ import { toast } from "sonner"; import { useDeleteFolderModal } from "../modals/delete-folder-modal"; import { useRenameFolderModal } from "../modals/rename-folder-modal"; import { useDefaultFolderModal } from "../modals/set-default-folder-modal"; -import { Chart, Delete, ThreeDots } from "../shared/icons"; +import Chart from "../shared/icons/chart"; +import Delete from "../shared/icons/delete"; +import ThreeDots from "../shared/icons/three-dots"; import { useFolderPermissionsPanel } from "./folder-permissions-panel"; import { isDefaultFolder } from "./utils"; diff --git a/apps/web/ui/folders/folder-permissions-panel.tsx b/apps/web/ui/folders/folder-permissions-panel.tsx index e61fd231735..3c73914208b 100644 --- a/apps/web/ui/folders/folder-permissions-panel.tsx +++ b/apps/web/ui/folders/folder-permissions-panel.tsx @@ -21,7 +21,7 @@ import { toast } from "sonner"; import useSWR, { mutate } from "swr"; import { Drawer } from "vaul"; import { AnimatedEmptyState } from "../shared/animated-empty-state"; -import { X } from "../shared/icons"; +import X from "../shared/icons/x"; import { FolderIcon } from "./folder-icon"; import { RequestFolderEditAccessButton } from "./request-edit-button"; diff --git a/apps/web/ui/links/destination-url-input.tsx b/apps/web/ui/links/destination-url-input.tsx index ab427dc45d0..2d156b91c82 100644 --- a/apps/web/ui/links/destination-url-input.tsx +++ b/apps/web/ui/links/destination-url-input.tsx @@ -10,7 +10,7 @@ import { import { getParamsFromURL, getUrlFromString } from "@dub/utils"; import { forwardRef, HTMLProps, ReactNode, useId } from "react"; import { useFormContext } from "react-hook-form"; -import { AlertCircleFill } from "../shared/icons"; +import AlertCircleFill from "../shared/icons/alert-circle-fill"; import { ProBadgeTooltip } from "../shared/pro-badge-tooltip"; import { LinkFormData } from "./link-builder/link-builder-provider"; diff --git a/apps/web/ui/links/link-controls.tsx b/apps/web/ui/links/link-controls.tsx index 7c8ae2235fd..9a7143c6657 100644 --- a/apps/web/ui/links/link-controls.tsx +++ b/apps/web/ui/links/link-controls.tsx @@ -28,7 +28,7 @@ import { useLinkBuilder } from "../modals/link-builder"; import { useLinkQRModal } from "../modals/link-qr-modal"; import { useMoveLinkToFolderModal } from "../modals/move-link-to-folder-modal"; import { useTransferLinkModal } from "../modals/transfer-link-modal"; -import { ThreeDots } from "../shared/icons"; +import ThreeDots from "../shared/icons/three-dots"; const OPTIONS = { edit: "e", diff --git a/apps/web/ui/links/links-toolbar.tsx b/apps/web/ui/links/links-toolbar.tsx index 2481dbcde77..2437dcf188e 100644 --- a/apps/web/ui/links/links-toolbar.tsx +++ b/apps/web/ui/links/links-toolbar.tsx @@ -26,7 +26,7 @@ import { useLinkBuilder } from "../modals/link-builder"; import { useLinkConversionTrackingModal } from "../modals/link-conversion-tracking-modal"; import { useMoveLinkToFolderModal } from "../modals/move-link-to-folder-modal"; import { useTagLinkModal } from "../modals/tag-link-modal"; -import { X } from "../shared/icons"; +import X from "../shared/icons/x"; import ArchivedLinksHint from "./archived-links-hint"; import { useLinkSelection } from "./link-selection-provider"; import { LinksListContext, ResponseLink } from "./links-container"; diff --git a/apps/web/ui/links/short-link-input.tsx b/apps/web/ui/links/short-link-input.tsx index bc32d7a32ef..8f55bd03d79 100644 --- a/apps/web/ui/links/short-link-input.tsx +++ b/apps/web/ui/links/short-link-input.tsx @@ -42,7 +42,7 @@ import { import { toast } from "sonner"; import { useDebounce } from "use-debounce"; import { FreeDotLinkBanner } from "../domains/free-dot-link-banner"; -import { AlertCircleFill } from "../shared/icons"; +import AlertCircleFill from "../shared/icons/alert-circle-fill"; import { UpgradeRequiredToast } from "../shared/upgrade-required-toast"; import { useAvailableDomains } from "./use-available-domains"; diff --git a/apps/web/ui/modals/program-welcome-modal.tsx b/apps/web/ui/modals/program-welcome-modal.tsx index e25be41c34e..968c6781697 100644 --- a/apps/web/ui/modals/program-welcome-modal.tsx +++ b/apps/web/ui/modals/program-welcome-modal.tsx @@ -9,7 +9,7 @@ import { useRef, useState, } from "react"; -import { CheckCircleFill } from "../shared/icons"; +import CheckCircleFill from "../shared/icons/check-circle-fill"; import { ModalHero } from "../shared/modal-hero"; const NEXT_STEPS = [ diff --git a/apps/web/ui/webhooks/webhook-events.tsx b/apps/web/ui/webhooks/webhook-events.tsx index e4d9c0ff3c2..0a3e97fd30e 100644 --- a/apps/web/ui/webhooks/webhook-events.tsx +++ b/apps/web/ui/webhooks/webhook-events.tsx @@ -13,7 +13,7 @@ import { CircleCheck, CircleHalfDottedClock, Copy } from "@dub/ui/icons"; import { PropsWithChildren, useEffect, useState } from "react"; import { Highlighter } from "shiki"; import { toast } from "sonner"; -import { X } from "../shared/icons"; +import X from "../shared/icons/x"; export type EventListProps = PropsWithChildren<{ events: WebhookEventProps[]; diff --git a/apps/web/ui/workspaces/invite-teammates-form.tsx b/apps/web/ui/workspaces/invite-teammates-form.tsx index 6acf881cc08..c31db5c69a3 100644 --- a/apps/web/ui/workspaces/invite-teammates-form.tsx +++ b/apps/web/ui/workspaces/invite-teammates-form.tsx @@ -9,7 +9,7 @@ import posthog from "posthog-js"; import { useFieldArray, useForm } from "react-hook-form"; import { toast } from "sonner"; import { mutate } from "swr"; -import { CheckCircleFill } from "../shared/icons"; +import CheckCircleFill from "../shared/icons/check-circle-fill"; import { UpgradeRequiredToast } from "../shared/upgrade-required-toast"; type FormData = { diff --git a/apps/web/ui/workspaces/subscription-menu.tsx b/apps/web/ui/workspaces/subscription-menu.tsx index 2ec37b364f8..9bf5c286d4e 100644 --- a/apps/web/ui/workspaces/subscription-menu.tsx +++ b/apps/web/ui/workspaces/subscription-menu.tsx @@ -14,7 +14,7 @@ import { Command } from "cmdk"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { toast } from "sonner"; -import { ThreeDots } from "../shared/icons"; +import ThreeDots from "../shared/icons/three-dots"; export default function SubscriptionMenu() { const { id: workspaceId } = useWorkspace(); diff --git a/packages/ui/src/accordion.tsx b/packages/ui/src/accordion.tsx index f3ceeb3a72f..23bcbf9a9a9 100644 --- a/packages/ui/src/accordion.tsx +++ b/packages/ui/src/accordion.tsx @@ -2,7 +2,7 @@ import { cn } from "@dub/utils"; import * as AccordionPrimitive from "@radix-ui/react-accordion"; import { ChevronDown } from "lucide-react"; import * as React from "react"; -import { Plus } from "./icons"; +import { Plus } from "./icons/nucleo/plus"; const Accordion = AccordionPrimitive.Root; diff --git a/packages/ui/src/animated-size-container.tsx b/packages/ui/src/animated-size-container.tsx index 61bfdca1adf..a9e95b29b44 100644 --- a/packages/ui/src/animated-size-container.tsx +++ b/packages/ui/src/animated-size-container.tsx @@ -6,7 +6,7 @@ import { forwardRef, useRef, } from "react"; -import { useResizeObserver } from "./hooks"; +import { useResizeObserver } from "./hooks/use-resize-observer"; type AnimatedSizeContainerProps = PropsWithChildren<{ width?: boolean; diff --git a/packages/ui/src/button.tsx b/packages/ui/src/button.tsx index b29fa05e34e..14e35610d60 100644 --- a/packages/ui/src/button.tsx +++ b/packages/ui/src/button.tsx @@ -1,7 +1,7 @@ import { cn } from "@dub/utils"; import { VariantProps, cva } from "class-variance-authority"; import { ReactNode, forwardRef } from "react"; -import { LoadingSpinner } from "./icons"; +import { LoadingSpinner } from "./icons/loading-spinner"; import { Tooltip } from "./tooltip"; export const buttonVariants = cva("transition-all", { diff --git a/packages/ui/src/charts/funnel-chart.tsx b/packages/ui/src/charts/funnel-chart.tsx index 0814e72325b..90053043f50 100644 --- a/packages/ui/src/charts/funnel-chart.tsx +++ b/packages/ui/src/charts/funnel-chart.tsx @@ -6,7 +6,7 @@ import { Area } from "@visx/shape"; import { Text } from "@visx/text"; import { motion } from "framer-motion"; import { Fragment, useMemo, useRef, useState } from "react"; -import { useMediaQuery } from "../hooks"; +import { useMediaQuery } from "../hooks/use-media-query"; const layers = [ { diff --git a/packages/ui/src/combobox/index.tsx b/packages/ui/src/combobox/index.tsx index 62f2ca26f44..3b85c895b0e 100644 --- a/packages/ui/src/combobox/index.tsx +++ b/packages/ui/src/combobox/index.tsx @@ -14,15 +14,14 @@ import { } from "react"; import { AnimatedSizeContainer } from "../animated-size-container"; import { Button, ButtonProps } from "../button"; -import { useMediaQuery, useScrollProgress } from "../hooks"; -import { - Check2, - CheckboxCheckedFill, - CheckboxUnchecked, - Icon, - LoadingSpinner, - Plus, -} from "../icons"; +import { useMediaQuery } from "../hooks/use-media-query"; +import { useScrollProgress } from "../hooks/use-scroll-progress"; +import { Icon } from "../icons"; +import { Check2 } from "../icons/nucleo/check2"; +import { CheckboxCheckedFill } from "../icons/nucleo/checkbox-checked-fill"; +import { CheckboxUnchecked } from "../icons/nucleo/checkbox-unchecked"; +import { LoadingSpinner } from "../icons/loading-spinner"; +import { Plus } from "../icons/nucleo/plus"; import { Popover, PopoverProps } from "../popover"; import { Tooltip } from "../tooltip";