diff --git a/src/api/quizRelase.ts b/src/api/quizRelase.ts index 51040aa..237e604 100644 --- a/src/api/quizRelase.ts +++ b/src/api/quizRelase.ts @@ -1,150 +1,148 @@ import axios from "axios"; -import {enqueueSnackbar} from "notistack"; -let SESSIONS = "" +import type { AxiosError } from "axios"; +import type { GetDataResponse } from "../model/settingsData"; -export const publicationMakeRequest = ({ - url, - body -}: any) => { - console.log(body) - return axios(url, { - //@ts-ignore - data:body, - headers: { - "X-Sessionkey": SESSIONS, - "Content-Type": "multipart/form-data", - }, - method: "POST" - }) -} +let SESSIONS = ""; -export async function getData(quizId: string) { - const QID = - process.env.NODE_ENV === "production" ? - window.location.pathname.replace(/\//g, '') - : - "ef836ff8-35b1-4031-9acf-af5766bac2b2" +export const publicationMakeRequest = ({ url, body }: any) => { + console.log(body); + return axios(url, { + //@ts-ignore + data: body, + headers: { + "X-Sessionkey": SESSIONS, + "Content-Type": "multipart/form-data", + }, + method: "POST", + }); +}; - try { - const data = await axios(`https://s.hbpn.link/answer/settings`, { - method: "POST", - // headers, - data: JSON.stringify({ - quiz_id: quizId, - limit: 100, - page: 0, - need_config: true, +export async function getData(quizId: string): Promise<{ + data: GetDataResponse | null; + isRecentlyCompleted: boolean; + error?: string; +}> { + const QID = + process.env.NODE_ENV === "production" + ? window.location.pathname.replace(/\//g, "") + : "ef836ff8-35b1-4031-9acf-af5766bac2b2"; - }), - }) - const sessions: any = JSON.parse(localStorage.getItem("sessions") || "{}") - console.log("что-то", data) - if (typeof sessions[QID] === "number") { - //unix время. Если меньше суток прошло - выводить ошибку, иначе пустить дальше - if ((Date.now() - sessions[QID] < 86400000)) { - throw new Error("Вы уже прошли этот опрос") - } + try { + const { data, headers } = await axios( + `https://s.hbpn.link/answer/settings`, + { + method: "POST", + // headers, + data: JSON.stringify({ + quiz_id: quizId, + limit: 100, + page: 0, + need_config: true, + }), + } + ); + const sessions = JSON.parse(localStorage.getItem("sessions") || "{}"); - - } - if (typeof sessions[data.data.settings[QID]] === "number" && (Date.now() - sessions[QID] > 86400000)) { - SESSIONS = data.headers["x-sessionkey"] - sessions[QID] = data.headers["x-sessionkey"] - localStorage.setItem("sessions", JSON.stringify(sessions)) - }else { - - } - SESSIONS = data.headers["x-sessionkey"] - sessions[QID] = data.headers["x-sessionkey"] - localStorage.setItem("sessions", JSON.stringify(sessions)) - return data.data - - } catch (e) { - console.log("ОШИБКА", e) - enqueueSnackbar(e) + if (typeof sessions[QID] === "number") { + // unix время. Если меньше суток прошло - выводить ошибку, иначе пустить дальше + if (Date.now() - sessions[QID] < 86400000) { + return { data, isRecentlyCompleted: true }; + } } -} + SESSIONS = headers["x-sessionkey"]; + + return { data, isRecentlyCompleted: false }; + } catch (nativeError) { + const error = nativeError as AxiosError; + + return { data: null, isRecentlyCompleted: false, error: error.message }; + } +} export function sendAnswer({ questionId, body, qid }: any) { - const formData = new FormData(); - console.log(qid) - const answers = [{ - question_id: questionId, - content: body, //тут массив с ответом - }] - formData.append("answers", JSON.stringify(answers)); - formData.append("qid", qid); + const formData = new FormData(); + console.log(qid); + const answers = [ + { + question_id: questionId, + content: body, //тут массив с ответом + }, + ]; + formData.append("answers", JSON.stringify(answers)); + formData.append("qid", qid); - return publicationMakeRequest({ - url: `https://s.hbpn.link/answer/answer`, - body: formData, - method: "POST", - }); + return publicationMakeRequest({ + url: `https://s.hbpn.link/answer/answer`, + body: formData, + method: "POST", + }); } //body ={file, filename} export function sendFile({ questionId, body, qid }: any) { - console.log(body) - const formData = new FormData(); + console.log(body); + const formData = new FormData(); - const answers: any = [{ - question_id: questionId, - content: "file:" + body.name, - }] + const answers: any = [ + { + question_id: questionId, + content: "file:" + body.name, + }, + ]; - formData.append("answers", JSON.stringify(answers)); - formData.append(body.name, body.file); - formData.append("qid", qid); + formData.append("answers", JSON.stringify(answers)); + formData.append(body.name, body.file); + formData.append("qid", qid); - return publicationMakeRequest({ - url: `https://s.hbpn.link/answer/answer`, - body: formData, - method: "POST", - }); + return publicationMakeRequest({ + url: `https://s.hbpn.link/answer/answer`, + body: formData, + method: "POST", + }); } - const fields = [ - "name", - "email", - "phone", - "adress", - "telegram", - "wechat", - "viber", - "vk", - "skype", - "whatsup", - "messenger", - "text" -] + "name", + "email", + "phone", + "adress", + "telegram", + "wechat", + "viber", + "vk", + "skype", + "whatsup", + "messenger", + "text", +]; //форма контактов export function sendFC({ questionId, body, qid }: any) { - const formData = new FormData(); + const formData = new FormData(); - // const keysBody = Object.keys(body) - // const content:any = {} - // fields.forEach((key) => { - // if (keysBody.includes(key)) content[key] = body.key - // }) + // const keysBody = Object.keys(body) + // const content:any = {} + // fields.forEach((key) => { + // if (keysBody.includes(key)) content[key] = body.key + // }) + const answers = [ + { + question_id: questionId, + content: JSON.stringify(body), + result: true, + qid, + }, + ]; - const answers = [{ - question_id: questionId, - content: JSON.stringify(body), - result: true, - qid - }] + formData.append("answers", JSON.stringify(answers)); + formData.append("qid", qid); - formData.append("answers", JSON.stringify(answers)); - formData.append("qid", qid); - - return publicationMakeRequest({ - url: `https://s.hbpn.link/answer/answer`, - body: formData, - method: "POST", - }); -} \ No newline at end of file + return publicationMakeRequest({ + url: `https://s.hbpn.link/answer/answer`, + body: formData, + method: "POST", + }); +} diff --git a/src/model/settingsData.ts b/src/model/settingsData.ts index 1f3e7db..e0f2f7c 100644 --- a/src/model/settingsData.ts +++ b/src/model/settingsData.ts @@ -38,6 +38,7 @@ export type QuestionsStore = { }; export interface Settings { + qid: string; fp: boolean; rep: boolean; name: string; diff --git a/src/pages/ViewPublicationPage/ContactForm.tsx b/src/pages/ViewPublicationPage/ContactForm.tsx index bc4688e..004488f 100644 --- a/src/pages/ViewPublicationPage/ContactForm.tsx +++ b/src/pages/ViewPublicationPage/ContactForm.tsx @@ -136,9 +136,14 @@ export const ContactForm = ({ await sendFC({ questionId: resultQuestion?.id, body: body, - //@ts-ignore qid: settings.qid, }); + + const sessions = JSON.parse(localStorage.getItem("sessions") || "{}"); + localStorage.setItem( + "sessions", + JSON.stringify({ ...sessions, [settings.qid]: new Date().getTime() }) + ); } catch (e) { enqueueSnackbar("ответ не был засчитан"); } @@ -290,29 +295,35 @@ export const ContactForm = ({ settings?.cfg.resultInfo.showResultForm === "after" && !checkEmptyData({ resultData: resultQuestion }) ) { - try { - await inputHC() - fireOnce.current = false - const QID = - process.env.NODE_ENV === "production" ? - window.location.pathname.replace(/\//g, '') - : - "ef836ff8-35b1-4031-9acf-af5766bac2b2" - const sessions: any = JSON.parse(localStorage.getItem("sessions") || "{}") - sessions[QID] = Date.now() - localStorage.setItem("sessions", JSON.stringify(sessions)) - enqueueSnackbar("Данные успешно отправлены") + await inputHC(); + fireOnce.current = false; + const QID = + process.env.NODE_ENV === "production" + ? window.location.pathname.replace(/\//g, "") + : "ef836ff8-35b1-4031-9acf-af5766bac2b2"; + const sessions: any = JSON.parse( + localStorage.getItem("sessions") || "{}" + ); + sessions[QID] = Date.now(); + localStorage.setItem( + "sessions", + JSON.stringify(sessions) + ); + enqueueSnackbar("Данные успешно отправлены"); } catch (e) { - enqueueSnackbar("повторите попытку позже") + enqueueSnackbar("повторите попытку позже"); } - - if (settings?.cfg.resultInfo.showResultForm === "after" && !checkEmptyData({ resultData: resultQuestion })) { - setShowContactForm(false) - setShowResultForm(true) + + if ( + settings?.cfg.resultInfo.showResultForm === "after" && + !checkEmptyData({ resultData: resultQuestion }) + ) { + setShowContactForm(false); + setShowResultForm(true); } } else { - enqueueSnackbar("Пожалуйста, заполните поля") + enqueueSnackbar("Пожалуйста, заполните поля"); } } else { enqueueSnackbar("Пожалуйста, заполните поля"); diff --git a/src/pages/ViewPublicationPage/index.tsx b/src/pages/ViewPublicationPage/index.tsx index a971e8b..c5c298e 100644 --- a/src/pages/ViewPublicationPage/index.tsx +++ b/src/pages/ViewPublicationPage/index.tsx @@ -1,45 +1,47 @@ import { useEffect, useState } from "react"; import { Box, Skeleton, ThemeProvider } from "@mui/material"; +import { enqueueSnackbar } from "notistack"; import { StartPageViewPublication } from "./StartPageViewPublication"; import { Question } from "./Question"; -import { ApologyPage } from "./ApologyPage" +import { ApologyPage } from "./ApologyPage"; -import { useQuestionsStore } from "@stores/quizData/store" -import { getData } from "@api/quizRelase" +import { useQuestionsStore } from "@stores/quizData/store"; +import { getData } from "@api/quizRelase"; import type { AnyTypedQuizQuestion } from "@model/questionTypes/shared"; import { useGetSettings } from "../../utils/hooks/useGetSettings"; import { themesPublication } from "../../utils/themes/Publication/themePublication"; import { replaceSpacesToEmptyLines } from "./tools/replaceSpacesToEmptyLines"; - const QID = - process.env.NODE_ENV === "production" ? - window.location.pathname.replace(/\//g, '') - : - "ef836ff8-35b1-4031-9acf-af5766bac2b2" - + process.env.NODE_ENV === "production" + ? window.location.pathname.replace(/\//g, "") + : "ef836ff8-35b1-4031-9acf-af5766bac2b2"; export const ViewPage = () => { - const { settings, cnt, items } = useQuestionsStore() - console.log("КВИЗ ", settings) - console.log("ВОПРОСЫ ", items) - + const { settings, cnt, items } = useQuestionsStore(); + console.log("КВИЗ ", settings); + console.log("ВОПРОСЫ ", items); const [visualStartPage, setVisualStartPage] = useState(); const [errormessage, setErrormessage] = useState(""); + const [recentlyСompleted, setRecentlyСompleted] = useState(false); useEffect(() => { async function get() { try { - let data = await getData(QID) + let { data, isRecentlyCompleted, error } = await getData(QID); - console.log(data) - //@ts-ignore - const settings = data.settings + setRecentlyСompleted(isRecentlyCompleted); + + if (error) { + return enqueueSnackbar(error); + } + + //@ts-ignore + const settings = data.settings; - console.log(data) //@ts-ignore data.settings = { //@ts-ignore @@ -52,12 +54,11 @@ export const ViewPage = () => { lim: settings.lim, due: settings.due, delay: settings.delay, - pausable: settings.pausable - } - console.log(data) + pausable: settings.pausable, + }; //@ts-ignore data.items = data.items.map((item) => { - const content = JSON.parse(item.c) + const content = JSON.parse(item.c); return { description: item.desc, id: item.id, @@ -65,61 +66,92 @@ export const ViewPage = () => { required: item.req, title: item.title, type: item.typ, - content - } - }), - console.log(data) - console.log(JSON.stringify({data: data}).replaceAll(/\\\" \\\"/g, '""').replaceAll(/\" \"/g, '""')) - console.log(JSON.parse(JSON.stringify({data: data}).replaceAll(/\\\" \\\"/g, '""').replaceAll(/\" \"/g, '""')).data) - data = replaceSpacesToEmptyLines(data) + content, + }; + }); - useQuestionsStore.setState(JSON.parse(JSON.stringify({data: data}).replaceAll(/\\\" \\\"/g, '""').replaceAll(/\" \"/g, '""')).data) + console.log( + JSON.stringify({ data: data }) + .replaceAll(/\\\" \\\"/g, '""') + .replaceAll(/\" \"/g, '""') + ); + console.log( + JSON.parse( + JSON.stringify({ data: data }) + .replaceAll(/\\\" \\\"/g, '""') + .replaceAll(/\" \"/g, '""') + ).data + ); + data = replaceSpacesToEmptyLines(data); + useQuestionsStore.setState( + JSON.parse( + JSON.stringify({ data: data }) + .replaceAll(/\\\" \\\"/g, '""') + .replaceAll(/\" \"/g, '""') + ).data + ); } catch (e) { - console.log("ОШИБКА", e) + console.log("ОШИБКА", e); //@ts-ignore - if (e?.response?.status === 423) setErrormessage("квиз не активирован") + if (e?.response?.status === 423) setErrormessage("квиз не активирован"); } } - get() - }, []) + get(); + }, []); let title = document.title; console.log(title); - useEffect(() => {//установка фавиконки + useEffect(() => { + //установка фавиконки if (Object.values(settings).length > 0) { - const link = document.querySelector('link[rel="icon"]'); if (link && settings?.cfg.startpage.favIcon) { link.setAttribute("href", settings?.cfg.startpage.favIcon); } //установка заголовка страницы - document.title = settings.name + document.title = settings.name; setVisualStartPage(!settings?.cfg.noStartPage); } }, [settings]); - const filteredQuestions = ( items.filter(({ type }) => type) as AnyTypedQuizQuestion[] ).sort((previousItem, item) => previousItem.page - item.page); + if (errormessage) return ; - if (errormessage) return - if (visualStartPage === undefined) return ; - if (cnt === 0 || (cnt === 1 && items[0].type === "result")) return + if (recentlyСompleted) { + return ; + } + + if (visualStartPage === undefined) { + return ( + + ); + } + + if (cnt === 0 || (cnt === 1 && items[0].type === "result")) + return ; return ( - - - { - visualStartPage ? + + {recentlyСompleted ? ( + + ) : ( + + {visualStartPage ? ( - : + ) : ( - } - + )} + + )} - ); };