PluginProbe ʕ •ᴥ•ʔ
Author Website Templates – Create Writer, Author & Publisher Websites Easily / 1.1.9
Author Website Templates – Create Writer, Author & Publisher Websites Easily v1.1.9
trunk 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9
author-website-templates / src / template-library / LibraryButton.js
author-website-templates / src / template-library Last commit date
LibraryButton.js 2 weeks ago LibraryModal.js 2 weeks ago index.js 2 weeks ago style.scss 2 weeks ago
LibraryButton.js
112 lines
1 import { useEffect, useState, createPortal } from '@wordpress/element';
2 import { Button } from '@wordpress/components';
3 import { __ } from '@wordpress/i18n';
4 import LibraryModal from './LibraryModal';
5
6 const LibraryButton = () => {
7 const [isOpen, setIsOpen] = useState(false);
8 const [container, setContainer] = useState(null);
9
10 useEffect(() => {
11 // ১. টার্গেট পরিবর্তন: এখন আমরা ডানদিকের 'Settings' এরিয়া খুঁজছি
12 const targetSelectors = [
13 '.edit-post-header__settings', // সাধারণ এডিটর (ডান পাশ)
14 '.editor-header__settings', // সাইট এডিটর (ডান পাশ)
15 '.edit-site-header__actions' // FSE (ডান পাশ)
16 ];
17
18 let targetNode = null;
19
20 const findToolbar = () => {
21 for (const selector of targetSelectors) {
22 const node = document.querySelector(selector);
23 if (node) return node;
24 }
25 return null;
26 };
27
28 const injectContainer = () => {
29 targetNode = findToolbar();
30
31 if (targetNode) {
32 let existingContainer = document.getElementById('awt-library-button-container');
33
34 if (!existingContainer) {
35 existingContainer = document.createElement('div');
36 existingContainer.id = 'awt-library-button-container';
37 existingContainer.style.display = 'inline-flex';
38 existingContainer.style.alignItems = 'center';
39 existingContainer.style.marginRight = '10px'; // ডানদিকের আইকন থেকে একটু দূরত্ব
40
41 // ২. পজিশন পরিবর্তন: 'appendChild' এর বদলে 'prepend' ব্যবহার করছি
42 // যাতে এটি ডানদিকের গ্রুপের সবার শুরুতে (বামে) বসে।
43 if (targetNode.firstChild) {
44 targetNode.insertBefore(existingContainer, targetNode.firstChild);
45 } else {
46 targetNode.appendChild(existingContainer);
47 }
48 }
49
50 setContainer(existingContainer);
51 return true;
52 }
53 return false;
54 };
55
56 if (!injectContainer()) {
57 let attempts = 0;
58 const interval = setInterval(() => {
59 attempts++;
60 if (injectContainer() || attempts > 20) {
61 clearInterval(interval);
62 }
63 }, 500);
64
65 return () => clearInterval(interval);
66 }
67
68 }, []);
69
70 // বাটন রেন্ডার
71 const ButtonComponent = (
72 <>
73 <Button
74 variant="primary"
75 onClick={() => setIsOpen(true)}
76 icon="layout"
77 style={{
78 backgroundColor: 'rgba(59, 103, 254, 0.1)',
79 color: '#3b67fe',
80 border: '1px solid transparent',
81 borderRadius: '4px',
82 height: '36px',
83 padding: '0 12px',
84 display: 'flex',
85 alignItems: 'center',
86 gap: '6px',
87 fontWeight: '500',
88 textDecoration: 'none',
89 transition: 'all 0.3s ease'
90 }}
91 className="awt-library-btn"
92 >
93 {__('Author Website Templates', 'author-website-templates')}
94 </Button>
95
96 {isOpen && (
97 <LibraryModal
98 isOpen={isOpen}
99 onClose={() => setIsOpen(false)}
100 />
101 )}
102 </>
103 );
104
105 if (container) {
106 return createPortal(ButtonComponent, container);
107 }
108
109 return null;
110 };
111
112 export default LibraryButton;