Compare commits

..

7 Commits

Author SHA1 Message Date
Simeon Pursiainen 6494647ec9 Merge branch 'master' into 'New_visual'
# Conflicts:
#   src/components/Navigation.tsx
2025-09-11 20:37:57 +03:00
SimeonPursiainen 3e7cd87f97 Fixed mobile scrolling + 404 site not found 2025-09-11 20:34:19 +03:00
SimeonPursiainen 1f72bfbf05 Changes to page setup 2025-09-11 19:57:40 +03:00
jadera eb1348445f removed social links from navbar to footer, cleaned up navbar on mobile 2025-09-11 00:18:13 +03:00
jadera dc1d641c17 teipattu mobile menu scrollaus takas. syypää on blockscroll.tsx ja tää teippaa sen 2025-09-10 22:21:30 +03:00
jadera 45dc2ed3b8 rako poistettu navigationin dropdown hommeli 2025-09-10 22:20:28 +03:00
Justus Ojala 7c23bc5103 Moved new student stuff under new dropdown 2025-09-10 17:14:45 +03:00
43 changed files with 894 additions and 2354 deletions
-1
View File
@@ -1,4 +1,3 @@
NEXT_PUBLIC_DEPLOY_ENV=local
NEXT_PUBLIC_API_URL=https://api.dev.sahkoinsinoorikilta.fi/api
NEXT_PUBLIC_SITE_URL=https://dev.sahkoinsinoorikilta.fi
NEXT_MQTT_HOST=mqtt.dev.sahkoinsinoorikilta.fi
-6
View File
@@ -47,11 +47,5 @@ module.exports = {
"jsx-a11y/no-noninteractive-element-interactions": "off",
"jsx-a11y/no-static-element-interactions": "off",
"@typescript-eslint/default-param-last": "warn",
"object-curly-newline": "warn",
"no-mixed-spaces-and-tabs": "warn",
"no-tabs": "warn",
"react/jsx-indent": "warn",
"padded-blocks": "warn",
"spaced-comment": "warn",
},
};
@@ -1,78 +0,0 @@
---
description: "Use this agent when the user asks to set up or fix ESLint in a project, especially legacy or older projects.\n\nTrigger phrases include:\n- 'get ESLint working'\n- 'fix ESLint'\n- 'setup ESLint for this project'\n- 'enable linting locally'\n- 'ESLint not working'\n- 'get linting working on this old project'\n\nExamples:\n- User says 'get this old projects eslint working so i can lint locally' → invoke this agent to diagnose and repair ESLint setup\n- User asks 'why isn't ESLint running?' → invoke this agent to troubleshoot configuration and dependencies\n- User says 'I need to lint locally but ESLint is broken' → invoke this agent to fix the setup end-to-end"
name: eslint-setup-fixer
---
# eslint-setup-fixer instructions
You are an expert build and tooling engineer specializing in getting ESLint working in legacy and older projects. Your mission is to diagnose ESLint issues and establish a working local linting setup that the user can reliably use.
Your core responsibilities:
- Diagnose why ESLint is not working in the project
- Identify and fix configuration issues
- Ensure all dependencies are properly installed and compatible
- Verify Node.js version compatibility
- Establish a working local linting workflow
- Document any fixes applied
Methodology:
1. First, examine the current project state:
- Check if .eslintrc file exists (any format: .js, .json, .yml, .yaml)
- Look for eslintConfig in package.json
- Review package.json to see if eslint is listed as a dependency
- Check the Node.js version being used
2. Diagnose the root cause:
- Run eslint to see what error messages appear
- Check if eslint is installed (node_modules)
- Identify dependency version conflicts
- Look for missing parser or plugin dependencies
- Check for Node version incompatibilities
3. Fix the issues systematically:
- Install or update eslint if needed
- Install any missing parser or plugin dependencies
- Create or repair .eslintrc configuration if missing
- Update package.json scripts with lint commands if needed
- Handle any Node version issues (upgrade, use nvm, etc.)
4. Validate the setup:
- Successfully run eslint on the codebase
- Verify linting rules are being applied
- Test that local linting works reliably
- Confirm users can run lint commands
Common pitfalls to avoid:
- Old ESLint versions (< v6) may not work with modern Node versions
- Missing @babel/eslint-parser for projects using older Babel
- Incompatible parser versions (e.g., wrong TypeScript parser)
- Node version too old or too new for the project's dependencies
- Configuration files with syntax errors preventing parsing
- Circular dependency issues in plugin configurations
Edge cases to handle:
- Project using TypeScript: ensure typescript parser is installed
- Project with React: ensure react plugin is installed
- Project with old Node version requirements: provide upgrade guidance
- Multiple conflicting .eslintrc files: consolidate to single source of truth
- Projects with monorepo structure: handle root and package-level configs
Output format:
- Clear summary of what was broken and why
- Step-by-step list of all fixes applied
- Verification results showing linting now works
- Any warnings about compatibility or recommendations for modernization
- Command to run linting locally (e.g., `npm run lint` or `npm run eslint`)
Quality checks:
- Verify eslint command runs without errors
- Confirm linting actually processes files (not just succeeding with no output)
- Test that rules are being enforced
- Ensure the fix is reproducible for other developers
- Document any version constraints or platform-specific requirements
When to ask for clarification:
- If you're unsure whether the project uses TypeScript, React, or other special configs
- If multiple conflicting approaches exist and you need user preference
- If Node version constraints prevent a standard fix
- If the project has unusual structure that prevents standard ESLint discovery
+1 -1
View File
@@ -1,4 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npm run lint:es
npm run lint
+59 -999
View File
File diff suppressed because it is too large Load Diff
+1 -6
View File
@@ -72,7 +72,6 @@
"fast-deep-equal": "^3.1.3",
"js-cookie": "^3.0.1",
"lodash": "^4.17.21",
"mqtt": "^5.14.1",
"next": "^13.1.6",
"normalize.css": "^8.0.1",
"react": "^18.2.0",
@@ -90,11 +89,7 @@
"sharp": "^0.30.3",
"shortid": "^2.2.16",
"styled-components": "^5.3.5",
"swr": "^1.2.2",
"uuid": "^13.0.0"
},
"engines": {
"node": "16"
"swr": "^1.2.2"
},
"overrides": {
"react-mde": {
-3
View File
@@ -1,11 +1,8 @@
import axios, { AxiosInstance, AxiosRequestConfig } from "axios";
import { getAccessTokenCookie } from "@utils/auth";
const API_TIMEOUT_MS = 10000;
const axiosInstance: AxiosInstance = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_URL,
timeout: API_TIMEOUT_MS,
});
export enum APIPath {
-1
View File
@@ -43,7 +43,6 @@ const StyledCard = styled.article`
}
h3 {
hyphens: auto;
padding: 0.5rem;
font-size: 1.5rem;
font-weight: 300;
+1 -2
View File
@@ -1,8 +1,7 @@
import { OptionTypes } from "@components/Widgets/SignupQuestionsWidget/common";
export interface Signup {
id?: number; // Database id for completed signup
submit_id?: string; // Signup request idempotency key
id?: number;
signupForm_id: number;
answer: string;
}
+23 -20
View File
@@ -14,13 +14,14 @@ interface InitialProps {
const EventPage: NextPage<InitialProps> = ({ event }) => {
const router = useRouter();
const { id } = router.query;
if (router.isFallback) return <LoadingView />;
return (
<>
<Head>
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/events/${event.id}`} />
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/events/${id}`} />
</Head>
<PageWrapper>
<EventPageView event={event} />
@@ -29,34 +30,36 @@ const EventPage: NextPage<InitialProps> = ({ event }) => {
);
};
export const getStaticPaths: GetStaticPaths = async () => ({
paths: [],
fallback: "blocking",
});
export const getStaticPaths: GetStaticPaths = async () => {
const allEvents = await EventApi.getEvents();
const paths = allEvents.map((e: Event) => ({
params: {
id: String(e.id),
},
}
));
return {
paths,
fallback: true,
};
};
export const getStaticProps: GetStaticProps<InitialProps> = async ({ params }) => {
const id = Number(params?.id);
if (!id) {
return {
notFound: true,
revalidate: 10,
};
}
const { id } = params;
let notFound = false;
let event: Event;
try {
const event = await EventApi.getEvent(id);
event = await EventApi.getEvent(Number(id));
} catch (err) {
notFound = true;
}
return {
props: {
event,
},
revalidate: 10, // Required for deleting hidden pages
notFound,
};
} catch {
return {
notFound: true,
revalidate: 10,
};
}
};
export default EventPage;
+23 -19
View File
@@ -14,13 +14,14 @@ interface InitialProps {
const FeedPage: NextPage<InitialProps> = ({ post }) => {
const router = useRouter();
const { id } = router.query;
if (router.isFallback) return <LoadingView />;
return (
<>
<Head>
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/feed/${post.id}`} />
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/feed/${id}`} />
</Head>
<PageWrapper>
<FeedPageView post={post} />
@@ -29,34 +30,37 @@ const FeedPage: NextPage<InitialProps> = ({ post }) => {
);
};
export const getStaticPaths: GetStaticPaths = async () => ({
paths: [],
fallback: "blocking",
});
export const getStaticPaths: GetStaticPaths = async () => {
const feed = await FeedApi.getFeed();
const paths = feed.map((post: Post) => ({
params: {
id: String(post.id),
},
}
));
return {
paths,
fallback: true,
};
};
export const getStaticProps: GetStaticProps<InitialProps> = async ({ params }) => {
const id = Number(params?.id);
if (!id) {
return {
notFound: true,
revalidate: 10,
};
const { id } = params;
let notFound = false;
let post: Post;
try {
post = await FeedApi.getPost(Number(id));
} catch (err) {
notFound = true;
}
try {
const post = await FeedApi.getPost(id);
return {
props: {
post,
},
revalidate: 10, // Required for deleting hidden pages
notFound,
};
} catch {
return {
notFound: true,
revalidate: 10,
};
}
};
export default FeedPage;
+4 -7
View File
@@ -44,15 +44,12 @@ const InEnglishPage: NextPage<InitialProps> = ({ initialEvents, initialFeed }) =
};
export const getStaticProps: GetStaticProps<InitialProps> = async () => {
const [eventsResult, feedResult] = await Promise.allSettled([
fetcher<Event[]>(eventApi),
fetcher<Post[]>(feedApi),
]);
const initialEvents = await fetcher<Event[]>(eventApi);
const initialFeed = await fetcher<Post[]>(feedApi);
return {
props: {
initialEvents: eventsResult.status === "fulfilled" ? eventsResult.value : [],
initialFeed: feedResult.status === "fulfilled" ? feedResult.value : [],
initialEvents,
initialFeed,
},
revalidate: 10,
};
+4 -7
View File
@@ -43,15 +43,12 @@ const FrontPage: NextPage<InitialProps> = ({ initialEvents, initialFeed }) => {
};
export const getStaticProps: GetStaticProps<InitialProps> = async () => {
const [eventsResult, feedResult] = await Promise.allSettled([
fetcher<Event[]>(eventApi),
fetcher<Post[]>(feedApi),
]);
const initialEvents = fetcher<Event[]>(eventApi);
const initialFeed = fetcher<Post[]>(feedApi);
return {
props: {
initialEvents: eventsResult.status === "fulfilled" ? eventsResult.value : [],
initialFeed: feedResult.status === "fulfilled" ? feedResult.value : [],
initialEvents: await initialEvents,
initialFeed: await initialFeed,
},
revalidate: 10,
};
-18
View File
@@ -1,18 +0,0 @@
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;
+6 -7
View File
@@ -3,7 +3,9 @@ import { NextPage, GetStaticProps } from "next";
import Head from "next/head";
import useSWR from "swr";
import Event from "@models/Event";
import EventApi from "@api/eventApi";
import Post from "@models/Feed";
import FeedApi from "@api/feedApi";
import ActualPageView from "@views/ActualPage/ActualPageView";
import PageWrapper from "@views/common/PageWrapper";
import { fetcher, APIPath, API } from "@api/backend";
@@ -38,15 +40,12 @@ const ActualPage: NextPage<InitialProps> = ({ initialEvents, initialFeed }) => {
};
export const getStaticProps: GetStaticProps<InitialProps> = async () => {
const [eventsResult, feedResult] = await Promise.allSettled([
fetcher<Event[]>(eventApi),
fetcher<Post[]>(feedApi),
]);
const initialEvents = await EventApi.getEvents();
const initialFeed = await FeedApi.getFeed();
return {
props: {
initialEvents: eventsResult.status === "fulfilled" ? eventsResult.value : [],
initialFeed: feedResult.status === "fulfilled" ? feedResult.value : [],
initialEvents,
initialFeed,
},
revalidate: 10,
};
+23 -59
View File
@@ -13,7 +13,6 @@ import PageWrapper from "@views/common/PageWrapper";
import LoadingView from "@views/common/LoadingView";
import noop from "@utils/noop";
import NotFoundPage from "@pages/404";
import { v4 as uuid } from "uuid";
type InitialProps = {
initialForm: SignupForm;
@@ -23,11 +22,7 @@ const FORM_URL = `${process.env.NEXT_PUBLIC_API_URL}/signupForm/`;
const SignUpPage: NextPage<InitialProps> = ({ initialForm }) => {
const router = useRouter();
const [honeypot, setHoneypot] = useState("");
const id = String(initialForm?.id ?? "");
const SUBMIT_ID = uuid(); // Submission key, generated on page refresh
const URL = `${FORM_URL}${id}/`;
const { data: signupForm, error } = useSWR<SignupForm>(URL, (url) => axios.get(url).then((res) => res.data), { fallbackData: initialForm });
@@ -46,23 +41,10 @@ const SignUpPage: NextPage<InitialProps> = ({ initialForm }) => {
);
}
const onSubmit = async ({ formData }: ISubmitEvent<any>) => {
// for bot detection
if (honeypot !== "") {
console.log("bot cought in honeypot cought lacking");
toast.success("Sign-up submitted successfully 😎");
return;
}
const trackedForm = {
...formData,
_source: "from the webs submit",
};
const onSubmit = async ({ formData }: ISubmitEvent<string>) => {
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,
answer: trackedForm,
answer: formData,
};
try {
@@ -87,59 +69,41 @@ const SignUpPage: NextPage<InitialProps> = ({ initialForm }) => {
onChange={noop}
onSubmit={onSubmit}
/>
{/* 3. HONEYPOT INPUT FIELD */}
<div
style={
{
position: "absolute", top: "-9999px", left: "-9999px", opacity: 0,
}
}
aria-hidden="true"
>
<label htmlFor="website_url">Do not fill this out if you are human</label>
<input
id="website_url"
type="text"
name="website_url"
value={honeypot}
onChange={(e) => setHoneypot(e.target.value)}
tabIndex={-1} // Removes it from the "tab" cycle so keyboard users don't hit it
autoComplete="off"
/>
</div>
</PageWrapper>
</>
);
};
export const getStaticPaths: GetStaticPaths = async () => ({
paths: [],
fallback: "blocking",
});
export const getStaticPaths: GetStaticPaths = async () => {
const allForms = await SignupApi.getForms();
const paths = allForms.map((e: SignupForm) => ({
params: {
id: String(e.id),
},
}
));
return {
paths,
fallback: true,
};
};
export const getStaticProps: GetStaticProps<InitialProps> = async ({ params }) => {
const id = Number(params?.id);
if (!id) {
return {
notFound: true,
revalidate: 10,
};
}
const { id } = params;
let notFound = false;
let initialForm: SignupForm;
try {
const initialForm = await SignupApi.getForm(id);
initialForm = await SignupApi.getForm(Number(id));
} catch {
notFound = true;
}
return {
props: {
initialForm,
},
revalidate: 10, // Required for deleting hidden pages
notFound,
};
} catch {
return {
notFound: true,
revalidate: 10,
};
}
};
export default SignUpPage;
+2 -5
View File
@@ -30,13 +30,10 @@ const CorporatePage: NextPage<InitialProps> = ({ initialJobAds }) => {
};
export const getStaticProps: GetStaticProps<InitialProps> = async () => {
const jobAdsResult = await Promise.allSettled([
fetcher<JobAd[]>(jobAdApi),
]);
const initialJobAds = await fetcher<JobAd[]>(jobAdApi);
return {
props: {
initialJobAds: jobAdsResult[0].status === "fulfilled" ? jobAdsResult[0].value : [],
initialJobAds,
},
revalidate: 10,
};
+1 -15
View File
@@ -38,17 +38,10 @@ const Container = styled.div`
}
@media (max-width: 950px) {
width: 80vw;
width: 100vw;
}
`;
const BoardImage = styled.img`
width: 100%;
height: auto;
margin-bottom: 2rem;
border-radius: 8px;
`;
const ContactContainer = styled.div`
overflow-x: hidden;
@media (max-width: 950px) {
@@ -61,12 +54,6 @@ const CommitteeContainer: React.FC<{
children: React.ReactNode;
}> = ({ committee, children }) => (
<Container>
{committee.slug === "board" && (
<BoardImage
src="https://static.sahkoinsinoorikilta.fi/img/board/2026/Pota105_sikh26_webiin.jpg"
alt="Hallitus 2026"
/>
)}
<div>
{committee.roles.map((role) => (
role.representatives.map((representative) => (
@@ -87,7 +74,6 @@ const CommitteeContainer: React.FC<{
);
interface Committee {
slug: string;
name_fi: string;
name_en: string;
roles: Array<Role>;
+40 -40
View File
@@ -1,6 +1,6 @@
{
"slug": "board",
"name_fi": "Hallitus 2026",
"name_fi": "Hallitus 2024",
"name_en": "Board",
"roles": [
{
@@ -8,10 +8,10 @@
"name_en": "Chairman of the Board",
"representatives": [
{
"name": "Sauli Hakala",
"name": "Emma Uusküla",
"phone_number": null,
"email": "sauli.hakala@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/sauli.jpg"
"email": "emma.uuskula@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Emma.jpg"
}
]
},
@@ -20,10 +20,10 @@
"name_en": "Vice Chair",
"representatives": [
{
"name": "Eemeli Hintsanen",
"name": "Johannes Viirimäki",
"phone_number": null,
"email": "eemeli.hintsanen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/eemeli.jpg"
"email": "johannes.viirimaki@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Johannes.jpg"
}
]
},
@@ -32,10 +32,10 @@
"name_en": "Treasurer",
"representatives": [
{
"name": "Nea Kanerva",
"name": "Nelli Liljasto",
"phone_number": null,
"email": "nea.kanerva@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/nea.jpg"
"email": "nelli.liljasto@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Nelli.jpg"
}
]
},
@@ -44,10 +44,10 @@
"name_en": "",
"representatives": [
{
"name": "Aura Friman",
"name": "Teemu Heikkinen",
"phone_number": null,
"email": "aura.friman@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/aura.jpg"
"email": "teemu.heikkinen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Teemu.jpg"
}
]
},
@@ -56,10 +56,10 @@
"name_en": "",
"representatives": [
{
"name": "Antti Salpakari",
"name": "Henri Aito",
"phone_number": null,
"email": "antti.salpakari@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/antti.jpg"
"email": "henri.aito@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Henri.jpg"
}
]
},
@@ -68,10 +68,10 @@
"name_en": "",
"representatives": [
{
"name": "Aino Saarela",
"name": "Tuomas Rantamäki",
"phone_number": null,
"email": "aino.saarela@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/aino_sa.jpg"
"email": "tuomas.rantamaki@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/TuomasR.jpg"
}
]
},
@@ -80,10 +80,10 @@
"name_en": "",
"representatives": [
{
"name": "Rosanna Reims",
"name": "Matilda Ahonen",
"phone_number": null,
"email": "rosanna.reims@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/rosanna.jpg"
"email": "matilda.ahonen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Matilda.jpg"
}
]
},
@@ -92,10 +92,10 @@
"name_en": "",
"representatives": [
{
"name": "Valentin Juhela",
"name": "Niklas Ritalahti",
"phone_number": null,
"email": "valentin.juhela@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/valentin.jpg"
"email": "niklas.ritalahti@sahkoinsinoorikilta.fi",
"image": ""
}
]
},
@@ -104,10 +104,10 @@
"name_en": "",
"representatives": [
{
"name": "Elida Widgren",
"name": "Mikael Vatiainen",
"phone_number": null,
"email": "elida.widgren@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/elida.jpg"
"email": "mikael.vatiainen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Mikael.jpg"
}
]
},
@@ -116,10 +116,10 @@
"name_en": "",
"representatives": [
{
"name": "Joona Maaranen",
"name": "Simeon Pursiainen",
"phone_number": null,
"email": "joona.maaranen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/joona.jpg"
"email": "simeon.pursiainen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Simeon.jpg"
}
]
},
@@ -128,10 +128,10 @@
"name_en": "",
"representatives": [
{
"name": "Jere Oinonen",
"name": "Markus Aaltio",
"phone_number": null,
"email": "jere.oinonen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/jere.jpg"
"email": "markus.aaltio@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Markus.jpg"
}
]
},
@@ -140,10 +140,10 @@
"name_en": "",
"representatives": [
{
"name": "Into Saarinen",
"name": "Tuomas Hintikka",
"phone_number": null,
"email": "into.saarinen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/into.jpg"
"email": "tuomas.hintikka@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/TuomasH.jpg"
}
]
},
@@ -152,10 +152,10 @@
"name_en": "",
"representatives": [
{
"name": "Aino Svahn",
"name": "Yassine Ramid",
"phone_number": null,
"email": "aino.svahn@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/aino_sv.jpg"
"email": "yassine.ramid@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Yassine.jpg"
}
]
}
@@ -16,9 +16,6 @@ import YtmkJson from "./ytmk.json";
import SwtmkJson from "./swtmk.json";
import VtmkJson from "./vtmk.json";
import LtmkJson from "./ltmk.json";
import SiccJson from "./sicc.json";
import SptmkJson from "./sptmk.json";
import PotatmkJson from "./potatmk.json";
import Others from "./others.json";
const orderedCommittees = [
@@ -34,9 +31,6 @@ const orderedCommittees = [
VtmkJson,
SwtmkJson,
NtmkJson,
SiccJson,
SptmkJson,
PotatmkJson,
Others,
];
+6 -6
View File
@@ -9,7 +9,7 @@
"name_en": "",
"representatives": [
{
"name": "Aura Friman"
"name": "Teemu Heikkinen"
}
]
},
@@ -18,7 +18,7 @@
"name_en": "",
"representatives": [
{
"name": "Antti Salpakari"
"name": "Henri Aito"
}
]
},
@@ -27,10 +27,10 @@
"name_en": "International Fuksi Captain",
"representatives": [
{
"name": "Jere Oinonen"
"name": "Markus Aaltio"
},
{
"name": "Hocine Montenez"
"name": "Apollo Ailus"
}
]
},
@@ -39,7 +39,7 @@
"name_en": "Tutor Coordinator",
"representatives": [
{
"name": "Veera Lindroos"
"name": "Axel Aurola"
}
]
},
@@ -48,7 +48,7 @@
"name_en": "International Tutor Coordinator",
"representatives": [
{
"name": "Janne Yrjölä"
"name": "Igor Oinonen"
}
]
}
+10 -13
View File
@@ -9,7 +9,7 @@
"name_en": "Master of Ceremonies",
"representatives": [
{
"name": "Aino Saarela"
"name": "Tuomas Rantamäki"
}
]
},
@@ -18,7 +18,7 @@
"name_en": "Court Counsellor",
"representatives": [
{
"name": "Rosanna Reims"
"name": "Matilda Ahonen"
}
]
},
@@ -27,13 +27,16 @@
"name_en": "Hostess",
"representatives": [
{
"name": "Elina Pyylampi"
"name": "Veera Lindroos"
},
{
"name": "Elle Leivo"
"name": "Aino Saarela"
},
{
"name": "Emma Salmenaho"
"name": "Nea Kanerva"
},
{
"name": "Rosanna Reims"
}
]
},
@@ -42,16 +45,10 @@
"name_en": "Host",
"representatives": [
{
"name": "Aleksi Nuutinen"
"name": "Eemeli Hintsanen"
},
{
"name": "Juho Rosnell"
},
{
"name": "Julius Härkönen"
},
{
"name": "Joonas Hilvo"
"name": "André Palosaari"
}
]
}
+23 -25
View File
@@ -9,7 +9,7 @@
"name_en": "Master of Wellbeing",
"representatives": [
{
"name": "Valentin Juhela"
"name": "Niklas Ritalahti"
}
]
},
@@ -18,13 +18,22 @@
"name_en": "Culture Representative",
"representatives": [
{
"name": "Johannes Viirimäki"
"name": "Peter Lindahl"
},
{
"name": "Linnea Viitasalo"
"name": "Kuura Janhunen"
},
{
"name": "Matilda Ahonen"
"name": "Valentin Juhela"
},
{
"name": "Leevi Leinonen"
},
{
"name": "Milla Heino"
},
{
"name": "Hocine Montenez"
}
]
},
@@ -33,13 +42,10 @@
"name_en": "Sports Representative",
"representatives": [
{
"name": "Aino Salmi"
"name": "Matias Hendolin"
},
{
"name": "Eeda Alasaari"
},
{
"name": "Iiris Kuulusa"
"name": "Sauli Hakala"
}
]
},
@@ -48,10 +54,10 @@
"name_en": "Guild Room Representative",
"representatives": [
{
"name": "Milja Kuusela"
"name": "Justus Ojala"
},
{
"name": "Tuomas Rantamäki"
"name": "Aaro Rasilainen"
}
]
},
@@ -60,17 +66,15 @@
"name_en": "",
"representatives": [
{
"name": "Arvi Virkkunen"
"name": "Tommi Sytelä"
},
{
"name": "Auli Purolinna"
"name": "Konsta Hakala"
},
{
"name": "Ville Lairila"
},
{
"name": "Tiitus Koski"
}
]
},
{
@@ -78,22 +82,16 @@
"name_en": "",
"representatives": [
{
"name": "Teemu Heikkinen"
"name": "Saara Rossi"
},
{
"name": "Aaron Löfgren"
},
{
"name": "Matilda Ahonen"
}
]
"name": "Milla Heino"
},
{
"name_fi": "Kiltamuori",
"name_en": "",
"representatives": [
{
"name": "Markus Aaltio"
"name": "Sauli Hakala"
}
]
}
+12 -15
View File
@@ -9,7 +9,7 @@
"name_en": "",
"representatives": [
{
"name": "Aino Salmi"
"name": "Leevi Oikarinen"
}
]
},
@@ -18,16 +18,19 @@
"name_en": "",
"representatives": [
{
"name": "Alex Hyytinen"
"name": "Aino Salmi"
},
{
"name": "Ilmari Reponen"
},
{
"name": "Iiris Kuulusa"
"name": "Jenni Marttinen"
},
{
"name": "Samuel Södervall"
"name": "Peter Lindahl"
},
{
"name": "Patrik Varteva"
},
{
"name": "Tapio Immonen"
@@ -39,25 +42,19 @@
"name_en": "",
"representatives": [
{
"name": "Aapo Palojärvi"
"name": "Alex Hyytinen"
},
{
"name": "André Palosaari"
"name": "Antti Salpakari"
},
{
"name": "Kaisa Lehtimäki"
"name": "Iiris Kuulusa"
},
{
"name": "Olav Hamel"
"name": "Roman Shalamov"
},
{
"name": "Otto Tuominen"
},
{
"name": "Panu Leinonen"
},
{
"name": "Terhi Lukkari"
"name": "Samuel Södervall"
}
]
}
+27 -33
View File
@@ -9,7 +9,7 @@
"name_en": "Editor in Chief",
"representatives": [
{
"name": "Joona Komonen",
"name": "Topi Manskinen",
"phone_number": null,
"email": null,
"image": null
@@ -21,7 +21,7 @@
"name_en": "",
"representatives": [
{
"name": "Topi Manskinen",
"name": "Visa Kurvi",
"phone_number": null,
"email": null,
"image": null
@@ -33,34 +33,31 @@
"name_en": "Journalist",
"representatives": [
{
"name": "Aake Laukkanen"
"name": "Joona Komonen"
},
{
"name": "Alex Hyytinen"
},
{
"name": "Apollo Ailus"
},
{
"name": "Eetu Tossavainen"
"name": "Olli Vaismaa"
},
{
"name": "Jenni Marttinen"
},
{
"name": "Juho Laukka"
"name": "Ilmari Reponen"
},
{
"name": "Lauri Anttila"
"name": "Igor Oinonen"
},
{
"name": "Otto kievimaa"
"name": "Otto Kievimaa"
}
]
},
{
"name": "Sampo Haarala"
},
"name_fi": "Toimittaja, Taittaja",
"name_en": "",
"representatives": [
{
"name": "Venla Nikkanen"
"name": "Atte Vitie"
}
]
},
@@ -68,17 +65,8 @@
"name_fi": "Taittaja",
"name_en": "",
"representatives": [
{
"name": "Atte Vitie"
},
{
"name": "Lauri Anttila"
},
{
"name": "Otto Kievimaa"
},
{
"name": "Partrik Varteva"
}
]
},
@@ -86,23 +74,29 @@
"name_fi": "Graafikko",
"name_en": "Photographer & Graphic Artist",
"representatives": [
{
"name": "Annika Tattari"
},
{
"name": "Elian Salmimaa"
},
{
"name": "Lotta Kähönen"
}
]
},
{
"name_fi": "Heevistriimaaja",
"name_en": "Heevistreamer",
"name_fi": "Valokuvaaja",
"name_en": "Photographer",
"representatives": [
{
"name": "Veikko Räty"
},
{
"name": "Into Saarinen"
},
{
"name": "Aaro Rasilainen"
},
{
"name": "Anton Niemi"
},
{
"name": "Veera Melvasalo"
}
]
}
+52 -44
View File
@@ -5,20 +5,32 @@
"info": "N-toimikunta järjestää erinäisiä tapahtumia vanhemmille ja vanhemmanmielisille kiltalaisille, kuten sitsejä, aftereita, ulkoilutapahtumia ja mitä ikinä keksitäänkään. N-toimikunta toimii myös matalan kynnyksen välinä Sklubiin, eli alumniyhdistykseemme. N-toimikuntaan kuuluu myös killan kiltapatruunat, jotka pitävät huolta killan jatkuvuudesta.",
"roles": [
{
"name_fi": "N-toimikunnan puheenjohtaja",
"name_fi": "N-toimikunnan nestori",
"name_en": "",
"representatives": [
{
"name": "Elina Huttunen"
"name": "Karoliina Talvikangas"
}
]
},
{
"name_fi": "N-toimikunnan Varapuheenjohtaja",
"name_fi": "N-toimikunnan varanestori, Kiltapatruuna",
"name_en": "",
"representatives": [
{
"name": "Ville Lairila"
"name": "Aaron Löfgren"
}
]
},
{
"name_fi": "Sklubi-yhdyshenkilö",
"name_en": "",
"representatives": [
{
"name": "Melisa Dönmez"
},
{
"name": "Eveliina Ahonen"
}
]
},
@@ -27,61 +39,57 @@
"name_en": "",
"representatives": [
{
"name": "Aaron Löfgren"
"name": "Ville Lairila"
},
{
"name": "Visa Kurvi"
}
]
},
{
"name_fi":
"Kiltapatruuna, Nipsu",
"name_en": "",
"representatives": [
{
"name": "Mikko Sandström"
},
{
"name": "Liisa Haltia"
},
{
"name": "Elina Huttunen"
}
]
},
{
"name_fi": "Nipsu",
"name_en": "",
"representatives": [
{
"name": "Mikael Siikonen"
},
{
"name": "Axel Aurola"
},
{
"name": "Emma Uusküla"
},
{
"name": "Johannes Viirimäki"
},
{
"name": "Tuomas Rantamäki"
},
{
"name": "Yassine Ramid"
}
]
},
{
"name_fi": "N-vastaava",
"name_en": "",
"representatives": [
{
"name": "Aaron Löfgren"
},
{
"name": "Aleksi Saajakari"
},
{
"name": "Elian Salmimaa"
},
{
"name": "Johannes Viirimäki"
"name": "Elias Damski"
},
{
"name": "Karoliina Talvikangas"
"name": "Elias Lindberg"
},
{
"name": "Markus Aaltio"
},
{
"name": "Miika Helminen"
},
{
"name": "Mikael Siikonen"
},
{
"name": "Peter Lindahl"
},
{
"name": "Veikko Räty"
"name": "Eero Ketonen"
},
{
"name": "Verneri Turkki"
},
{
"name": "Akseli Heikkinen"
}
]
}
+5 -18
View File
@@ -9,7 +9,7 @@
"name_en": "Master of Studies",
"representatives": [
{
"name": "Elida Widgren"
"name": "Mikael Vatiainen"
}
]
},
@@ -18,36 +18,23 @@
"name_en": "Study Coordinator",
"representatives": [
{
"name": "Aapo Tynninen"
},
{
"name": "Aleksi Liukkonen"
"name": "Atu Vahla"
},
{
"name": "Antti Lehtonen"
},
{
"name": "Atu Vahla"
},
{
"name": "Iiris Kuulusa"
"name": "Aleksi Liukkonen"
},
{
"name": "Ilmari Reponen"
},
{
"name": "Jesper Seppäläinen"
"name": "Milla Heino"
},
{
"name": "Mikael Vatiainen"
},
{
"name": "Vi Tam"
},
{
"name": "Yassine Ramid"
"name": "Samuel Södervall"
}
]
}
]
+8 -28
View File
@@ -5,47 +5,27 @@
"info": "",
"roles": [
{
"name_fi": "Arkistovastaava",
"name_en": "",
"name_fi": "Merikapteeni",
"name_en": "Sea captain",
"representatives": [
{
"name": "Aaron Löfgren",
"name": "Ville Lairila",
"phone_number": null,
"email": null
}
]
},
{
"name_fi": "Sklubi-yhdyshenkilö",
"name_en": "",
"name_fi": "Meripojankloppi",
"name_en": "ship's boy",
"representatives": [
{
"name": "Ville Kurko",
"phone_number": null,
"email": null
}
]
},
{
"name_fi": "Teekkarikokousen kiltaedustaja",
"name_en": "",
"representatives": [
{
"name": "Aaron Löfgren",
"phone_number": null,
"email": null
}
]
},
{
"name_fi": "TEK-yhdyshenkilö",
"name_en": "",
"representatives": [
{
"name": "Visa Kurvi",
"name": "Peter Lindahl",
"phone_number": null,
"email": null
}
]
}
]
-83
View File
@@ -1,83 +0,0 @@
{
"slug": "potatmk",
"name_fi": "Potentiaalin Tasaus 105-toimikunta",
"name_en": "",
"info": "Killan vuosijuhlat",
"roles": [
{
"name_fi": "PoTa-tirehtööri",
"name_en": "",
"representatives": [
{
"name": "Axel Aurola"
},
{
"name": "Karoliina Talvikangas"
}
]
},
{
"name_fi": "Kukkohäntävastaava",
"name_en": "",
"representatives": [
{
"name": "Antti Salpakari"
},
{
"name": "Tuomas Rantamäki"
}
]
},
{
"name_fi": "Seremoniamestari",
"name_en": "",
"representatives": [
{
"name": "Henri Aito"
}
]
},
{
"name_fi": "Jatkovastaava",
"name_en": "",
"representatives": [
{
"name": "Aino Tasapuro"
},
{
"name": "Eemeli Hintsanen"
}
]
},
{
"name_fi": "Koristeluvastaava",
"name_en": "",
"representatives": [
{
"name": "Elina Huttunen"
}
]
},
{
"name_fi": "Sillisvastaava",
"name_en": "",
"representatives": [
{
"name": "Leevi Oikarinen"
},
{
"name": "Valentin Juhela"
}
]
},
{
"name_fi": "Graafikko",
"name_en": "",
"representatives": [
{
"name": "Elian Salmimaa"
}
]
}
]
}
+17 -20
View File
@@ -9,19 +9,7 @@
"name_en": "",
"representatives": [
{
"name": "Simeon Pursiainen"
}
]
},
{
"name_fi": "Pajavastaava",
"name_en": "",
"representatives": [
{
"name": "Axel Söderberg"
},
{
"name": "Đình Minh Trần"
"name": "Jere Oinonen"
}
]
},
@@ -30,25 +18,34 @@
"name_en": "",
"representatives": [
{
"name": "Aapo Tynninen"
"name": "Otto Kievimaa"
},
{
"name": "Aarni Kämppi"
"name": "Đình Minh Trần"
},
{
"name": "Atte Elo"
"name": "Valentin Juhela"
},
{
"name": "Emma Uusküla"
"name": "Axel Söderberg"
},
{
"name": "Jusi Seppälä"
"name": "Auli Purolinna"
},
{
"name": "Tuomas Rantamäki"
"name": "Karl Lipping"
},
{
"name": "Vi Tam"
"name": "Petrus Asikainen"
},
{
"name": "Elmo Kankkunen"
},
{
"name": "Samu Nyman"
},
{
"name": "Hilkka Gröhn"
}
]
}
-44
View File
@@ -1,44 +0,0 @@
{
"slug": "sicc",
"name_fi": "SIK International Committee Council",
"name_en": "SIK International Committee Council",
"info": "*coming soon*",
"roles": [
{
"name_fi": "International Ambassador",
"name_en": "International Ambassador",
"representatives": [
{
"name": "Igor Oinonen"
}
]
},
{
"name_fi": "International Attaché",
"name_en": "International Attaché",
"representatives": [
{
"name": "Kuura Janhunen"
}
]
},
{
"name_fi": "International Envoy",
"name_en": "International Envoy",
"representatives": [
{
"name": "Aleksanteri Vesala"
},
{
"name": "Apollo Ailus"
},
{
"name": "Juho Aikio"
},
{
"name": "Léo Di Poi"
}
]
}
]
}
-45
View File
@@ -1,45 +0,0 @@
{
"slug": "sptmk",
"name_fi": "Sähköpäivätoimikunta",
"name_en": "",
"info": "",
"roles": [
{
"name_fi": "Sähköpäivätirehtööri",
"name_en": "",
"representatives": [
{
"name": "Aino Tasapuro"
},
{
"name": "Matilda Ahonen"
}
]
},
{
"name_fi": "Sähköpäivävastaava",
"name_en": "",
"representatives": [
{
"name": "Aapo Nyyssönen"
},
{
"name": "Aapo Saranpää"
},
{
"name": "André Palosaari"
},
{
"name": "Ilmari Reponen"
},
{
"name": "Oliver Hannula"
},
{
"name": "Teemu Heikkinen"
}
]
}
]
}
+6 -15
View File
@@ -9,7 +9,7 @@
"name_en": "Head of sales",
"representatives": [
{
"name": "Leevi Oikarinen"
"name": "Tiitus Koski"
}
]
},
@@ -18,28 +18,19 @@
"name_en": "Clerk",
"representatives": [
{
"name": "Alexandr Lemin"
"name": "Arvi Virkkunen"
},
{
"name": "Henri Aito"
"name": "Valentin Juhela"
},
{
"name": "Ossi Jalkanen"
"name": "Otto Rinne"
},
{
"name": "Tiitus Koski"
"name": "Auli Purolinna"
},
{
"name": "Veikko Räty"
}
]
},
{
"name_fi": "Kiltapäiväkerhovastaava",
"name_en": "",
"representatives": [
{
"name": "Matilda Ahonen"
"name": "Patrik Varteva"
}
]
}
+8 -5
View File
@@ -9,7 +9,7 @@
"name_en": "Master of technology",
"representatives": [
{
"name": "Joona Maaranen"
"name": "Simeon Pursiainen"
}
]
},
@@ -18,16 +18,19 @@
"name_en": "",
"representatives": [
{
"name": "Alekdsandr Lemin"
"name": "Joona Maaranen"
},
{
"name": "Atte Elo"
"name": "Aleksi Liukkonen"
},
{
"name": "Dat Tram"
"name": "Elmo Kankkunen"
},
{
"name": "Oiva Haapaniemi"
"name": "Justus Ojala"
},
{
"name": "Tommi Sytelä"
}
]
}
+24 -38
View File
@@ -9,7 +9,7 @@
"name_en": "Head of communcations",
"representatives": [
{
"name": "Aino Svahn"
"name": "Yassine Ramid"
}
]
},
@@ -18,22 +18,25 @@
"name_en": "",
"representatives": [
{
"name": "Aada Tättilä"
"name": "Aaron Löfgren"
},
{
"name": "Ada Minkkinen"
"name": "Elina Huttunen"
},
{
"name": "Aino Tasapuro"
"name": "Aura Friman"
}
]
},
{
"name": "Ira Kosunen"
"name_fi": "Somevastaava, Brändivastaava",
"name_en": "",
"representatives": [
{
"name": "Aapo Saranpää"
},
{
"name": "Lukas Iles"
},
{
"name": "Tytti Solonen"
"name": "Aino Svahn"
}
]
},
@@ -42,15 +45,23 @@
"name_en": "",
"representatives": [
{
"name": "Aapo Saranpää"
"name": "Aleksandr Lemin"
},
{
"name": "Roope Jaskari"
},
{
"name": "Sauli Hakala"
},
{
"name": "Ville Lairila"
},
{
"name": "Aapo Nyyssönen"
},
{
"name": "Kehrä Halme"
"name": "Mikko Sandström"
}
]
},
{
@@ -58,37 +69,12 @@
"name_en": "",
"representatives": [
{
"name": "Apollo Ailus"
"name": "Veera Melvasalo"
},
{
"name": "Julius Männistö"
}
]
},
{
"name_fi": "Valokuvaaja",
"name_en": "",
"representatives": [
{
"name": "Aaro Rasilainen"
},
{
"name": "Apollo Ailus"
},
{
"name": "Arvi Virkkunen"
},
{
"name": "Julius Männistö"
},
{
"name": "Lotta Kähönen"
},
{
"name": "Veikko Räty"
}
]
}
]
}
+46 -16
View File
@@ -7,15 +7,6 @@
{
"name_fi": "Yrityssuhdemestari",
"name_en": "Head of Corporate Relations",
"representatives": [
{
"name": "Into Saarinen"
}
]
},
{
"name_fi": "Yrityssuhdeguru",
"name_en": "Guru of yritysuhde",
"representatives": [
{
"name": "Tuomas Hintikka"
@@ -27,28 +18,67 @@
"name_en": "Head of Excursions",
"representatives": [
{
"name": "Roope Palo"
"name": "Aino Tasapuro"
}
]
},
{
"name_fi": "Yrityssuhde- ja excursiovastaava",
"name_fi": "Yrityssuhdevastaava",
"name_en": "Apprentice of Corporate Relations",
"representatives": [
{
"name": "Axel Aurola"
},
{
"name": "Mikael Sundell"
},
{
"name": "Kaisa Lehtimäki"
"name": "Henrik Ervasti"
},
{
"name": "Timo Kaleva"
"name": "Samuel Södervall"
},
{
"name": "Markus Määttänen"
},
{
"name": "Aura Friman"
},
{
"name": "Anton Niemi"
},
{
"name": "Iida Toivanen"
},
{
"name": "Joona Kivioja"
},
{
"name": "Jussi Seppälä"
},
{
"name": "Roope Palo"
},
{
"name": "Väinö Saarinen"
},
{
"name": "Junias Vasama"
},
{
"name": "Anton Saari"
},
{
"name": "Väinö Silvenius"
}
]
},
{
"name_fi": "Excursiovastaava",
"name_en": "",
"representatives": [
{
"name": "Into Saarinen"
},
{
"name": "Otto Rinne"
}
]
}
@@ -11,8 +11,6 @@ const TG_GROUP_CHAT_LINK = "https://t.me/+ctpg4H0-Y3hlZTY0";
const TG_NOTIFICATIONS_LINK = "https://t.me/+v30Nts-MrIMyMjNk";
const EMAIL_LINK = "ftmk@sahkoinsinoorikilta.fi";
const EMAIL_LINK_MAILTO = `mailto:${EMAIL_LINK}`;
const SIK_QR = "https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-2026-telegram.jpg";
const SIK_QR_TIEDOTUS = "https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-2026-telegram-tiedotus.jpg";
const ImageContainer = styled.div`
width: 100%;
@@ -61,7 +59,7 @@ const ForFreshmenPageView: React.FC = () => (
<ImageContainer>
<Image
src="https://static.sahkoinsinoorikilta.fi/FTMK/kipparit-26.jpg"
src="https://static.sahkoinsinoorikilta.fi/FTMK/IMG_6539.JPG"
alt="Kipparit"
layout="responsive"
width={100}
@@ -84,8 +82,8 @@ const ForFreshmenPageView: React.FC = () => (
Over time, the pieces of the puzzle will come together to form an image that reflects you, and you&apos;ll have the opportunity to shape what the final result looks like.
</p>
<p>
Orientation week is held from August 25th to 29th, 2026, but even before then, you&apos;ll have the chance to meet us, other freshmen, and the ISOs at a relaxed Pre-Start event.
The Pre-Start for the freshman year is organized on Saturday, August 16th, 2026. Find more details in the Telegram groups!
Orientation week is held from August 25th to 29th, 2025, but even before then, you&apos;ll have the chance to meet us, other freshmen, and the ISOs at a relaxed Pre-Start event.
The Pre-Start for the freshman year is organized on Saturday, August 16th, 2025. Find more details in the Telegram groups!
</p>
<h6>Teemu Heikkinen</h6>
@@ -130,12 +128,12 @@ const ForFreshmenPageView: React.FC = () => (
SIK fuksis have a group chat, which you can join by scanning the QR code below:
</p>
<QRImages
src={SIK_QR}
src="https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-2025.jpg"
/>
<p>or <Link to={TG_GROUP_CHAT_LINK} target="_blank">press me!</Link></p>
<p>Also join the notifications channel for SIK fuksis, to stay in the loop!:</p>
<QRImages
src="https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-tiedotus-2026.jpg"
src="https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-tiedotus-2025.jpg"
/>
<p>or <Link to={TG_NOTIFICATIONS_LINK} target="_blank">press me!</Link></p>
</InfoBox>
@@ -11,8 +11,6 @@ const TG_GROUP_CHAT_LINK = "https://t.me/+oNrBDLI5cXZhNDEx";
const TG_NOTIFICATIONS_LINK = "https://t.me/sikhotline2526";
const EMAIL_LINK = "ftmk@sahkoinsinoorikilta.fi";
const EMAIL_LINK_MAILTO = `mailto:${EMAIL_LINK}`;
const SIK_QR = "https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-2026-telegram.jpg";
const SIK_QR_TIEDOTUS = "https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-2026-telegram-tiedotus.jpg";
const ImageContainer = styled.div`
width: 100%;
@@ -78,7 +76,7 @@ const ForIntlPageView: React.FC = () => (
<ImageContainer>
<Image
src="https://static.sahkoinsinoorikilta.fi/FTMK/Captains2026.jpg"
src="https://static.sahkoinsinoorikilta.fi/FTMK/Captains2025.jpg"
alt="Kipparit"
layout="responsive"
width={100}
@@ -104,9 +102,9 @@ const ForIntlPageView: React.FC = () => (
having just as much fun as we are. Always remember that as a teekkari in Otaniemi, you&apos;re never alone.
</p>
<p>
Orientation week will be held from 25 to 29 August 2026, but even before that you have the
Orientation week will be held from 25 to 29 August 2025, but even before that you have the
opportunity to come and get to know us, other freshmen and ISOs at a relaxed Headstart event.
This will be held on Saturday 16 August 2026. More about that in the Telegram groups!
This will be held on Saturday 16 August 2025. More about that in the Telegram groups!
</p>
<h6>Apollo Ailus</h6>
@@ -151,12 +149,12 @@ const ForIntlPageView: React.FC = () => (
SIK fuksis have a group chat, which you can join by scanning the QR code below:
</p>
<QRImages
src={SIK_QR}
src="https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-2025.jpg"
/>
<p>or <Link to={TG_GROUP_CHAT_LINK} target="_blank">press me!</Link></p>
<p>Also join the notifications channel for SIK fuksis, to stay in the loop!:</p>
<QRImages
src={SIK_QR_TIEDOTUS}
src="https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-tiedotus-2025.jpg"
/>
<p>or <Link to={TG_NOTIFICATIONS_LINK} target="_blank">press me!</Link></p>
</InfoBox>
+5 -7
View File
@@ -11,8 +11,6 @@ const TG_GROUP_CHAT_LINK = "https://t.me/+ctpg4H0-Y3hlZTY0";
const TG_NOTIFICATIONS_LINK = "https://t.me/+v30Nts-MrIMyMjNk";
const EMAIL_LINK = "ftmk@sahkoinsinoorikilta.fi";
const EMAIL_LINK_MAILTO = `mailto:${EMAIL_LINK}`;
const SIK_QR = "https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-2026-telegram.jpg";
const SIK_QR_TIEDOTUS = "https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-2026-telegram-tiedotus.jpg";
const ImageContainer = styled.div`
width: 100%;
@@ -60,7 +58,7 @@ const FreshmenPageView: React.FC = () => (
<ImageContainer>
<Image
src="https://static.sahkoinsinoorikilta.fi/FTMK/kipparit-26.jpg"
src="https://static.sahkoinsinoorikilta.fi/FTMK/IMG_6539.JPG"
alt="Kipparit"
layout="responsive"
width={100}
@@ -82,8 +80,8 @@ const FreshmenPageView: React.FC = () => (
Ajan myötä palapelin palat muodostavat sinun näköisesi kuvan ja pääset itse vaikuttamaan siihen, miltä lopputulos näyttää.
</p>
<p>
Orientaatioviikko järjestetään 25.-29.8.2026, mutta jo ennen sitä sinulla on mahdollisuus tulla tutustumaan meihin, muihin fukseihin ja ISOihin rentoon Varaslähtöön.
Varaslähtö fuksivuoteen järjestetään lauantaina 16.8.2026. Siitä lisää Telegram-ryhmissä!
Orientaatioviikko järjestetään 25.-29.8.2025, mutta jo ennen sitä sinulla on mahdollisuus tulla tutustumaan meihin, muihin fukseihin ja ISOihin rentoon Varaslähtöön.
Varaslähtö fuksivuoteen järjestetään lauantaina 16.8.2025. Siitä lisää Telegram-ryhmissä!
</p>
<h6>Teemu Heikkinen</h6>
@@ -128,12 +126,12 @@ const FreshmenPageView: React.FC = () => (
SIK:n fukseilla on oma Telegram-ryhmä, jonne pääset liitymään tästä:
</p>
<QRImages
src={SIK_QR}
src="https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-2025.jpg"
/>
<p>tai <Link to={TG_GROUP_CHAT_LINK} target="_blank">tästä</Link></p>
<p>Liity myös samalla SIK-fuksien tiedotuskanavalle tästä:</p>
<QRImages
src={SIK_QR_TIEDOTUS}
src="https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-tiedotus-2025.jpg"
/>
<p>tai <Link to={TG_NOTIFICATIONS_LINK} target="_blank">tästä</Link></p>
</InfoBox>
+1 -1
View File
@@ -30,7 +30,7 @@ const FrontPageHero: React.FC = () => (
<HeroAsideItem
header="Vasta-aloittaneelle opiskelijalle"
text="Fuksikasvatusta ja ISOtoimintaa"
link="/newStudent/fuksi"
link="/kilta/fuksi"
linkText="Fuksit&nbsp; "
/>
<HeroAsideItem
@@ -1,97 +0,0 @@
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;
+1 -24
View File
@@ -40,8 +40,7 @@ const HonoraryPageView: React.FC = () => (
<li>Keijo Nikoskinen 20112014</li>
<li>Jussi Ryynänen 20142017</li>
<li>Ville Viikari 20172020</li>
<li>Anu Lehtovuori 20202026</li>
<li>Marko Hinkkanen 2026-</li>
<li>Anu Lehtovuori 2020</li>
</ul>
<h2>Pro SIK</h2>
<p>
@@ -92,8 +91,6 @@ const HonoraryPageView: React.FC = () => (
<li>2023 Emmaleena Ahonen</li>
<li>2024 Jonna Tammikivi</li>
<li>2025 Eveliina Ahonen</li>
<li>2026 Otto Julkunen</li>
<li>2026 Melisa Dönmez</li>
</ul>
<h2>Standaari</h2>
<p>Standaari voidaan hallituksen päätöksellä lahjoittaa killan toimintaan myönteisesti vaikuttaneille tahoille. Standaarit on numeroitu lahjoittamisjärjestyksessä.</p>
@@ -236,12 +233,6 @@ const HonoraryPageView: React.FC = () => (
<li>2025 Iikka Huttu</li>
<li>2025 Heidi Mäkitalo</li>
</ul>
<ul>
<li>2026 Aaron Löfgren</li>
<li>2025 Elina Huttunen</li>
<li>2026 Karoliina Talvikangas</li>
<li>2026 Tommi Sytelä</li>
</ul>
<h2>Hopeiset ansiomerkit</h2>
<p>Killan hallitus voi myöntää hopeisen ansiomerkin killan jäsenelle tai perustellusta syystä myös muulle henkilölle tunnustuksena erityisestä kiinnostuksesta kiltaa kohtaan sekä ansioituneesta toiminnasta killan hyväksi.</p>
<ul>
@@ -639,20 +630,6 @@ const HonoraryPageView: React.FC = () => (
<li>2024 Veikko Räty</li>
<li>2024 Visa Kurvi</li>
</ul>
<ul>
<li>2025 Alisa Ahonen</li>
<li>2025 Axel Aurola</li>
<li>2025 Axel Söderberg</li>
<li>2025 Leevi Oikarinen</li>
<li>2025 Liisa Haltia</li>
<li>2025 Mikael Siikonen</li>
<li>2025 Mikko Sandström</li>
<li>2025 Peter Lindahl</li>
<li>2025 Roope Jaskari</li>
<li>2025 Sauli Hakala</li>
<li>2025 Valentin Juhela</li>
<li>2025 Ville Lairila</li>
</ul>
</div>
</TextSection>
</>
@@ -15,23 +15,10 @@ const MembershipPageView: React.FC = () => (
sekä pääsyn killan tiloihin kuten kiltahuoneelle ja SIK-pajalle.
</p>
<p>
Killan varsinaiseksi jäseneksi voidaan hyväksyä kaikki killan toiminnasta kiinnostuneet AYY:n jäsenet.
Killan ulkojäseneksi voidaan hyväksyä jäsenmaksun maksanut henkilö, jota ei voida hyväksyä varsinaiseksi jäseneksi.
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ö, joita ei voida hyväksyä varsinaiseksi jäseneksi.
Killan kannatusjäseneksi voidaan hyväksyä henkilö tai yhteisö, joka haluaa tukea killan toimintaa.
</p>
<p>
Killan sääntöjen mukaan jäsenmaksuista määrätään seuraavasti:
<br />
</p>
<p>
<h5>8 § Jäsenmaksut</h5>
<br />
Jäsenet ovat velvollisia suorittamaan lukuvuosittain killalle jäsenmaksun.
Kunniajäsenet ovat vapautettuja jäsenmaksuista.
</p>
<p>
Jäsenmaksujen suuruudet määrää killan yleinen kokous.
</p>
<h6 id="jasenmaksu">Jäsenmaksu</h6>
<p>
@@ -49,11 +36,6 @@ const MembershipPageView: React.FC = () => (
Jäsenrekisterin tietosuojaseloste
</Link>
</p>
<p>
<Link to="https://static.sahkoinsinoorikilta.fi/saannot/killansaannot.pdf">
Killan säännöt
</Link>
</p>
</div>
</TextSection>
</>