Skip to content

Commit 02bee89

Browse files
authored
Merge pull request #63 from cthit/remove-rps-from-pateter
Remove rps from pateter
2 parents 42d1f9f + be80959 commit 02bee89

File tree

4 files changed

+150
-151
lines changed

4 files changed

+150
-151
lines changed

components/Page.tsx

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,46 +5,50 @@ import PageMargins from "./PageMargins";
55
import ImageWithFallback from "./ImageWithFallback";
66

77
interface PageProps {
8-
blackout?: boolean
9-
children?: React.ReactNode
10-
unrestrictChildren?: boolean
11-
currentYear?: number
8+
blackout?: boolean;
9+
children?: React.ReactNode;
10+
ignoreMargins?: boolean;
11+
currentYear?: number;
1212
}
1313

1414
export default function Page(props: PageProps) {
15-
16-
const ctx = useContext(YearContext)
15+
const ctx = useContext(YearContext);
1716

1817
return (
1918
<>
20-
2119
{/* Background */}
2220
<div className="fixed w-screen h-screen overflow-hidden bg-black -z-50">
2321
<div className={`w-full h-full ${props.blackout ? "opacity-20" : ""}`}>
2422
<div>
25-
<ImageWithFallback src={`/bilder/${ctx.year}/landskap.jpg`} fallbacksrc={`/bilder/reserv/landskap.jpg`} layout="fill" objectFit="cover" />
23+
<ImageWithFallback
24+
src={`/bilder/${ctx.year}/landskap.jpg`}
25+
fallbacksrc={`/bilder/reserv/landskap.jpg`}
26+
layout="fill"
27+
objectFit="cover"
28+
/>
2629
</div>
2730
<div className="lg:hidden">
28-
<ImageWithFallback src={`/bilder/${ctx.year}/porträtt.jpg`} fallbacksrc={`/bilder/reserv/porträtt.jpg`} layout="fill" objectFit="cover" />
31+
<ImageWithFallback
32+
src={`/bilder/${ctx.year}/porträtt.jpg`}
33+
fallbacksrc={`/bilder/reserv/porträtt.jpg`}
34+
layout="fill"
35+
objectFit="cover"
36+
/>
2937
</div>
3038
</div>
3139
</div>
3240

3341
{/* Content */}
34-
{(props.unrestrictChildren ?? false) ? (
42+
{props.ignoreMargins ?? false ? (
3543
props.children
3644
) : (
37-
<PageMargins>
38-
{props.children}
39-
</PageMargins>
45+
<PageMargins>{props.children}</PageMargins>
4046
)}
4147

42-
4348
{/* Header */}
4449
<div className="fixed flex flex-col items-center w-screen top-0 z-50 pointer-events-none">
4550
<Header year={props.currentYear} blackout={props.blackout ?? false} />
4651
</div>
4752
</>
48-
)
49-
50-
}
53+
);
54+
}

components/PageMargins.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
interface PageMarginsProps {
2-
children?: React.ReactNode
2+
children?: React.ReactNode;
33
}
44

55
const PageMargins = (props: PageMarginsProps) => {
@@ -9,7 +9,7 @@ const PageMargins = (props: PageMarginsProps) => {
99
{props.children}
1010
</div>
1111
</div>
12-
)
13-
}
12+
);
13+
};
1414

15-
export default PageMargins
15+
export default PageMargins;

components/Precursor.tsx

Lines changed: 46 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,46 +2,54 @@ import React from "react";
22
import { CommitteeWithMembers } from "../types";
33
import Button from "./Button";
44

