add container widget param: show button on mobile instead of quiz

This commit is contained in:
nflnkr 2024-05-13 16:41:41 +03:00
parent 2375f81b48
commit 8242f99580
2 changed files with 48 additions and 17 deletions

@ -1,29 +1,27 @@
import QuizAnswerer from "@/components/QuizAnswerer"; import { ComponentPropsWithoutRef } from "react";
import { Root, createRoot } from "react-dom/client"; import { Root, createRoot } from "react-dom/client";
import { pollForSelector } from "../shared/pollForSelector"; import { pollForSelector } from "../shared/pollForSelector";
import QuizContainer from "./QuizContainer";
type Props = ComponentPropsWithoutRef<typeof QuizContainer>;
export class ContainerWidget { export class ContainerWidget {
root: Root | undefined; root: Root | undefined;
constructor({ selector, quizId, selectorPollingTimeLimit = 60 }: { constructor(props: Props & {
quizId: string;
selector: string; selector: string;
/** /**
* In seconds, null - polling disabled * In seconds, null - polling disabled
*/ */
selectorPollingTimeLimit?: number | null; selectorPollingTimeLimit?: number | null;
}) { }) {
const { selector, selectorPollingTimeLimit = 60 } = props;
const element = document.querySelector(selector); const element = document.querySelector(selector);
if (element) { if (element) {
this.root = createRoot(element); this.root = createRoot(element);
this.root.render( this.render(props);
<QuizAnswerer
quizId={quizId}
changeFaviconAndTitle={false}
disableGlobalCss
/>
);
return; return;
} }
@ -35,16 +33,14 @@ export class ContainerWidget {
pollForSelector(selector, selectorPollingTimeLimit, (element) => { pollForSelector(selector, selectorPollingTimeLimit, (element) => {
this.root = createRoot(element); this.root = createRoot(element);
this.root.render( this.render(props);
<QuizAnswerer
quizId={quizId}
changeFaviconAndTitle={false}
disableGlobalCss
/>
);
}); });
} }
render(props: Props) {
this.root?.render(<QuizContainer {...props} />);
}
destroy() { destroy() {
if (this.root) this.root.unmount(); if (this.root) this.root.unmount();
} }

@ -0,0 +1,35 @@
import QuizAnswerer from "@/components/QuizAnswerer";
import { Box, useMediaQuery } from "@mui/material";
import { ComponentPropsWithoutRef } from "react";
import OpenQuizButton from "../button/OpenQuizButton";
type Props = ComponentPropsWithoutRef<typeof OpenQuizButton> & {
quizId: string;
showButtonOnMobile?: boolean;
dimensions?: { width: string; height: string; };
};
export default function QuizContainer(props: Props) {
const { quizId, dimensions, showButtonOnMobile = false } = props;
const isMobile = useMediaQuery("(max-width: 600px)");
return showButtonOnMobile && isMobile ? (
<OpenQuizButton {...props} />
) : (
<Box
sx={{
width: dimensions?.width ?? "100%",
maxWidth: "100%",
height: dimensions?.height ?? "100%",
maxHeight: "100%",
}}
>
<QuizAnswerer
quizId={quizId}
changeFaviconAndTitle={false}
disableGlobalCss
/>
</Box>
);
}