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 / settings / quickbuilder / QuickBuildWrapper.jsx

QuickBuildWrapper.jsx in BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot 4.9.5, at react-src/admin/settings/quickbuilder/QuickBuildWrapper.jsx

152 lines 7.4 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 { useHistory } from "react-router-dom";
3 import { BuilderProvider, useBuilder } from "quickbuilder";
4 import QuickBuild from "./QuickBuild";
5 import { addAction } from "@wordpress/hooks";
6
7 const TAB_ID_PREFIX = "tab-";
8
9 // Convert a URL hash like `#layout` (or `#tab-layout`) into a builder tab id
10 // like `tab-layout`. Returns null if the hash is empty.
11 const hashToTabId = (rawHash) => {
12 const slug = (rawHash || "").replace(/^#/, "").trim();
13 if (!slug) return null;
14 return slug.startsWith(TAB_ID_PREFIX) ? slug : `${TAB_ID_PREFIX}${slug}`;
15 };
16
17 // Convert a tab id like `tab-layout` into a user-friendly hash slug like `layout`.
18 const tabIdToHashSlug = (tabId) => {
19 if (!tabId) return "";
20 return tabId.startsWith(TAB_ID_PREFIX) ? tabId.slice(TAB_ID_PREFIX.length) : tabId;
21 };
22
23 // Hash anchor (#layout) wins; legacy ?tab=tab-layout is honored as a fallback.
24 const getInitialTabFromUrl = () => {
25 const fromHash = hashToTabId(window.location.hash);
26 if (fromHash) return fromHash;
27 const queryTab = new URLSearchParams(window.location.search).get("tab");
28 if (!queryTab) return null;
29 return queryTab.startsWith(TAB_ID_PREFIX) ? queryTab : `${TAB_ID_PREFIX}${queryTab}`;
30 };
31
32 const QuickBuildWrapper = (props) => {
33 const builder = useBuilder(betterdocsAdminSettings);
34 const [isLoading, setIsLoading] = useState(true);
35 const [triggerEffect, setTriggerEffect] = useState(false);
36
37 builder.values.is_pro_active = betterdocsAdminSettings?.is_pro_active;
38
39 const settingsCopyObject = {...betterdocsAdminSettings};
40
41 useEffect(() => {
42 if( builder?.values?.multiple_kb == true && builder?.values?.internal_knowledge_base_type == 'specific-docs' && betterdocsAdminSettings?.values?.multiple_kb == false && builder?.values?.betterdocs_access_control_repeater_kb != undefined && builder?.values?.betterdocs_access_control_repeater_kb?.length == 0 ){
43 builder.values.internal_knowledge_base_type = 'all-docs';
44 }
45 }, [builder?.values?.multiple_kb]);
46
47 // useEffect(() => {
48 // const submitButton = document.querySelector('.wprf-submit .wprf-submit-button');
49 // if( builder?.values?.betterdocs_access_control_repeater?.length == 0 && builder?.values?.betterdocs_access_control_repeater?.length != betterdocsAdminSettings.values?.betterdocs_access_control_repeater?.length && submitButton.style.display == 'block') {
50 // submitButton.style.display == 'block';
51 // }
52 // }, [builder?.values?.betterdocs_access_control_repeater]);
53
54 useEffect(() => {
55 if( builder.values.enable_disable == false ) { //related I/A settings preview
56 builder.values.ia_enable_preview = false;
57 }
58 betterdocsAdminSettings.values = builder.values;
59 }, [builder.values]);
60
61 // Deep-link initial tab from the URL. `#layout` wins; `?tab=tab-layout` is a fallback.
62 useEffect(() => {
63 const initial = getInitialTabFromUrl();
64 if (initial) {
65 builder.setActiveTab(initial);
66 }
67 }, []);
68
69 // Reflect the active tab in the URL hash so links can be shared and
70 // browser back/forward stays in sync. `replaceState` keeps tab clicks
71 // out of the history stack.
72 useEffect(() => {
73 const active = builder?.config?.active;
74 if (!active) return;
75 const desiredHash = `#${tabIdToHashSlug(active)}`;
76 if (window.location.hash === desiredHash) return;
77 const url = `${window.location.pathname}${window.location.search}${desiredHash}`;
78 window.history.replaceState(null, "", url);
79 }, [builder?.config?.active]);
80
81 // Pick up hash edits and back/forward navigation.
82 useEffect(() => {
83 const handleHashChange = () => {
84 const tabId = hashToTabId(window.location.hash);
85 if (tabId && tabId !== builder?.config?.active) {
86 builder.setActiveTab(tabId);
87 }
88 };
89 window.addEventListener("hashchange", handleHashChange);
90 return () => window.removeEventListener("hashchange", handleHashChange);
91 }, [builder]);
92
93 useEffect(() => {
94 setIsLoading(false);
95 }, []);
96
97
98 useEffect(() => {
99 const externalButtons = document.querySelectorAll('.title-advance-settings-tab .wprf-tab-nav-item');
100
101 const handleClick = () => {
102 setTriggerEffect(prev => !prev); // or setTriggerEffect(true);
103 };
104
105 if (externalButtons) {
106 for(let button of externalButtons){
107 button.addEventListener('click', handleClick);
108 }
109 }
110
111 // Cleanup
112 return () => {
113 if (externalButtons) {
114 for(let button of externalButtons){
115 button.removeEventListener('click', handleClick);
116 }
117 }
118 };
119 }, [builder]);
120
121 useEffect(() => {
122 const submitButton = document.querySelector('.wprf-submit .wprf-submit-button');
123 if( ( builder?.config?.active == 'tab-advance-settings' && builder?.values?.internal_knowledge_base_type == 'specific-docs' && builder?.values?.betterdocs_access_control_repeater?.length == 0 && settingsCopyObject?.values?.betterdocs_access_control_repeater?.length == 1 && submitButton?.style?.display == 'block' && ! builder?.values?.multiple_kb ) || ( builder?.config?.active == 'tab-advance-settings' && builder?.values?.internal_knowledge_base_type == 'specific-docs' && builder?.values?.betterdocs_access_control_repeater_kb?.length == 0 && settingsCopyObject?.values?.betterdocs_access_control_repeater_kb?.length == 1 && submitButton?.style?.display == 'block' && builder?.values?.multiple_kb ) ) {
124 return;
125 } else if( builder?.config?.active == 'tab-advance-settings' && builder?.values?.internal_knowledge_base_type == 'specific-docs' && builder?.values?.betterdocs_access_control_repeater?.length == 0 && submitButton && ! builder?.values?.multiple_kb ) {
126 submitButton.style.display = 'none';
127 } else if( builder?.config?.active == 'tab-advance-settings' && builder?.values?.multiple_kb && builder?.values?.internal_knowledge_base_type == 'specific-docs' && builder?.values?.betterdocs_access_control_repeater_kb?.length == 0 && submitButton ) {
128 submitButton.style.display = 'none';
129 } else if( builder?.config?.active == 'tab-advance-settings' && builder?.values?.multiple_kb && builder?.values?.internal_knowledge_base_type == 'specific-docs' && builder?.values?.betterdocs_access_control_repeater_kb?.length > 0 && submitButton ) {
130 submitButton.style.display = 'block';
131 } else if( builder?.config?.active == 'tab-advance-settings' && builder?.values?.internal_knowledge_base_type == 'specific-docs' && builder?.values?.betterdocs_access_control_repeater?.length > 0 && submitButton && ! builder?.values?.multiple_kb ) {
132 submitButton.style.display = 'block';
133 } else if( submitButton ) {
134 submitButton.style.display = 'block';
135 }
136 }, [triggerEffect, builder?.config?.active, builder?.values?.internal_knowledge_base_type, builder?.values?.betterdocs_access_control_repeater, builder?.values?.betterdocs_access_control_repeater_kb, builder?.values?.multiple_kb]);
137
138 useEffect(() => {
139 const submitButton = document.querySelector('.wprf-submit .wprf-submit-button');
140 if( builder?.values?.enable_content_restriction == false && submitButton?.style?.display == 'none' ) {
141 submitButton.style.display = 'block';
142 }
143 }, [builder?.values?.enable_content_restriction]);
144
145 return (
146 <BuilderProvider value={{ ...builder, isLoading, setIsLoading }}>
147 <QuickBuild isLoading={isLoading} />
148 </BuilderProvider>
149 );
150 };
151 export default QuickBuildWrapper;
152