5-
6-
75
const Precursor = ({ committee }: { committee: CommitteeWithMembers }) => {
8-
9-
return (
10-
<div className="fixed w-screen h-screen">
11-
<div className="w-full h-full flex flex-col justify-center items-center pt-24 sm:pt-12">
12-
13-
<div className="flex items-center justify-evenly flex-col h-full sm:flex-row w-10/12 sm:gap-8 sm:w-[95%]">
14-
15-
{/* Image */}
16-
<div className="sm:max-w-[55%] sm:flex sm:items-center">
17-
<img src={`/bilder/${committee.year}/kommitte.jpg`} alt={committee.year.toString()} className="max-h-[30vh] sm:max-h-[75vh]" />
18-
</div>
19-
20-
{/* Text */}
21-
<div>
22-
<h1 className="text-5xl sm:text-6xl font-theme mb-4 sm:mb-8">{"NollKIT'" + committee.year.toString().slice(2)}</h1>
23-
<p className="italic text-lg sm:text-2xl mb-2">{committee.orderInImageDesc}:</p>
24-
25-
<div className="grid gap-x-10 gap-y-2 items-center text-sm" style={ {gridTemplateColumns: "auto auto"} }>
26-
{committee.members.sort((a, b) => a.orderInImage - b.orderInImage).map( member => (
27-
<React.Fragment key={member.name}>
28-
<span>{member.name}</span>
29-
<i>{member.role}</i>
30-
</React.Fragment>
31-
))}
32-
</div>
33-
<div className="pt-6">
34-
<Button action={() => {location.href="/modul/" + committee.year + ".pdf"}}>
35-
Modul
36-
</Button>
37-
</div>
38-
</div>
39-
</div>
40-
</div>
6+
return (
7+
<div className="w-full h-screen snap-start flex flex-col justify-center items-center pt-24 sm:pt-12">
8+
<div className="flex items-center justify-evenly flex-col h-full sm:flex-row w-10/12 sm:gap-8 sm:w-[95%]">
9+
{/* Image */}
10+
<div className="sm:max-w-[55%] sm:flex sm:items-center">
11+
<img
12+
src={`/bilder/${committee.year}/kommitte.jpg`}
13+
alt={committee.year.toString()}
14+
className="max-h-[30vh] sm:max-h-[75vh]"
15+
/>
4116
</div>
42-
)
43-
}
44-
4517

18+
{/* Text */}
19+
<div>
20+
<h1 className="text-5xl sm:text-6xl font-theme mb-4 sm:mb-8">
21+
{"NollKIT'" + committee.year.toString().slice(2)}
22+
</h1>
23+
<p className="italic text-lg sm:text-2xl mb-2">
24+
{committee.orderInImageDesc}:
25+
</p>
26+
27+
<div
28+
className="grid gap-x-10 gap-y-2 items-center text-sm"
29+
style={{ gridTemplateColumns: "auto auto" }}
30+
>
31+
{committee.members
32+
.sort((a, b) => a.orderInImage - b.orderInImage)
33+
.map((member) => (
34+
<React.Fragment key={member.name}>
35+
<span>{member.name}</span>
36+
<i>{member.role}</i>
37+
</React.Fragment>
38+
))}
39+
</div>
40+
<div className="pt-6">
41+
<Button
42+
action={() => {
43+
location.href = "/modul/" + committee.year + ".pdf";
44+
}}
45+
>
46+
Modul
47+
</Button>
48+
</div>
49+
</div>
50+
</div>
51+
</div>
52+
);
53+
};
4654

4755
export default Precursor;

pages/pateter.tsx

Lines changed: 79 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1,136 +1,123 @@
1-
import { NextPage } from "next"
2-
import Precursor from "../components/Precursor"
3-
import ReactPageScroller from 'react-page-scroller';
4-
import { useEffect, useState } from "react";
1+
import { NextPage } from "next";
2+
import Precursor from "../components/Precursor";
3+
import { useState } from "react";
54
import PageInfo from "../components/PageInfo";
6-
import { Committee, PageText } from "@prisma/client";
5+
import { PageText } from "@prisma/client";
76
import Page from "../components/Page";
8-
import PageMargins from "../components/PageMargins";
97
import Button from "../components/Button";
108
import { CommitteeWithMembers } from "../types";
119
import Divider from "../components/Divider";
12-
import { prisma } from '../prisma/prismaclient';
13-
14-
const NavBall = (props: { index: number; committeeyear: string; currentPage: number; scrollTo: (to: number) => void }) => {
15-
return (
16-
<div onClick={() => { props.scrollTo(props.index) }} className="h-0 w-0 p-2.5 flex justify-end relative items-center m-px navBallBox cursor-pointer">
17-
<span className="transition-all opacity-0 navBallLabel">{props.committeeyear}</span>
18-
<span className={`navBall ${props.index === props.currentPage ? 'bg-slate-100' : ''} border visible p-1.5 border-slate-100 opacity-50 rounded-full m-2 transition-all duration-200`}></span>
19-
</div>
20-
)
21-
};
22-
10+
import { prisma } from "../prisma/prismaclient";
2311

