sozsoft-platform/ui/src/utils/hooks/usePublicMenu.ts

66 lines
2.2 KiB
TypeScript
Raw Normal View History

import { useMemo } from 'react'
import { useStoreState } from '@/store'
/**
* Public site menu kaydi. Menuler `Pub` modulu altinda tutulur ve uygulama
* konfigurasyonunun `publicMenus` 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'
/** Public site menulerinin modulu; yonetim navigasyonu bu modulu disarida birakir. */
export const PUBLIC_MENU_MODULE_ID = 'Pub'
/** Ust ve alt bilgiyi cizen Custom Component'lerin adlari. */
export const PUBLIC_HEADER_COMPONENT = 'PublicHeader'
export const PUBLIC_FOOTER_COMPONENT = 'PublicFooter'
2026-10-17 18:51:10 +00:00
const PUBLIC_MENU_HEADER_CODE = 'App.Public.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?.['publicMenus'],
) as PublicMenuItem[] | undefined
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])
}