PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 4.9.5
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v4.9.5
4.9.5 4.9.4 4.9.3 4.9.2 4.9.1 4.9.0 4.8.2 4.8.1 4.8.0 4.7.0 4.6.2 4.6.1 4.6.0 4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 4.5.1 4.5.0 4.4.1 4.4.0 3.3.4 3.4.0 3.4.1 All 203 releases
betterdocs / react-src / admin / components / Layout.js

Layout.js in BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot 4.9.5, at react-src/admin/components/Layout.js

97 lines 4.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import React, { useEffect, useState } from "react";
2 import { Outlet, useSearchParams } from "react-router-dom";
3 import useFetch from "../dashboard/hooks/useFetch";
4 import { addQueryArgs } from "@wordpress/url";
5 import Header from './Header';
6 import { saveFaqOrder } from '../faq-builder/utils/function';
7
8 const Layout = () => {
9 const [searchParams] = useSearchParams();
10 const [mkbFilter, setMkbFilterValue] = useState('');
11 const [callRefetch, setCallRefetch] = useState(false);
12 let { isLoading, totalPages, totalItems, setRefetch } = useFetch({
13 path: addQueryArgs(`/wp/v2/docs`, {
14 status:'trash',
15 }),
16 parse: false
17 });
18 const post_status = searchParams.get('post_status');
19 const [faqKeywordSearch, setFaqKeywordSearch] = useState('');
20 const [debouncedFaqKeyword, setDebouncedFaqKeywordSearch] = useState('');
21 const [docCategoriesKeyword, setDocCategoriesKeyword] = useState('');
22 const [debouncedDocCategoriesKeyword, setDebouncedDocCategoriesKeyword] = useState('');
23 const [docTagsKeyword, setDocTagsKeyword] = useState('');
24 const [debouncedDocTagsKeyword, setDebouncedDocTagsKeyword] = useState('');
25 // Seed from the saved preference (option `betterdocs_faq_order`) so the
26 // builder opens on the same order the front end is currently using.
27 const [faqOrder, setFaqOrder] = useState(betterdocs_admin?.faq_order || 'default');
28 // Update the dropdown immediately, then persist so the front end mirrors it.
29 const handleFaqOrderChange = (order) => {
30 setFaqOrder(order);
31 saveFaqOrder(order).catch(() => {});
32 };
33 const debounceDelay = 500;
34 const page = searchParams.get('page');
35
36 useEffect(() => {
37 const handler = setTimeout(() => {
38 if (page == 'betterdocs-faq') {
39 setDebouncedFaqKeywordSearch(faqKeywordSearch);
40 } else if (page == 'betterdocs-doc-categories') {
41 setDebouncedDocCategoriesKeyword(docCategoriesKeyword);
42 } else if (page == 'betterdocs-doc-tags') {
43 setDebouncedDocTagsKeyword(docTagsKeyword);
44 }
45 }, debounceDelay);
46
47 return () => { clearTimeout(handler); };
48 }, [page, faqKeywordSearch, docCategoriesKeyword, docTagsKeyword]);
49
50 useEffect(() => {
51 setFaqKeywordSearch('');
52 setDebouncedFaqKeywordSearch('');
53 setDocCategoriesKeyword('');
54 setDebouncedDocCategoriesKeyword('');
55 setDocTagsKeyword('');
56 setDebouncedDocTagsKeyword('');
57 }, [page]);
58
59 useEffect(() => {
60 if( !isLoading ){
61 if( searchParams?.size >= 1 || searchParams?.get('mode') == 'grid' ){
62 setCallRefetch(true);
63 } else if ( searchParams?.get('mode') == 'list' && post_status == 'any' ) {
64 setCallRefetch(true);
65 } else if( searchParams.get('mode') == 'list' && post_status == 'trash' ) {
66 setCallRefetch(true);
67 }
68 }
69 }, [isLoading, totalItems, setRefetch, post_status, searchParams]);
70
71 return (
72 <div>
73 <Header
74 page={page}
75 postStatus={searchParams.get('post_status')}
76 filter={[mkbFilter, setMkbFilterValue]}
77 docs={[isLoading, totalItems]}
78 mode={betterdocs_admin?.dashboard_mode != undefined && betterdocs_admin?.dashboard_mode != '' ? betterdocs_admin?.dashboard_mode : searchParams.get('mode')}
79 faqSearchKeyword={faqKeywordSearch}
80 handleFAQSearch={(e) => setFaqKeywordSearch(e?.target?.value)}
81 faqOrder={faqOrder}
82 onFaqOrderChange={handleFaqOrderChange}
83 docCategoriesKeyword={docCategoriesKeyword}
84 handleDocCategoriesSearch={(e) => setDocCategoriesKeyword(e?.target?.value)}
85 docTagsKeyword={docTagsKeyword}
86 handleDocTagsSearch={(e) => setDocTagsKeyword(e?.target?.value)}
87 />
88 {/* Slot 2 used to carry the glossary search keyword. Glossaries moved to
89 Pro, which owns its own search field via `betterdocs_admin_header_search`,
90 so it is reserved here purely to keep the positional indices below stable. */}
91 <Outlet context={[mkbFilter, (callRefetch ? setRefetch : null), null, debouncedFaqKeyword, faqOrder, debouncedDocCategoriesKeyword, debouncedDocTagsKeyword]}/>
92 </div>
93 );
94 };
95
96 export default Layout;
97