Compare commits
109 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a3ab778a84 | |||
| 4de56eef0b | |||
| b3eae06a5b | |||
| f8a711a869 | |||
| 19fbe71506 | |||
| 469f4f4da6 | |||
| cd2a58a76d | |||
| 84b2b450c6 | |||
| 7d3fd6857c | |||
| 9f44bf57f6 | |||
| 9d9211fa9c | |||
| c22bad5718 | |||
| 4fbec0b85c | |||
| 81be5a1e60 | |||
| 80ccf1bc66 | |||
| d75c6b4756 | |||
| 69c06636ab | |||
| 42ce058dc9 | |||
| 67627d4d16 | |||
| 4639397d25 | |||
| 630c0bce05 | |||
| b80942ee53 | |||
| a27c77e16c | |||
| 813479a602 | |||
| c12d4c1e73 | |||
| 453d20d345 | |||
| 7abb7dc414 | |||
| 103f2b163a | |||
| fda39d7372 | |||
| 3689dbc60c | |||
| 80a961d1f9 | |||
| db8c8ea2b9 | |||
| a854de921b | |||
| 9c8a2eb4ce | |||
| ff558534a0 | |||
| 56531b1cfc | |||
| a7c297354f | |||
| ff5da7a131 | |||
| 7412b652c1 | |||
| eb64777252 | |||
| 73869a4c15 | |||
| b6e0e5ea36 | |||
| 96a591b1c5 | |||
| 19ad40b969 | |||
| 482be66b43 | |||
| 5439ff9a56 | |||
| b7c06890fe | |||
| cdff86c0f3 | |||
| 984966f3af | |||
| fe015c3bce | |||
| a570fde9d7 | |||
| c683b2d61a | |||
| c23200401f | |||
| 827eab0531 | |||
| 1ee25d3447 | |||
| e62017691c | |||
| c116ea27cc | |||
| eb67fedde4 | |||
| 006a2dd548 | |||
| 49bb413424 | |||
| be4358b128 | |||
| db662959aa | |||
| 58b3e9594a | |||
| a120d7580d | |||
| 7b2393142f | |||
| 110ea83dc5 | |||
| d4bdeeb9ae | |||
| 2a44d99814 | |||
| 4e56f5d832 | |||
| 5ed2bfcbec | |||
| 9195bd2d59 | |||
| a50f6d2562 | |||
| ead8465673 | |||
| 749acccb07 | |||
| 5ef98ae1f5 | |||
| c449d2e1d0 | |||
| c8b846f518 | |||
| a80e92dcd4 | |||
| 95f02de0ae | |||
| b16ea3d5de | |||
| bad9ace8c8 | |||
| 1a2a870f18 | |||
| 34d8213156 | |||
| 238508f875 | |||
| 0fdc1aef3a | |||
| 71f209edde | |||
| 3181cede9b | |||
| 2579cd4763 | |||
| 63209bbf20 | |||
| 047c8656ac | |||
| e16a3bb8fc | |||
| 9b34d77c42 | |||
| a76ba2b1df | |||
| 5b59d36f76 | |||
| b381400903 | |||
| de93bb2a05 | |||
| 4a6b8093bc | |||
| d381e39f0f | |||
| acb335e010 | |||
| c630ebdb4d | |||
| 504b035b2a | |||
| 15843d8970 | |||
| d34e371d37 | |||
| e1e06f185e | |||
| a39e6fec4d | |||
| f7a65fabc0 | |||
| fbe20594dd | |||
| 7280edb99f | |||
| 613732aed2 |
@@ -1,3 +1,4 @@
|
||||
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
|
||||
@@ -5,3 +5,4 @@ node_modules
|
||||
# don't lint nyc coverage output
|
||||
coverage
|
||||
next-env.d.ts
|
||||
tests
|
||||
|
||||
+18
-9
@@ -8,7 +8,7 @@ stages:
|
||||
- deploy
|
||||
|
||||
install:
|
||||
image: node:16
|
||||
image: node:20
|
||||
stage: setup
|
||||
script:
|
||||
- npm ci
|
||||
@@ -21,35 +21,35 @@ install:
|
||||
expire_in: 1 week
|
||||
|
||||
audit:
|
||||
image: node:16
|
||||
image: node:20
|
||||
needs: ["install"]
|
||||
allow_failure: true
|
||||
allow_failure: true
|
||||
stage: audit
|
||||
script:
|
||||
- npm audit --audit-level=critical
|
||||
|
||||
es:lint:
|
||||
image: node:16
|
||||
image: node:20
|
||||
needs: ["install"]
|
||||
stage: lint
|
||||
script:
|
||||
- npm run lint:es
|
||||
|
||||
css:lint:
|
||||
image: node:16
|
||||
image: node:20
|
||||
needs: ["install"]
|
||||
stage: lint
|
||||
script:
|
||||
- npm run lint:css
|
||||
|
||||
# test:unit:
|
||||
# image: node:16
|
||||
# image: node:20
|
||||
# stage: test
|
||||
# script:
|
||||
# - npm run test:unit
|
||||
|
||||
build:
|
||||
image: node:16
|
||||
image: node:20
|
||||
needs: ["install"]
|
||||
stage: build
|
||||
script:
|
||||
@@ -67,11 +67,20 @@ build:
|
||||
- .next/cache/
|
||||
|
||||
test:e2e:
|
||||
image: circleci/node:16-browsers
|
||||
# Use a Cypress image which has Node 20 + Chrome and runs as root (solves permission issues)
|
||||
image: cypress/browsers:latest
|
||||
needs: ["install", "build"]
|
||||
stage: test
|
||||
script:
|
||||
- npm run testcafe
|
||||
# No sudo needed if running as root.
|
||||
# If permissions are still wrong, we CAN fix them because we are root.
|
||||
# But usually, being root means we can overwrite/rm the files anyway.
|
||||
|
||||
# 1. Clean install to ensure native modules match this container's environment
|
||||
- npm ci
|
||||
|
||||
# 2. Run TestCafe (using the CI script for headless mode)
|
||||
- npm run testcafe:ci
|
||||
artifacts:
|
||||
paths:
|
||||
- e2e-screenshots
|
||||
|
||||
Vendored
+2
-1
@@ -1,5 +1,6 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
import "./.next/types/routes.d.ts";
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
||||
// see https://nextjs.org/docs/pages/api-reference/config/typescript for more information.
|
||||
|
||||
+46
-21
@@ -1,29 +1,54 @@
|
||||
// web2.0-frontend/next.config.js
|
||||
const { withSentryConfig } = require("@sentry/nextjs");
|
||||
const withBundleAnalyzer = require("@next/bundle-analyzer")({
|
||||
enabled: process.env.ANALYZE === "true",
|
||||
});
|
||||
|
||||
const sentryWebpackPluginOptions = {
|
||||
// Additional config options for the Sentry Webpack plugin. Keep in mind that
|
||||
// the following options are set automatically, and overriding them is not
|
||||
// recommended:
|
||||
// release, url, org, project, authToken, configFile, stripPrefix,
|
||||
// urlPrefix, include, ignore
|
||||
|
||||
silent: true, // Suppresses all logs
|
||||
// For all available options, see:
|
||||
// https://github.com/getsentry/sentry-webpack-plugin#options.
|
||||
};
|
||||
|
||||
module.exports = withBundleAnalyzer(withSentryConfig({
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
compiler: {
|
||||
styledComponents: true,
|
||||
},
|
||||
images: {
|
||||
domains: [
|
||||
"api.sahkoinsinoorikilta.fi",
|
||||
"static.sahkoinsinoorikilta.fi",
|
||||
"api.dev.sahkoinsinoorikilta.fi",
|
||||
remotePatterns: [
|
||||
{
|
||||
protocol: "https",
|
||||
hostname: "api.sahkoinsinoorikilta.fi",
|
||||
},
|
||||
{
|
||||
protocol: "https",
|
||||
hostname: "static.sahkoinsinoorikilta.fi",
|
||||
},
|
||||
{
|
||||
protocol: "https",
|
||||
hostname: "api.dev.sahkoinsinoorikilta.fi",
|
||||
},
|
||||
],
|
||||
},
|
||||
sentry: {
|
||||
hideSourceMaps: true, // Hide source maps, see: https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/#configure-source-maps
|
||||
},
|
||||
}, sentryWebpackPluginOptions));
|
||||
// Note: The 'sentry' key is removed from here as it is no longer supported in v8
|
||||
};
|
||||
|
||||
// Sentry options are now passed as a single object in the second argument
|
||||
const sentryOptions = {
|
||||
// For all available options, see:
|
||||
// https://github.com/getsentry/sentry-webpack-plugin#options
|
||||
|
||||
// Suppresses all logs
|
||||
silent: true,
|
||||
|
||||
// Hides source maps from generated client bundles
|
||||
hideSourceMaps: true,
|
||||
|
||||
// Automatically tree-shake Sentry logger statements to reduce bundle size
|
||||
disableLogger: true,
|
||||
|
||||
// Upload a larger set of source maps for prettier stack traces (increases build time)
|
||||
widenClientFileUpload: true,
|
||||
|
||||
// (Optional) You can add org and project if not set in environment variables
|
||||
// org: "your-org-slug",
|
||||
// project: "your-project-slug",
|
||||
};
|
||||
|
||||
// Wrap the config with Sentry first, then Bundle Analyzer
|
||||
module.exports = withBundleAnalyzer(withSentryConfig(nextConfig, sentryOptions));
|
||||
|
||||
Generated
+33158
-26195
File diff suppressed because it is too large
Load Diff
+100
-97
@@ -1,100 +1,103 @@
|
||||
{
|
||||
"name": "web2.0-frontend",
|
||||
"version": "0.1.0",
|
||||
"description": "Web 2.0 Frontend. React, Typescript.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://gitlab.com/sahkoinsinoorikilta/vtmk/web2.0-frontend.git"
|
||||
},
|
||||
"keywords": [
|
||||
"react",
|
||||
"next.js",
|
||||
"typescript",
|
||||
"styled-components"
|
||||
],
|
||||
"author": "Aarni Halinen",
|
||||
"license": "MIT",
|
||||
"homepage": "https://sahkoinsinoorikilta.fi",
|
||||
"scripts": {
|
||||
"build": "next build",
|
||||
"postbuild": "next-sitemap",
|
||||
"export": "next export",
|
||||
"lint": "npm run lint:es && npm run lint:css",
|
||||
"lint:es": "next lint",
|
||||
"lint:es:fix": "next lint --fix",
|
||||
"lint:css": "stylelint \"./src/**/*.{ts,tsx}\"",
|
||||
"dev": "next dev",
|
||||
"start": "next dev",
|
||||
"start-prod": "next start --port ${SERVER_PORT:=80}",
|
||||
"serve": "next start --port 3000",
|
||||
"test:unit": "jest --coverage",
|
||||
"test": "npm run testcafe",
|
||||
"testcafe": "testcafe --config-file testcafe.json",
|
||||
"build-analyze": "ANALYZE=true npm run build",
|
||||
"prepare": "husky install"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^27.4.1",
|
||||
"@types/js-cookie": "^3.0.1",
|
||||
"@types/node": "^16.11.36",
|
||||
"@types/react": "^18.0.15",
|
||||
"@types/react-csv": "^1.1.3",
|
||||
"@types/react-dom": "^18.0.6",
|
||||
"@types/shortid": "^0.0.29",
|
||||
"@types/styled-components": "^5.1.25",
|
||||
"@typescript-eslint/eslint-plugin": "^5.18.0",
|
||||
"@typescript-eslint/parser": "^5.18.0",
|
||||
"babel-plugin-styled-components": "^2.0.7",
|
||||
"eslint": "^8.13.0",
|
||||
"eslint-config-airbnb": "^19.0.4",
|
||||
"eslint-config-airbnb-typescript": "^17.0.0",
|
||||
"eslint-config-next": "^13.1.6",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"husky": "^7.0.4",
|
||||
"jest": "^27.5.1",
|
||||
"next-sitemap": "^3.1.11",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"postcss-jsx": "^0.36.4",
|
||||
"postcss-syntax": "^0.36.2",
|
||||
"stylelint": "^14.2.0",
|
||||
"stylelint-config-recommended": "^6.0.0",
|
||||
"stylelint-config-styled-components": "^0.1.1",
|
||||
"testcafe": "^1.18.5",
|
||||
"ts-jest": "^27.1.4",
|
||||
"typescript": "^4.6.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@next/bundle-analyzer": "^12.2.3",
|
||||
"@rjsf/core": "^4.2.0",
|
||||
"@sentry/nextjs": "^7.34.0",
|
||||
"axios": "^0.26.1",
|
||||
"date-fns": "^2.28.0",
|
||||
"fast-deep-equal": "^3.1.3",
|
||||
"js-cookie": "^3.0.1",
|
||||
"lodash": "^4.17.21",
|
||||
"next": "^13.1.6",
|
||||
"normalize.css": "^8.0.1",
|
||||
"react": "^18.2.0",
|
||||
"react-csv": "^2.2.2",
|
||||
"react-dnd": "15.0.2",
|
||||
"react-dnd-html5-backend": "15.0.2",
|
||||
"react-dnd-touch-backend": "15.0.2",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-is": "^18.2.0",
|
||||
"react-markdown": "^8.0.3",
|
||||
"react-mde": "^11.5.0",
|
||||
"react-toastify": "^9.0.7",
|
||||
"rehype-raw": "^6.1.1",
|
||||
"rehype-sanitize": "^5.0.1",
|
||||
"sharp": "^0.30.3",
|
||||
"shortid": "^2.2.16",
|
||||
"styled-components": "^5.3.5",
|
||||
"swr": "^1.2.2"
|
||||
},
|
||||
"overrides": {
|
||||
"react-mde": {
|
||||
"react": "$react",
|
||||
"react-dom": "$react-dom"
|
||||
"name": "web2.0-frontend",
|
||||
"version": "0.1.0",
|
||||
"description": "Web 2.0 Frontend. React, Typescript.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://gitlab.com/sahkoinsinoorikilta/vtmk/web2.0-frontend.git"
|
||||
},
|
||||
"keywords": [
|
||||
"react",
|
||||
"next.js",
|
||||
"typescript",
|
||||
"styled-components"
|
||||
],
|
||||
"author": "Aarni Halinen",
|
||||
"license": "MIT",
|
||||
"homepage": "https://sahkoinsinoorikilta.fi",
|
||||
"scripts": {
|
||||
"build": "next build",
|
||||
"postbuild": "next-sitemap",
|
||||
"export": "next export",
|
||||
"lint": "npm run lint:es && npm run lint:css",
|
||||
"lint:es": "eslint . --ext .js,.jsx,.ts,.tsx",
|
||||
"lint:es:fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix",
|
||||
"lint:css": "stylelint \"./src/**/*.{ts,tsx}\"",
|
||||
"dev": "next dev --webpack",
|
||||
"start": "next dev --webpack",
|
||||
"start-prod": "next start --port ${SERVER_PORT:=80}",
|
||||
"serve": "next start --port 3000",
|
||||
"test:unit": "jest --coverage",
|
||||
"test": "npm run testcafe",
|
||||
"testcafe": "testcafe --config-file testcafe.json",
|
||||
"testcafe:ci": "testcafe 'chrome:headless --no-sandbox --disable-dev-shm-usage' --config-file testcafe.json",
|
||||
"build-analyze": "ANALYZE=true npm run build",
|
||||
"prepare": "husky install"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^30.0.0",
|
||||
"@types/js-cookie": "^3.0.1",
|
||||
"@types/node": "^16.11.36",
|
||||
"@types/react": "^18.0.15",
|
||||
"@types/react-csv": "^1.1.3",
|
||||
"@types/react-dom": "^18.0.6",
|
||||
"@types/shortid": "^0.0.29",
|
||||
"@types/styled-components": "^5.1.25",
|
||||
"@typescript-eslint/eslint-plugin": "^5.18.0",
|
||||
"@typescript-eslint/parser": "^5.18.0",
|
||||
"babel-plugin-styled-components": "^2.0.7",
|
||||
"eslint": "^8.57.1",
|
||||
"eslint-config-airbnb": "^19.0.4",
|
||||
"eslint-config-airbnb-typescript": "^17.0.0",
|
||||
"eslint-config-next": "^13.5.11",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"husky": "^7.0.4",
|
||||
"jest": "^30.2.0",
|
||||
"next-sitemap": "^3.1.11",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"postcss-jsx": "^0.36.4",
|
||||
"postcss-syntax": "^0.36.2",
|
||||
"stylelint": "^14.2.0",
|
||||
"stylelint-config-recommended": "^6.0.0",
|
||||
"stylelint-config-styled-components": "^0.1.1",
|
||||
"testcafe": "^3.7.2",
|
||||
"ts-jest": "^29.4.6",
|
||||
"typescript": "^5.9.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@next/bundle-analyzer": "^12.2.3",
|
||||
"@rjsf/core": "^4.2.0",
|
||||
"@sentry/nextjs": "^10.29.0",
|
||||
"axios": "^1.13.2",
|
||||
"date-fns": "^2.28.0",
|
||||
"fast-deep-equal": "^3.1.3",
|
||||
"js-cookie": "^3.0.1",
|
||||
"lodash": "^4.17.21",
|
||||
"mqtt": "^5.14.1",
|
||||
"next": "^16.0.8",
|
||||
"normalize.css": "^8.0.1",
|
||||
"react": "^18.2.0",
|
||||
"react-csv": "^2.2.2",
|
||||
"react-dnd": "15.0.2",
|
||||
"react-dnd-html5-backend": "15.0.2",
|
||||
"react-dnd-touch-backend": "15.0.2",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-is": "^18.2.0",
|
||||
"react-markdown": "^8.0.3",
|
||||
"react-mde": "^11.5.0",
|
||||
"react-toastify": "^9.0.7",
|
||||
"rehype-raw": "^6.1.1",
|
||||
"rehype-sanitize": "^5.0.1",
|
||||
"sharp": "^0.34.5",
|
||||
"shortid": "^2.2.16",
|
||||
"styled-components": "^5.3.5",
|
||||
"swr": "^1.2.2",
|
||||
"uuid": "^13.0.0"
|
||||
},
|
||||
"overrides": {
|
||||
"react-mde": {
|
||||
"react": "$react",
|
||||
"react-dom": "$react-dom"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
// This file configures the initialization of Sentry for edge features (middleware, edge routes, and so on).
|
||||
// The config you add here will be used whenever one of the edge features is loaded.
|
||||
// Note that this config is unrelated to the Vercel Edge Runtime and is also required when running locally.
|
||||
// https://docs.sentry.io/platforms/javascript/guides/nextjs/
|
||||
|
||||
import * as Sentry from "@sentry/nextjs";
|
||||
|
||||
const SENTRY_DSN = process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN;
|
||||
const ENV = process.env.NEXT_PUBLIC_DEPLOY_ENV;
|
||||
|
||||
Sentry.init({
|
||||
dsn: SENTRY_DSN,
|
||||
environment: ENV,
|
||||
// Adjust this value in production, or use tracesSampler for greater control
|
||||
// tracesSampleRate: 1.0, // Commented out as client/server configs don't have it
|
||||
// Setting this option to true will print useful information to the console while you're setting up Sentry.
|
||||
// debug: false, // Commented out as client/server configs don't have it
|
||||
});
|
||||
@@ -1,5 +1,5 @@
|
||||
import React from "react";
|
||||
import Image from "next/legacy/image";
|
||||
import Image from "next/image";
|
||||
|
||||
const Icon = "/img/add-icon.png";
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React from "react";
|
||||
import Image from "next/legacy/image";
|
||||
import Image from "next/image";
|
||||
import styled from "styled-components";
|
||||
import colors from "@theme/colors";
|
||||
import Link from "@components/Link";
|
||||
@@ -22,6 +22,7 @@ const StyledCard = styled.article`
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
color: ${colors.black};
|
||||
position: relative;
|
||||
margin: 1rem;
|
||||
text-align: center;
|
||||
|
||||
@@ -72,7 +73,7 @@ const WrappedCard: React.FC<WrappedCardProps> = ({
|
||||
}) => (
|
||||
<StyledCard {...props}>
|
||||
{image && (
|
||||
<Image src={image.src} alt={image.alt} layout="responsive" width={0} height={0} objectFit="scale-down" />
|
||||
<Image src={image.src} alt={image.alt} fill sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw" style={{ objectFit: "scale-down" }} />
|
||||
)}
|
||||
<p>{startTime}</p>
|
||||
<h3>{title}</h3>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React from "react";
|
||||
import Image from "next/legacy/image";
|
||||
import Image from "next/image";
|
||||
import styled from "styled-components";
|
||||
import colors from "@theme/colors";
|
||||
|
||||
@@ -73,8 +73,9 @@ const ContactCard: React.FC<ContactCardProps> = ({
|
||||
<Image
|
||||
src={image}
|
||||
alt={name}
|
||||
layout="fill"
|
||||
objectFit="cover"
|
||||
fill
|
||||
sizes="128px"
|
||||
style={{ objectFit: "cover" }}
|
||||
/>
|
||||
</ImageContainer>
|
||||
) : null}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import React from "react";
|
||||
import Image, { ImageProps } from "next/legacy/image";
|
||||
import Image from "next/image";
|
||||
import styled, { keyframes, Keyframes } from "styled-components";
|
||||
|
||||
interface CrossFadeImagesProps {
|
||||
width: ImageProps["width"];
|
||||
height: ImageProps["height"];
|
||||
width: number | string;
|
||||
height: number | string;
|
||||
images: string[];
|
||||
presentationTime: number;
|
||||
fadeTime: number;
|
||||
}
|
||||
|
||||
const AnimatedImage = styled(Image)<{ layout: string; $delay: number }>`
|
||||
const AnimatedImage = styled(Image) <{ $delay: number }>`
|
||||
animation-delay: ${(p) => p.$delay}s;
|
||||
`;
|
||||
|
||||
@@ -69,14 +69,15 @@ const CrossFadeImages: React.FC<CrossFadeImagesProps> = ({
|
||||
$animation={animation}
|
||||
$duration={len * SINGLE_IMAGE_TIME}
|
||||
>
|
||||
{ images.map((image, idx) => (
|
||||
{images.map((image, idx) => (
|
||||
// eslint-disable-next-line react/no-array-index-key
|
||||
<div key={idx} className={idx > 0 ? "not-first" : undefined}>
|
||||
<AnimatedImage
|
||||
src={image}
|
||||
objectFit="cover"
|
||||
width={width}
|
||||
height={height}
|
||||
alt=""
|
||||
width={width as any}
|
||||
height={height as any}
|
||||
layout="responsive"
|
||||
$delay={delays[idx]}
|
||||
/>
|
||||
|
||||
@@ -12,8 +12,8 @@ interface DropDownBoxProps {
|
||||
const Box = styled.div`
|
||||
background-color: ${colors.white};
|
||||
border: 1px solid ${colors.black};
|
||||
margin-top: 0.8rem;
|
||||
position: absolute;
|
||||
/* margin-top: 0.8rem; hides cool onhover effect but fixes a gap problem */
|
||||
left: 0;
|
||||
top: 2.5rem;
|
||||
z-index: 20;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import React from "react";
|
||||
import styled from "styled-components";
|
||||
import { Link } from "@components/index";
|
||||
import Icon, { IconType } from "@components/Icon";
|
||||
import colors from "@theme/colors";
|
||||
import breakpoints from "@theme/breakpoints";
|
||||
|
||||
@@ -28,6 +29,7 @@ const Content = styled.div`
|
||||
h4 {
|
||||
color: ${colors.lightBlue};
|
||||
padding: 1.5rem 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
a {
|
||||
@@ -67,6 +69,27 @@ const Map = styled.div`
|
||||
}
|
||||
`;
|
||||
|
||||
const SomeContainer = styled.div`
|
||||
display: flex;
|
||||
flex-flow: column nowrap;
|
||||
justify-content: space-between;
|
||||
a {
|
||||
display: flex;
|
||||
flex-flow: row nowrap;
|
||||
justify-content: center;
|
||||
margin-right: 0.5rem;
|
||||
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
|
||||
}
|
||||
svg{
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
fill: ${colors.white};
|
||||
}
|
||||
`;
|
||||
|
||||
const FooterContent: React.FC = () => (
|
||||
<Content>
|
||||
<div>
|
||||
@@ -90,6 +113,13 @@ const FooterContent: React.FC = () => (
|
||||
<Link to="https://sik.kuvat.fi">Kuvagalleria</Link>
|
||||
<Link to="https://static.sahkoinsinoorikilta.fi/logot-ja-grafiikka/">Logot ja grafiikka</Link>
|
||||
</div>
|
||||
<div>
|
||||
<SomeContainer>
|
||||
<Icon name={IconType.Facebook} link="https://www.facebook.com/AaltoYliopistonSIK/" />
|
||||
<Icon name={IconType.Instagram} link="https://www.instagram.com/sahkoinsinoorikilta/" />
|
||||
<Icon name={IconType.LinkedIn} link="https://www.linkedin.com/groups/8103057/" />
|
||||
</SomeContainer>
|
||||
</div>
|
||||
</Columns>
|
||||
</MarginSpace>
|
||||
</div>
|
||||
|
||||
@@ -26,6 +26,13 @@ const Sticky = styled.div<{ $isHidden?: boolean; $mobileMenuOpen?: boolean }>`
|
||||
transition: all 200ms ease-out;
|
||||
height: ${(p) => (p.$mobileMenuOpen ? "100vh" : "unset")};
|
||||
|
||||
/* tape to allow mobile dropdown menu scrolling */
|
||||
@media screen and (max-width: ${breakpoints.mobile}) {
|
||||
overflow-y: ${(p) => (p.$mobileMenuOpen ? "auto" : "visible")};
|
||||
overflow-x: hidden;
|
||||
-webkit-overflow-scrolling: touch; /* apparently some ios optimization for smoother scrolin' */
|
||||
}
|
||||
|
||||
${(p) => (p.$isHidden ? (`
|
||||
transition: all 200ms ease-in;
|
||||
transform: translateY(-100%);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React from "react";
|
||||
import Image from "next/legacy/image";
|
||||
import Image from "next/image";
|
||||
import styled from "styled-components";
|
||||
import { Link } from "@components/index";
|
||||
|
||||
@@ -18,8 +18,9 @@ const HeaderLogo: React.FC = () => (
|
||||
<Image
|
||||
src={TitleImage}
|
||||
alt="logo"
|
||||
layout="fill"
|
||||
objectFit="scale-down"
|
||||
fill
|
||||
sizes="200px"
|
||||
style={{ objectFit: "scale-down" }}
|
||||
/>
|
||||
</Logo>
|
||||
);
|
||||
|
||||
@@ -11,7 +11,6 @@ export const renderNavigationItems = (mobile = false): JSX.Element => (
|
||||
<NavbarDropdownLink to="/kilta" text="Kilta ›" exploded={mobile}>
|
||||
<NavbarChildLink to="/kilta/toiminta">Toiminta</NavbarChildLink>
|
||||
<NavbarChildLink to="/kilta/jasenyys">Jäsenyys</NavbarChildLink>
|
||||
<NavbarChildLink to="/kilta/fuksi">Fukseille</NavbarChildLink>
|
||||
<NavbarChildLink to="/kilta/hallitus">Hallitus</NavbarChildLink>
|
||||
<NavbarChildLink to="/kilta/toimihenkilot">Toimihenkilöt</NavbarChildLink>
|
||||
<NavbarChildLink to="/kilta/vuokraa">Vuokraa kalustoa</NavbarChildLink>
|
||||
@@ -20,6 +19,11 @@ export const renderNavigationItems = (mobile = false): JSX.Element => (
|
||||
<NavbarChildLink to="https://sik.kuvat.fi">Kuvagalleria</NavbarChildLink>
|
||||
<NavbarChildLink to="/kilta/kilta-avustus">Kilta-avustus</NavbarChildLink>
|
||||
</NavbarDropdownLink>
|
||||
<NavbarDropdownLink to="/" text="New students ›" exploded={mobile}>
|
||||
<NavbarChildLink to="/newStudent/fuksi">Fukseille</NavbarChildLink>
|
||||
<NavbarChildLink to="/newStudent/fukseille_en">For Freshmen</NavbarChildLink>
|
||||
<NavbarChildLink to="/newStudent/forExchangers">For Exchange/MSc students</NavbarChildLink>
|
||||
</NavbarDropdownLink>
|
||||
<NavbarDropdownLink to="/opinnot_ja_ura" text="Opinnot ja ura" exploded={mobile} />
|
||||
<NavbarDropdownLink to="/yritysyhteistyo" text="Yritysyhteistyö" exploded={mobile} />
|
||||
<NavbarDropdownLink to="/yhteystiedot" text="Yhteystiedot" exploded={mobile}>
|
||||
@@ -29,7 +33,6 @@ export const renderNavigationItems = (mobile = false): JSX.Element => (
|
||||
<NavbarDropdownLink to="/in_english" text="In English" exploded={mobile} />
|
||||
</>
|
||||
);
|
||||
|
||||
const Nav = styled.div`
|
||||
flex: 1 0 auto;
|
||||
display: flex;
|
||||
@@ -53,6 +56,11 @@ const Nav = styled.div`
|
||||
@media screen and (max-width: ${breakpoints.mobile}) {
|
||||
justify-content: center;
|
||||
margin-left: 0;
|
||||
/* line 59 */
|
||||
border-top: 2px solid ${colors.lightBlue}; /* Add line above */
|
||||
padding-top: 0.5rem; /* Add some spacing */
|
||||
padding-bottom: 0.5rem; /* Add some spacing */
|
||||
cursor: pointer; /* Make entire nav clickable */
|
||||
}
|
||||
|
||||
svg {
|
||||
@@ -74,22 +82,12 @@ const DesktopContainer = styled.div`
|
||||
}
|
||||
`;
|
||||
|
||||
const SomeContainer = styled.div`
|
||||
display: flex;
|
||||
flex-flow: row nowrap;
|
||||
|
||||
a {
|
||||
display: flex;
|
||||
flex-flow: row nowrap;
|
||||
justify-content: center;
|
||||
margin: 1rem;
|
||||
}
|
||||
`;
|
||||
|
||||
const MobileMenu = styled.div`
|
||||
display: flex;
|
||||
margin: 0 1rem;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
padding: 0 50%; /* Large clickable area horizontally cheeze */
|
||||
|
||||
span {
|
||||
display: flex;
|
||||
@@ -99,9 +97,6 @@ const MobileMenu = styled.div`
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media screen and (max-width: ${breakpoints.mobile}) {
|
||||
margin-left: 3rem;
|
||||
}
|
||||
`;
|
||||
|
||||
interface NavigationProps {
|
||||
@@ -115,13 +110,8 @@ const Navigation: React.FC<NavigationProps> = ({ onMobileMenuOpen }) => {
|
||||
<DesktopContainer>
|
||||
{desktopItems}
|
||||
</DesktopContainer>
|
||||
<SomeContainer>
|
||||
<Icon name={IconType.Facebook} link="https://www.facebook.com/AaltoYliopistonSIK/" />
|
||||
<Icon name={IconType.Instagram} link="https://www.instagram.com/sahkoinsinoorikilta/" />
|
||||
<Icon name={IconType.LinkedIn} link="https://www.linkedin.com/groups/8103057/" />
|
||||
</SomeContainer>
|
||||
<MobileMenu>
|
||||
<Icon name={IconType.HamburgerMenu} onClick={onMobileMenuOpen} />
|
||||
<MobileMenu onClick={onMobileMenuOpen}>
|
||||
<Icon name={IconType.HamburgerMenu} />
|
||||
</MobileMenu>
|
||||
</Nav>
|
||||
);
|
||||
|
||||
@@ -4,8 +4,8 @@ import colors from "@theme/colors";
|
||||
import { renderNavigationItems } from "./Navigation";
|
||||
|
||||
const Nav = styled.nav`
|
||||
padding: 1rem 2rem;
|
||||
|
||||
padding: 1rem 1rem;
|
||||
padding-bottom: 20rem;
|
||||
a {
|
||||
fill: ${colors.lightBlue};
|
||||
color: ${colors.lightBlue};
|
||||
|
||||
+20
-10
@@ -1,5 +1,5 @@
|
||||
import React, {
|
||||
createContext, useContext, useMemo, useReducer,
|
||||
createContext, useContext, useMemo, useReducer, useEffect,
|
||||
} from "react";
|
||||
import fi from "./locales/fi/common.json";
|
||||
import en from "./locales/en/common.json";
|
||||
@@ -36,16 +36,10 @@ interface Store {
|
||||
changeLanguage: React.Dispatch<Lang>,
|
||||
}
|
||||
|
||||
let initialLanguage: Lang = "fi";
|
||||
try {
|
||||
const storedLang = localStorage.getItem(LOCAL_STORAGE_KEY) as Lang;
|
||||
initialLanguage = storedLang;
|
||||
} catch (err) {
|
||||
// Just ignore if fails to get value from browser (server etc.)
|
||||
}
|
||||
|
||||
// Always default to 'fi' for the initial state to ensure Server/Client match.
|
||||
// We will hydrate the user's preference in useEffect below.
|
||||
const initialState: Store = {
|
||||
language: initialLanguage,
|
||||
language: "fi",
|
||||
changeLanguage: null,
|
||||
};
|
||||
|
||||
@@ -69,6 +63,22 @@ const Reducer = (state: Store, action: Lang) => {
|
||||
const LocaleContext = createContext(initialState);
|
||||
const LocaleStore: React.FC<{ children?: React.ReactNode }> = ({ children }) => {
|
||||
const [state, dispatch] = useReducer(Reducer, initialState);
|
||||
|
||||
// Sync with localStorage only after the component has mounted (client-side)
|
||||
useEffect(() => {
|
||||
try {
|
||||
const storedLang = localStorage.getItem(LOCAL_STORAGE_KEY) as Lang;
|
||||
if (storedLang && (storedLang === "fi" || storedLang === "en")) {
|
||||
// Only dispatch if different to prevent unnecessary re-renders
|
||||
if (storedLang !== state.language) {
|
||||
dispatch(storedLang);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
// Just ignore if fails to get value from browser
|
||||
}
|
||||
}, []); // Empty dependency array ensures this runs once on mount
|
||||
|
||||
const changeLanguage = (action: Lang) => {
|
||||
dispatch(action);
|
||||
try {
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
// This file configures the initialization of Sentry on the browser.
|
||||
// The config you add here will be used whenever a page is visited.
|
||||
// https://docs.sentry.io/platforms/javascript/guides/nextjs/
|
||||
|
||||
/* eslint-disable import/prefer-default-export */
|
||||
import * as Sentry from "@sentry/nextjs";
|
||||
|
||||
const SENTRY_DSN = process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN;
|
||||
@@ -14,3 +11,6 @@ Sentry.init({
|
||||
// `release` value here - use the environment variable `SENTRY_RELEASE`, so
|
||||
// that it will also get attached to your source maps
|
||||
});
|
||||
|
||||
// This is required by Sentry v8 to instrument navigation (tracing)
|
||||
export const onRouterTransitionStart = Sentry.captureRouterTransitionStart;
|
||||
@@ -0,0 +1,13 @@
|
||||
import * as Sentry from "@sentry/nextjs";
|
||||
|
||||
export async function register() {
|
||||
if (process.env.NEXT_RUNTIME === "nodejs") {
|
||||
await import("../sentry.server.config");
|
||||
}
|
||||
|
||||
if (process.env.NEXT_RUNTIME === "edge") {
|
||||
await import("../sentry.edge.config");
|
||||
}
|
||||
}
|
||||
|
||||
export const onRequestError = Sentry.captureRequestError;
|
||||
@@ -1,7 +1,8 @@
|
||||
import { OptionTypes } from "@components/Widgets/SignupQuestionsWidget/common";
|
||||
|
||||
export interface Signup {
|
||||
id?: number;
|
||||
id?: number; // Database id for completed signup
|
||||
submit_id?: string; // Signup request idempotency key
|
||||
signupForm_id: number;
|
||||
answer: string;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
@@ -0,0 +1,18 @@
|
||||
import React from "react";
|
||||
import { NextPage } from "next";
|
||||
import Head from "next/head";
|
||||
import ForInternationalPageView from "@views/ForInternationalPage/ForIntlPageView";
|
||||
import PageWrapper from "@views/common/PageWrapper";
|
||||
|
||||
const ForInternationalPage: NextPage = () => (
|
||||
<>
|
||||
<Head>
|
||||
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/newStudent/ForIntl`} />
|
||||
</Head>
|
||||
<PageWrapper>
|
||||
<ForInternationalPageView />
|
||||
</PageWrapper>
|
||||
</>
|
||||
);
|
||||
|
||||
export default ForInternationalPage;
|
||||
@@ -0,0 +1,18 @@
|
||||
import React from "react";
|
||||
import { NextPage } from "next";
|
||||
import Head from "next/head";
|
||||
import ContactsPageView from "@views/ForFreshmenPage/ForFreshmenPageView";
|
||||
import PageWrapper from "@views/common/PageWrapper";
|
||||
|
||||
const ContactsPage: NextPage = () => (
|
||||
<>
|
||||
<Head>
|
||||
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/newStudent/ForFreshmen`} />
|
||||
</Head>
|
||||
<PageWrapper>
|
||||
<ContactsPageView />
|
||||
</PageWrapper>
|
||||
</>
|
||||
);
|
||||
|
||||
export default ContactsPage;
|
||||
@@ -7,7 +7,7 @@ import PageWrapper from "@views/common/PageWrapper";
|
||||
const FreshmenPage: NextPage = () => (
|
||||
<>
|
||||
<Head>
|
||||
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/kilta/fuksi`} />
|
||||
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/newStudent/fuksi`} />
|
||||
</Head>
|
||||
<PageWrapper>
|
||||
<FreshmenPageView />
|
||||
@@ -13,6 +13,7 @@ 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,6 +24,7 @@ const FORM_URL = `${process.env.NEXT_PUBLIC_API_URL}/signupForm/`;
|
||||
const SignUpPage: NextPage<InitialProps> = ({ initialForm }) => {
|
||||
const router = useRouter();
|
||||
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 });
|
||||
|
||||
@@ -43,6 +45,7 @@ const SignUpPage: NextPage<InitialProps> = ({ initialForm }) => {
|
||||
|
||||
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: formData,
|
||||
};
|
||||
|
||||
@@ -107,6 +107,9 @@ const BoardPageView: React.FC = () => (
|
||||
</BlueLink>
|
||||
.
|
||||
</p>
|
||||
<p>
|
||||
Muut yhteystiedot löydät <Link to="/yhteystiedot">täältä.</Link>
|
||||
</p>
|
||||
<p>
|
||||
{"Hallitukselle voi myös lähettää palautetta täyttämällä "}
|
||||
<BlueLink to="https://docs.google.com/forms/d/e/1FAIpQLSeD8Hm66uvwr7Xa2WGgOCfI2RS1NrZsmISf2QBKUcJf_stv8g/viewform?usp=sf_link">
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
"name_en": "Guild Room Representative",
|
||||
"representatives": [
|
||||
{
|
||||
"name": "Justus Ojala"
|
||||
"name": "Milja Kuusela"
|
||||
},
|
||||
{
|
||||
"name": "Aaro Rasilainen"
|
||||
|
||||
@@ -21,7 +21,7 @@ const ContactsPageView: React.FC = () => (
|
||||
<p>
|
||||
Yhdistys : Aalto-yliopiston Sähköinsinöörikilta ry <br />
|
||||
Y-tunnus: 1627010-1 <br />
|
||||
Sähköpostilaskut: <a href="mailto:rahastonhoitaja@sahkoinsinoorikilta.fi">rahastonhoitaja@sahkoinsinoorikilta.fi </a>
|
||||
Sähköpostilaskut: <a href="mailto:rahastonhoitaja@sahkoinsinoorikilta.fi">rahastonhoitaja@sahkoinsinoorikilta.fi</a>
|
||||
</p>
|
||||
<h6>Kiltahuone</h6>
|
||||
<p>
|
||||
|
||||
@@ -100,8 +100,8 @@ const CorporatePageView: React.FC<CorporatePageViewProps> = ({ jobAds }) => (
|
||||
|
||||
<CTASection
|
||||
bgColor="orange1"
|
||||
link="https://sosso.fi/wp-content/uploads/2023/01/sossomediakortti23.pdf"
|
||||
linkText="Killan lehden mediakortin löydät täältä ›"
|
||||
link="https://static.sahkoinsinoorikilta.fi/sekalaista/sossomediakortti25-web.pdf"
|
||||
linkText="Killan lehden mediakortti ›"
|
||||
>
|
||||
Mainos Sössöön?
|
||||
</CTASection>
|
||||
@@ -110,7 +110,7 @@ const CorporatePageView: React.FC<CorporatePageViewProps> = ({ jobAds }) => (
|
||||
<h3 id="tyopaikat">Työpaikkailmoitukset</h3>
|
||||
<div>
|
||||
<JobAdList jobAds={jobAds} />
|
||||
<p>Voit saada yrityksesi työpaikkailmoituksen listalle lähettämällä sen osoitteeseen <a href={`mailto:${CORPORATE_MASTER_INFO.email}`}>{CORPORATE_MASTER_INFO.email}</a></p>
|
||||
<p> Haluatko työpaikkailmoituksesti näkyviin listalle? Lähetä tarjous osoitteeseen <a href={`mailto:${CORPORATE_MASTER_INFO.email}`}>{CORPORATE_MASTER_INFO.email}</a></p>
|
||||
</div>
|
||||
|
||||
</TextSection>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React from "react";
|
||||
import Image from "next/legacy/image";
|
||||
import Image from "next/image";
|
||||
import styled from "styled-components";
|
||||
import rehypeRaw from "rehype-raw";
|
||||
import rehypeSanitize from "rehype-sanitize";
|
||||
@@ -81,10 +81,9 @@ const EventPageView: React.FC<EventPageViewProps> = ({ event }) => {
|
||||
<Image
|
||||
src={event.image || event.tags[0].icon}
|
||||
alt={title}
|
||||
objectFit="scale-down"
|
||||
layout="responsive"
|
||||
width={16}
|
||||
height={9}
|
||||
style={{ objectFit: "scale-down" }}
|
||||
/>
|
||||
</h1>
|
||||
<div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React from "react";
|
||||
import Image from "next/legacy/image";
|
||||
import Image from "next/image";
|
||||
import styled from "styled-components";
|
||||
import rehypeRaw from "rehype-raw";
|
||||
import rehypeSanitize from "rehype-sanitize";
|
||||
@@ -65,10 +65,9 @@ const FeedPageView: React.FC<FeedPageViewProps> = ({ post }) => {
|
||||
<Image
|
||||
src={post.image}
|
||||
alt={title}
|
||||
objectFit="scale-down"
|
||||
layout="responsive"
|
||||
width={16}
|
||||
height={9}
|
||||
style={{ objectFit: "scale-down" }}
|
||||
/>
|
||||
)}
|
||||
</h1>
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
import React from "react";
|
||||
import {
|
||||
Hero, HeroPrimarySection, HeroAside, HeroAsideItem,
|
||||
} from "@components/Hero";
|
||||
|
||||
const ForFreshmenPageHero: React.FC = () => (
|
||||
<Hero>
|
||||
<HeroPrimarySection
|
||||
header="Welcome to study in Otaniemi!"
|
||||
text="This is the frontpage for fuksis (freshmen). Here we have collected all the most important information that you will need during your first year.
|
||||
Of course, everything happening in the guild can't fit here, so it is recommended that you also check out the more general 'in english' page."
|
||||
/>
|
||||
|
||||
<HeroAside bgColor="lightTurquoise">
|
||||
<HeroAsideItem
|
||||
header="Read the guild freshman guide"
|
||||
link="https://static.sahkoinsinoorikilta.fi/FTMK/Fopas_25_en_web.pdf"
|
||||
linkText="read the freshman guide here!"
|
||||
/>
|
||||
|
||||
<HeroAsideItem
|
||||
header="Follow the guild's announcements"
|
||||
link="https://t.me/+KxOI-aQ0jpFhNTJk"
|
||||
linkText="Join the guild's Telegram-group!"
|
||||
/>
|
||||
<HeroAsideItem
|
||||
header="Fuksi groups and ISOs?"
|
||||
link="#isos"
|
||||
linkText="Information about the fuksi groups"
|
||||
/>
|
||||
</HeroAside>
|
||||
</Hero>
|
||||
);
|
||||
|
||||
export default ForFreshmenPageHero;
|
||||
@@ -0,0 +1,169 @@
|
||||
import React from "react";
|
||||
import Image from "next/image";
|
||||
import styled from "styled-components";
|
||||
import {
|
||||
CTASection, TextSection, InfoBox, PageLink, Link,
|
||||
} from "@components/index";
|
||||
import ForFreshmenPageHero from "./ForFreshmenPageHero";
|
||||
|
||||
const FUKSI_POINTS_LINK = "https://static.sahkoinsinoorikilta.fi/FTMK/Fuksipisteohje.pdf";
|
||||
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 ImageContainer = styled.div`
|
||||
width: 100%;
|
||||
display: block;
|
||||
margin: auto;
|
||||
`;
|
||||
|
||||
const QRImages = styled.img`
|
||||
width: 10em;
|
||||
height: 10em;
|
||||
`;
|
||||
|
||||
const FopasImage = styled.img`
|
||||
width: 15em;
|
||||
margin-bottom: 1em;
|
||||
`;
|
||||
|
||||
const ForFreshmenPageView: React.FC = () => (
|
||||
<>
|
||||
<ForFreshmenPageHero />
|
||||
<TextSection>
|
||||
<h3 id="abeille">Congratulations on an awesome choice of studies!</h3>
|
||||
<div>
|
||||
<p>
|
||||
You have made an excellent choice by taking the first step on a journey where you will first become an engineering student, ...known better in finnish
|
||||
as "teekkari" and later a Master of Science in Engineering "Diplomi-insinööri".
|
||||
You have just become a technical high school graduate and a freshman.
|
||||
A great achievement that certainly deserves celebration, and there is no better place for that celebration than Otaniemi.
|
||||
Welcome!
|
||||
</p>
|
||||
<p>
|
||||
As a first step, we recommend that you join the Telegram channels created for freshmen.
|
||||
{" "}
|
||||
<Link to={TG_GROUP_CHAT_LINK} target="_blank">Click here</Link> to get acquainted with your fellow freshmen and ISOs, and <Link to={TG_NOTIFICATIONS_LINK} target="_blank">click here</Link> to join the notification channel.
|
||||
</p>
|
||||
|
||||
<h6>A story named Teekkarius</h6>
|
||||
<p>
|
||||
Every teekkari's journey is unique.
|
||||
The guild, the student union, and the other organizations in Otaniemi will undoubtedly offer something for everyone.
|
||||
You are now part of Aalto University's Electrical Engineering Guild, and we will support you throughout your teekkari journey so that you can find the places that are perfect for you to make an impact and pursue your hobbies.
|
||||
To make this possible, we have placed you in a freshman group, which you will get to know during orientation week and which will serve as your support group for new adventures.
|
||||
Your freshman group also includes a few tutors better known as ISOs.
|
||||
You can find more information about them <Link to="#isot">below</Link>.
|
||||
</p>
|
||||
|
||||
<ImageContainer>
|
||||
<Image
|
||||
src="https://static.sahkoinsinoorikilta.fi/FTMK/IMG_6539.JPG"
|
||||
alt="Kipparit"
|
||||
width={100}
|
||||
height={80}
|
||||
style={{ objectFit: "contain" }}
|
||||
/>
|
||||
</ImageContainer>
|
||||
|
||||
<h6>Freshmen captains</h6>
|
||||
<p>
|
||||
We are your freshman captains <strong>Teemu</strong> and <strong>Henri</strong> and we'll be here to support you and monitor your
|
||||
progress throughout the freshman year adventures toward earning your engineer's hat (= teekkarilakki),
|
||||
which you might possibly earn during May Day next spring.
|
||||
If you have any questions, feel free to contact us via <Link to={TG_GROUP_CHAT_LINK} target="_blank">Telegram</Link> or <a href={EMAIL_LINK_MAILTO}>email</a>.
|
||||
</p>
|
||||
|
||||
<h6>Smile When We Meet!</h6>
|
||||
<p>
|
||||
Although the first days in Otaniemi might bring along some funny and strange experiences, don't be alarmed by them!
|
||||
Over time, the pieces of the puzzle will come together to form an image that reflects you, and you'll have the opportunity to shape what the final result looks like.
|
||||
</p>
|
||||
<p>
|
||||
Orientation week is held from August 25th to 29th, 2025, but even before then, you'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>
|
||||
<p>040 097 1835<br />teemu.heikkinen (ät) sahkoinsinoorikilta.fi <br />@heikkinenteemu</p>
|
||||
|
||||
<h6>Henri Aito</h6>
|
||||
<p>045 328 2883<br />henri.aito (ät) sahkoinsinoorikilta.fi <br />@henriaito</p>
|
||||
</div>
|
||||
<aside>
|
||||
<div>
|
||||
<PageLink to={EMAIL_LINK_MAILTO} desc={EMAIL_LINK}>
|
||||
You can reach the freshman captains at
|
||||
</PageLink>
|
||||
<PageLink to="https://api.sahkoinsinoorikilta.fi/members/application" desc="And join our activities! ›">
|
||||
Join the guild!
|
||||
</PageLink>
|
||||
<PageLink to={FUKSI_POINTS_LINK} desc="Take a look at the fuksipoints ›">
|
||||
Fuksipoint guide - This will be translated later so don't worry if you don't understand Finnish!
|
||||
</PageLink>
|
||||
</div>
|
||||
<div>
|
||||
<InfoBox>
|
||||
<h6>Fuksiguide</h6>
|
||||
<Link to="https://static.sahkoinsinoorikilta.fi/FTMK/Fopas_25_en_web.pdf" target="_blank">
|
||||
<FopasImage
|
||||
src="https://static.sahkoinsinoorikilta.fi/FTMK/Fopas_25_kansi.jpg"
|
||||
/>
|
||||
</Link>
|
||||
|
||||
<p>
|
||||
It's a good idea to take a look at the fuksiguide before starting your studies!
|
||||
The guide contains lots of useful information about the guild, the student union, and the student life in Otaniemi.
|
||||
You can find the guide <Link to="https://static.sahkoinsinoorikilta.fi/FTMK/Fopas_25_en_web.pdf" target="_blank">here</Link>.
|
||||
</p>
|
||||
<br />
|
||||
<h6>Telegram?</h6>
|
||||
<p>
|
||||
Telegram is a messaging app used in Otaniemi.
|
||||
More info can be found here: <Link to="https://telegram.org/faq" target="_blank">https://telegram.org/faq</Link>.
|
||||
</p>
|
||||
<p>
|
||||
SIK fuksis have a group chat, which you can join by scanning the QR code below:
|
||||
</p>
|
||||
<QRImages
|
||||
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-2025.jpg"
|
||||
/>
|
||||
<p>or <Link to={TG_NOTIFICATIONS_LINK} target="_blank">press me!</Link></p>
|
||||
</InfoBox>
|
||||
</div>
|
||||
</aside>
|
||||
</TextSection>
|
||||
<CTASection
|
||||
bgColor="lightBlue"
|
||||
link="/kilta/toiminta"
|
||||
linkText="Follow what the guild is up to"
|
||||
>
|
||||
The guild organises lots of things!
|
||||
</CTASection>
|
||||
|
||||
<TextSection>
|
||||
<h3 id="isos">Freshman groups and ISOs</h3>
|
||||
<div>
|
||||
<p>SIK freshmen enjoy the guidance and care of their wonderful ISOs in their own freshman groups</p>
|
||||
<p>
|
||||
ISOs are older students and guild members, who are there to support you throughout your freshman year. You will be divided into groups.
|
||||
You can ask your ISOs anything regarding studying and student life. Even though they don't know all the answers, they can likely help you finding them.
|
||||
</p>
|
||||
<p>
|
||||
As stated above, your ISOs will support you through your whole freshman year, but you will see them most during the orientation week,
|
||||
during which they will wander through Otaniemi together with your group and guide you into the ways of the teekkari.
|
||||
They will also help you find whatever is needed to start your studies here, and will support you in creating your timetable and getting your library, HSL and student cards.
|
||||
</p>
|
||||
<p>ISOs are also invited to the first event of the freshman year, the head start. Come meet them there early!</p>
|
||||
</div>
|
||||
</TextSection>
|
||||
</>
|
||||
);
|
||||
|
||||
export default ForFreshmenPageView;
|
||||
@@ -0,0 +1,35 @@
|
||||
import React from "react";
|
||||
import {
|
||||
Hero, HeroPrimarySection, HeroAside, HeroAsideItem,
|
||||
} from "@components/Hero";
|
||||
|
||||
const ForFreshmenPageHero: React.FC = () => (
|
||||
<Hero>
|
||||
<HeroPrimarySection
|
||||
header="Welcome to Aalto and Otaniemi!"
|
||||
text="This is the frontpage for fuksis (freshmen). Here we have collected all the most important information that you will need during your first year.
|
||||
Of course, everything happening in the guild can't fit here, so it is recommended that you also check out the more general 'in english' page."
|
||||
/>
|
||||
|
||||
<HeroAside bgColor="lightTurquoise">
|
||||
<HeroAsideItem
|
||||
header="Read the guild's fuksi guide"
|
||||
link="https://static.sahkoinsinoorikilta.fi/FTMK/Fopas_25_en_web.pdf"
|
||||
linkText="Read the fuksi guide here!"
|
||||
/>
|
||||
|
||||
<HeroAsideItem
|
||||
header="Follow the guild's announcements"
|
||||
link="https://t.me/+KxOI-aQ0jpFhNTJk"
|
||||
linkText="Join the guild's Telegram group!"
|
||||
/>
|
||||
<HeroAsideItem
|
||||
header="Fuksi groups and ISOs?"
|
||||
link="#isos"
|
||||
linkText="Information about the fuksi groups"
|
||||
/>
|
||||
</HeroAside>
|
||||
</Hero>
|
||||
);
|
||||
|
||||
export default ForFreshmenPageHero;
|
||||
@@ -0,0 +1,190 @@
|
||||
import React from "react";
|
||||
import Image from "next/image";
|
||||
import styled from "styled-components";
|
||||
import {
|
||||
CTASection, TextSection, InfoBox, PageLink, Link,
|
||||
} from "@components/index";
|
||||
import ForIntlPageHero from "./ForIntlPageHero";
|
||||
|
||||
const FUKSI_POINTS_LINK = "https://static.sahkoinsinoorikilta.fi/FTMK/Fuksipisteohje.pdf";
|
||||
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 ImageContainer = styled.div`
|
||||
width: 100%;
|
||||
display: block;
|
||||
margin: auto;
|
||||
`;
|
||||
|
||||
const QRImages = styled.img`
|
||||
width: 10em;
|
||||
height: 10em;
|
||||
`;
|
||||
|
||||
const FopasImage = styled.img`
|
||||
width: 15em;
|
||||
margin-bottom: 1em;
|
||||
`;
|
||||
|
||||
const ForIntlPageView: React.FC = () => (
|
||||
<>
|
||||
<ForIntlPageHero />
|
||||
<TextSection>
|
||||
<h3 id="abeille">Congratulations on your admission!</h3>
|
||||
<div>
|
||||
<p>
|
||||
You've not only become a new student at Aalto, but also what's known as a teekkari
|
||||
– a term used to describe students of technology in Finland, and which is synonymous
|
||||
with a distinct, tradition-filled student culture.
|
||||
</p>
|
||||
<p>
|
||||
Whether you've learned about this before or it's your first time hearing about it, it's absolutely worth celebrating, and the best place for this is definitely our campus in Otaniemi. Welcome!
|
||||
</p>
|
||||
<p>
|
||||
As a first step, we recommend that you join the Telegram channels made for fuksis. This is where you can get to know your fellow new students and your student tutors known as ISOs. This is also where you can access the information channel.
|
||||
{" "}
|
||||
<Link to={TG_GROUP_CHAT_LINK} target="_blank">Click here</Link> to get acquainted with your fellow freshmen and ISOs, and <Link to={TG_NOTIFICATIONS_LINK} target="_blank">click here</Link> to join the notification channel.
|
||||
</p>
|
||||
|
||||
<h6>A journey called Teekkarius</h6>
|
||||
<p>
|
||||
Every teekkari's journey is unique.
|
||||
The guild, the student union, and the other organizations in Otaniemi will undoubtedly offer something for everyone.
|
||||
You are now part of Aalto University's Electrical Engineering Guild, and we will support you throughout your teekkari journey so that you can find the places that are perfect for you to make an impact and pursue your hobbies.
|
||||
To make this possible, we have placed you in a freshman group, which you will get to know during orientation week and which will serve as your support group for new adventures.
|
||||
Your freshman group also includes a few tutors better known as ISOs.
|
||||
You can find more information about them <Link to="#isot">below</Link>.
|
||||
</p>
|
||||
<p>
|
||||
The journey of a teekkari is unique to everyone. The guild, the Aalto Student Union,
|
||||
and other organizations in Otaniemi offer various opportunities to pursue hobbies,
|
||||
passions, and social lives.
|
||||
</p>
|
||||
<p>
|
||||
You are now part of the Aalto University Guid of Electrical Engineering
|
||||
(SIK, short for Sähköinsinöörikilta in Finnish) and we will support you in
|
||||
settling in and finding the right places to have fun and make an impact.
|
||||
</p>
|
||||
<p>
|
||||
To make this successful, we’ve placed you in a small “fuksi group” with other new students,
|
||||
whom you will get to know and adventure with starting in Orientation Week.
|
||||
Your fuksi group also includes a few ISOs, who have studied here for at least a year and will
|
||||
lean on their experience to show you around and help you get comfortable.
|
||||
</p>
|
||||
|
||||
<ImageContainer>
|
||||
<Image
|
||||
src="https://static.sahkoinsinoorikilta.fi/FTMK/Captains2025.jpg"
|
||||
alt="Kipparit"
|
||||
width={100}
|
||||
height={80}
|
||||
style={{ objectFit: "contain" }}
|
||||
/>
|
||||
</ImageContainer>
|
||||
|
||||
<h6>International captains</h6>
|
||||
<p>
|
||||
We are your International Fuksi Captains <strong>Markus</strong> and <strong>Apollo</strong>,
|
||||
and we will be there to support you in getting started at Aalto, but also to guide you through
|
||||
the awesome (and distinctly Finnish) process of becoming a full-blown teekkari.
|
||||
This involves participating in many fun activities and traditions, culminating in earning the famous
|
||||
Teekkari Cap and having an amazing community alongside you. If you have any questions,
|
||||
please contact us on Telegram or by email.
|
||||
</p>
|
||||
|
||||
<h6>Looking forward to meeting you!</h6>
|
||||
<p>
|
||||
Even though your first few days in Otaniemi may bring some new and unfamiliar experiences,
|
||||
please don't be intimidated! Over time, the pieces of the puzzle will come together and you'll be
|
||||
having just as much fun as we are. Always remember that as a teekkari in Otaniemi, you're never alone.
|
||||
</p>
|
||||
<p>
|
||||
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 2025. More about that in the Telegram groups!
|
||||
</p>
|
||||
|
||||
<h6>Apollo Ailus</h6>
|
||||
<p>+358 045 803 3662<br />apollo.ailus@sahkoinsinoorikilta.fi <br />@SIKCaptain</p>
|
||||
|
||||
<h6>Markus Aaltio</h6>
|
||||
<p>+358 044 050 4028<br />markus.aaltio@sahkoinsinoorikilta.fi <br />@KvCaptain</p>
|
||||
</div>
|
||||
<aside>
|
||||
<div>
|
||||
<PageLink to={EMAIL_LINK_MAILTO} desc={EMAIL_LINK}>
|
||||
You can reach the freshman captains at
|
||||
</PageLink>
|
||||
<PageLink to="https://api.sahkoinsinoorikilta.fi/members/application" desc="And join our activities! ›">
|
||||
Join the guild!
|
||||
</PageLink>
|
||||
<PageLink to={FUKSI_POINTS_LINK} desc="Take a look at the fuksipoints ›">
|
||||
Fuksipoint guide - This will be translated later so don't worry if you don't understand Finnish!
|
||||
</PageLink>
|
||||
</div>
|
||||
<div>
|
||||
<InfoBox>
|
||||
<h6>Fuksiguide</h6>
|
||||
<Link to="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiguide_25_web.pdf" target="_blank">
|
||||
<FopasImage
|
||||
src="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiguide_25_cover.png"
|
||||
/>
|
||||
</Link>
|
||||
|
||||
<p>
|
||||
It's a good idea to take a look at the fuksiguide before starting your studies!
|
||||
The guide contains lots of useful information about the guild, the student union, and the student life in Otaniemi.
|
||||
You can find the guide <Link to="https://static.sahkoinsinoorikilta.fi/FTMK/Fopas_25_en_web.pdf" target="_blank">here</Link>.
|
||||
</p>
|
||||
<br />
|
||||
<h6>Telegram?</h6>
|
||||
<p>
|
||||
Telegram is a messaging app used in Otaniemi.
|
||||
More info can be found here: <Link to="https://telegram.org/faq" target="_blank">https://telegram.org/faq</Link>.
|
||||
</p>
|
||||
<p>
|
||||
SIK fuksis have a group chat, which you can join by scanning the QR code below:
|
||||
</p>
|
||||
<QRImages
|
||||
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-2025.jpg"
|
||||
/>
|
||||
<p>or <Link to={TG_NOTIFICATIONS_LINK} target="_blank">press me!</Link></p>
|
||||
</InfoBox>
|
||||
</div>
|
||||
</aside>
|
||||
</TextSection>
|
||||
<CTASection
|
||||
bgColor="lightBlue"
|
||||
link="/kilta/toiminta"
|
||||
linkText="Follow what the guild is up to"
|
||||
>
|
||||
The guild organises lots of things!
|
||||
</CTASection>
|
||||
|
||||
<TextSection>
|
||||
<h3 id="isos">Freshman groups and ISOs</h3>
|
||||
<div>
|
||||
<p>SIK freshmen enjoy the guidance and care of their wonderful ISOs in their own freshman groups</p>
|
||||
<p>
|
||||
ISOs are older students and guild members, who are there to support you throughout your freshman year. You will be divided into groups.
|
||||
You can ask your ISOs anything regarding studying and student life. Even though they don't know all the answers, they can likely help you finding them.
|
||||
</p>
|
||||
<p>
|
||||
As stated above, your ISOs will support you through your whole freshman year, but you will see them most during the orientation week,
|
||||
during which they will wander through Otaniemi together with your group and guide you into the ways of the teekkari.
|
||||
They will also help you find whatever is needed to start your studies here, and will support you in creating your timetable and getting your library, HSL and student cards.
|
||||
</p>
|
||||
<p>ISOs are also invited to the first event of the freshman year, the head start. Come meet them there early!</p>
|
||||
</div>
|
||||
</TextSection>
|
||||
</>
|
||||
);
|
||||
|
||||
export default ForIntlPageView;
|
||||
@@ -13,7 +13,7 @@ const FreshmenPageHero: React.FC = () => (
|
||||
<HeroAside bgColor="lightTurquoise">
|
||||
<HeroAsideItem
|
||||
header="Lue killan fuksiopas"
|
||||
link="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiopas2024.pdf"
|
||||
link="https://static.sahkoinsinoorikilta.fi/FTMK/Fopas_25_web.pdf"
|
||||
linkText="lue fuksiopas täältä!"
|
||||
/>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React from "react";
|
||||
import Image from "next/legacy/image";
|
||||
import Image from "next/image";
|
||||
import styled from "styled-components";
|
||||
import {
|
||||
CTASection, TextSection, InfoBox, PageLink, Link,
|
||||
@@ -7,8 +7,8 @@ import {
|
||||
import FreshmenPageHero from "./FreshmenPageHero";
|
||||
|
||||
const FUKSI_POINTS_LINK = "https://static.sahkoinsinoorikilta.fi/FTMK/Fuksipisteohje.pdf";
|
||||
const TG_GROUP_CHAT_LINK = "https://t.me/+8McxwmHvXu80YmFk";
|
||||
const TG_NOTIFICATIONS_LINK = "https://t.me/+GGTLMfwce1gxM2Q8";
|
||||
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}`;
|
||||
|
||||
@@ -43,7 +43,7 @@ const FreshmenPageView: React.FC = () => (
|
||||
<p>
|
||||
Ensi askeleina suosittelemme, että liityt teille fukseille tehdyille Telegram-kanaville.
|
||||
{" "}
|
||||
<Link to={TG_GROUP_CHAT_LINK} target="_blank">Tästä</Link> tutustumaan fuksikavereihin ja ISOihisi ja <Link to={TG_NOTIFICATIONS_LINK} target="_blank">tästä</Link> pääset tiedotuskanavalle.
|
||||
<Link to={TG_GROUP_CHAT_LINK} target="_blank">Tästä</Link> pääset tutustumaan fuksikavereihisi sekä ISOihin ja <Link to={TG_NOTIFICATIONS_LINK} target="_blank">tästä</Link> pääset tiedotuskanavalle.
|
||||
</p>
|
||||
|
||||
<h6>Matka nimeltä Teekkarius</h6>
|
||||
@@ -58,18 +58,17 @@ const FreshmenPageView: React.FC = () => (
|
||||
|
||||
<ImageContainer>
|
||||
<Image
|
||||
src="https://static.sahkoinsinoorikilta.fi/FTMK/fuksikipparit-2024.jpg"
|
||||
src="https://static.sahkoinsinoorikilta.fi/FTMK/IMG_6539.JPG"
|
||||
alt="Kipparit"
|
||||
layout="responsive"
|
||||
width={100}
|
||||
height={80}
|
||||
objectFit="contain"
|
||||
style={{ objectFit: "contain" }}
|
||||
/>
|
||||
</ImageContainer>
|
||||
|
||||
<h6>Fuksikapteenit</h6>
|
||||
<p>
|
||||
Me olemme fuksikapteenisi <strong>Sauli</strong> ja <strong>Valentin</strong> ja tulemme olemaan tukenasi sekä valvomassa suorituksiasi fuksivuoden seikkailuissa kohti teekkarilakkia,
|
||||
Me olemme fuksikapteenisi <strong>Teemu</strong> ja <strong>Henri</strong> ja tulemme olemaan tukenasi sekä valvomassa suorituksiasi fuksivuoden seikkailuissa kohti teekkarilakkia,
|
||||
jonka voit ansaita mahdollisesti järjestettävänä Wappuna ensi keväällä.
|
||||
Jos sinulla on mitään kysymyksiä, ota ihmeessä meihin yhteyttä esimerkiksi <Link to={TG_GROUP_CHAT_LINK} target="_blank">Telegramissa</Link> tai <a href={EMAIL_LINK_MAILTO}>sähköpostitse</a>.
|
||||
</p>
|
||||
@@ -80,15 +79,15 @@ 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 26-30.8.2024, 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 17.8.2024. 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>Sauli Hakala</h6>
|
||||
<p>045 317 1800<br />sauli.hakala (ät) sahkoinsinoorikilta.fi <br />@saulihakala</p>
|
||||
<h6>Teemu Heikkinen</h6>
|
||||
<p>040 097 1835<br />teemu.heikkinen (ät) sahkoinsinoorikilta.fi <br />@heikkinenteemu</p>
|
||||
|
||||
<h6>Valentin Juhela</h6>
|
||||
<p>040 968 1644<br />valentin.juhela (ät) sahkoinsinoorikilta.fi <br />@ValentinJuhela</p>
|
||||
<h6>Henri Aito</h6>
|
||||
<p>045 328 2883<br />henri.aito (ät) sahkoinsinoorikilta.fi <br />@henriaito</p>
|
||||
</div>
|
||||
<aside>
|
||||
<div>
|
||||
@@ -96,7 +95,7 @@ const FreshmenPageView: React.FC = () => (
|
||||
Fuksikipparit tavoitat
|
||||
</PageLink>
|
||||
<PageLink to="https://api.sahkoinsinoorikilta.fi/members/application" desc="ja tule mukaan toimintaamme ›">
|
||||
Liity jäseneksi
|
||||
Liity jäseneksi tästä
|
||||
</PageLink>
|
||||
<PageLink to={FUKSI_POINTS_LINK} desc="Katso fuksipisteitä ›">
|
||||
Fuksipisteohje
|
||||
@@ -105,15 +104,15 @@ const FreshmenPageView: React.FC = () => (
|
||||
<div>
|
||||
<InfoBox>
|
||||
<h6>Killan Fuksiopas</h6>
|
||||
<Link to="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiopas2024.pdf" target="_blank">
|
||||
<Link to="https://static.sahkoinsinoorikilta.fi/FTMK/Fopas_25_web.pdf" target="_blank">
|
||||
<FopasImage
|
||||
src="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiopas2024-kansi.jpg"
|
||||
src="https://static.sahkoinsinoorikilta.fi/FTMK/Fopas_25_kansi.jpg"
|
||||
/>
|
||||
</Link>
|
||||
|
||||
<p>
|
||||
Ennen opintojen alkua on hyvä tutustua killan fuksioppaaseen.
|
||||
Sitä pääset selailemaan <Link to="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiopas2024.pdf" target="_blank">tästä</Link>.
|
||||
Oppaan pääset lukemaan tästä!
|
||||
</p>
|
||||
<br />
|
||||
<h6>Telegram?</h6>
|
||||
@@ -126,12 +125,12 @@ const FreshmenPageView: React.FC = () => (
|
||||
SIK:n fukseilla on oma Telegram-ryhmä, jonne pääset liitymään tästä:
|
||||
</p>
|
||||
<QRImages
|
||||
src="https://static.sahkoinsinoorikilta.fi/FTMK/sik-fuksit-2024.jpg"
|
||||
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="https://static.sahkoinsinoorikilta.fi/FTMK/sik-fuksit-2024-tiedotus.jpg"
|
||||
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>
|
||||
|
||||
@@ -30,7 +30,7 @@ const FrontPageHero: React.FC = () => (
|
||||
<HeroAsideItem
|
||||
header="Vasta-aloittaneelle opiskelijalle"
|
||||
text="Fuksikasvatusta ja ISOtoimintaa"
|
||||
link="/kilta/fuksi"
|
||||
link="/newStudent/fuksi"
|
||||
linkText="Fuksit ›"
|
||||
/>
|
||||
<HeroAsideItem
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React from "react";
|
||||
import Image from "next/legacy/image";
|
||||
import Image from "next/image";
|
||||
import styled from "styled-components";
|
||||
import {
|
||||
Divider,
|
||||
@@ -20,13 +20,15 @@ const ABB = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/abb.jpg";
|
||||
const Caruna = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/caruna.jpg";
|
||||
const Ensto = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/ensto.jpg";
|
||||
const eSett = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/esett.jpg";
|
||||
const Fingrid = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/fingrid.jpg";
|
||||
const Okmetic = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/okmetic.jpg";
|
||||
const Nokia = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/nokia.jpg";
|
||||
const Granlund = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/granlund.jpg";
|
||||
const Eaton = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/eaton.png";
|
||||
const MerusPower = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/meruspower.png";
|
||||
const Ramboll = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/ramboll.png";
|
||||
const Ericsson = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/ericsson.png";
|
||||
const Saab = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/Saab.png";
|
||||
const STUL = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/stul_logo.png";
|
||||
const Metso = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/Metso-logo.png";
|
||||
|
||||
interface FrontPageViewProps {
|
||||
events: Event[];
|
||||
@@ -91,37 +93,43 @@ const FrontPageView: React.FC<FrontPageViewProps> = ({ events, feed }) => (
|
||||
<SponsorReel>
|
||||
<div>
|
||||
<Link to="https://new.abb.com/fi/">
|
||||
<Image src={ABB} alt="ABB" layout="responsive" width={200} height={100} objectFit="contain" />
|
||||
<Image src={ABB} alt="ABB" width={200} height={100} style={{ objectFit: "contain" }} />
|
||||
</Link>
|
||||
<Link to="https://caruna.fi/">
|
||||
<Image src={Caruna} alt="Caruna" layout="responsive" width={200} height={100} objectFit="contain" />
|
||||
<Image src={Caruna} alt="Caruna" width={200} height={100} style={{ objectFit: "contain" }} />
|
||||
</Link>
|
||||
<Link to="https://www.nokia.com/">
|
||||
<Image src={Nokia} alt="Nokia" layout="responsive" width={200} height={100} objectFit="contain" />
|
||||
<Image src={Nokia} alt="Nokia" width={200} height={100} style={{ objectFit: "contain" }} />
|
||||
</Link>
|
||||
<Link to="https://www.ensto.com/fi/">
|
||||
<Image src={Ensto} alt="Ensto" layout="responsive" width={200} height={100} objectFit="contain" />
|
||||
<Image src={Ensto} alt="Ensto" width={200} height={100} style={{ objectFit: "contain" }} />
|
||||
</Link>
|
||||
<Link to="https://www.esett.com/">
|
||||
<Image src={eSett} alt="eSett" layout="responsive" width={200} height={100} objectFit="contain" />
|
||||
<Image src={eSett} alt="eSett" width={200} height={100} style={{ objectFit: "contain" }} />
|
||||
</Link>
|
||||
<Link to="https://www.fingrid.fi/">
|
||||
<Image src={Fingrid} alt="Fingrid" width={200} height={100} style={{ objectFit: "contain" }} />
|
||||
</Link>
|
||||
<Link to="https://www.okmetic.com/fi/">
|
||||
<Image src={Okmetic} alt="Okmetic" layout="responsive" width={200} height={100} objectFit="contain" />
|
||||
<Image src={Okmetic} alt="Okmetic" width={200} height={100} style={{ objectFit: "contain" }} />
|
||||
</Link>
|
||||
<Link to="https://www.granlund.fi/">
|
||||
<Image src={Granlund} alt="Granlund" layout="responsive" width={200} height={100} objectFit="contain" />
|
||||
<Image src={Granlund} alt="Granlund" width={200} height={100} style={{ objectFit: "contain" }} />
|
||||
</Link>
|
||||
<Link to="https://www.eaton.com/fi/fi-fi.html">
|
||||
<Image src={Eaton} alt="Eaton" layout="responsive" width={200} height={100} objectFit="contain" />
|
||||
</Link>
|
||||
<Link to="https://meruspower.com/">
|
||||
<Image src={MerusPower} alt="Merus Power" layout="responsive" width={200} height={100} objectFit="contain" />
|
||||
</Link>
|
||||
<Link to="https://www.ramboll.com/fi-fi">
|
||||
<Image src={Ramboll} alt="Ramboll" layout="responsive" width={200} height={100} objectFit="contain" />
|
||||
<Image src={Eaton} alt="Eaton" width={200} height={100} style={{ objectFit: "contain" }} />
|
||||
</Link>
|
||||
<Link to="https://www.ericsson.com/en">
|
||||
<Image src={Ericsson} alt="Ericsson" layout="responsive" width={200} height={100} objectFit="contain" />
|
||||
<Image src={Ericsson} alt="Ericsson" width={200} height={100} style={{ objectFit: "contain" }} />
|
||||
</Link>
|
||||
<Link to="https://www.saab.com/fi/markets/finland">
|
||||
<Image src={Saab} alt="Saab" width={200} height={100} style={{ objectFit: "contain" }} />
|
||||
</Link>
|
||||
<Link to="https://www.stul.fi/">
|
||||
<Image src={STUL} alt="STUL" width={200} height={100} style={{ objectFit: "contain" }} />
|
||||
</Link>
|
||||
<Link to="https://www.metso.com/fi/">
|
||||
<Image src={Metso} alt="Metso" width={200} height={100} style={{ objectFit: "contain" }} />
|
||||
</Link>
|
||||
</div>
|
||||
<Link to="/yritysyhteistyo">Haluatko kuulla lisää yhteistyöstä kanssamme?</Link>
|
||||
|
||||
@@ -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;
|
||||
@@ -19,6 +19,19 @@ const MembershipPageView: React.FC = () => (
|
||||
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>
|
||||
@@ -36,6 +49,11 @@ 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>
|
||||
</>
|
||||
|
||||
@@ -11,6 +11,7 @@ const RentPageView: React.FC = () => (
|
||||
<li>Mökämasiina <a href="https://static.sahkoinsinoorikilta.fi/img/equipment/mokamasiina.jpg">kuva</a> 50 €/päivä</li>
|
||||
<li>SIK-Teltta <a href="https://sik.kuvat.fi/kuvat/2021/Varaslähtö/Varaslähtö-Suvi-Karanta-16.jpg">kuva</a> 50 €/päivä</li>
|
||||
<li>Gongi ilmainen</li>
|
||||
<li>Kyykkäsetti 10 €</li>
|
||||
<li>80 kpl kevytpeitteet</li>
|
||||
<ul>
|
||||
<li>Alle 5 kpl ilmainen</li>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React from "react";
|
||||
import Image from "next/legacy/image";
|
||||
import Image from "next/image";
|
||||
import {
|
||||
CTASection, TextSection, PageLink, Link,
|
||||
} from "@components/index";
|
||||
@@ -81,8 +81,7 @@ const StudiesPageView: React.FC = () => (
|
||||
alt="Ville Viikari"
|
||||
width={300}
|
||||
height={150}
|
||||
layout="responsive"
|
||||
objectFit="contain"
|
||||
style={{ objectFit: "contain" }}
|
||||
/>
|
||||
<h6>Ville Viikari</h6>
|
||||
<p>
|
||||
|
||||
@@ -9,3 +9,4 @@ services:
|
||||
order: start-first
|
||||
ports:
|
||||
- 3000:3000
|
||||
|
||||
|
||||
+1
-1
@@ -8,5 +8,5 @@
|
||||
},
|
||||
"skipJsErrors": true,
|
||||
"appCommand": "npm run serve",
|
||||
"appInitDelay": 2000
|
||||
"appInitDelay": 10000
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Selector } from "testcafe";
|
||||
import {
|
||||
getSiteRoot, getPageUrl, deleteForm, doLogin, generateAccessToken, getPostRequestLogger, waitForLogger
|
||||
getSiteRoot, getPageUrl, deleteForm, doLogin, generateAccessToken, getPostRequestLogger, waitForLogger,
|
||||
} from "../utils";
|
||||
|
||||
const LOGGER = getPostRequestLogger("signupForm/");
|
||||
|
||||
@@ -159,10 +159,10 @@ export const generateTestEvent = async (formIds = [], jwt_access: string) => (
|
||||
export const sleep = async (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
||||
|
||||
export const waitForLogger = async (logger: RequestLogger) => {
|
||||
for (let i = 0; i < 50; i++) {
|
||||
for (let i = 0; i < 50; i += 1) {
|
||||
await sleep(100);
|
||||
if (logger.requests.length > 0 ) {
|
||||
return;
|
||||
if (logger.requests.length > 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
"esModuleInterop": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "preserve",
|
||||
"jsx": "react-jsx",
|
||||
"lib": [
|
||||
"dom",
|
||||
"esnext"
|
||||
|
||||
Reference in New Issue
Block a user