mirror of
https://github.com/IRBorisov/ConceptPortal.git
synced 2025-06-26 13:00:39 +03:00
Embed youtube video
This commit is contained in:
parent
5fda409929
commit
7da327c131
31
rsconcept/frontend/src/components/Common/EmbedYoutube.tsx
Normal file
31
rsconcept/frontend/src/components/Common/EmbedYoutube.tsx
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
interface EmbedYoutubeProps {
|
||||||
|
videoID: string
|
||||||
|
pxHeight: number
|
||||||
|
pxWidth?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
function EmbedYoutube({ videoID, pxHeight, pxWidth }: EmbedYoutubeProps) {
|
||||||
|
if (!pxWidth) {
|
||||||
|
pxWidth = pxHeight * 16 / 9;
|
||||||
|
console.log(pxWidth);
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className='relative'
|
||||||
|
style={{height: 0, paddingBottom: `${pxHeight}px`, paddingLeft: `${pxWidth}px`}}
|
||||||
|
>
|
||||||
|
<iframe
|
||||||
|
className='absolute top-0 left-0 clr-border'
|
||||||
|
style={{minHeight: `${pxHeight}px`, minWidth: `${pxWidth}px`}}
|
||||||
|
width={`${pxWidth}px`}
|
||||||
|
height={`${pxHeight}px`}
|
||||||
|
src={`https://www.youtube.com/embed/${videoID}`}
|
||||||
|
allow='accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture'
|
||||||
|
allowFullScreen
|
||||||
|
title='Встроенное видео Youtube'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default EmbedYoutube;
|
|
@ -1,16 +1,40 @@
|
||||||
import { urls } from '../../utils/constants';
|
import { useMemo } from 'react';
|
||||||
|
|
||||||
|
import useWindowSize from '../../hooks/useWindowSize';
|
||||||
|
import { urls, youtube } from '../../utils/constants';
|
||||||
|
import EmbedYoutube from '../Common/EmbedYoutube';
|
||||||
|
|
||||||
|
const OPT_VIDEO_H = 1080
|
||||||
|
|
||||||
function HelpRSLang() {
|
function HelpRSLang() {
|
||||||
|
const windowSize = useWindowSize();
|
||||||
|
|
||||||
|
const videoHeight = useMemo(
|
||||||
|
() => {
|
||||||
|
const viewH = windowSize.height ?? 0;
|
||||||
|
const viewW = windowSize.width ?? 0;
|
||||||
|
return Math.min(OPT_VIDEO_H, viewH - 370, Math.floor((viewW - 250)*9/16));
|
||||||
|
}, [windowSize]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div className='flex flex-col w-full gap-4'>
|
||||||
<h1>Язык родов структур</h1>
|
<div>
|
||||||
<p>Формальная запись (<u>экспликация</u>) концептуальных схем осуществляется с помощью языка родов структур. Данный математический аппарат основан на аксиоматической теории множеств Цермелло-Френкеля и аппарате родов структур Н.Бурбаки.</p>
|
<h1>Язык родов структур</h1>
|
||||||
<p>Для ознакомления с основами родов структур можно использовать следующие материалы:</p>
|
<p>Формальная запись (<u>экспликация</u>) концептуальных схем осуществляется с помощью языка родов структур.</p>
|
||||||
<ul>
|
<p>Данный математический аппарат основан на аксиоматической теории множеств Цермелло-Френкеля и аппарате родов структур Н.Бурбаки.</p>
|
||||||
<li>1. <a className='underline' href={urls.intro_video}>Краткое введение в мат. аппарат</a></li>
|
<p>Для ознакомления с основами родов структур можно использовать следующие материалы:</p>
|
||||||
<li>2. <a className='underline' href={urls.full_course}>Видео лекций по мат. аппарату для 4 курса (второй семестр 2022-23 год)</a></li>
|
<ul>
|
||||||
<li>3. <a className='underline' href={urls.ponomarev}>Учебник И. Н. Пономарева</a></li>
|
<li>1. <a className='underline' href={urls.intro_video}>Краткое введение в мат. аппарат</a></li>
|
||||||
</ul>
|
<li>2. <a className='underline' href={urls.full_course}>Видео лекций по мат. аппарату для 4 курса (второй семестр 2022-23 год)</a></li>
|
||||||
|
<li>3. <a className='underline' href={urls.ponomarev}>Учебник И. Н. Пономарева</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div className='justify-center hidden w-full md:flex fleex-col'>
|
||||||
|
<EmbedYoutube
|
||||||
|
videoID={youtube.intro}
|
||||||
|
pxHeight={videoHeight}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
31
rsconcept/frontend/src/hooks/useWindowSize.ts
Normal file
31
rsconcept/frontend/src/hooks/useWindowSize.ts
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
|
function useWindowSize() {
|
||||||
|
const isClient = typeof window === "object";
|
||||||
|
|
||||||
|
function getSize() {
|
||||||
|
return {
|
||||||
|
width: isClient ? window.innerWidth : undefined,
|
||||||
|
height: isClient ? window.innerHeight : undefined
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const [windowSize, setWindowSize] = useState(getSize);
|
||||||
|
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
if (!isClient) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
function handleResize() {
|
||||||
|
setWindowSize(getSize());
|
||||||
|
}
|
||||||
|
window.addEventListener("resize", handleResize);
|
||||||
|
return () => window.removeEventListener("resize", handleResize);
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return windowSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default useWindowSize;
|
|
@ -13,6 +13,10 @@ const dev = {
|
||||||
export const config = process.env.NODE_ENV === 'production' ? prod : dev;
|
export const config = process.env.NODE_ENV === 'production' ? prod : dev;
|
||||||
export const TIMEOUT_UI_REFRESH = 100;
|
export const TIMEOUT_UI_REFRESH = 100;
|
||||||
|
|
||||||
|
export const youtube = {
|
||||||
|
intro: '0Ty9mu9sOJo'
|
||||||
|
};
|
||||||
|
|
||||||
export const urls = {
|
export const urls = {
|
||||||
concept: 'https://www.acconcept.ru/',
|
concept: 'https://www.acconcept.ru/',
|
||||||
exteor32: 'https://drive.google.com/open?id=1IHlMMwaYlAUBRSxU1RU_hXM5mFU9-oyK&usp=drive_fs',
|
exteor32: 'https://drive.google.com/open?id=1IHlMMwaYlAUBRSxU1RU_hXM5mFU9-oyK&usp=drive_fs',
|
||||||
|
|
Loading…
Reference in New Issue
Block a user