fix quiz data datafetching

fix headers
This commit is contained in:
nflnkr 2024-04-02 16:09:13 +03:00
parent 60757e0906
commit 6034fa5168
7 changed files with 163 additions and 202 deletions

@ -7,34 +7,35 @@ import type { AxiosError } from "axios";
import { replaceSpacesToEmptyLines } from "../components/ViewPublicationPage/tools/replaceSpacesToEmptyLines"; import { replaceSpacesToEmptyLines } from "../components/ViewPublicationPage/tools/replaceSpacesToEmptyLines";
import { QuizSettings } from "@model/settingsData"; import { QuizSettings } from "@model/settingsData";
import * as Bowser from "bowser"; import * as Bowser from "bowser";
import useSWR from "swr";
let SESSIONS = ""; let SESSIONS = "";
const domain = location.hostname === "hbpn.link" ? "" : "https://s.hbpn.link"; const domain = location.hostname === "hbpn.link" ? "" : "https://s.hbpn.link";
const md = new MobileDetect(window.navigator.userAgent); const md = new MobileDetect(window.navigator.userAgent);
const userAgent = navigator.userAgent const userAgent = navigator.userAgent;
//операционная система //операционная система
let OSDevice:string | undefined let OSDevice: string | undefined;
if (userAgent.toLowerCase().includes("linux")) {OSDevice = "Linux"} if (userAgent.toLowerCase().includes("linux")) { OSDevice = "Linux"; }
if (userAgent.toLowerCase().includes("windows")) {OSDevice = "Windows"} if (userAgent.toLowerCase().includes("windows")) { OSDevice = "Windows"; }
if (/iPad|iPhone|iPod/.test(userAgent)){OSDevice = "IOS"} if (/iPad|iPhone|iPod/.test(userAgent)) { OSDevice = "IOS"; }
if (userAgent.toLowerCase().includes("macintosh")) {OSDevice = "Mac OS"} if (userAgent.toLowerCase().includes("macintosh")) { OSDevice = "Mac OS"; }
if (OSDevice === undefined) {OSDevice = userAgent} if (OSDevice === undefined) { OSDevice = userAgent; }
//браузер //браузер
let browserUser:string let browserUser: string;
if (Bowser.name === "Chrome") { if (Bowser.name === "Chrome") {
browserUser = "Chrome" browserUser = "Chrome";
} else if (Bowser.name === "Firefox") { } else if (Bowser.name === "Firefox") {
browserUser = "Firefox" browserUser = "Firefox";
} else if (Bowser.name === "Safari") { } else if (Bowser.name === "Safari") {
browserUser = "Safari" browserUser = "Safari";
}else{browserUser = userAgent} } else { browserUser = userAgent; }
const DeviceType = device.type const DeviceType = device.type;
let Device = md.mobile() let Device = md.mobile();
if (Device === null) {Device = userAgent} if (Device === null) { Device = userAgent; }
export const publicationMakeRequest = ({ url, body }: any) => { export const publicationMakeRequest = ({ url, body }: any) => {
return axios(url, { return axios(url, {
@ -42,10 +43,10 @@ export const publicationMakeRequest = ({ url, body }: any) => {
headers: { headers: {
"X-Sessionkey": SESSIONS, "X-Sessionkey": SESSIONS,
"Content-Type": "multipart/form-data", "Content-Type": "multipart/form-data",
"DeviceType" : DeviceType, // "DeviceType" : DeviceType,
"Device" : Device, // "Device" : Device,
"OS": OSDevice, // "OS": OSDevice,
"Browser" : browserUser // "Browser" : browserUser
}, },
method: "POST", method: "POST",
}); });
@ -115,7 +116,7 @@ export async function getQuizData(quizId: string) {
} }
export function sendAnswer({ questionId, body, qid, preview }: any) { export function sendAnswer({ questionId, body, qid, preview }: any) {
if (preview) return if (preview) return;
const formData = new FormData(); const formData = new FormData();
const answers = [ const answers = [
@ -137,7 +138,7 @@ export function sendAnswer({ questionId, body, qid, preview }: any) {
//body ={file, filename} //body ={file, filename}
export function sendFile({ questionId, body, qid, preview }: any) { export function sendFile({ questionId, body, qid, preview }: any) {
if (preview) return if (preview) return;
const formData = new FormData(); const formData = new FormData();
const answers: any = [ const answers: any = [
@ -161,7 +162,7 @@ export function sendFile({ questionId, body, qid, preview }: any) {
//форма контактов //форма контактов
export function sendFC({ questionId, body, qid, preview }: any) { export function sendFC({ questionId, body, qid, preview }: any) {
if (preview) return if (preview) return;
const formData = new FormData(); const formData = new FormData();
// const keysBody = Object.keys(body) // const keysBody = Object.keys(body)

@ -1,4 +1,7 @@
import { getQuizData } from "@/api/quizRelase";
import LoadingSkeleton from "@/ui_kit/LoadingSkeleton";
import { QuizDataContext } from "@contexts/QuizDataContext"; import { QuizDataContext } from "@contexts/QuizDataContext";
import { RootContainerWidthContext } from "@contexts/RootContainerWidthContext";
import { QuizSettings } from "@model/settingsData"; import { QuizSettings } from "@model/settingsData";
import { Box, CssBaseline, ThemeProvider } from "@mui/material"; import { Box, CssBaseline, ThemeProvider } from "@mui/material";
import { LocalizationProvider } from "@mui/x-date-pickers"; import { LocalizationProvider } from "@mui/x-date-pickers";
@ -8,38 +11,37 @@ import { handleComponentError } from "@utils/handleComponentError";
import lightTheme from "@utils/themes/light"; import lightTheme from "@utils/themes/light";
import moment from "moment"; import moment from "moment";
import { SnackbarProvider } from 'notistack'; import { SnackbarProvider } from 'notistack';
import { startTransition, useEffect, useLayoutEffect, useRef, useState } from "react";
import { ErrorBoundary } from "react-error-boundary"; import { ErrorBoundary } from "react-error-boundary";
import useSWR from "swr";
import { ApologyPage } from "./ViewPublicationPage/ApologyPage"; import { ApologyPage } from "./ViewPublicationPage/ApologyPage";
import ViewPublicationPage from "./ViewPublicationPage/ViewPublicationPage"; import ViewPublicationPage from "./ViewPublicationPage/ViewPublicationPage";
import { RootContainerWidthContext } from "@contexts/RootContainerWidthContext";
import { startTransition, useEffect, useLayoutEffect, useRef, useState } from "react";
import { getQuizData } from "@/api/quizRelase";
import LoadingSkeleton from "@/ui_kit/LoadingSkeleton";
moment.locale("ru"); moment.locale("ru");
const localeText = ruRU.components.MuiLocalizationProvider.defaultProps.localeText; const localeText = ruRU.components.MuiLocalizationProvider.defaultProps.localeText;
type Props = { type Props = {
quizSettings?: QuizSettings | {}; quizSettings?: QuizSettings;
quizId: string; quizId: string;
preview?: boolean; preview?: boolean;
}; };
export default function QuizAnswerer({ quizSettings = {}, quizId, preview = false }: Props) { export default function QuizAnswerer({ quizSettings, quizId, preview = false }: Props) {
const [rootContainerWidth, setRootContainerWidth] = useState<number>(() => window.innerWidth); const [rootContainerWidth, setRootContainerWidth] = useState<number>(() => window.innerWidth);
const [quizData, setQuizData] = useState<QuizSettings | {}>(quizSettings);
const rootContainerRef = useRef<HTMLDivElement>(null); const rootContainerRef = useRef<HTMLDivElement>(null);
const { data, error, isLoading } = useSWR(quizSettings ? null : ["quizData", quizId], params => getQuizData(params[1]), {
revalidateOnFocus: false,
revalidateOnReconnect: false,
shouldRetryOnError: false,
refreshInterval: 0,
});
useLayoutEffect(() => { useLayoutEffect(() => {
if (rootContainerRef.current) setRootContainerWidth(rootContainerRef.current.clientWidth); if (rootContainerRef.current) setRootContainerWidth(rootContainerRef.current.clientWidth);
}, []); }, []);
useEffect(() => { useEffect(() => {
if (Object.values(quizSettings).length === 0) {
const data = (async()=>await getQuizData(quizId))()
setQuizData(data)
}
const handleWindowResize = () => { const handleWindowResize = () => {
startTransition(() => { startTransition(() => {
if (rootContainerRef.current) setRootContainerWidth(rootContainerRef.current.clientWidth); if (rootContainerRef.current) setRootContainerWidth(rootContainerRef.current.clientWidth);
@ -52,10 +54,15 @@ export default function QuizAnswerer({ quizSettings = {}, quizId, preview = fals
}; };
}, []); }, []);
if (Object.values(quizData).length === 0) return <LoadingSkeleton />; if (isLoading) return <LoadingSkeleton />;
if (error) return <ApologyPage error={error} />;
quizSettings ??= data;
if (!quizSettings) throw new Error("Quiz data is null");
return ( return (
<RootContainerWidthContext.Provider value={rootContainerWidth}> <RootContainerWidthContext.Provider value={rootContainerWidth}>
<QuizDataContext.Provider value={{ ...quizData, quizId, preview }}> <QuizDataContext.Provider value={{ ...quizSettings, quizId, preview }}>
<LocalizationProvider dateAdapter={AdapterMoment} adapterLocale="ru" localeText={localeText}> <LocalizationProvider dateAdapter={AdapterMoment} adapterLocale="ru" localeText={localeText}>
<ThemeProvider theme={lightTheme}> <ThemeProvider theme={lightTheme}>
<SnackbarProvider <SnackbarProvider

@ -1,26 +1,23 @@
import { Button, ThemeProvider, useTheme } from "@mui/material"; import { sendAnswer } from "@api/quizRelase";
import { useQuizData } from "@contexts/QuizDataContext";
import { ThemeProvider } from "@mui/material";
import { useQuizViewStore } from "@stores/quizView"; import { useQuizViewStore } from "@stores/quizView";
import { useQuestionFlowControl } from "@utils/hooks/useQuestionFlowControl"; import { useQuestionFlowControl } from "@utils/hooks/useQuestionFlowControl";
import { useQuizData } from "@contexts/QuizDataContext";
import { notReachable } from "@utils/notReachable"; import { notReachable } from "@utils/notReachable";
import { quizThemes } from "@utils/themes/Publication/themePublication"; import { quizThemes } from "@utils/themes/Publication/themePublication";
import { enqueueSnackbar } from "notistack";
import { ReactElement, useEffect } from "react"; import { ReactElement, useEffect } from "react";
import { useRootContainerSize } from "../../contexts/RootContainerWidthContext";
import { ContactForm } from "./ContactForm"; import { ContactForm } from "./ContactForm";
import { Question } from "./Question"; import { Question } from "./Question";
import { ResultForm } from "./ResultForm"; import { ResultForm } from "./ResultForm";
import { StartPageViewPublication } from "./StartPageViewPublication"; import { StartPageViewPublication } from "./StartPageViewPublication";
import PrevButton from "./tools/PrevButton";
import NextButton from "./tools/NextButton"; import NextButton from "./tools/NextButton";
import { enqueueSnackbar } from "notistack"; import PrevButton from "./tools/PrevButton";
import { sendAnswer } from "@api/quizRelase";
import LoadingSkeleton from "@/ui_kit/LoadingSkeleton";
export default function ViewPublicationPage() { export default function ViewPublicationPage() {
const { settings, recentlyCompleted, quizId, preview } = useQuizData(); const { settings, recentlyCompleted, quizId, preview } = useQuizData();
const { answers } = useQuizViewStore(); const { answers } = useQuizViewStore();
let currentQuizStep = useQuizViewStore((state) => state.currentQuizStep); let currentQuizStep = useQuizViewStore((state) => state.currentQuizStep);
const isMobileMini = useRootContainerSize() < 382;
const { const {
currentQuestion, currentQuestion,
currentQuestionStepNumber, currentQuestionStepNumber,
@ -31,19 +28,16 @@ export default function ViewPublicationPage() {
showResultAfterContactForm, showResultAfterContactForm,
} = useQuestionFlowControl(); } = useQuestionFlowControl();
const isAnswer = answers.some(ans => ans.questionId === currentQuestion.id) const isAnswer = answers.some(ans => ans.questionId === currentQuestion.id);
useEffect( useEffect(
function setFaviconAndTitle() { function setFaviconAndTitle() {
if (settings.cfg !== undefined) {
const link = document.querySelector('link[rel="icon"]'); const link = document.querySelector('link[rel="icon"]');
if (link && settings.cfg.startpage.favIcon) { if (link && settings.cfg.startpage.favIcon) {
link.setAttribute("href", settings.cfg.startpage.favIcon); link.setAttribute("href", settings.cfg.startpage.favIcon);
} }
document.title = settings.name; document.title = settings.name;
}
}, },
[settings] [settings]
); );
@ -85,7 +79,7 @@ export default function ViewPublicationPage() {
enqueueSnackbar("ответ не был засчитан"); enqueueSnackbar("ответ не был засчитан");
} }
} }
moveToNextQuestion() moveToNextQuestion();
}} }}
/>} />}
/> />

@ -1,19 +1,13 @@
import { QuizSettings } from "@model/settingsData"; import { QuizSettings } from "@model/settingsData";
import { createContext, useContext } from "react"; import { createContext, useContext } from "react";
type QuizSettingsFull = QuizSettings | {}; type QuizData = QuizSettings & { quizId: string; preview: boolean; };
type QuizData = QuizSettingsFull & { quizId: string; preview: boolean; };
type QuizDataClean = QuizSettings & { quizId: string; preview: boolean; };
export const QuizDataContext = createContext<QuizData | null>(null); export const QuizDataContext = createContext<QuizData | null>(null);
export const useQuizData = ():QuizDataClean => { export const useQuizData = () => {
const quizData = useContext(QuizDataContext); const quizData = useContext(QuizDataContext);
if ( if (quizData === null) throw new Error("QuizData context is null");
quizData === null ||
!("settings" in quizData) ||
!("recentlyCompleted" in quizData)
) throw new Error("QuizData context is null");
return quizData; return quizData;
}; };

@ -1,6 +1,6 @@
{ {
"name": "@frontend/squzanswerer", "name": "@frontend/squzanswerer",
"version": "1.0.10", "version": "1.0.11",
"type": "module", "type": "module",
"main": "./dist-package/index.js", "main": "./dist-package/index.js",
"module": "./dist-package/index.js", "module": "./dist-package/index.js",

@ -1,10 +1,6 @@
import { getQuizData } from "@api/quizRelase";
import { Box } from "@mui/material"; import { Box } from "@mui/material";
import LoadingSkeleton from "@ui_kit/LoadingSkeleton";
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import useSWR from "swr";
import QuizAnswerer from "../lib/components/QuizAnswerer"; import QuizAnswerer from "../lib/components/QuizAnswerer";
import { ApologyPage } from "../lib/components/ViewPublicationPage/ApologyPage";
// const defaultQuizId = "45ef7f9c-784d-4e58-badb-f6b337f08ba0"; // branching // const defaultQuizId = "45ef7f9c-784d-4e58-badb-f6b337f08ba0"; // branching
const defaultQuizId = "0c568ac9-d176-491b-b6cd-5afd31254951"; //looooong header const defaultQuizId = "0c568ac9-d176-491b-b6cd-5afd31254951"; //looooong header
@ -12,20 +8,6 @@ const defaultQuizId = "0c568ac9-d176-491b-b6cd-5afd31254951"; //looooong header
export default function App() { export default function App() {
const quizId = useParams().quizId ?? defaultQuizId; const quizId = useParams().quizId ?? defaultQuizId;
const { data, error, isLoading } = useSWR(
["quizData", quizId],
(params) => getQuizData(params[1]),
{
revalidateOnFocus: false,
revalidateOnReconnect: false,
shouldRetryOnError: false,
refreshInterval: 0,
}
);
if (isLoading) return <LoadingSkeleton />;
if (error) return <ApologyPage error={error} />;
if (!data) throw new Error("Quiz data is null");
return ( return (
<Box <Box
@ -33,7 +15,7 @@ export default function App() {
height: "100dvh", height: "100dvh",
}} }}
> >
<QuizAnswerer quizSettings={data} quizId={quizId} /> <QuizAnswerer quizId={quizId} />
</Box> </Box>
); );
} }

@ -1,8 +1,4 @@
import { getQuizData } from "@api/quizRelase";
import LoadingSkeleton from "@ui_kit/LoadingSkeleton";
import useSWR from "swr";
import QuizAnswerer from "../lib/components/QuizAnswerer"; import QuizAnswerer from "../lib/components/QuizAnswerer";
import { ApologyPage } from "../lib/components/ViewPublicationPage/ApologyPage";
interface Props { interface Props {
@ -10,21 +6,8 @@ interface Props {
} }
export default function WidgetApp({ quizId }: Props) { export default function WidgetApp({ quizId }: Props) {
const { data, error, isLoading } = useSWR(["quizData", quizId], params => getQuizData(params[1]), {
revalidateOnFocus: false,
revalidateOnReconnect: false,
shouldRetryOnError: false,
refreshInterval: 0,
});
if (isLoading) return <LoadingSkeleton />;
if (error) return <ApologyPage error={error} />;
if (!data) throw new Error("Quiz data is null");
return ( return (
<QuizAnswerer <QuizAnswerer quizId={quizId} />
quizSettings={data}
quizId={quizId}
/>
); );
} }