{"version":3,"sources":["../src/components/BreadcrumbMenu/useBreadcrumbBuilder.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { useBreadcrumb, type BreadcrumbItem } from './breadcrumbStore';\n\n/**\n * Interface para configuração de um nível de breadcrumb dinâmico (com dados)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface BreadcrumbLevelWithData<T = any> {\n  /** Dados do nível atual */\n  data: T | null;\n  /** ID extraído da URL para comparação */\n  urlId?: string;\n  /** Função para obter o ID dos dados */\n  getId: (data: T) => string;\n  /** Função para obter o nome dos dados */\n  getName: (data: T) => string;\n  /** Função para construir a URL do breadcrumb */\n  getUrl: (data: T, previousIds: string[]) => string;\n}\n\n/**\n * Interface para configuração de um nível de breadcrumb estático (sem dados)\n */\nexport interface BreadcrumbLevelStatic {\n  /** Breadcrumb estático */\n  breadcrumb: BreadcrumbItem;\n  /** ID extraído da URL para validação (se não estiver na URL, não mostra) */\n  urlId?: string;\n}\n\n/**\n * Union type para aceitar ambos os tipos de breadcrumb\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type BreadcrumbLevel<T = any> =\n  | BreadcrumbLevelWithData<T>\n  | BreadcrumbLevelStatic;\n\n/**\n * Configuração do builder de breadcrumbs\n */\nexport interface BreadcrumbBuilderConfig {\n  /** Namespace único para este breadcrumb */\n  namespace: string;\n  /** Breadcrumb inicial (raiz) */\n  root: BreadcrumbItem;\n  /** Níveis hierárquicos de breadcrumbs (cada um pode ter tipo diferente) */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  levels: BreadcrumbLevel<any>[];\n}\n\n/**\n * Hook para construir breadcrumbs hierárquicos automaticamente\n *\n * Suporta dois tipos de breadcrumbs:\n * 1. Dinâmico (com dados): Requer dados carregados do backend\n * 2. Estático: Breadcrumb fixo que aparece baseado na URL\n *\n * @param config - Configuração do builder\n * @returns Breadcrumbs e métodos para manipulá-los\n *\n * @example\n * // Breadcrumb dinâmico (com dados do backend)\n * ```tsx\n * const { breadcrumbs } = useBreadcrumbBuilder({\n *   namespace: 'performance',\n *   root: { id: 'home', name: 'Home', url: '/' },\n *   levels: [\n *     {\n *       data: subjectData,\n *       urlId: subjectId,\n *       getId: (data) => data.subjectId,\n *       getName: (data) => data.subjectName,\n *       getUrl: (data) => `/subjects/${data.subjectId}`,\n *     },\n *   ],\n * });\n * ```\n *\n * @example\n * // Breadcrumb estático (sem dados)\n * ```tsx\n * const { breadcrumbs } = useBreadcrumbBuilder({\n *   namespace: 'settings',\n *   root: { id: 'home', name: 'Home', url: '/' },\n *   levels: [\n *     {\n *       breadcrumb: { id: 'settings', name: 'Configurações', url: '/settings' },\n *       urlId: 'settings', // Mostra apenas se 'settings' estiver na URL\n *     },\n *     {\n *       breadcrumb: { id: 'profile', name: 'Perfil', url: '/settings/profile' },\n *       urlId: 'profile',\n *     },\n *   ],\n * });\n * ```\n *\n * @example\n * // Misturar estático e dinâmico\n * ```tsx\n * const { breadcrumbs } = useBreadcrumbBuilder({\n *   namespace: 'mixed',\n *   root: { id: 'home', name: 'Home', url: '/' },\n *   levels: [\n *     // Estático\n *     {\n *       breadcrumb: { id: 'products', name: 'Produtos', url: '/products' },\n *       urlId: 'products',\n *     },\n *     // Dinâmico\n *     {\n *       data: categoryData,\n *       urlId: categoryId,\n *       getId: (data) => data.id,\n *       getName: (data) => data.name,\n *       getUrl: (data) => `/products/${data.id}`,\n *     },\n *   ],\n * });\n * ```\n */\n/**\n * Type guard para verificar se é um breadcrumb com dados\n */\nconst isBreadcrumbWithData = (\n  level: BreadcrumbLevel\n): level is BreadcrumbLevelWithData => {\n  return 'data' in level;\n};\n\nexport const useBreadcrumbBuilder = (config: BreadcrumbBuilderConfig) => {\n  const { namespace, root, levels } = config;\n  const { breadcrumbs, setBreadcrumbs, sliceBreadcrumbs } =\n    useBreadcrumb(namespace);\n\n  // Extrair apenas os dados dos levels que são as verdadeiras dependências\n  const levelDependencies = levels.map((level) =>\n    isBreadcrumbWithData(level) ? level.data : null\n  );\n  const levelUrlIds = levels.map((level) => level.urlId);\n\n  useEffect(() => {\n    const newBreadcrumbs: BreadcrumbItem[] = [root];\n    const previousIds: string[] = [];\n\n    // Construir breadcrumbs hierarquicamente\n    for (const level of levels) {\n      const { urlId } = level;\n\n      // Verificar se é breadcrumb com dados ou estático\n      if (isBreadcrumbWithData(level)) {\n        // Breadcrumb dinâmico (com dados)\n        const { data, getId, getName, getUrl } = level;\n\n        // Parar se não temos dados\n        if (!data) break;\n\n        const dataId = getId(data);\n\n        // Se urlId está definido, deve corresponder ao dataId\n        // Se urlId é undefined, significa que estamos em nível superior, então parar\n        if (urlId === undefined || dataId !== urlId) break;\n\n        // Adicionar breadcrumb\n        newBreadcrumbs.push({\n          id: dataId,\n          name: getName(data),\n          url: getUrl(data, previousIds),\n        });\n\n        previousIds.push(dataId);\n      } else {\n        // Breadcrumb estático\n        const { breadcrumb } = level;\n\n        // Se urlId é undefined, parar (não estamos neste nível)\n        if (urlId === undefined) break;\n\n        // Adicionar breadcrumb estático\n        newBreadcrumbs.push(breadcrumb);\n        previousIds.push(breadcrumb.id);\n      }\n    }\n\n    setBreadcrumbs(newBreadcrumbs);\n  }, [namespace, ...levelDependencies, ...levelUrlIds, root.id]);\n\n  return {\n    breadcrumbs,\n    sliceBreadcrumbs,\n  };\n};\n"],"mappings":";;;;;AAAA,SAAS,iBAAiB;AA6H1B,IAAM,uBAAuB,CAC3B,UACqC;AACrC,SAAO,UAAU;AACnB;AAEO,IAAM,uBAAuB,CAAC,WAAoC;AACvE,QAAM,EAAE,WAAW,MAAM,OAAO,IAAI;AACpC,QAAM,EAAE,aAAa,gBAAgB,iBAAiB,IACpD,cAAc,SAAS;AAGzB,QAAM,oBAAoB,OAAO;AAAA,IAAI,CAAC,UACpC,qBAAqB,KAAK,IAAI,MAAM,OAAO;AAAA,EAC7C;AACA,QAAM,cAAc,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK;AAErD,YAAU,MAAM;AACd,UAAM,iBAAmC,CAAC,IAAI;AAC9C,UAAM,cAAwB,CAAC;AAG/B,eAAW,SAAS,QAAQ;AAC1B,YAAM,EAAE,MAAM,IAAI;AAGlB,UAAI,qBAAqB,KAAK,GAAG;AAE/B,cAAM,EAAE,MAAM,OAAO,SAAS,OAAO,IAAI;AAGzC,YAAI,CAAC,KAAM;AAEX,cAAM,SAAS,MAAM,IAAI;AAIzB,YAAI,UAAU,UAAa,WAAW,MAAO;AAG7C,uBAAe,KAAK;AAAA,UAClB,IAAI;AAAA,UACJ,MAAM,QAAQ,IAAI;AAAA,UAClB,KAAK,OAAO,MAAM,WAAW;AAAA,QAC/B,CAAC;AAED,oBAAY,KAAK,MAAM;AAAA,MACzB,OAAO;AAEL,cAAM,EAAE,WAAW,IAAI;AAGvB,YAAI,UAAU,OAAW;AAGzB,uBAAe,KAAK,UAAU;AAC9B,oBAAY,KAAK,WAAW,EAAE;AAAA,MAChC;AAAA,IACF;AAEA,mBAAe,cAAc;AAAA,EAC/B,GAAG,CAAC,WAAW,GAAG,mBAAmB,GAAG,aAAa,KAAK,EAAE,CAAC;AAE7D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;","names":[]}