feat: uploading skeletons
This commit is contained in:
parent
9b0454eab5
commit
95ae8c6a83
@ -69,7 +69,6 @@ export default function OptionsAndPicture({
|
|||||||
|
|
||||||
setPictureUploading(true);
|
setPictureUploading(true);
|
||||||
|
|
||||||
try {
|
|
||||||
const url = await uploadQuestionImage(
|
const url = await uploadQuestionImage(
|
||||||
question.id,
|
question.id,
|
||||||
quizQid,
|
quizQid,
|
||||||
@ -88,7 +87,6 @@ export default function OptionsAndPicture({
|
|||||||
);
|
);
|
||||||
closeImageUploadModal();
|
closeImageUploadModal();
|
||||||
openCropModal(file, url);
|
openCropModal(file, url);
|
||||||
} catch {}
|
|
||||||
|
|
||||||
setPictureUploading(false);
|
setPictureUploading(false);
|
||||||
};
|
};
|
||||||
|
@ -63,7 +63,6 @@ export default function OptionsPicture({
|
|||||||
|
|
||||||
setPictureUploading(true);
|
setPictureUploading(true);
|
||||||
|
|
||||||
try {
|
|
||||||
const url = await uploadQuestionImage(
|
const url = await uploadQuestionImage(
|
||||||
question.id,
|
question.id,
|
||||||
quizQid,
|
quizQid,
|
||||||
@ -83,7 +82,6 @@ export default function OptionsPicture({
|
|||||||
|
|
||||||
closeImageUploadModal();
|
closeImageUploadModal();
|
||||||
openCropModal(file, url);
|
openCropModal(file, url);
|
||||||
} catch {}
|
|
||||||
|
|
||||||
setPictureUploading(false);
|
setPictureUploading(false);
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
|
import { useState } from "react";
|
||||||
import { AnyTypedQuizQuestion } from "@model/questionTypes/shared";
|
import { AnyTypedQuizQuestion } from "@model/questionTypes/shared";
|
||||||
import { Box, ButtonBase, Typography, useTheme } from "@mui/material";
|
import { Box, Skeleton, Typography, useTheme } from "@mui/material";
|
||||||
import { updateQuestion, uploadQuestionImage } from "@root/questions/actions";
|
import { updateQuestion, uploadQuestionImage } from "@root/questions/actions";
|
||||||
import { useCurrentQuiz } from "@root/quizes/hooks";
|
import { useCurrentQuiz } from "@root/quizes/hooks";
|
||||||
import { CropModal, useCropModalState } from "@ui_kit/Modal/CropModal";
|
import { CropModal, useCropModalState } from "@ui_kit/Modal/CropModal";
|
||||||
@ -12,6 +13,7 @@ type UploadImageProps = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default function UploadImage({ question }: UploadImageProps) {
|
export default function UploadImage({ question }: UploadImageProps) {
|
||||||
|
const [pictureUploding, setPictureUploading] = useState<boolean>(false);
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const quiz = useCurrentQuiz();
|
const quiz = useCurrentQuiz();
|
||||||
|
|
||||||
@ -29,29 +31,50 @@ export default function UploadImage({ question }: UploadImageProps) {
|
|||||||
>
|
>
|
||||||
Загрузить изображение
|
Загрузить изображение
|
||||||
</Typography>
|
</Typography>
|
||||||
|
{pictureUploding ? (
|
||||||
|
<Skeleton variant="rounded" sx={{ height: "120px", width: "300px" }} />
|
||||||
|
) : (
|
||||||
<DropZone
|
<DropZone
|
||||||
text={"5 MB максимум"}
|
text={"5 MB максимум"}
|
||||||
heightImg={"110px"}
|
|
||||||
sx={{ maxWidth: "300px", width: "100%" }}
|
sx={{ maxWidth: "300px", width: "100%" }}
|
||||||
imageUrl={question.content.back}
|
imageUrl={question.content.back}
|
||||||
originalImageUrl={question.content.originalBack}
|
originalImageUrl={question.content.originalBack}
|
||||||
onImageUploadClick={(file) => {
|
onImageUploadClick={async (file) => {
|
||||||
uploadQuestionImage(question.id, quiz.qid, file, (question, url) => {
|
setPictureUploading(true);
|
||||||
|
|
||||||
|
await uploadQuestionImage(
|
||||||
|
question.id,
|
||||||
|
quiz.qid,
|
||||||
|
file,
|
||||||
|
(question, url) => {
|
||||||
question.content.back = url;
|
question.content.back = url;
|
||||||
question.content.originalBack = url;
|
question.content.originalBack = url;
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
setPictureUploading(false);
|
||||||
}}
|
}}
|
||||||
onDeleteClick={() => {
|
onDeleteClick={() => {
|
||||||
updateQuestion(question.id, (question) => {
|
updateQuestion(question.id, (question) => {
|
||||||
question.content.back = null;
|
question.content.back = null;
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
onImageSaveClick={(file) => {
|
onImageSaveClick={async (file) => {
|
||||||
uploadQuestionImage(question.id, quiz.qid, file, (question, url) => {
|
setPictureUploading(true);
|
||||||
|
|
||||||
|
await uploadQuestionImage(
|
||||||
|
question.id,
|
||||||
|
quiz.qid,
|
||||||
|
file,
|
||||||
|
(question, url) => {
|
||||||
question.content.back = url;
|
question.content.back = url;
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
setPictureUploading(false);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ import {
|
|||||||
Select,
|
Select,
|
||||||
Tooltip,
|
Tooltip,
|
||||||
Typography,
|
Typography,
|
||||||
|
Skeleton,
|
||||||
useMediaQuery,
|
useMediaQuery,
|
||||||
useTheme,
|
useTheme,
|
||||||
} from "@mui/material";
|
} from "@mui/material";
|
||||||
@ -75,6 +76,9 @@ export default function StartPageSettings() {
|
|||||||
const quiz = useCurrentQuiz();
|
const quiz = useCurrentQuiz();
|
||||||
const [formState, setFormState] = useState<"design" | "content">("design");
|
const [formState, setFormState] = useState<"design" | "content">("design");
|
||||||
const [mobileVersion, setMobileVersion] = useState(false);
|
const [mobileVersion, setMobileVersion] = useState(false);
|
||||||
|
const [faviconUploding, setFaviconUploading] = useState<boolean>(false);
|
||||||
|
const [backgroundUploding, setBackgroundUploading] = useState<boolean>(false);
|
||||||
|
const [logoUploding, setLogoUploading] = useState<boolean>(false);
|
||||||
|
|
||||||
if (!quiz) return null;
|
if (!quiz) return null;
|
||||||
|
|
||||||
@ -84,14 +88,20 @@ export default function StartPageSettings() {
|
|||||||
|
|
||||||
const designType = quiz?.config?.startpageType;
|
const designType = quiz?.config?.startpageType;
|
||||||
|
|
||||||
const favIconDropZoneElement = (
|
const favIconDropZoneElement = faviconUploding ? (
|
||||||
|
<Skeleton sx={{ width: "48px", height: "48px", transform: "none" }} />
|
||||||
|
) : (
|
||||||
<FaviconDropZone
|
<FaviconDropZone
|
||||||
imageUrl={quiz.config.startpage.favIcon}
|
imageUrl={quiz.config.startpage.favIcon}
|
||||||
onImageUploadClick={async (file) => {
|
onImageUploadClick={async (file) => {
|
||||||
|
setFaviconUploading(true);
|
||||||
const resizedImage = await resizeFavIcon(file);
|
const resizedImage = await resizeFavIcon(file);
|
||||||
uploadQuizImage(quiz.id, resizedImage, (quiz, url) => {
|
|
||||||
|
await uploadQuizImage(quiz.id, resizedImage, (quiz, url) => {
|
||||||
quiz.config.startpage.favIcon = url;
|
quiz.config.startpage.favIcon = url;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
setFaviconUploading(false);
|
||||||
}}
|
}}
|
||||||
onDeleteClick={() => {
|
onDeleteClick={() => {
|
||||||
updateQuiz(quiz.id, (quiz) => {
|
updateQuiz(quiz.id, (quiz) => {
|
||||||
@ -330,23 +340,39 @@ export default function StartPageSettings() {
|
|||||||
>
|
>
|
||||||
Изображение
|
Изображение
|
||||||
</Typography>
|
</Typography>
|
||||||
|
{backgroundUploding ? (
|
||||||
|
<Skeleton
|
||||||
|
sx={{
|
||||||
|
width: "300px",
|
||||||
|
height: "120px",
|
||||||
|
transform: "none",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
<DropZone
|
<DropZone
|
||||||
value={"5 MB максимум"}
|
text={"5 MB максимум"}
|
||||||
sx={{ maxWidth: "300px" }}
|
sx={{ maxWidth: "300px" }}
|
||||||
imageUrl={quiz.config.startpage.background.desktop}
|
imageUrl={quiz.config.startpage.background.desktop}
|
||||||
originalImageUrl={
|
originalImageUrl={
|
||||||
quiz.config.startpage.background.originalDesktop
|
quiz.config.startpage.background.originalDesktop
|
||||||
}
|
}
|
||||||
onImageUploadClick={(file) => {
|
onImageUploadClick={async (file) => {
|
||||||
uploadQuizImage(quiz.id, file, (quiz, url) => {
|
setBackgroundUploading(true);
|
||||||
|
await uploadQuizImage(quiz.id, file, (quiz, url) => {
|
||||||
quiz.config.startpage.background.desktop = url;
|
quiz.config.startpage.background.desktop = url;
|
||||||
quiz.config.startpage.background.originalDesktop = url;
|
quiz.config.startpage.background.originalDesktop =
|
||||||
|
url;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
setBackgroundUploading(false);
|
||||||
}}
|
}}
|
||||||
onImageSaveClick={(file) => {
|
onImageSaveClick={async (file) => {
|
||||||
uploadQuizImage(quiz.id, file, (quiz, url) => {
|
setBackgroundUploading(true);
|
||||||
|
await uploadQuizImage(quiz.id, file, (quiz, url) => {
|
||||||
quiz.config.startpage.background.desktop = url;
|
quiz.config.startpage.background.desktop = url;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
setBackgroundUploading(false);
|
||||||
}}
|
}}
|
||||||
onDeleteClick={() => {
|
onDeleteClick={() => {
|
||||||
updateQuiz(quiz.id, (quiz) => {
|
updateQuiz(quiz.id, (quiz) => {
|
||||||
@ -354,6 +380,7 @@ export default function StartPageSettings() {
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<ModalSizeImage />
|
<ModalSizeImage />
|
||||||
@ -386,6 +413,17 @@ export default function StartPageSettings() {
|
|||||||
</Tooltip>
|
</Tooltip>
|
||||||
)}
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
|
{backgroundUploding ? (
|
||||||
|
<Skeleton
|
||||||
|
sx={{
|
||||||
|
width: "48px",
|
||||||
|
height: "48px",
|
||||||
|
transform: "none",
|
||||||
|
margin: "20px 0",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
<ButtonBase
|
<ButtonBase
|
||||||
component="label"
|
component="label"
|
||||||
sx={{
|
sx={{
|
||||||
@ -398,14 +436,22 @@ export default function StartPageSettings() {
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
onChange={(event) => {
|
onChange={async (event) => {
|
||||||
|
setBackgroundUploading(true);
|
||||||
const file = event.target.files?.[0];
|
const file = event.target.files?.[0];
|
||||||
|
|
||||||
if (file) {
|
if (file) {
|
||||||
uploadQuizImage(quiz.id, file, (quiz, url) => {
|
await uploadQuizImage(
|
||||||
|
quiz.id,
|
||||||
|
file,
|
||||||
|
(quiz, url) => {
|
||||||
quiz.config.startpage.background.video = url;
|
quiz.config.startpage.background.video = url;
|
||||||
});
|
},
|
||||||
|
);
|
||||||
// setVideo(URL.createObjectURL(file));
|
// setVideo(URL.createObjectURL(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setBackgroundUploading(false);
|
||||||
}}
|
}}
|
||||||
hidden
|
hidden
|
||||||
accept=".mp4"
|
accept=".mp4"
|
||||||
@ -420,13 +466,15 @@ export default function StartPageSettings() {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</ButtonBase>
|
</ButtonBase>
|
||||||
{quiz.config.startpage.background.video ? (
|
{quiz.config.startpage.background.video && (
|
||||||
<video
|
<video
|
||||||
src={quiz.config.startpage.background.video}
|
src={quiz.config.startpage.background.video}
|
||||||
width="400"
|
width="400"
|
||||||
controls
|
controls
|
||||||
/>
|
/>
|
||||||
) : null}
|
)}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
{designType !== "centered" && (
|
{designType !== "centered" && (
|
||||||
@ -500,21 +548,36 @@ export default function StartPageSettings() {
|
|||||||
>
|
>
|
||||||
Логотип
|
Логотип
|
||||||
</Typography>
|
</Typography>
|
||||||
|
{logoUploding ? (
|
||||||
|
<Skeleton
|
||||||
|
sx={{
|
||||||
|
width: "300px",
|
||||||
|
height: "120px",
|
||||||
|
transform: "none",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
<DropZone
|
<DropZone
|
||||||
value={"5 MB максимум"}
|
text={"5 MB максимум"}
|
||||||
sx={{ maxWidth: "300px" }}
|
sx={{ maxWidth: "300px" }}
|
||||||
imageUrl={quiz.config.startpage.logo}
|
imageUrl={quiz.config.startpage.logo}
|
||||||
originalImageUrl={quiz.config.startpage.originalLogo}
|
originalImageUrl={quiz.config.startpage.originalLogo}
|
||||||
onImageUploadClick={(file) => {
|
onImageUploadClick={async (file) => {
|
||||||
uploadQuizImage(quiz.id, file, (quiz, url) => {
|
setLogoUploading(true);
|
||||||
|
await uploadQuizImage(quiz.id, file, (quiz, url) => {
|
||||||
quiz.config.startpage.logo = url;
|
quiz.config.startpage.logo = url;
|
||||||
quiz.config.startpage.originalLogo = url;
|
quiz.config.startpage.originalLogo = url;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
setLogoUploading(false);
|
||||||
}}
|
}}
|
||||||
onImageSaveClick={(file) => {
|
onImageSaveClick={async (file) => {
|
||||||
uploadQuizImage(quiz.id, file, (quiz, url) => {
|
setLogoUploading(true);
|
||||||
|
await uploadQuizImage(quiz.id, file, (quiz, url) => {
|
||||||
quiz.config.startpage.logo = url;
|
quiz.config.startpage.logo = url;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
setLogoUploading(false);
|
||||||
}}
|
}}
|
||||||
onDeleteClick={() => {
|
onDeleteClick={() => {
|
||||||
updateQuiz(quiz.id, (quiz) => {
|
updateQuiz(quiz.id, (quiz) => {
|
||||||
@ -522,6 +585,7 @@ export default function StartPageSettings() {
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<Typography
|
<Typography
|
||||||
@ -567,21 +631,36 @@ export default function StartPageSettings() {
|
|||||||
>
|
>
|
||||||
Логотип
|
Логотип
|
||||||
</Typography>
|
</Typography>
|
||||||
|
{logoUploding ? (
|
||||||
|
<Skeleton
|
||||||
|
sx={{
|
||||||
|
width: "300px",
|
||||||
|
height: "120px",
|
||||||
|
transform: "none",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
<DropZone
|
<DropZone
|
||||||
value={"5 MB максимум"}
|
text={"5 MB максимум"}
|
||||||
sx={{ maxWidth: "300px" }}
|
sx={{ maxWidth: "300px" }}
|
||||||
imageUrl={quiz.config.startpage.logo}
|
imageUrl={quiz.config.startpage.logo}
|
||||||
originalImageUrl={quiz.config.startpage.originalLogo}
|
originalImageUrl={quiz.config.startpage.originalLogo}
|
||||||
onImageUploadClick={(file) => {
|
onImageUploadClick={async (file) => {
|
||||||
uploadQuizImage(quiz.id, file, (quiz, url) => {
|
setLogoUploading(true);
|
||||||
|
await uploadQuizImage(quiz.id, file, (quiz, url) => {
|
||||||
quiz.config.startpage.logo = url;
|
quiz.config.startpage.logo = url;
|
||||||
quiz.config.startpage.originalLogo = url;
|
quiz.config.startpage.originalLogo = url;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
setLogoUploading(false);
|
||||||
}}
|
}}
|
||||||
onImageSaveClick={(file) => {
|
onImageSaveClick={async (file) => {
|
||||||
uploadQuizImage(quiz.id, file, (quiz, url) => {
|
setLogoUploading(true);
|
||||||
|
await uploadQuizImage(quiz.id, file, (quiz, url) => {
|
||||||
quiz.config.startpage.logo = url;
|
quiz.config.startpage.logo = url;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
setLogoUploading(false);
|
||||||
}}
|
}}
|
||||||
onDeleteClick={() => {
|
onDeleteClick={() => {
|
||||||
updateQuiz(quiz.id, (quiz) => {
|
updateQuiz(quiz.id, (quiz) => {
|
||||||
@ -589,6 +668,7 @@ export default function StartPageSettings() {
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<Typography
|
<Typography
|
||||||
|
@ -41,7 +41,6 @@ export const MediaSelectionAndDisplay: FC<Iprops> = ({ resultData }) => {
|
|||||||
async function handleImageUpload(file: File) {
|
async function handleImageUpload(file: File) {
|
||||||
setPictureUploading(true);
|
setPictureUploading(true);
|
||||||
|
|
||||||
try {
|
|
||||||
const url = await uploadQuestionImage(
|
const url = await uploadQuestionImage(
|
||||||
resultData.id,
|
resultData.id,
|
||||||
quizQid,
|
quizQid,
|
||||||
@ -53,7 +52,6 @@ export const MediaSelectionAndDisplay: FC<Iprops> = ({ resultData }) => {
|
|||||||
);
|
);
|
||||||
closeImageUploadModal();
|
closeImageUploadModal();
|
||||||
openCropModal(file, url);
|
openCropModal(file, url);
|
||||||
} catch {}
|
|
||||||
|
|
||||||
setPictureUploading(false);
|
setPictureUploading(false);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user