basic version working

pull/2/head
Michael Ochmann 3 years ago
parent 9631afa93f
commit 1b53de3bac
  1. 3
      src/ui/src/assets/css/_variables.scss
  2. 20
      src/ui/src/assets/css/_window.scss
  3. 58
      src/ui/src/components/Ation.js
  4. 48
      src/ui/src/components/KeyboardControl.js
  5. 4
      src/ui/src/components/Slide.js
  6. 41
      src/ui/src/components/SlidesList.js
  7. 8
      src/ui/src/shared/SlideContext.js

@ -2,7 +2,8 @@ $colors : (
//background : #272822, //background : #272822,
background : #1a1a1a, background : #1a1a1a,
foreground : #ddd, foreground : #ddd,
lighterBackground : #333, sidebarBackground : #333,
mainBackground : #222,
scrollbar : rgba(255,255,255,0.2) scrollbar : rgba(255,255,255,0.2)
); );

@ -1,7 +1,25 @@
.window { .window {
display: grid; display: grid;
grid-template-columns: 200px auto; grid-template-columns: 20% auto;
height: 100%; height: 100%;
width: 100%; width: 100%;
position: absolute; position: absolute;
main {
background: color(mainBackground);
overflow-y: auto;
transition: all 0.3s ease-in-out;
}
&.fullscreen {
main {
& > .slide:first-child {
position: absolute;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
}
}
}
} }

@ -1,39 +1,16 @@
import React, {useEffect, useState} from "react"; import React, {useEffect, useState} from "react";
import SlidesList from "./SlidesList"; import SlidesList from "./SlidesList";
import Modes from "../models/Modes"; import Modes from "../models/Modes";
import Slide from "./Slide"; import Slide from "./Slide";
import KeyboardControl from "./KeyboardControl";
const Ation = () => { import SlideContext from "../shared/SlideContext";
const [mode, setMode] = useState(Modes.NORMAL);
const [deck, setDeck] = useState([]);
useEffect(() => {
const keyHandler = event => {
switch (event.key) {
case "F5":
document.documentElement.requestFullscreen();
setMode(Modes.PRESENT);
break;
default:
return;
}
};
const fullscreenHandler = () => {
if (!document.fullscreenElement)
setMode(Modes.NORMAL);
};
window.addEventListener("keydown", keyHandler); const Ation = () => {
window.addEventListener("fullscreenchange", fullscreenHandler); const [mode, setMode] = useState(Modes.NORMAL);
const [deck, setDeck] = useState([]);
return () => { const [slide, setSlide] = useState(0);
window.removeEventListener("keydown", keyHandler);
window.removeEventListener("fullscreenchange", fullscreenHandler);
}
}, []);
const openFile = async () => { const openFile = async () => {
const slideDeck = await window.api.openFile(); const slideDeck = await window.api.openFile();
@ -44,13 +21,16 @@ const Ation = () => {
} }
return ( return (
<section className={`window${mode === Modes.PRESENT ? " fullscreen" : ""}`}> <SlideContext.Provider value={{slide, setSlide}}>
<SlidesList deck={deck} /> <section className={`window${mode === Modes.PRESENT ? " fullscreen" : ""}`}>
<main className="main"> <SlidesList deck={deck} />
<Slide data={deck[3] || null} /> <main className="main">
<button onClick={openFile}>open</button> <Slide data={deck[slide] || null} />
</main> <button onClick={openFile}>open</button>
</section> </main>
</section>
<KeyboardControl mode={mode} setMode={setMode} deck={deck} />
</SlideContext.Provider>
); );
}; };

@ -0,0 +1,48 @@
import {useContext, useEffect} from "react";
import SlideContext from "../shared/SlideContext";
import Modes from "../models/Modes";
const KeyboardControl = ({mode, setMode, deck}) => {
const {slide, setSlide} = useContext(SlideContext);
useEffect(() => {
const keyHandler = event => {
console.log(event.key);
switch (event.key) {
case "F5":
document.documentElement.requestFullscreen();
setMode(Modes.PRESENT);
break;
case "ArrowLeft":
if (slide <= 0)
return;
setSlide(slide - 1);
break;
case "ArrowRight":
if (slide >= deck.length -1)
return;
setSlide(slide + 1);
break;
default:
return;
}
};
const fullscreenHandler = () => {
if (!document.fullscreenElement)
setMode(Modes.NORMAL);
};
window.addEventListener("keydown", keyHandler);
window.addEventListener("fullscreenchange", fullscreenHandler);
return () => {
window.removeEventListener("keydown", keyHandler);
window.removeEventListener("fullscreenchange", fullscreenHandler);
}
}, [slide, setSlide, mode, setMode, deck]);
};
export default KeyboardControl;

@ -2,9 +2,9 @@ import React from "react";
import SlideItem from "./SlideItem"; import SlideItem from "./SlideItem";
const Slide = ({data}) => { const Slide = ({data, ...props}) => {
return ( return (
<article className="slide"> <article className="slide" {...props}>
{data?.content.map((item, index) => {data?.content.map((item, index) =>
<SlideItem item={item} key={index} /> <SlideItem item={item} key={index} />
)} )}

@ -1,13 +1,44 @@
import React from "react"; import React, {useEffect, useState, useCallback, useRef, useContext} from "react";
import Slide from "./Slide"; import Slide from "./Slide";
import SlideContext from "../shared/SlideContext";
const SlidesList = ({deck}) => { const SlidesList = ({deck}) => {
const {slide, setSlide} = useContext(SlideContext);
const container = useRef();
const [scale, setScale] = useState(1);
const sizeChange = useCallback(() => {
if (!container.current)
return;
const firstSlide = document.querySelector(".slides-list .slide");
if (!firstSlide)
return;
const slideWidth = firstSlide.clientWidth;
const parentWidth = container.current.clientWidth;
const targetWidth = parentWidth * 0.9;
setScale(targetWidth / slideWidth);
}, [container]);
useEffect(() => {
const resizeListener = () => {
sizeChange();
};
window.addEventListener("resize", resizeListener);
sizeChange();
return () => window.removeEventListener("resize", resizeListener);
}, [sizeChange, deck]);
return ( return (
<aside className="slides-list"> <aside className="slides-list" ref={container}>
{deck.map((slide, index) => ( {deck.map((slide, index) => (
<div key={index}> <div className="slide-wrap" key={index}>
<Slide data={slide} /> <Slide data={slide} style={{transform : `scale(${scale}) translateX(0)`}} onClick={() => setSlide(index)} />
</div> </div>
))} ))}
</aside> </aside>

@ -0,0 +1,8 @@
import {createContext} from "react";
const SlideContext = createContext({
slide : 0,
setSlide : () => {}
});
export default SlideContext;
Loading…
Cancel
Save