import { useMemo } from 'react' import { useStoreState } from '@/store' import type { ConfigMenus } from '@/proxy/menus/models' /** * Public site menu kaydi. Menuler `Pub` modulu altinda tutulur ve uygulama * konfigurasyonunun `menus.public` alaniyla tasinir; menu ucu `[Authorize]` * oldugu icin ziyaretci ayri bir istek atamaz. */ export interface PublicMenuItem { code: string displayName?: string url?: string icon?: string order: number parentCode?: string cssClass?: string target?: string requiredPermissionName?: string } export interface PublicMenuNode extends PublicMenuItem { children: PublicMenuNode[] } /** Ust menude bu sinifi tasiyan kayit duz baglanti yerine vurgulu buton olarak cizilir. */ export const PUBLIC_MENU_CTA_CLASS = 'cta' /** Ust ve alt bilgiyi cizen Custom Component'lerin adlari. */ export const PUBLIC_HEADER_COMPONENT = 'PublicHeader' export const PUBLIC_FOOTER_COMPONENT = 'PublicFooter' const PUBLIC_MENU_HEADER_CODE = 'Pub.Header' function buildChildren( items: PublicMenuItem[], parentCode: string, isVisible: (item: PublicMenuItem) => boolean, ): PublicMenuNode[] { return items .filter((item) => item.parentCode === parentCode && isVisible(item)) .sort((left, right) => left.order - right.order) .map((item) => ({ ...item, children: buildChildren(items, item.code, isVisible) })) } /** * Ust menu baglantilarini menu agacindan turetir. Alt bilgi kendi Custom Component'inde * tasarlanir, menuden beslenmez. */ export function usePublicMenu() { const publicMenus = useStoreState( (state) => (state.abpConfig.config?.extraProperties?.['menus'] as ConfigMenus | undefined)?.public, ) const grantedPolicies = useStoreState((state) => state.abpConfig.config?.auth?.grantedPolicies) return useMemo(() => { const items = Array.isArray(publicMenus) ? publicMenus : [] const isVisible = (item: PublicMenuItem) => !item.requiredPermissionName || grantedPolicies?.[item.requiredPermissionName] === true return { headerLinks: buildChildren(items, PUBLIC_MENU_HEADER_CODE, isVisible) } }, [publicMenus, grantedPolicies]) }