| 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 |
|