Compare commits

..

19 Commits

Author SHA1 Message Date
Aarni Halinen 28e87e2b8e add hyphens to cards if text needs breaks 2026-02-02 20:13:47 +02:00
J4DER4 5d069047c8 Edit board.json 2026-01-06 18:08:10 +00:00
J4DER4 6d239d7211 Merge branch 'board26' into 'master'
Edit board.json

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!195
2026-01-06 15:17:49 +00:00
J4DER4 6a6aafcfe5 Edit board.json 2026-01-06 15:09:54 +00:00
Justus Ojala c22bad5718 Use secure websockets for mqtt 2025-10-14 17:59:55 +03:00
Justus Ojala 4fbec0b85c Do not try to connect to MQTT if host undefined 2025-10-14 08:41:25 +03:00
Justus Ojala 81be5a1e60 Merge branch 'Coffeescale' into 'master'
Coffeescale

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!193
2025-10-13 22:02:53 +03:00
Justus Ojala 80ccf1bc66 Coffeescale 2025-10-13 22:02:53 +03:00
Justus Ojala d75c6b4756 Rename submitKey to submit_id 2025-10-13 19:38:28 +03:00
SimeonPursiainen 69c06636ab Fix link for freshmen page on the homepage 2025-10-07 11:43:41 +03:00
Justus Ojala 42ce058dc9 Update guild room custodians 2025-09-23 21:38:58 +03:00
SimeonPursiainen 67627d4d16 Clearer instructions for membership payments 2025-09-23 20:54:32 +03:00
Justus Ojala 4639397d25 Merge branch 'signup_duplicate_prevention' into 'master'
Add submission key to frontend to prevent duplicate signups

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!189
2025-09-16 21:43:15 +03:00
Justus Ojala 630c0bce05 Add submission key to frontend to prevent duplicate signups 2025-09-15 14:00:24 +03:00
Simeon Pursiainen b80942ee53 Merge branch 'New_visual' into 'master'
New visual

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!187
2025-09-11 20:45:14 +03:00
Simeon Pursiainen a27c77e16c New visual 2025-09-11 20:45:14 +03:00
Simeon Pursiainen 813479a602 Merge branch 'New_visual' into 'master'
New visual

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!186
2025-09-11 20:10:29 +03:00
Simeon Pursiainen c12d4c1e73 New visual 2025-09-11 20:10:29 +03:00
SimeonPursiainen 453d20d345 Added kyykkäsetti to rentpage 2025-09-09 19:05:15 +03:00
11 changed files with 1165 additions and 102 deletions
+1
View File
@@ -1,3 +1,4 @@
NEXT_PUBLIC_DEPLOY_ENV=local NEXT_PUBLIC_DEPLOY_ENV=local
NEXT_PUBLIC_API_URL=https://api.dev.sahkoinsinoorikilta.fi/api NEXT_PUBLIC_API_URL=https://api.dev.sahkoinsinoorikilta.fi/api
NEXT_PUBLIC_SITE_URL=https://dev.sahkoinsinoorikilta.fi NEXT_PUBLIC_SITE_URL=https://dev.sahkoinsinoorikilta.fi
NEXT_MQTT_HOST=mqtt.dev.sahkoinsinoorikilta.fi
+999 -59
View File
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -72,6 +72,7 @@
"fast-deep-equal": "^3.1.3", "fast-deep-equal": "^3.1.3",
"js-cookie": "^3.0.1", "js-cookie": "^3.0.1",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mqtt": "^5.14.1",
"next": "^13.1.6", "next": "^13.1.6",
"normalize.css": "^8.0.1", "normalize.css": "^8.0.1",
"react": "^18.2.0", "react": "^18.2.0",
@@ -89,7 +90,8 @@
"sharp": "^0.30.3", "sharp": "^0.30.3",
"shortid": "^2.2.16", "shortid": "^2.2.16",
"styled-components": "^5.3.5", "styled-components": "^5.3.5",
"swr": "^1.2.2" "swr": "^1.2.2",
"uuid": "^13.0.0"
}, },
"overrides": { "overrides": {
"react-mde": { "react-mde": {
+1
View File
@@ -43,6 +43,7 @@ const StyledCard = styled.article`
} }
h3 { h3 {
hyphens: auto;
padding: 0.5rem; padding: 0.5rem;
font-size: 1.5rem; font-size: 1.5rem;
font-weight: 300; font-weight: 300;
+2 -1
View File
@@ -1,7 +1,8 @@
import { OptionTypes } from "@components/Widgets/SignupQuestionsWidget/common"; import { OptionTypes } from "@components/Widgets/SignupQuestionsWidget/common";
export interface Signup { export interface Signup {
id?: number; id?: number; // Database id for completed signup
submit_id?: string; // Signup request idempotency key
signupForm_id: number; signupForm_id: number;
answer: string; answer: string;
} }
+18
View File
@@ -0,0 +1,18 @@
import React from "react";
import { NextPage } from "next";
import Head from "next/head";
import GuildroomPageView from "@views/GuildroomPage/GuildroomPageView";
import PageWrapper from "@views/common/PageWrapper";
const GuildroomPage: NextPage = () => (
<>
<Head>
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/kilta/guildroom`} />
</Head>
<PageWrapper>
<GuildroomPageView />
</PageWrapper>
</>
);
export default GuildroomPage;
+3
View File
@@ -13,6 +13,7 @@ import PageWrapper from "@views/common/PageWrapper";
import LoadingView from "@views/common/LoadingView"; import LoadingView from "@views/common/LoadingView";
import noop from "@utils/noop"; import noop from "@utils/noop";
import NotFoundPage from "@pages/404"; import NotFoundPage from "@pages/404";
import { v4 as uuid } from "uuid";
type InitialProps = { type InitialProps = {
initialForm: SignupForm; initialForm: SignupForm;
@@ -23,6 +24,7 @@ const FORM_URL = `${process.env.NEXT_PUBLIC_API_URL}/signupForm/`;
const SignUpPage: NextPage<InitialProps> = ({ initialForm }) => { const SignUpPage: NextPage<InitialProps> = ({ initialForm }) => {
const router = useRouter(); const router = useRouter();
const id = String(initialForm?.id ?? ""); const id = String(initialForm?.id ?? "");
const SUBMIT_ID = uuid(); // Submission key, generated on page refresh
const URL = `${FORM_URL}${id}/`; const URL = `${FORM_URL}${id}/`;
const { data: signupForm, error } = useSWR<SignupForm>(URL, (url) => axios.get(url).then((res) => res.data), { fallbackData: initialForm }); const { data: signupForm, error } = useSWR<SignupForm>(URL, (url) => axios.get(url).then((res) => res.data), { fallbackData: initialForm });
@@ -43,6 +45,7 @@ const SignUpPage: NextPage<InitialProps> = ({ initialForm }) => {
const onSubmit = async ({ formData }: ISubmitEvent<string>) => { const onSubmit = async ({ formData }: ISubmitEvent<string>) => {
const payload: Signup = { const payload: Signup = {
submit_id: SUBMIT_ID, // This is for preventing duplicate requests; NOT RELATED TO THE SIGNUP ID IN DATABASE
signupForm_id: signupForm.id, signupForm_id: signupForm.id,
answer: formData, answer: formData,
}; };
+38 -38
View File
@@ -8,10 +8,10 @@
"name_en": "Chairman of the Board", "name_en": "Chairman of the Board",
"representatives": [ "representatives": [
{ {
"name": "Emma Uusküla", "name": "Sauli Hakala",
"phone_number": null, "phone_number": null,
"email": "emma.uuskula@sahkoinsinoorikilta.fi", "email": "sauli.hakala@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Emma.jpg" "image": ""
} }
] ]
}, },
@@ -20,10 +20,10 @@
"name_en": "Vice Chair", "name_en": "Vice Chair",
"representatives": [ "representatives": [
{ {
"name": "Johannes Viirimäki", "name": "Eemeli Hintsanen",
"phone_number": null, "phone_number": null,
"email": "johannes.viirimaki@sahkoinsinoorikilta.fi", "email": "eemeli.hintsanen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Johannes.jpg" "image": ""
} }
] ]
}, },
@@ -32,10 +32,10 @@
"name_en": "Treasurer", "name_en": "Treasurer",
"representatives": [ "representatives": [
{ {
"name": "Nelli Liljasto", "name": "Nea Kanerva",
"phone_number": null, "phone_number": null,
"email": "nelli.liljasto@sahkoinsinoorikilta.fi", "email": "nea.kanerva@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Nelli.jpg" "image": ""
} }
] ]
}, },
@@ -44,10 +44,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Teemu Heikkinen", "name": "Aura Friman",
"phone_number": null, "phone_number": null,
"email": "teemu.heikkinen@sahkoinsinoorikilta.fi", "email": "aura.friman@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Teemu.jpg" "image": ""
} }
] ]
}, },
@@ -56,10 +56,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Henri Aito", "name": "Antti Salpakari",
"phone_number": null, "phone_number": null,
"email": "henri.aito@sahkoinsinoorikilta.fi", "email": "antti.salpakari@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Henri.jpg" "image": ""
} }
] ]
}, },
@@ -68,10 +68,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Tuomas Rantamäki", "name": "Aino Saarela",
"phone_number": null, "phone_number": null,
"email": "tuomas.rantamaki@sahkoinsinoorikilta.fi", "email": "aino.saarela@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/TuomasR.jpg" "image": ""
} }
] ]
}, },
@@ -80,10 +80,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Matilda Ahonen", "name": "Rosanna Reims",
"phone_number": null, "phone_number": null,
"email": "matilda.ahonen@sahkoinsinoorikilta.fi", "email": "rosanna.reims@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Matilda.jpg" "image": ""
} }
] ]
}, },
@@ -92,9 +92,9 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Niklas Ritalahti", "name": "Valentin Juhela",
"phone_number": null, "phone_number": null,
"email": "niklas.ritalahti@sahkoinsinoorikilta.fi", "email": "valentin.juhela@sahkoinsinoorikilta.fi",
"image": "" "image": ""
} }
] ]
@@ -104,10 +104,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Mikael Vatiainen", "name": "Elida Widgren",
"phone_number": null, "phone_number": null,
"email": "mikael.vatiainen@sahkoinsinoorikilta.fi", "email": "elida.widgren@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Mikael.jpg" "image": ""
} }
] ]
}, },
@@ -116,10 +116,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Simeon Pursiainen", "name": "Joona Maaranen",
"phone_number": null, "phone_number": null,
"email": "simeon.pursiainen@sahkoinsinoorikilta.fi", "email": "joona.maaranen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Simeon.jpg" "image": ""
} }
] ]
}, },
@@ -128,10 +128,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Markus Aaltio", "name": "Jere Oinonen",
"phone_number": null, "phone_number": null,
"email": "markus.aaltio@sahkoinsinoorikilta.fi", "email": "jere.oinonen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Markus.jpg" "image": ""
} }
] ]
}, },
@@ -140,10 +140,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Tuomas Hintikka", "name": "Into Saarinen",
"phone_number": null, "phone_number": null,
"email": "tuomas.hintikka@sahkoinsinoorikilta.fi", "email": "into.saarinen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/TuomasH.jpg" "image": ""
} }
] ]
}, },
@@ -152,10 +152,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Yassine Ramid", "name": "Aino Svahn",
"phone_number": null, "phone_number": null,
"email": "yassine.ramid@sahkoinsinoorikilta.fi", "email": "aino.svahn@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Yassine.jpg" "image": ""
} }
] ]
} }
+1 -1
View File
@@ -30,7 +30,7 @@ const FrontPageHero: React.FC = () => (
<HeroAsideItem <HeroAsideItem
header="Vasta-aloittaneelle opiskelijalle" header="Vasta-aloittaneelle opiskelijalle"
text="Fuksikasvatusta ja ISOtoimintaa" text="Fuksikasvatusta ja ISOtoimintaa"
link="/kilta/fuksi" link="/newStudent/fuksi"
linkText="Fuksit&nbsp; " linkText="Fuksit&nbsp; "
/> />
<HeroAsideItem <HeroAsideItem
@@ -0,0 +1,97 @@
import { useState, useEffect } from "react";
import mqtt from "mqtt";
import { TextSection } from "@components/index";
import styled from "styled-components";
const CoffeeTitle = styled.div`
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 3rem;
font-weight: bold;
`;
const Cups = styled.div`
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 7rem;
font-variant-numeric: tabular-nums;
`;
const Time = styled.div`
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 1rem;
`;
const GuildroomView = () => {
const [brewing, setBrewing] = useState<boolean>(false);
const [time, setTime] = useState<number>(0);
const [cups, setCups] = useState<number>(0);
const [client, setClient] = useState<mqtt.MqttClient | null>(null);
const [status, setStatus] = useState<boolean>(false);
useEffect(() => {
setStatus(false);
if (process.env.NEXT_PUBLIC_MQTT_HOST) {
setClient(mqtt.connect(`wss://${process.env.NEXT_PUBLIC_MQTT_HOST}`));
} else {
console.error("MQTT host undefined");
}
}, []);
useEffect(() => {
if (client) {
client.on("connect", () => {
setStatus(true);
client.subscribe("sik/kiltahuone/kahvivaaka/#", (err) => {
if (!err) {
console.log("Connected to MQTT server!");
}
});
});
client.on("error", (err) => {
console.error("Connection error: ", err);
client.end();
});
client.on("reconnect", () => {
setStatus(false);
});
client.on("offline", () => {
setStatus(false);
});
client.on("message", (topic, message) => {
if (topic === "sik/kiltahuone/kahvivaaka/cups") {
setCups(Number(message.toString()));
}
if (topic === "sik/kiltahuone/kahvivaaka/brewtime") {
setTime(Number(message.toString()));
}
if (topic === "sik/kiltahuone/kahvivaaka/brewing") {
setBrewing(Boolean(message.toString()));
}
});
}
}, [client]);
if (!status) {
return (
<CoffeeTitle style={{ margin: "10%" }}>NO MQTT CONNECTION</CoffeeTitle>
);
}
return (
<div style={{ margin: "10%" }}>
<CoffeeTitle>{brewing ? "Brewing more..." : "Cups left"}</CoffeeTitle>
<Cups>{cups}</Cups>
<Time>Brewed {time} min ago</Time>
</div>
);
};
export default GuildroomView;
@@ -15,8 +15,8 @@ const MembershipPageView: React.FC = () => (
sekä pääsyn killan tiloihin kuten kiltahuoneelle ja SIK-pajalle. sekä pääsyn killan tiloihin kuten kiltahuoneelle ja SIK-pajalle.
</p> </p>
<p> <p>
Killan varsinaiseksi jäseneksi voidaan hyväksyä kaikki killan toiminnasta kiinnostuneet AYY:n jäsenet. Killan varsinaiseksi jäseneksi voidaan hyväksyä kaikki killan toiminnasta kiinnotuneet AYY:n jäsenet.
Killan ulkojäseneksi voidaan hyväksyä jäsenmaksun maksanut henkilö, jota ei voida hyväksyä varsinaiseksi jäseneksi. Killan ulkojäseneksi voidaan hyväksyä jäsenmaksun maksanut henkilö, joita ei voida hyväksyä varsinaiseksi jäseneksi.
Killan kannatusjäseneksi voidaan hyväksyä henkilö tai yhteisö, joka haluaa tukea killan toimintaa. Killan kannatusjäseneksi voidaan hyväksyä henkilö tai yhteisö, joka haluaa tukea killan toimintaa.
</p> </p>
<p> <p>