leumas-private-shared
Version:
Private React JSX Package For Leumas Shared Components, Headers, Footers, Asides, Login Pages, API Key Manager and much more. Styles and everything reusable to avoid DRY code across all of our subdomains
79 lines (64 loc) • 2.32 kB
JSX
import { useEffect, useRef, useState } from 'react';
import ReactDOM from 'react-dom';
import { AuthProvider } from "react-auth-kit";
import { ThemeProvider } from '@material-tailwind/react';
import React from 'react';
function MonitorSelector({ componentType: Component, componentProps, authConfig }) {
const popupRef = useRef(null);
const openOnMonitor = (event) => {
event.preventDefault();
event.stopPropagation();
const x = 0;
const y = 0;
let newWindow = window.open('', '_blank', `left=${x},top=${y},width=800,height=600`);
if (!newWindow) {
alert("Please allow pop-ups for this website.");
return;
}
popupRef.current = newWindow;
// Grab and apply styles to the new window
const styles = Array.from(document.styleSheets)
.reduce((acc, sheet) => {
try {
const rules = Array.from(sheet.cssRules)
.map(rule => rule.cssText)
.join('');
return acc + rules;
} catch (e) {
return acc;
}
}, '');
const styleElement = newWindow.document.createElement('style');
styleElement.textContent = styles;
newWindow.document.head.appendChild(styleElement);
const linkElement = newWindow.document.createElement('link');
linkElement.rel = 'stylesheet';
linkElement.href = '../../../../index.css'; // Adjust with your Tailwind CSS path or CDN link
newWindow.document.head.appendChild(linkElement);
const popupRoot = newWindow.document.createElement('div');
newWindow.document.body.appendChild(popupRoot);
ReactDOM.render(
<ThemeProvider>
<AuthProvider {...authConfig}>
<Component {...componentProps} />
</AuthProvider>
</ThemeProvider>,
popupRoot
);
};
useEffect(() => {
return () => {
if (popupRef.current) {
popupRef.current.close();
}
};
}, []);
return (
<button
className="bg-blue-500 hover:bg-black text-white font-semibold py-2 px-4 rounded shadow transition duration-200 ease-in-out text-black"
onClick={openOnMonitor}>
+
</button>
);
}
export default MonitorSelector;