UNPKG

analytica-frontend-lib

Version:

Repositório público dos componentes utilizados nas plataformas da Analytica Ensino

1 lines 6.91 kB
{"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":[]}