feat: one day delay

This commit is contained in:
IlyaDoronin 2024-01-25 17:24:10 +03:00
parent 00831e5664
commit a54893d67a
4 changed files with 231 additions and 189 deletions

@ -1,150 +1,148 @@
import axios from "axios"; import axios from "axios";
import {enqueueSnackbar} from "notistack";
let SESSIONS = "" import type { AxiosError } from "axios";
import type { GetDataResponse } from "../model/settingsData";
export const publicationMakeRequest = ({ let SESSIONS = "";
url,
body
}: any) => {
console.log(body)
return axios(url, {
//@ts-ignore
data:body,
headers: {
"X-Sessionkey": SESSIONS,
"Content-Type": "multipart/form-data",
},
method: "POST"
})
}
export async function getData(quizId: string) { export const publicationMakeRequest = ({ url, body }: any) => {
const QID = console.log(body);
process.env.NODE_ENV === "production" ? return axios(url, {
window.location.pathname.replace(/\//g, '') //@ts-ignore
: data: body,
"ef836ff8-35b1-4031-9acf-af5766bac2b2" headers: {
"X-Sessionkey": SESSIONS,
"Content-Type": "multipart/form-data",
},
method: "POST",
});
};
try { export async function getData(quizId: string): Promise<{
const data = await axios(`https://s.hbpn.link/answer/settings`, { data: GetDataResponse | null;
method: "POST", isRecentlyCompleted: boolean;
// headers, error?: string;
data: JSON.stringify({ }> {
quiz_id: quizId, const QID =
limit: 100, process.env.NODE_ENV === "production"
page: 0, ? window.location.pathname.replace(/\//g, "")
need_config: true, : "ef836ff8-35b1-4031-9acf-af5766bac2b2";
}), try {
}) const { data, headers } = await axios<GetDataResponse>(
const sessions: any = JSON.parse(localStorage.getItem("sessions") || "{}") `https://s.hbpn.link/answer/settings`,
console.log("что-то", data) {
if (typeof sessions[QID] === "number") { method: "POST",
//unix время. Если меньше суток прошло - выводить ошибку, иначе пустить дальше // headers,
if ((Date.now() - sessions[QID] < 86400000)) { data: JSON.stringify({
throw new Error("Вы уже прошли этот опрос") quiz_id: quizId,
} limit: 100,
page: 0,
need_config: true,
}),
}
);
const sessions = JSON.parse(localStorage.getItem("sessions") || "{}");
if (typeof sessions[QID] === "number") {
} // unix время. Если меньше суток прошло - выводить ошибку, иначе пустить дальше
if (typeof sessions[data.data.settings[QID]] === "number" && (Date.now() - sessions[QID] > 86400000)) { if (Date.now() - sessions[QID] < 86400000) {
SESSIONS = data.headers["x-sessionkey"] return { data, isRecentlyCompleted: true };
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)
} }
}
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) { export function sendAnswer({ questionId, body, qid }: any) {
const formData = new FormData(); const formData = new FormData();
console.log(qid) console.log(qid);
const answers = [{ const answers = [
question_id: questionId, {
content: body, //тут массив с ответом question_id: questionId,
}] content: body, //тут массив с ответом
formData.append("answers", JSON.stringify(answers)); },
formData.append("qid", qid); ];
formData.append("answers", JSON.stringify(answers));
formData.append("qid", qid);
return publicationMakeRequest({ return publicationMakeRequest({
url: `https://s.hbpn.link/answer/answer`, url: `https://s.hbpn.link/answer/answer`,
body: formData, body: formData,
method: "POST", method: "POST",
}); });
} }
//body ={file, filename} //body ={file, filename}
export function sendFile({ questionId, body, qid }: any) { export function sendFile({ questionId, body, qid }: any) {
console.log(body) console.log(body);
const formData = new FormData(); const formData = new FormData();
const answers: any = [{ const answers: any = [
question_id: questionId, {
content: "file:" + body.name, question_id: questionId,
}] content: "file:" + body.name,
},
];
formData.append("answers", JSON.stringify(answers)); formData.append("answers", JSON.stringify(answers));
formData.append(body.name, body.file); formData.append(body.name, body.file);
formData.append("qid", qid); formData.append("qid", qid);
return publicationMakeRequest({ return publicationMakeRequest({
url: `https://s.hbpn.link/answer/answer`, url: `https://s.hbpn.link/answer/answer`,
body: formData, body: formData,
method: "POST", method: "POST",
}); });
} }
const fields = [ const fields = [
"name", "name",
"email", "email",
"phone", "phone",
"adress", "adress",
"telegram", "telegram",
"wechat", "wechat",
"viber", "viber",
"vk", "vk",
"skype", "skype",
"whatsup", "whatsup",
"messenger", "messenger",
"text" "text",
] ];
//форма контактов //форма контактов
export function sendFC({ questionId, body, qid }: any) { export function sendFC({ questionId, body, qid }: any) {
const formData = new FormData(); const formData = new FormData();
// const keysBody = Object.keys(body) // const keysBody = Object.keys(body)
// const content:any = {} // const content:any = {}
// fields.forEach((key) => { // fields.forEach((key) => {
// if (keysBody.includes(key)) content[key] = body.key // if (keysBody.includes(key)) content[key] = body.key
// }) // })
const answers = [
{
question_id: questionId,
content: JSON.stringify(body),
result: true,
qid,
},
];
const answers = [{ formData.append("answers", JSON.stringify(answers));
question_id: questionId, formData.append("qid", qid);
content: JSON.stringify(body),
result: true,
qid
}]
formData.append("answers", JSON.stringify(answers)); return publicationMakeRequest({
formData.append("qid", qid); url: `https://s.hbpn.link/answer/answer`,
body: formData,
return publicationMakeRequest({ method: "POST",
url: `https://s.hbpn.link/answer/answer`, });
body: formData, }
method: "POST",
});
}

@ -38,6 +38,7 @@ export type QuestionsStore = {
}; };
export interface Settings { export interface Settings {
qid: string;
fp: boolean; fp: boolean;
rep: boolean; rep: boolean;
name: string; name: string;

@ -136,9 +136,14 @@ export const ContactForm = ({
await sendFC({ await sendFC({
questionId: resultQuestion?.id, questionId: resultQuestion?.id,
body: body, body: body,
//@ts-ignore
qid: settings.qid, qid: settings.qid,
}); });
const sessions = JSON.parse(localStorage.getItem("sessions") || "{}");
localStorage.setItem(
"sessions",
JSON.stringify({ ...sessions, [settings.qid]: new Date().getTime() })
);
} catch (e) { } catch (e) {
enqueueSnackbar("ответ не был засчитан"); enqueueSnackbar("ответ не был засчитан");
} }
@ -290,29 +295,35 @@ export const ContactForm = ({
settings?.cfg.resultInfo.showResultForm === "after" && settings?.cfg.resultInfo.showResultForm === "after" &&
!checkEmptyData({ resultData: resultQuestion }) !checkEmptyData({ resultData: resultQuestion })
) { ) {
try { try {
await inputHC() await inputHC();
fireOnce.current = false fireOnce.current = false;
const QID = const QID =
process.env.NODE_ENV === "production" ? process.env.NODE_ENV === "production"
window.location.pathname.replace(/\//g, '') ? window.location.pathname.replace(/\//g, "")
: : "ef836ff8-35b1-4031-9acf-af5766bac2b2";
"ef836ff8-35b1-4031-9acf-af5766bac2b2" const sessions: any = JSON.parse(
const sessions: any = JSON.parse(localStorage.getItem("sessions") || "{}") localStorage.getItem("sessions") || "{}"
sessions[QID] = Date.now() );
localStorage.setItem("sessions", JSON.stringify(sessions)) sessions[QID] = Date.now();
enqueueSnackbar("Данные успешно отправлены") localStorage.setItem(
"sessions",
JSON.stringify(sessions)
);
enqueueSnackbar("Данные успешно отправлены");
} catch (e) { } catch (e) {
enqueueSnackbar("повторите попытку позже") enqueueSnackbar("повторите попытку позже");
} }
if (settings?.cfg.resultInfo.showResultForm === "after" && !checkEmptyData({ resultData: resultQuestion })) { if (
setShowContactForm(false) settings?.cfg.resultInfo.showResultForm === "after" &&
setShowResultForm(true) !checkEmptyData({ resultData: resultQuestion })
) {
setShowContactForm(false);
setShowResultForm(true);
} }
} else { } else {
enqueueSnackbar("Пожалуйста, заполните поля") enqueueSnackbar("Пожалуйста, заполните поля");
} }
} else { } else {
enqueueSnackbar("Пожалуйста, заполните поля"); enqueueSnackbar("Пожалуйста, заполните поля");

@ -1,45 +1,47 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { Box, Skeleton, ThemeProvider } from "@mui/material"; import { Box, Skeleton, ThemeProvider } from "@mui/material";
import { enqueueSnackbar } from "notistack";
import { StartPageViewPublication } from "./StartPageViewPublication"; import { StartPageViewPublication } from "./StartPageViewPublication";
import { Question } from "./Question"; import { Question } from "./Question";
import { ApologyPage } from "./ApologyPage" import { ApologyPage } from "./ApologyPage";
import { useQuestionsStore } from "@stores/quizData/store" import { useQuestionsStore } from "@stores/quizData/store";
import { getData } from "@api/quizRelase" import { getData } from "@api/quizRelase";
import type { AnyTypedQuizQuestion } from "@model/questionTypes/shared"; import type { AnyTypedQuizQuestion } from "@model/questionTypes/shared";
import { useGetSettings } from "../../utils/hooks/useGetSettings"; import { useGetSettings } from "../../utils/hooks/useGetSettings";
import { themesPublication } from "../../utils/themes/Publication/themePublication"; import { themesPublication } from "../../utils/themes/Publication/themePublication";
import { replaceSpacesToEmptyLines } from "./tools/replaceSpacesToEmptyLines"; import { replaceSpacesToEmptyLines } from "./tools/replaceSpacesToEmptyLines";
const QID = const QID =
process.env.NODE_ENV === "production" ? process.env.NODE_ENV === "production"
window.location.pathname.replace(/\//g, '') ? window.location.pathname.replace(/\//g, "")
: : "ef836ff8-35b1-4031-9acf-af5766bac2b2";
"ef836ff8-35b1-4031-9acf-af5766bac2b2"
export const ViewPage = () => { export const ViewPage = () => {
const { settings, cnt, items } = useQuestionsStore() const { settings, cnt, items } = useQuestionsStore();
console.log("КВИЗ ", settings) console.log("КВИЗ ", settings);
console.log("ВОПРОСЫ ", items) console.log("ВОПРОСЫ ", items);
const [visualStartPage, setVisualStartPage] = useState<boolean>(); const [visualStartPage, setVisualStartPage] = useState<boolean>();
const [errormessage, setErrormessage] = useState<string>(""); const [errormessage, setErrormessage] = useState<string>("");
const [recentlyСompleted, setRecentlyСompleted] = useState<boolean>(false);
useEffect(() => { useEffect(() => {
async function get() { async function get() {
try { try {
let data = await getData(QID) let { data, isRecentlyCompleted, error } = await getData(QID);
console.log(data) setRecentlyСompleted(isRecentlyCompleted);
//@ts-ignore
const settings = data.settings if (error) {
return enqueueSnackbar(error);
}
//@ts-ignore
const settings = data.settings;
console.log(data)
//@ts-ignore //@ts-ignore
data.settings = { data.settings = {
//@ts-ignore //@ts-ignore
@ -52,12 +54,11 @@ export const ViewPage = () => {
lim: settings.lim, lim: settings.lim,
due: settings.due, due: settings.due,
delay: settings.delay, delay: settings.delay,
pausable: settings.pausable pausable: settings.pausable,
} };
console.log(data)
//@ts-ignore //@ts-ignore
data.items = data.items.map((item) => { data.items = data.items.map((item) => {
const content = JSON.parse(item.c) const content = JSON.parse(item.c);
return { return {
description: item.desc, description: item.desc,
id: item.id, id: item.id,
@ -65,61 +66,92 @@ export const ViewPage = () => {
required: item.req, required: item.req,
title: item.title, title: item.title,
type: item.typ, type: item.typ,
content 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)
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) { } catch (e) {
console.log("ОШИБКА", e) console.log("ОШИБКА", e);
//@ts-ignore //@ts-ignore
if (e?.response?.status === 423) setErrormessage("квиз не активирован") if (e?.response?.status === 423) setErrormessage("квиз не активирован");
} }
} }
get() get();
}, []) }, []);
let title = document.title; let title = document.title;
console.log(title); console.log(title);
useEffect(() => {//установка фавиконки useEffect(() => {
//установка фавиконки
if (Object.values(settings).length > 0) { if (Object.values(settings).length > 0) {
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;
setVisualStartPage(!settings?.cfg.noStartPage); setVisualStartPage(!settings?.cfg.noStartPage);
} }
}, [settings]); }, [settings]);
const filteredQuestions = ( const filteredQuestions = (
items.filter(({ type }) => type) as AnyTypedQuizQuestion[] items.filter(({ type }) => type) as AnyTypedQuizQuestion[]
).sort((previousItem, item) => previousItem.page - item.page); ).sort((previousItem, item) => previousItem.page - item.page);
if (errormessage) return <ApologyPage message={errormessage} />;
if (errormessage) return <ApologyPage message={errormessage} /> if (recentlyСompleted) {
if (visualStartPage === undefined) return <Skeleton sx={{ bgcolor: 'grey', width: "100vw", height: "100vh" }} variant="rectangular" />; return <ApologyPage message="Вы уже прошли этот опрос" />;
if (cnt === 0 || (cnt === 1 && items[0].type === "result")) return <ApologyPage message="Нет созданных вопросов" /> }
if (visualStartPage === undefined) {
return (
<Skeleton
sx={{ bgcolor: "grey", width: "100vw", height: "100vh" }}
variant="rectangular"
/>
);
}
if (cnt === 0 || (cnt === 1 && items[0].type === "result"))
return <ApologyPage message="Нет созданных вопросов" />;
return ( return (
<ThemeProvider theme={themesPublication?.[settings?.cfg.theme || "StandardTheme"]}> <ThemeProvider
<Box> theme={themesPublication?.[settings?.cfg.theme || "StandardTheme"]}
{ >
visualStartPage ? {recentlyСompleted ? (
<ApologyPage message="Вы уже прошли этот опрос" />
) : (
<Box>
{visualStartPage ? (
<StartPageViewPublication setVisualStartPage={setVisualStartPage} /> <StartPageViewPublication setVisualStartPage={setVisualStartPage} />
: ) : (
<Question questions={filteredQuestions} /> <Question questions={filteredQuestions} />
} )}
</Box> </Box>
)}
</ThemeProvider> </ThemeProvider>
); );
}; };