1- import React , { useState , useEffect } from 'react' ;
1+ import React , { useMemo } from 'react' ;
22import Header from './header' ;
33import Footer from './footer' ;
44import DevTools from './devtools' ;
55import { HeaderProps , FooterProps , PageProps , Posts , ChilderenProps , Entry , NavLinks , Links } from "../typescript/layout" ;
66
7+ function buildNavigation ( ent : Entry , hd : HeaderProps , ft : FooterProps ) {
8+ let newHeader = { ...hd } ;
9+ let newFooter = { ...ft } ;
10+ if ( ent . length !== newHeader . navigation_menu . length ) {
11+ ent . forEach ( ( entry ) => {
12+ const hFound = newHeader ?. navigation_menu . find (
13+ ( navLink : NavLinks ) => navLink . label === entry . title
14+ ) ;
15+ if ( ! hFound ) {
16+ newHeader . navigation_menu ?. push ( {
17+ label : entry . title ,
18+ page_reference : [
19+ { title : entry . title , url : entry . url , $ : entry . $ } ,
20+ ] ,
21+ $ : { } ,
22+ } ) ;
23+ }
24+ const fFound = newFooter ?. navigation . link . find (
25+ ( nlink : Links ) => nlink . title === entry . title
26+ ) ;
27+ if ( ! fFound ) {
28+ newFooter . navigation . link ?. push ( {
29+ title : entry . title ,
30+ href : entry . url ,
31+ $ : entry . $ ,
32+ } ) ;
33+ }
34+ } ) ;
35+ }
36+ return [ newHeader , newFooter ] ;
37+ }
38+
739export default function Layout ( {
840 header,
941 footer,
@@ -14,51 +46,19 @@ export default function Layout({
1446 children,
1547} : { header : HeaderProps , footer : FooterProps , page : PageProps , blogPost : Posts , blogList : Posts , entries : Entry , children : ChilderenProps } ) {
1648
17- const [ getLayout , setLayout ] = useState ( { header, footer } ) ;
49+ const getLayout = useMemo ( ( ) => {
50+ if ( footer && header && entries ) {
51+ const [ newHeader , newFooter ] = buildNavigation ( entries , header , footer ) ;
52+ return { header : newHeader , footer : newFooter } ;
53+ }
54+ return { header, footer } ;
55+ } , [ header , footer , entries ] ) ;
56+
1857 const jsonObj : any = { header, footer } ;
1958 page && ( jsonObj . page = page ) ;
2059 blogPost && ( jsonObj . blog_post = blogPost ) ;
2160 blogList && ( jsonObj . blog_post = blogList ) ;
2261
23- function buildNavigation ( ent : Entry , hd : HeaderProps , ft : FooterProps ) {
24- let newHeader = { ...hd } ;
25- let newFooter = { ...ft } ;
26- if ( ent . length !== newHeader . navigation_menu . length ) {
27- ent . forEach ( ( entry ) => {
28- const hFound = newHeader ?. navigation_menu . find (
29- ( navLink : NavLinks ) => navLink . label === entry . title
30- ) ;
31- if ( ! hFound ) {
32- newHeader . navigation_menu ?. push ( {
33- label : entry . title ,
34- page_reference : [
35- { title : entry . title , url : entry . url , $ : entry . $ } ,
36- ] ,
37- $ : { } ,
38- } ) ;
39- }
40- const fFound = newFooter ?. navigation . link . find (
41- ( nlink : Links ) => nlink . title === entry . title
42- ) ;
43- if ( ! fFound ) {
44- newFooter . navigation . link ?. push ( {
45- title : entry . title ,
46- href : entry . url ,
47- $ : entry . $ ,
48- } ) ;
49- }
50- } ) ;
51- }
52- return [ newHeader , newFooter ] ;
53- }
54-
55- useEffect ( ( ) => {
56- if ( footer && header && entries ) {
57- const [ newHeader , newFooter ] = buildNavigation ( entries , header , footer ) ;
58- setLayout ( { header : newHeader , footer : newFooter } ) ;
59- }
60- } , [ header , footer ] ) ;
61-
6262 return (
6363 < >
6464 { header ? < Header header = { getLayout . header } entries = { entries } /> : '' }
0 commit comments