2412
export const getServerSideProps = async () => {
25-
2613
const text = await prisma.pageText.findFirst({
2714
where: {
28-
page: "pateter"
29-
}
30-
})
15+
page: "pateter",
16+
},
17+
});
3118

3219
let allCommittees = await prisma.committee.findMany({
3320
include: {
34-
members: true
35-
}
36-
})
21+
members: true,
22+
},
23+
});
3724

3825
// Database entries are not necessarily in order, and needs to be sorted
39-
allCommittees.sort((a,b) => b.year - a.year)
26+
allCommittees.sort((a, b) => b.year - a.year);
4027
// Remove the current year from the list
41-
allCommittees.shift()
28+
allCommittees.shift();
4229

4330
return {
44-
props: { text: text, allCommittees: allCommittees }
45-
}
46-
}
31+
props: { text: text, allCommittees: allCommittees },
32+
};
33+
};
4734

4835
interface PateterProps {
49-
text: PageText
50-
allCommittees: CommitteeWithMembers[]
36+
text: PageText;
37+
allCommittees: CommitteeWithMembers[];
5138
}
5239

5340
const Pateter: NextPage<PateterProps> = ({ text, allCommittees }) => {
41+
const [showToTopButton, setShowToTopButton] = useState(false);
42+
const [showScrollDownButton, setShowScrollDownButton] = useState(true);
5443

55-
const [currentPage, setCurrentPage] = useState<number>(0)
44+
function handleScroll() {
45+
const boundary = document.querySelector("#boundary");
46+
const pateter = document.querySelector("#pateter");
5647

57-
const changeBgOpacity = (index: number) => {
58-
const fp = document.getElementById("first-page")
59-
if (!fp) return
60-
if (index === 0) {
61-
fp.style.background = "rgba(0,0,0,0.8)"
62-
} else {
63-
fp.style.background = "rgba(0,0,0,0.9)"
64-
}
65-
}
66-
const scrollTo = (index: number) => {
67-
setCurrentPage(index)
68-
}
48+
if (!boundary) return;
49+
if (!pateter) return;
6950

70-
const [topButtonShown, setTopButtonShown] = useState<boolean>(false)
51+
setShowToTopButton(boundary.getBoundingClientRect().top <= 0);
7152

72-
const toggleTopButton = (index: number) => {
73-
index === 0 ? setTopButtonShown(false) : setTopButtonShown(true)
53+
console.log(pateter.scrollTop);
54+
setShowScrollDownButton(pateter.scrollTop <= 0);
7455
}
7556

76-
const [currentYear, setCurrentYear] = useState<number>(0)
57+
function scrollToFirst() {
58+
const boundary = document.querySelector("#boundary");
7759

78-
const handlePageChange = (index: number) => {
79-
setCurrentPage(index)
80-
changeBgOpacity(index)
81-
toggleTopButton(index)
82-
index === 0 ? setCurrentYear(new Date().getFullYear()) : setCurrentYear(allCommittees[index-1].year) // kind of ugly but there's no better way?
83-
};
60+
if (!boundary) return;
8461

85-
// set currentyear to current year with useEffect
86-
useEffect(() => {
87-
setCurrentYear(new Date().getFullYear())
88-
}, [])
62+
boundary.scrollIntoView({ behavior: "smooth" });
63+
}
8964

9065
return (
9166
<>
92-
<Page blackout unrestrictChildren currentYear={currentYear}>
93-
<ReactPageScroller
94-
animationTimer={700}
95-
animationTimerBuffer={700}
96-
renderAllPagesOnFirstRender={true}
97-
onBeforePageScroll={handlePageChange}
98-
customPageNumber={currentPage}
67+
<Page blackout ignoreMargins>
68+
<div
69+
id="pateter"
70+
className="snap-y snap-mandatory flex flex-col items-center h-screen overflow-y-auto"
71+
onScroll={() => handleScroll()}
9972
>
100-
<PageMargins>
101-
<PageInfo heading="Pateter">
102-
{text.content}
103-
</PageInfo>
73+
<div className="snap-start h-full flex flex-col items-center w-10/12 lg:w-3/4 min-h-screen">
74+
<PageInfo heading="Pateter">{text.content}</PageInfo>
10475
<Divider />
105-
106-
<div className="absolute bottom-10 flex flex-col gap-4 items-center cursor-pointer py-2" onClick={() => scrollTo(1)}>
76+
<div
77+
className={`absolute bottom-10 flex flex-col gap-4 items-center cursor-pointer py-2 transition duration-700 ${
78+
showScrollDownButton
79+
? "opacity-100 pointer-events-auto"
80+
: "opacity-0 pointer-events-none"
81+
}`}
82+
onClick={() => scrollToFirst()}
83+
>
10784
<p className="text-sm italic">Skrolla för pateter</p>
108-
<img className="downarrow w-10 transition opacity-60" src={"/down.svg"} alt="arrow down" />
85+
<img
86+
className="downarrow w-10 transition opacity-60"
87+
src={"/down.svg"}
88+
alt="arrow down"
89+
/>
10990
</div>
110-
</PageMargins>
111-
112-
{allCommittees.map(committee => (
113-
<div key={committee.year}>
91+
</div>
92+
{/* used to to know whether user has scrolled far enough */}
93+
<div id="boundary"></div>{" "}
94+
{allCommittees.map((committee) => (
95+
<div key={committee.year} className="snap-start">
11496
<Precursor committee={committee} />
11597
</div>
11698
))}
117-
118-
</ReactPageScroller>
119-
120-
<div className="fixed flex flex-col items-center -right-2 lg:right-4 self-center top-1/4">
121-
<NavBall index={0} scrollTo={() => scrollTo(0)} currentPage={currentPage} committeeyear={"Till toppen"} ></NavBall>
122-
{allCommittees.map((committee: Committee, index) => (
123-
<NavBall key={index} index={index + 1} scrollTo={() => scrollTo(index + 1)} currentPage={currentPage} committeeyear={committee.year.toString().slice(-2)}></NavBall>
124-
))}
125-
</div>
126-
<div className={`fixed right-10 bottom-10 transition-opacity duration-300 ${topButtonShown ? 'opacity-100' : 'opacity-0 pointer-events-none'}`}>
127-
<Button action={() => scrollTo(0)}>
128-
Tillbaka till toppen
129-
</Button>
13099
</div>
131100
</Page>
101+
<div
102+
className={`fixed right-10 bottom-10 transition-opacity duration-300 ${
103+
showToTopButton
104+
? "opacity-100 pointer-events-auto"
105+
: "opacity-0 pointer-events-none"
106+
}`}
107+
>
108+
<Button
109+
color="bg-black/20"
110+
action={() => {
111+
document
112+
.querySelector("#pateter")
113+
?.scrollTo({ top: 0, behavior: "smooth" });
114+
}}
115+
>
116+
Tillbaka till toppen
117+
</Button>
118+
</div>
132119
</>
133-
)
134-
}
120+
);
121+
};
135122

136-
export default Pateter
123+
export default Pateter;

0 commit comments

Comments
 (0)