2026-09-09 06:06:25 +00:00
|
|
|
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'
|
2026-09-09 06:06:25 +00:00
|
|
|
|
|
|
|
|
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])
|
|
|
|
|
}
|