PluginProbe
Discount Rules for WooCommerce – Disco | Dynamic Pricing, Conditions, Bulk, Bundle, BOGO / 1.4.14
Discount Rules for WooCommerce – Disco | Dynamic Pricing, Conditions, Bulk, Bundle, BOGO v1.4.14
1.4.14 1.4.13 1.4.12 1.4.11 1.4.10 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.54 1.3.53 1.3.52 1.3.51 1.3.50 1.3.49 1.3.48 1.3.47 1.3.46 1.3.45 All 177 releases
disco / backend / views / components / Docs / App.jsx

App.jsx in Discount Rules for WooCommerce – Disco | Dynamic Pricing, Conditions, Bulk, Bundle, BOGO 1.4.14, at backend/views/components/Docs/App.jsx

82 lines 2.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import { useEffect, useState } from 'react';
2 import DiscoAccordion from './components/accordions/Accordions';
3 import HelpCenter from './components/help-center/HelpCenter';
4 import DiscoResources from './components/resources/AdditionalResources';
5 import DiscoSidebar from './components/sidebar/Sidebar';
6 import DiscoSupportSection from './components/support/SupportSection';
7 import initialData from './data/docsData';
8 import getDocs from './utils/fetchDocs';
9
10 export default function App() {
11 const [docsData, setDocsData] = useState(initialData);
12 const [searchQuery, setSearchQuery] = useState('');
13
14 useEffect(() => {
15 const fetchDocs = async () => {
16 try {
17 const data = await getDocs();
18 const updatedDocs = initialData.map((section) => {
19 const matchingDocs = data.filter(
20 (doc) => doc.doc_category[0] === section.doc_category_id
21 );
22 return { ...section, items: matchingDocs };
23 });
24 setDocsData(updatedDocs);
25 } catch (err) {
26 console.error('Failed to fetch docs:', err);
27 }
28 };
29 fetchDocs();
30 }, []);
31
32 const query = searchQuery.trim().toLowerCase();
33
34 const stripHtml = (html) =>
35 html
36 ? html
37 .replace(/<[^>]*>/g, ' ')
38 .replace(/\s+/g, ' ')
39 .trim()
40 : '';
41
42 const itemMatches = (item) => {
43 const title = (item.title?.rendered || item.title || '').toLowerCase();
44 const content = stripHtml(item.content?.rendered || '').toLowerCase();
45 return title.includes(query) || content.includes(query);
46 };
47
48 // Flat list of matching results for the search dropdown
49 const searchResults = query
50 ? docsData.flatMap((section) =>
51 section.items.filter(itemMatches).map((item) => ({
52 title: item.title?.rendered || item.title,
53 link: item.link,
54 section: section.title,
55 excerpt: stripHtml(
56 item.excerpt?.rendered || item.content?.rendered || ''
57 ).slice(0, 100),
58 }))
59 )
60 : [];
61
62 return (
63 <div className="disco:py-4 disco:pr-4">
64 <HelpCenter
65 searchQuery={searchQuery}
66 setSearchQuery={setSearchQuery}
67 searchResults={searchResults}
68 />
69 {/* Accordions */}
70 <div className="disco:flex disco:justify-between disco:gap-5 disco:py-5">
71 <div className="disco:w-[70%]">
72 <DiscoAccordion docsData={docsData} />
73 {/* Contact Form */}
74 <DiscoSupportSection />
75 <DiscoResources />
76 </div>
77 <DiscoSidebar />
78 </div>
79 </div>
80 );
81 }
82