Compare commits

...

138 Commits

Author SHA1 Message Date
einstein 6af5d7fa1f Fix CI build SSG timeouts
- Add backend request timeout to prevent hanging builds

- Make getStaticProps resilient to API failures

- Avoid build-time crawling for dynamic routes (blocking fallback)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-26 18:47:04 +03:00
Your Name 1df9b22fa3 lint fixes 2026-05-25 18:57:55 +03:00
Your Name 17713d4f9d picutre updates for 2026 fuksis 2026-05-25 18:56:26 +03:00
toimistokone d0a930794e fix poop overflow 2026-03-23 14:13:09 +02:00
toimistokone 170e7b3c31 hallitusbigpick 2026-03-18 14:56:02 +02:00
jadera 20f39b545d allow ... operator 2026-03-11 12:04:30 +02:00
jadera 22454369fd xd 2026-03-11 11:56:44 +02:00
jadera 7a9805ebe9 kappaa 2026-03-11 11:52:18 +02:00
jadera 4c69a4620d to detect source 2026-03-11 11:44:37 +02:00
jadera ae28ec183e 2026 prosik,oltermanni,ansiomerkit 2026-03-10 22:35:16 +02:00
Aarni Halinen b49e9e70b2 add hyphens to cards if text needs breaks 2026-03-10 21:10:43 +02:00
toimistokone 4510bb08d8 eslint xD 2026-03-10 21:10:43 +02:00
toimistokone 0825d87d0f antibot 2026-03-10 17:27:16 +02:00
J4DER4 bcad873b97 Merge branch 'atte-temp-2' into 'production'
Fixed typos in committees (again)

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!201
2026-02-27 20:48:29 +00:00
Atte Elo f6a5080769 Update 5 files
- /src/views/CommitteePage/ltmk.json
- /src/views/CommitteePage/mtmk.json
- /src/views/CommitteePage/ptmk.json
- /src/views/CommitteePage/sicc.json
- /src/views/CommitteePage/vtmk.json
2026-02-27 19:50:24 +00:00
J4DER4 e3d3b736f1 Merge branch 'boardimg26' into 'production'
change board images howth his work

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!199
2026-02-16 18:38:02 +00:00
jadera 56c509b4c1 change board images howth his work 2026-02-16 20:27:12 +02:00
J4DER4 771b9eb391 Merge branch 'comiteeentries' into 'production'
Comitee entries

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!198
2026-02-13 16:52:53 +00:00
J4DER4 75cf2e2ce1 Comitee entries 2026-02-13 16:52:53 +00:00
J4DER4 4fe78fd96d Merge branch 'master' into 'production'
Change board members for 2026

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!196
2026-01-06 18:26:03 +00:00
J4DER4 50fd27d193 Change board members for 2026 2026-01-06 18:26:02 +00:00
J4DER4 6cb18c4a13 Merge branch 'master' into 'production'
Master

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!194
2025-11-21 19:23:29 +00:00
SimeonPursiainen 2009a65f55 Added silver honoraries for 2025 2025-10-28 14:13:21 +02:00
Justus Ojala c22bad5718 Use secure websockets for mqtt 2025-10-14 17:59:55 +03:00
Justus Ojala 4fbec0b85c Do not try to connect to MQTT if host undefined 2025-10-14 08:41:25 +03:00
Justus Ojala 81be5a1e60 Merge branch 'Coffeescale' into 'master'
Coffeescale

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!193
2025-10-13 22:02:53 +03:00
Justus Ojala 80ccf1bc66 Coffeescale 2025-10-13 22:02:53 +03:00
Justus Ojala d75c6b4756 Rename submitKey to submit_id 2025-10-13 19:38:28 +03:00
SimeonPursiainen 69c06636ab Fix link for freshmen page on the homepage 2025-10-07 11:43:41 +03:00
Simeon Pursiainen 3c72152704 Merge branch 'textFix' into 'production'
Textfix

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!191
2025-09-24 13:00:08 +03:00
Justus Ojala 42ce058dc9 Update guild room custodians 2025-09-23 21:38:58 +03:00
SimeonPursiainen 2ad2907f5f Fixup 2025-09-23 21:27:48 +03:00
SimeonPursiainen f61fc155a8 Updated membership fee payment info 2025-09-23 21:18:20 +03:00
SimeonPursiainen 67627d4d16 Clearer instructions for membership payments 2025-09-23 20:54:32 +03:00
Justus Ojala 4639397d25 Merge branch 'signup_duplicate_prevention' into 'master'
Add submission key to frontend to prevent duplicate signups

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

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!188
2025-09-11 21:21:13 +03:00
Simeon Pursiainen e4784e1932 Master 2025-09-11 21:21:13 +03:00
Simeon Pursiainen b80942ee53 Merge branch 'New_visual' into 'master'
New visual

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

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!186
2025-09-11 20:10:29 +03:00
Simeon Pursiainen c12d4c1e73 New visual 2025-09-11 20:10:29 +03:00
Simeon Pursiainen c015f0a275 Merge branch 'master' into 'production'
touch d'andre

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!185
2025-09-09 19:18:11 +03:00
Simeon Pursiainen 6a9cb63cff touch d'andre 2025-09-09 19:18:11 +03:00
SimeonPursiainen 453d20d345 Added kyykkäsetti to rentpage 2025-09-09 19:05:15 +03:00
Simeon Pursiainen 5007d443e7 Merge branch 'master' into 'production'
Fixup

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!184
2025-09-09 14:42:39 +03:00
SimeonPursiainen 7abb7dc414 Fixup 2025-09-09 13:36:16 +03:00
Simeon Pursiainen 648c49582e Merge branch 'master' into 'production'
Changed instructions for job ads

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!183
2025-09-05 12:30:03 +03:00
SimeonPursiainen 103f2b163a Changed instructions for job ads 2025-09-05 12:15:15 +03:00
Simeon Pursiainen c50a09c691 Merge branch 'master' into 'production'
added new media card for sosso

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!182
2025-09-02 16:55:36 +03:00
SimeonPursiainen fda39d7372 added new media card for sosso 2025-09-02 16:42:35 +03:00
Simeon Pursiainen 2b75f5a567 Merge branch 'master' into 'production'
Added Metso to sponsors

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!181
2025-09-01 20:04:25 +03:00
SimeonPursiainen 3689dbc60c Added Metso to sponsors 2025-09-01 19:52:02 +03:00
Simeon Pursiainen 4e27d892d5 Merge branch 'master' into 'production'
fix stack compose

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!180
2025-09-01 19:29:30 +03:00
SimeonPursiainen 80a961d1f9 fix stack compose 2025-09-01 19:15:28 +03:00
Simeon Pursiainen 0a36c1c233 Merge branch 'master' into 'production'
removing replicas

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!179
2025-09-01 18:57:43 +03:00
SimeonPursiainen db8c8ea2b9 removing replicas 2025-09-01 18:42:42 +03:00
Simeon Pursiainen 9459930291 Merge branch 'master' into 'production'
Separate eng and international fuksi pages

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!177
2025-08-16 14:51:57 +03:00
Justus Ojala cea106b134 Separate eng and international fuksi pages 2025-08-16 14:51:57 +03:00
Justus Ojala a854de921b Merge branch 'text-fix' into 'master'
Reverse captain name order to match photo

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!178
2025-08-16 14:13:05 +03:00
Justus Ojala 9c8a2eb4ce Reverse captain name order to match photo 2025-08-16 14:13:05 +03:00
Justus Ojala ff558534a0 Merge branch 'revert-eng-freshmen' into 'master'
Revert eng freshmen page

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!176
2025-08-16 13:34:46 +03:00
Justus Ojala 56531b1cfc Revert eng freshmen page 2025-08-16 13:27:06 +03:00
Justus Ojala a7c297354f Merge branch 'update-links' into 'master'
Update links on international freshman page

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!175
2025-08-16 12:56:02 +03:00
Justus Ojala ff5da7a131 Update links on international freshman page 2025-08-16 12:27:35 +03:00
Justus Ojala 7412b652c1 Merge branch 'separate-eng-and-intl-pages' into 'master'
Separate eng and intl pages

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!174
2025-08-16 12:17:13 +03:00
Justus Ojala eb64777252 Separate eng and intl pages 2025-08-16 12:17:13 +03:00
Simeon Pursiainen af9b115205 Merge branch 'master' into 'production'
Master

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!173
2025-08-13 21:16:40 +03:00
Justus Ojala 73869a4c15 Merge branch 'for-freshmen-update-20250813' into 'master'
Update "for feshmen" page

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!172
2025-08-13 20:35:09 +03:00
Justus Ojala b6e0e5ea36 Update "for feshmen" page 2025-08-13 20:35:09 +03:00
Simeon Pursiainen 7ed7849c43 Merge branch 'master' into 'production'
FIx fopas links

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!171
2025-07-15 21:41:51 +03:00
Simeon Pursiainen 96a591b1c5 Merge branch 'production' into 'master'
# Conflicts:
#   src/views/ForFreshmenPage/ForFreshmenPageHero.tsx
2025-07-15 21:29:15 +03:00
SimeonPursiainen 19ad40b969 fopas links fix 2025-07-15 20:43:11 +03:00
SimeonPursiainen 482be66b43 new links for fopas 2025-07-09 20:58:23 +03:00
SimeonPursiainen 5439ff9a56 fixing lint 2025-07-02 07:36:43 +03:00
SimeonPursiainen b7c06890fe english fuksipoint guide 2025-07-02 07:35:57 +03:00
SimeonPursiainen cdff86c0f3 english fuksiguide 2025-07-02 07:34:19 +03:00
SimeonPursiainen 984966f3af added replica in case of a failure 2025-07-01 20:56:44 +03:00
SimeonPursiainen fe015c3bce testing force push to refresh site 2025-07-01 19:37:07 +03:00
Simeon Pursiainen a570fde9d7 Merge branch 'master' into 'production'
Translate the freshman page hero

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!170
2025-06-26 07:22:24 +03:00
SimeonPursiainen c683b2d61a removed ramboll from sponsors 2025-06-26 06:51:13 +03:00
SimeonPursiainen c23200401f edited ForFreshmenPage 2025-06-26 06:48:37 +03:00
SimeonPursiainen 827eab0531 edited english freshmen page 2025-06-26 06:47:44 +03:00
Justus Ojala 1ee25d3447 Merge branch '60-forfreshmen' into 'master'
Translate the freshman page hero

Closes #60

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!168
2025-06-24 20:47:28 +03:00
Simeon Pursiainen e62017691c Merge branch 'master' into 'production'
added 2025 fuksiopas

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!169
2025-06-24 18:48:02 +03:00
SimeonPursiainen c116ea27cc added 2025 fuksiopas 2025-06-24 18:12:07 +03:00
Justus Ojala eb67fedde4 Merge branch 'master' into '60-forfreshmen'
# Conflicts:
#   src/views/FreshmenPage/FreshmenPageView.tsx
2025-06-23 21:49:35 +03:00
SimeonPursiainen 006a2dd548 commit5 2025-06-17 22:55:52 +03:00
SimeonPursiainen 49bb413424 commit5 2025-06-17 22:54:32 +03:00
SimeonPursiainen be4358b128 commit4 2025-06-17 22:43:13 +03:00
SimeonPursiainen db662959aa commit3 2025-06-17 22:42:05 +03:00
SimeonPursiainen 58b3e9594a commit2 2025-06-17 22:39:00 +03:00
SimeonPursiainen a120d7580d edited for freshmen 2025-06-17 22:32:25 +03:00
Simeon Pursiainen 7b2393142f Merge branch 'master' into 'production'
updated corporate logos

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!167
2025-06-16 20:47:13 +03:00
SimeonPursiainen 110ea83dc5 updated corporate logos 2025-06-12 20:44:16 +03:00
Simeon Pursiainen d4bdeeb9ae Merge branch 'master' into 'production'
Master

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!166
2025-06-04 20:12:56 +03:00
SimeonPursiainen 2a44d99814 Removed Merus Power logo from frontpage 2025-06-04 19:57:06 +03:00
SimeonPursiainen 4e56f5d832 same 2025-06-04 19:55:09 +03:00
SimeonPursiainen 5ed2bfcbec same as previous 2025-06-04 19:52:14 +03:00
SimeonPursiainen 9195bd2d59 Edited fukseille-page 2025-06-04 19:49:11 +03:00
SimeonPursiainen a50f6d2562 New picture for Kipparit 2025-05-25 21:08:36 +03:00
Simeon Pursiainen ead8465673 Merge branch 'master' into 'production'
Master

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!165
2025-05-25 18:41:27 +03:00
SimeonPursiainen 749acccb07 Cleaning "fukseille" page 2025-05-25 18:20:30 +03:00
SimeonPursiainen 5ef98ae1f5 New FTMK 2025-05-25 18:18:37 +03:00
SimeonPursiainen c449d2e1d0 same as previous commit 2025-05-25 14:08:33 +03:00
SimeonPursiainen c8b846f518 new tg groupchat links 2025-05-25 13:48:19 +03:00
SimeonPursiainen a80e92dcd4 updated telegram links 2025-05-22 22:21:02 +03:00
Justus Ojala 95f02de0ae Translate the ISO section 2025-05-20 21:42:29 +03:00
Justus Ojala b16ea3d5de Translate the freshman page hero
also removed the link to the bachelor programme info package. It is in finnish only, and is largely not applicable to exchange students and master fuksis
2025-05-20 21:21:50 +03:00
Justus Ojala bad9ace8c8 Copy content of finnish freshmen page to english freshmen page 2025-05-20 21:13:55 +03:00
Simeon Pursiainen 1a2a870f18 Merge branch 'master' into 'production'
Master

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!164
2025-05-17 13:23:18 +03:00
Simeon Pursiainen 34d8213156 Master 2025-05-17 13:23:17 +03:00
SimeonPursiainen 238508f875 added member application link 2025-05-17 11:36:47 +03:00
SimeonPursiainen 0fdc1aef3a freshmen page 2025-05-16 23:59:28 +03:00
SimeonPursiainen 71f209edde english page update 2025-05-16 23:28:54 +03:00
SimeonPursiainen 3181cede9b Added english page for freshmen 2025-05-16 23:15:04 +03:00
Simeon Pursiainen 2579cd4763 Merge branch 'master' into 'production'
Revert "Merge branch 'master' of gitlab.com:sahkoinsinoorikilta/vtmk/web2.0-frontend"

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!163
2025-05-16 22:41:30 +03:00
Simeon Pursiainen 63209bbf20 Merge branch 'production' into 'master'
# Conflicts:
#   src/views/FreshmenPage/FreshmenPageView.tsx
2025-05-16 22:29:22 +03:00
SimeonPursiainen 047c8656ac updated tg-links 2025-05-12 23:21:33 +03:00
SimeonPursiainen e16a3bb8fc changes 2025-05-12 23:05:43 +03:00
SimeonPursiainen 9b34d77c42 Changed links 2025-05-12 23:03:18 +03:00
SimeonPursiainen a76ba2b1df removed due to abuse 2025-05-12 22:35:59 +03:00
Simeon Pursiainen 5b59d36f76 Merge branch 'fix_next_version' into 'master'
Revert "audit" to fix next update try 2

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!159
2025-05-12 17:46:31 +03:00
Joona M b381400903 Revert "audit" to fix next update try 2
This reverts commit 7280edb99f.
2025-05-12 17:32:34 +03:00
Simeon Pursiainen de93bb2a05 allow audit failure 2025-05-04 09:06:19 +03:00
Simeon Pursiainen 4a6b8093bc Merge branch 'production' into 'master'
Production

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!157
2025-05-03 21:02:45 +03:00
Simeon Pursiainen d381e39f0f Production 2025-05-03 21:02:45 +03:00
Simeon Pursiainen acb335e010 sponsors 2025-05-03 20:48:28 +03:00
Simeon Pursiainen c630ebdb4d Merge branch 'revert-e1e06f18' into 'master'
Revert "Merge branch 'master' of gitlab.com:sahkoinsinoorikilta/vtmk/web2.0-frontend"

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!156
2025-05-03 20:40:58 +03:00
Simeon Pursiainen 504b035b2a Revert "Merge branch 'master' of gitlab.com:sahkoinsinoorikilta/vtmk/web2.0-frontend"
This reverts commit e1e06f185e
2025-05-03 20:33:33 +03:00
SimeonPursiainen 15843d8970 edit 2025-05-03 20:31:36 +03:00
Simeon Pursiainen d34e371d37 Edit FrontPageView.tsx 2025-05-03 20:06:46 +03:00
Simeon Pursiainen e1e06f185e Merge branch 'master' of gitlab.com:sahkoinsinoorikilta/vtmk/web2.0-frontend 2025-05-03 19:42:16 +03:00
SimeonPursiainen a39e6fec4d updated email link 2025-04-19 16:28:15 +03:00
Simeon Pursiainen f7a65fabc0 Merge branch 'revert-33ebf456' into 'master'
Revert "updated sponsors"

See merge request sahkoinsinoorikilta/vtmk/web2.0-frontend!152
2025-04-07 22:27:43 +03:00
Simeon Pursiainen fbe20594dd Revert "updated sponsors" 2025-04-07 22:27:43 +03:00
Simeon Pursiainen 7280edb99f audit 2025-04-06 12:25:31 +03:00
Simeon Pursiainen 613732aed2 Updated contacts 2025-04-06 11:52:17 +03:00
60 changed files with 2904 additions and 937 deletions
+1
View File
@@ -1,3 +1,4 @@
NEXT_PUBLIC_DEPLOY_ENV=local NEXT_PUBLIC_DEPLOY_ENV=local
NEXT_PUBLIC_API_URL=https://api.dev.sahkoinsinoorikilta.fi/api NEXT_PUBLIC_API_URL=https://api.dev.sahkoinsinoorikilta.fi/api
NEXT_PUBLIC_SITE_URL=https://dev.sahkoinsinoorikilta.fi NEXT_PUBLIC_SITE_URL=https://dev.sahkoinsinoorikilta.fi
NEXT_MQTT_HOST=mqtt.dev.sahkoinsinoorikilta.fi
+6
View File
@@ -47,5 +47,11 @@ module.exports = {
"jsx-a11y/no-noninteractive-element-interactions": "off", "jsx-a11y/no-noninteractive-element-interactions": "off",
"jsx-a11y/no-static-element-interactions": "off", "jsx-a11y/no-static-element-interactions": "off",
"@typescript-eslint/default-param-last": "warn", "@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",
}, },
}; };
@@ -0,0 +1,78 @@
---
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 #!/bin/sh
. "$(dirname "$0")/_/husky.sh" . "$(dirname "$0")/_/husky.sh"
npm run lint npm run lint:es
+999 -59
View File
File diff suppressed because it is too large Load Diff
+6 -1
View File
@@ -72,6 +72,7 @@
"fast-deep-equal": "^3.1.3", "fast-deep-equal": "^3.1.3",
"js-cookie": "^3.0.1", "js-cookie": "^3.0.1",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mqtt": "^5.14.1",
"next": "^13.1.6", "next": "^13.1.6",
"normalize.css": "^8.0.1", "normalize.css": "^8.0.1",
"react": "^18.2.0", "react": "^18.2.0",
@@ -89,7 +90,11 @@
"sharp": "^0.30.3", "sharp": "^0.30.3",
"shortid": "^2.2.16", "shortid": "^2.2.16",
"styled-components": "^5.3.5", "styled-components": "^5.3.5",
"swr": "^1.2.2" "swr": "^1.2.2",
"uuid": "^13.0.0"
},
"engines": {
"node": "16"
}, },
"overrides": { "overrides": {
"react-mde": { "react-mde": {
+3
View File
@@ -1,8 +1,11 @@
import axios, { AxiosInstance, AxiosRequestConfig } from "axios"; import axios, { AxiosInstance, AxiosRequestConfig } from "axios";
import { getAccessTokenCookie } from "@utils/auth"; import { getAccessTokenCookie } from "@utils/auth";
const API_TIMEOUT_MS = 10000;
const axiosInstance: AxiosInstance = axios.create({ const axiosInstance: AxiosInstance = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_URL, baseURL: process.env.NEXT_PUBLIC_API_URL,
timeout: API_TIMEOUT_MS,
}); });
export enum APIPath { export enum APIPath {
+1
View File
@@ -43,6 +43,7 @@ const StyledCard = styled.article`
} }
h3 { h3 {
hyphens: auto;
padding: 0.5rem; padding: 0.5rem;
font-size: 1.5rem; font-size: 1.5rem;
font-weight: 300; font-weight: 300;
+1 -1
View File
@@ -12,8 +12,8 @@ interface DropDownBoxProps {
const Box = styled.div` const Box = styled.div`
background-color: ${colors.white}; background-color: ${colors.white};
border: 1px solid ${colors.black}; border: 1px solid ${colors.black};
margin-top: 0.8rem;
position: absolute; position: absolute;
/* margin-top: 0.8rem; hides cool onhover effect but fixes a gap problem */
left: 0; left: 0;
top: 2.5rem; top: 2.5rem;
z-index: 20; z-index: 20;
+30
View File
@@ -1,6 +1,7 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { Link } from "@components/index"; import { Link } from "@components/index";
import Icon, { IconType } from "@components/Icon";
import colors from "@theme/colors"; import colors from "@theme/colors";
import breakpoints from "@theme/breakpoints"; import breakpoints from "@theme/breakpoints";
@@ -28,6 +29,7 @@ const Content = styled.div`
h4 { h4 {
color: ${colors.lightBlue}; color: ${colors.lightBlue};
padding: 1.5rem 0; padding: 1.5rem 0;
text-align: center;
} }
a { 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 = () => ( const FooterContent: React.FC = () => (
<Content> <Content>
<div> <div>
@@ -90,6 +113,13 @@ const FooterContent: React.FC = () => (
<Link to="https://sik.kuvat.fi">Kuvagalleria</Link> <Link to="https://sik.kuvat.fi">Kuvagalleria</Link>
<Link to="https://static.sahkoinsinoorikilta.fi/logot-ja-grafiikka/">Logot ja grafiikka</Link> <Link to="https://static.sahkoinsinoorikilta.fi/logot-ja-grafiikka/">Logot ja grafiikka</Link>
</div> </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> </Columns>
</MarginSpace> </MarginSpace>
</div> </div>
+7
View File
@@ -26,6 +26,13 @@ const Sticky = styled.div<{ $isHidden?: boolean; $mobileMenuOpen?: boolean }>`
transition: all 200ms ease-out; transition: all 200ms ease-out;
height: ${(p) => (p.$mobileMenuOpen ? "100vh" : "unset")}; 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 ? (` ${(p) => (p.$isHidden ? (`
transition: all 200ms ease-in; transition: all 200ms ease-in;
transform: translateY(-100%); transform: translateY(-100%);
+14 -24
View File
@@ -11,7 +11,6 @@ export const renderNavigationItems = (mobile = false): JSX.Element => (
<NavbarDropdownLink to="/kilta" text="Kilta " exploded={mobile}> <NavbarDropdownLink to="/kilta" text="Kilta " exploded={mobile}>
<NavbarChildLink to="/kilta/toiminta">Toiminta</NavbarChildLink> <NavbarChildLink to="/kilta/toiminta">Toiminta</NavbarChildLink>
<NavbarChildLink to="/kilta/jasenyys">Jäsenyys</NavbarChildLink> <NavbarChildLink to="/kilta/jasenyys">Jäsenyys</NavbarChildLink>
<NavbarChildLink to="/kilta/fuksi">Fukseille</NavbarChildLink>
<NavbarChildLink to="/kilta/hallitus">Hallitus</NavbarChildLink> <NavbarChildLink to="/kilta/hallitus">Hallitus</NavbarChildLink>
<NavbarChildLink to="/kilta/toimihenkilot">Toimihenkilöt</NavbarChildLink> <NavbarChildLink to="/kilta/toimihenkilot">Toimihenkilöt</NavbarChildLink>
<NavbarChildLink to="/kilta/vuokraa">Vuokraa kalustoa</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="https://sik.kuvat.fi">Kuvagalleria</NavbarChildLink>
<NavbarChildLink to="/kilta/kilta-avustus">Kilta-avustus</NavbarChildLink> <NavbarChildLink to="/kilta/kilta-avustus">Kilta-avustus</NavbarChildLink>
</NavbarDropdownLink> </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="/opinnot_ja_ura" text="Opinnot ja ura" exploded={mobile} />
<NavbarDropdownLink to="/yritysyhteistyo" text="Yritysyhteistyö" exploded={mobile} /> <NavbarDropdownLink to="/yritysyhteistyo" text="Yritysyhteistyö" exploded={mobile} />
<NavbarDropdownLink to="/yhteystiedot" text="Yhteystiedot" 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} /> <NavbarDropdownLink to="/in_english" text="In English" exploded={mobile} />
</> </>
); );
const Nav = styled.div` const Nav = styled.div`
flex: 1 0 auto; flex: 1 0 auto;
display: flex; display: flex;
@@ -53,6 +56,11 @@ const Nav = styled.div`
@media screen and (max-width: ${breakpoints.mobile}) { @media screen and (max-width: ${breakpoints.mobile}) {
justify-content: center; justify-content: center;
margin-left: 0; 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 { 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` const MobileMenu = styled.div`
display: flex; display: flex;
margin: 0 1rem; margin: 0 1rem;
align-items: center;
cursor: pointer; cursor: pointer;
padding: 0 50%; /* Large clickable area horizontally cheeze */
span { span {
display: flex; display: flex;
@@ -99,9 +97,6 @@ const MobileMenu = styled.div`
display: none; display: none;
} }
@media screen and (max-width: ${breakpoints.mobile}) {
margin-left: 3rem;
}
`; `;
interface NavigationProps { interface NavigationProps {
@@ -115,13 +110,8 @@ const Navigation: React.FC<NavigationProps> = ({ onMobileMenuOpen }) => {
<DesktopContainer> <DesktopContainer>
{desktopItems} {desktopItems}
</DesktopContainer> </DesktopContainer>
<SomeContainer> <MobileMenu onClick={onMobileMenuOpen}>
<Icon name={IconType.Facebook} link="https://www.facebook.com/AaltoYliopistonSIK/" /> <Icon name={IconType.HamburgerMenu} />
<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> </MobileMenu>
</Nav> </Nav>
); );
+2 -2
View File
@@ -4,8 +4,8 @@ import colors from "@theme/colors";
import { renderNavigationItems } from "./Navigation"; import { renderNavigationItems } from "./Navigation";
const Nav = styled.nav` const Nav = styled.nav`
padding: 1rem 2rem; padding: 1rem 1rem;
padding-bottom: 20rem;
a { a {
fill: ${colors.lightBlue}; fill: ${colors.lightBlue};
color: ${colors.lightBlue}; color: ${colors.lightBlue};
+2 -1
View File
@@ -1,7 +1,8 @@
import { OptionTypes } from "@components/Widgets/SignupQuestionsWidget/common"; import { OptionTypes } from "@components/Widgets/SignupQuestionsWidget/common";
export interface Signup { export interface Signup {
id?: number; id?: number; // Database id for completed signup
submit_id?: string; // Signup request idempotency key
signupForm_id: number; signupForm_id: number;
answer: string; answer: string;
} }
+20 -23
View File
@@ -14,14 +14,13 @@ interface InitialProps {
const EventPage: NextPage<InitialProps> = ({ event }) => { const EventPage: NextPage<InitialProps> = ({ event }) => {
const router = useRouter(); const router = useRouter();
const { id } = router.query;
if (router.isFallback) return <LoadingView />; if (router.isFallback) return <LoadingView />;
return ( return (
<> <>
<Head> <Head>
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/events/${id}`} /> <link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/events/${event.id}`} />
</Head> </Head>
<PageWrapper> <PageWrapper>
<EventPageView event={event} /> <EventPageView event={event} />
@@ -30,36 +29,34 @@ const EventPage: NextPage<InitialProps> = ({ event }) => {
); );
}; };
export const getStaticPaths: GetStaticPaths = async () => { export const getStaticPaths: GetStaticPaths = async () => ({
const allEvents = await EventApi.getEvents(); paths: [],
const paths = allEvents.map((e: Event) => ({ fallback: "blocking",
params: { });
id: String(e.id),
},
}
));
return {
paths,
fallback: true,
};
};
export const getStaticProps: GetStaticProps<InitialProps> = async ({ params }) => { export const getStaticProps: GetStaticProps<InitialProps> = async ({ params }) => {
const { id } = params; const id = Number(params?.id);
let notFound = false; if (!id) {
let event: Event; return {
try { notFound: true,
event = await EventApi.getEvent(Number(id)); revalidate: 10,
} catch (err) { };
notFound = true;
} }
try {
const event = await EventApi.getEvent(id);
return { return {
props: { props: {
event, event,
}, },
revalidate: 10, // Required for deleting hidden pages revalidate: 10, // Required for deleting hidden pages
notFound,
}; };
} catch {
return {
notFound: true,
revalidate: 10,
};
}
}; };
export default EventPage; export default EventPage;
+19 -23
View File
@@ -14,14 +14,13 @@ interface InitialProps {
const FeedPage: NextPage<InitialProps> = ({ post }) => { const FeedPage: NextPage<InitialProps> = ({ post }) => {
const router = useRouter(); const router = useRouter();
const { id } = router.query;
if (router.isFallback) return <LoadingView />; if (router.isFallback) return <LoadingView />;
return ( return (
<> <>
<Head> <Head>
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/feed/${id}`} /> <link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/feed/${post.id}`} />
</Head> </Head>
<PageWrapper> <PageWrapper>
<FeedPageView post={post} /> <FeedPageView post={post} />
@@ -30,37 +29,34 @@ const FeedPage: NextPage<InitialProps> = ({ post }) => {
); );
}; };
export const getStaticPaths: GetStaticPaths = async () => { export const getStaticPaths: GetStaticPaths = async () => ({
const feed = await FeedApi.getFeed(); paths: [],
const paths = feed.map((post: Post) => ({ fallback: "blocking",
params: { });
id: String(post.id),
},
}
));
return {
paths,
fallback: true,
};
};
export const getStaticProps: GetStaticProps<InitialProps> = async ({ params }) => { export const getStaticProps: GetStaticProps<InitialProps> = async ({ params }) => {
const { id } = params; const id = Number(params?.id);
let notFound = false; if (!id) {
let post: Post; return {
try { notFound: true,
post = await FeedApi.getPost(Number(id)); revalidate: 10,
} catch (err) { };
notFound = true;
} }
try {
const post = await FeedApi.getPost(id);
return { return {
props: { props: {
post, post,
}, },
revalidate: 10, // Required for deleting hidden pages revalidate: 10, // Required for deleting hidden pages
notFound,
}; };
} catch {
return {
notFound: true,
revalidate: 10,
};
}
}; };
export default FeedPage; export default FeedPage;
+7 -4
View File
@@ -44,12 +44,15 @@ const InEnglishPage: NextPage<InitialProps> = ({ initialEvents, initialFeed }) =
}; };
export const getStaticProps: GetStaticProps<InitialProps> = async () => { export const getStaticProps: GetStaticProps<InitialProps> = async () => {
const initialEvents = await fetcher<Event[]>(eventApi); const [eventsResult, feedResult] = await Promise.allSettled([
const initialFeed = await fetcher<Post[]>(feedApi); fetcher<Event[]>(eventApi),
fetcher<Post[]>(feedApi),
]);
return { return {
props: { props: {
initialEvents, initialEvents: eventsResult.status === "fulfilled" ? eventsResult.value : [],
initialFeed, initialFeed: feedResult.status === "fulfilled" ? feedResult.value : [],
}, },
revalidate: 10, revalidate: 10,
}; };
+7 -4
View File
@@ -43,12 +43,15 @@ const FrontPage: NextPage<InitialProps> = ({ initialEvents, initialFeed }) => {
}; };
export const getStaticProps: GetStaticProps<InitialProps> = async () => { export const getStaticProps: GetStaticProps<InitialProps> = async () => {
const initialEvents = fetcher<Event[]>(eventApi); const [eventsResult, feedResult] = await Promise.allSettled([
const initialFeed = fetcher<Post[]>(feedApi); fetcher<Event[]>(eventApi),
fetcher<Post[]>(feedApi),
]);
return { return {
props: { props: {
initialEvents: await initialEvents, initialEvents: eventsResult.status === "fulfilled" ? eventsResult.value : [],
initialFeed: await initialFeed, initialFeed: feedResult.status === "fulfilled" ? feedResult.value : [],
}, },
revalidate: 10, revalidate: 10,
}; };
+18
View File
@@ -0,0 +1,18 @@
import React from "react";
import { NextPage } from "next";
import Head from "next/head";
import GuildroomPageView from "@views/GuildroomPage/GuildroomPageView";
import PageWrapper from "@views/common/PageWrapper";
const GuildroomPage: NextPage = () => (
<>
<Head>
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/kilta/guildroom`} />
</Head>
<PageWrapper>
<GuildroomPageView />
</PageWrapper>
</>
);
export default GuildroomPage;
+7 -6
View File
@@ -3,9 +3,7 @@ import { NextPage, GetStaticProps } from "next";
import Head from "next/head"; import Head from "next/head";
import useSWR from "swr"; import useSWR from "swr";
import Event from "@models/Event"; import Event from "@models/Event";
import EventApi from "@api/eventApi";
import Post from "@models/Feed"; import Post from "@models/Feed";
import FeedApi from "@api/feedApi";
import ActualPageView from "@views/ActualPage/ActualPageView"; import ActualPageView from "@views/ActualPage/ActualPageView";
import PageWrapper from "@views/common/PageWrapper"; import PageWrapper from "@views/common/PageWrapper";
import { fetcher, APIPath, API } from "@api/backend"; import { fetcher, APIPath, API } from "@api/backend";
@@ -40,12 +38,15 @@ const ActualPage: NextPage<InitialProps> = ({ initialEvents, initialFeed }) => {
}; };
export const getStaticProps: GetStaticProps<InitialProps> = async () => { export const getStaticProps: GetStaticProps<InitialProps> = async () => {
const initialEvents = await EventApi.getEvents(); const [eventsResult, feedResult] = await Promise.allSettled([
const initialFeed = await FeedApi.getFeed(); fetcher<Event[]>(eventApi),
fetcher<Post[]>(feedApi),
]);
return { return {
props: { props: {
initialEvents, initialEvents: eventsResult.status === "fulfilled" ? eventsResult.value : [],
initialFeed, initialFeed: feedResult.status === "fulfilled" ? feedResult.value : [],
}, },
revalidate: 10, revalidate: 10,
}; };
+18
View File
@@ -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;
+18
View File
@@ -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 = () => ( const FreshmenPage: NextPage = () => (
<> <>
<Head> <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> </Head>
<PageWrapper> <PageWrapper>
<FreshmenPageView /> <FreshmenPageView />
+59 -23
View File
@@ -13,6 +13,7 @@ import PageWrapper from "@views/common/PageWrapper";
import LoadingView from "@views/common/LoadingView"; import LoadingView from "@views/common/LoadingView";
import noop from "@utils/noop"; import noop from "@utils/noop";
import NotFoundPage from "@pages/404"; import NotFoundPage from "@pages/404";
import { v4 as uuid } from "uuid";
type InitialProps = { type InitialProps = {
initialForm: SignupForm; initialForm: SignupForm;
@@ -22,7 +23,11 @@ const FORM_URL = `${process.env.NEXT_PUBLIC_API_URL}/signupForm/`;
const SignUpPage: NextPage<InitialProps> = ({ initialForm }) => { const SignUpPage: NextPage<InitialProps> = ({ initialForm }) => {
const router = useRouter(); const router = useRouter();
const [honeypot, setHoneypot] = useState("");
const id = String(initialForm?.id ?? ""); const id = String(initialForm?.id ?? "");
const SUBMIT_ID = uuid(); // Submission key, generated on page refresh
const URL = `${FORM_URL}${id}/`; const URL = `${FORM_URL}${id}/`;
const { data: signupForm, error } = useSWR<SignupForm>(URL, (url) => axios.get(url).then((res) => res.data), { fallbackData: initialForm }); const { data: signupForm, error } = useSWR<SignupForm>(URL, (url) => axios.get(url).then((res) => res.data), { fallbackData: initialForm });
@@ -41,10 +46,23 @@ const SignUpPage: NextPage<InitialProps> = ({ initialForm }) => {
); );
} }
const onSubmit = async ({ formData }: ISubmitEvent<string>) => { 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 payload: Signup = { const payload: Signup = {
submit_id: SUBMIT_ID, // This is for preventing duplicate requests; NOT RELATED TO THE SIGNUP ID IN DATABASE
signupForm_id: signupForm.id, signupForm_id: signupForm.id,
answer: formData, answer: trackedForm,
}; };
try { try {
@@ -69,41 +87,59 @@ const SignUpPage: NextPage<InitialProps> = ({ initialForm }) => {
onChange={noop} onChange={noop}
onSubmit={onSubmit} 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> </PageWrapper>
</> </>
); );
}; };
export const getStaticPaths: GetStaticPaths = async () => { export const getStaticPaths: GetStaticPaths = async () => ({
const allForms = await SignupApi.getForms(); paths: [],
const paths = allForms.map((e: SignupForm) => ({ fallback: "blocking",
params: { });
id: String(e.id),
},
}
));
return {
paths,
fallback: true,
};
};
export const getStaticProps: GetStaticProps<InitialProps> = async ({ params }) => { export const getStaticProps: GetStaticProps<InitialProps> = async ({ params }) => {
const { id } = params; const id = Number(params?.id);
let notFound = false; if (!id) {
let initialForm: SignupForm; return {
try { notFound: true,
initialForm = await SignupApi.getForm(Number(id)); revalidate: 10,
} catch { };
notFound = true;
} }
try {
const initialForm = await SignupApi.getForm(id);
return { return {
props: { props: {
initialForm, initialForm,
}, },
revalidate: 10, // Required for deleting hidden pages revalidate: 10, // Required for deleting hidden pages
notFound,
}; };
} catch {
return {
notFound: true,
revalidate: 10,
};
}
}; };
export default SignUpPage; export default SignUpPage;
+5 -2
View File
@@ -30,10 +30,13 @@ const CorporatePage: NextPage<InitialProps> = ({ initialJobAds }) => {
}; };
export const getStaticProps: GetStaticProps<InitialProps> = async () => { export const getStaticProps: GetStaticProps<InitialProps> = async () => {
const initialJobAds = await fetcher<JobAd[]>(jobAdApi); const jobAdsResult = await Promise.allSettled([
fetcher<JobAd[]>(jobAdApi),
]);
return { return {
props: { props: {
initialJobAds, initialJobAds: jobAdsResult[0].status === "fulfilled" ? jobAdsResult[0].value : [],
}, },
revalidate: 10, revalidate: 10,
}; };
+18 -1
View File
@@ -38,10 +38,17 @@ const Container = styled.div`
} }
@media (max-width: 950px) { @media (max-width: 950px) {
width: 100vw; width: 80vw;
} }
`; `;
const BoardImage = styled.img`
width: 100%;
height: auto;
margin-bottom: 2rem;
border-radius: 8px;
`;
const ContactContainer = styled.div` const ContactContainer = styled.div`
overflow-x: hidden; overflow-x: hidden;
@media (max-width: 950px) { @media (max-width: 950px) {
@@ -54,6 +61,12 @@ const CommitteeContainer: React.FC<{
children: React.ReactNode; children: React.ReactNode;
}> = ({ committee, children }) => ( }> = ({ committee, children }) => (
<Container> <Container>
{committee.slug === "board" && (
<BoardImage
src="https://static.sahkoinsinoorikilta.fi/img/board/2026/Pota105_sikh26_webiin.jpg"
alt="Hallitus 2026"
/>
)}
<div> <div>
{committee.roles.map((role) => ( {committee.roles.map((role) => (
role.representatives.map((representative) => ( role.representatives.map((representative) => (
@@ -74,6 +87,7 @@ const CommitteeContainer: React.FC<{
); );
interface Committee { interface Committee {
slug: string;
name_fi: string; name_fi: string;
name_en: string; name_en: string;
roles: Array<Role>; roles: Array<Role>;
@@ -107,6 +121,9 @@ const BoardPageView: React.FC = () => (
</BlueLink> </BlueLink>
. .
</p> </p>
<p>
Muut yhteystiedot löydät <Link to="/yhteystiedot">täältä.</Link>
</p>
<p> <p>
{"Hallitukselle voi myös lähettää palautetta täyttämällä "} {"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"> <BlueLink to="https://docs.google.com/forms/d/e/1FAIpQLSeD8Hm66uvwr7Xa2WGgOCfI2RS1NrZsmISf2QBKUcJf_stv8g/viewform?usp=sf_link">
+40 -40
View File
@@ -1,6 +1,6 @@
{ {
"slug": "board", "slug": "board",
"name_fi": "Hallitus 2024", "name_fi": "Hallitus 2026",
"name_en": "Board", "name_en": "Board",
"roles": [ "roles": [
{ {
@@ -8,10 +8,10 @@
"name_en": "Chairman of the Board", "name_en": "Chairman of the Board",
"representatives": [ "representatives": [
{ {
"name": "Emma Uusküla", "name": "Sauli Hakala",
"phone_number": null, "phone_number": null,
"email": "emma.uuskula@sahkoinsinoorikilta.fi", "email": "sauli.hakala@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Emma.jpg" "image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/sauli.jpg"
} }
] ]
}, },
@@ -20,10 +20,10 @@
"name_en": "Vice Chair", "name_en": "Vice Chair",
"representatives": [ "representatives": [
{ {
"name": "Johannes Viirimäki", "name": "Eemeli Hintsanen",
"phone_number": null, "phone_number": null,
"email": "johannes.viirimaki@sahkoinsinoorikilta.fi", "email": "eemeli.hintsanen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Johannes.jpg" "image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/eemeli.jpg"
} }
] ]
}, },
@@ -32,10 +32,10 @@
"name_en": "Treasurer", "name_en": "Treasurer",
"representatives": [ "representatives": [
{ {
"name": "Nelli Liljasto", "name": "Nea Kanerva",
"phone_number": null, "phone_number": null,
"email": "nelli.liljasto@sahkoinsinoorikilta.fi", "email": "nea.kanerva@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Nelli.jpg" "image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/nea.jpg"
} }
] ]
}, },
@@ -44,10 +44,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Teemu Heikkinen", "name": "Aura Friman",
"phone_number": null, "phone_number": null,
"email": "teemu.heikkinen@sahkoinsinoorikilta.fi", "email": "aura.friman@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Teemu.jpg" "image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/aura.jpg"
} }
] ]
}, },
@@ -56,10 +56,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Henri Aito", "name": "Antti Salpakari",
"phone_number": null, "phone_number": null,
"email": "henri.aito@sahkoinsinoorikilta.fi", "email": "antti.salpakari@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Henri.jpg" "image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/antti.jpg"
} }
] ]
}, },
@@ -68,10 +68,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Tuomas Rantamäki", "name": "Aino Saarela",
"phone_number": null, "phone_number": null,
"email": "tuomas.rantamaki@sahkoinsinoorikilta.fi", "email": "aino.saarela@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/TuomasR.jpg" "image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/aino_sa.jpg"
} }
] ]
}, },
@@ -80,10 +80,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Matilda Ahonen", "name": "Rosanna Reims",
"phone_number": null, "phone_number": null,
"email": "matilda.ahonen@sahkoinsinoorikilta.fi", "email": "rosanna.reims@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Matilda.jpg" "image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/rosanna.jpg"
} }
] ]
}, },
@@ -92,10 +92,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Niklas Ritalahti", "name": "Valentin Juhela",
"phone_number": null, "phone_number": null,
"email": "niklas.ritalahti@sahkoinsinoorikilta.fi", "email": "valentin.juhela@sahkoinsinoorikilta.fi",
"image": "" "image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/valentin.jpg"
} }
] ]
}, },
@@ -104,10 +104,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Mikael Vatiainen", "name": "Elida Widgren",
"phone_number": null, "phone_number": null,
"email": "mikael.vatiainen@sahkoinsinoorikilta.fi", "email": "elida.widgren@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Mikael.jpg" "image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/elida.jpg"
} }
] ]
}, },
@@ -116,10 +116,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Simeon Pursiainen", "name": "Joona Maaranen",
"phone_number": null, "phone_number": null,
"email": "simeon.pursiainen@sahkoinsinoorikilta.fi", "email": "joona.maaranen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Simeon.jpg" "image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/joona.jpg"
} }
] ]
}, },
@@ -128,10 +128,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Markus Aaltio", "name": "Jere Oinonen",
"phone_number": null, "phone_number": null,
"email": "markus.aaltio@sahkoinsinoorikilta.fi", "email": "jere.oinonen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Markus.jpg" "image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/jere.jpg"
} }
] ]
}, },
@@ -140,10 +140,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Tuomas Hintikka", "name": "Into Saarinen",
"phone_number": null, "phone_number": null,
"email": "tuomas.hintikka@sahkoinsinoorikilta.fi", "email": "into.saarinen@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/TuomasH.jpg" "image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/into.jpg"
} }
] ]
}, },
@@ -152,10 +152,10 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Yassine Ramid", "name": "Aino Svahn",
"phone_number": null, "phone_number": null,
"email": "yassine.ramid@sahkoinsinoorikilta.fi", "email": "aino.svahn@sahkoinsinoorikilta.fi",
"image": "https://static.sahkoinsinoorikilta.fi/img/board/Yassine.jpg" "image": "https://static.sahkoinsinoorikilta.fi/img/board/2026/aino_sv.jpg"
} }
] ]
} }
@@ -16,6 +16,9 @@ import YtmkJson from "./ytmk.json";
import SwtmkJson from "./swtmk.json"; import SwtmkJson from "./swtmk.json";
import VtmkJson from "./vtmk.json"; import VtmkJson from "./vtmk.json";
import LtmkJson from "./ltmk.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"; import Others from "./others.json";
const orderedCommittees = [ const orderedCommittees = [
@@ -31,6 +34,9 @@ const orderedCommittees = [
VtmkJson, VtmkJson,
SwtmkJson, SwtmkJson,
NtmkJson, NtmkJson,
SiccJson,
SptmkJson,
PotatmkJson,
Others, Others,
]; ];
+6 -6
View File
@@ -9,7 +9,7 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Teemu Heikkinen" "name": "Aura Friman"
} }
] ]
}, },
@@ -18,7 +18,7 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Henri Aito" "name": "Antti Salpakari"
} }
] ]
}, },
@@ -27,10 +27,10 @@
"name_en": "International Fuksi Captain", "name_en": "International Fuksi Captain",
"representatives": [ "representatives": [
{ {
"name": "Markus Aaltio" "name": "Jere Oinonen"
}, },
{ {
"name": "Apollo Ailus" "name": "Hocine Montenez"
} }
] ]
}, },
@@ -39,7 +39,7 @@
"name_en": "Tutor Coordinator", "name_en": "Tutor Coordinator",
"representatives": [ "representatives": [
{ {
"name": "Axel Aurola" "name": "Veera Lindroos"
} }
] ]
}, },
@@ -48,7 +48,7 @@
"name_en": "International Tutor Coordinator", "name_en": "International Tutor Coordinator",
"representatives": [ "representatives": [
{ {
"name": "Igor Oinonen" "name": "Janne Yrjölä"
} }
] ]
} }
+13 -10
View File
@@ -9,7 +9,7 @@
"name_en": "Master of Ceremonies", "name_en": "Master of Ceremonies",
"representatives": [ "representatives": [
{ {
"name": "Tuomas Rantamäki" "name": "Aino Saarela"
} }
] ]
}, },
@@ -18,7 +18,7 @@
"name_en": "Court Counsellor", "name_en": "Court Counsellor",
"representatives": [ "representatives": [
{ {
"name": "Matilda Ahonen" "name": "Rosanna Reims"
} }
] ]
}, },
@@ -27,16 +27,13 @@
"name_en": "Hostess", "name_en": "Hostess",
"representatives": [ "representatives": [
{ {
"name": "Veera Lindroos" "name": "Elina Pyylampi"
}, },
{ {
"name": "Aino Saarela" "name": "Elle Leivo"
}, },
{ {
"name": "Nea Kanerva" "name": "Emma Salmenaho"
},
{
"name": "Rosanna Reims"
} }
] ]
}, },
@@ -45,10 +42,16 @@
"name_en": "Host", "name_en": "Host",
"representatives": [ "representatives": [
{ {
"name": "Eemeli Hintsanen" "name": "Aleksi Nuutinen"
}, },
{ {
"name": "André Palosaari" "name": "Juho Rosnell"
},
{
"name": "Julius Härkönen"
},
{
"name": "Joonas Hilvo"
} }
] ]
} }
+25 -23
View File
@@ -9,7 +9,7 @@
"name_en": "Master of Wellbeing", "name_en": "Master of Wellbeing",
"representatives": [ "representatives": [
{ {
"name": "Niklas Ritalahti" "name": "Valentin Juhela"
} }
] ]
}, },
@@ -18,22 +18,13 @@
"name_en": "Culture Representative", "name_en": "Culture Representative",
"representatives": [ "representatives": [
{ {
"name": "Peter Lindahl" "name": "Johannes Viirimäki"
}, },
{ {
"name": "Kuura Janhunen" "name": "Linnea Viitasalo"
}, },
{ {
"name": "Valentin Juhela" "name": "Matilda Ahonen"
},
{
"name": "Leevi Leinonen"
},
{
"name": "Milla Heino"
},
{
"name": "Hocine Montenez"
} }
] ]
}, },
@@ -42,10 +33,13 @@
"name_en": "Sports Representative", "name_en": "Sports Representative",
"representatives": [ "representatives": [
{ {
"name": "Matias Hendolin" "name": "Aino Salmi"
}, },
{ {
"name": "Sauli Hakala" "name": "Eeda Alasaari"
},
{
"name": "Iiris Kuulusa"
} }
] ]
}, },
@@ -54,10 +48,10 @@
"name_en": "Guild Room Representative", "name_en": "Guild Room Representative",
"representatives": [ "representatives": [
{ {
"name": "Justus Ojala" "name": "Milja Kuusela"
}, },
{ {
"name": "Aaro Rasilainen" "name": "Tuomas Rantamäki"
} }
] ]
}, },
@@ -66,15 +60,17 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Tommi Sytelä" "name": "Arvi Virkkunen"
}, },
{ {
"name": "Konsta Hakala" "name": "Auli Purolinna"
}, },
{ {
"name": "Ville Lairila" "name": "Ville Lairila"
},
{
"name": "Tiitus Koski"
} }
] ]
}, },
{ {
@@ -82,16 +78,22 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Saara Rossi" "name": "Teemu Heikkinen"
}, },
{ {
"name": "Aaron Löfgren" "name": "Aaron Löfgren"
}, },
{ {
"name": "Milla Heino" "name": "Matilda Ahonen"
}
]
}, },
{ {
"name": "Sauli Hakala" "name_fi": "Kiltamuori",
"name_en": "",
"representatives": [
{
"name": "Markus Aaltio"
} }
] ]
} }
+15 -12
View File
@@ -9,7 +9,7 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Leevi Oikarinen" "name": "Aino Salmi"
} }
] ]
}, },
@@ -18,19 +18,16 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Aino Salmi" "name": "Alex Hyytinen"
}, },
{ {
"name": "Ilmari Reponen" "name": "Ilmari Reponen"
}, },
{ {
"name": "Jenni Marttinen" "name": "Iiris Kuulusa"
}, },
{ {
"name": "Peter Lindahl" "name": "Samuel Södervall"
},
{
"name": "Patrik Varteva"
}, },
{ {
"name": "Tapio Immonen" "name": "Tapio Immonen"
@@ -42,19 +39,25 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Alex Hyytinen" "name": "Aapo Palojärvi"
}, },
{ {
"name": "Antti Salpakari" "name": "André Palosaari"
}, },
{ {
"name": "Iiris Kuulusa" "name": "Kaisa Lehtimäki"
}, },
{ {
"name": "Roman Shalamov" "name": "Olav Hamel"
}, },
{ {
"name": "Samuel Södervall" "name": "Otto Tuominen"
},
{
"name": "Panu Leinonen"
},
{
"name": "Terhi Lukkari"
} }
] ]
} }
+33 -27
View File
@@ -9,7 +9,7 @@
"name_en": "Editor in Chief", "name_en": "Editor in Chief",
"representatives": [ "representatives": [
{ {
"name": "Topi Manskinen", "name": "Joona Komonen",
"phone_number": null, "phone_number": null,
"email": null, "email": null,
"image": null "image": null
@@ -21,7 +21,7 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Visa Kurvi", "name": "Topi Manskinen",
"phone_number": null, "phone_number": null,
"email": null, "email": null,
"image": null "image": null
@@ -33,31 +33,34 @@
"name_en": "Journalist", "name_en": "Journalist",
"representatives": [ "representatives": [
{ {
"name": "Joona Komonen" "name": "Aake Laukkanen"
}, },
{ {
"name": "Olli Vaismaa" "name": "Alex Hyytinen"
},
{
"name": "Apollo Ailus"
},
{
"name": "Eetu Tossavainen"
}, },
{ {
"name": "Jenni Marttinen" "name": "Jenni Marttinen"
}, },
{ {
"name": "Ilmari Reponen" "name": "Juho Laukka"
}, },
{ {
"name": "Igor Oinonen" "name": "Lauri Anttila"
}, },
{ {
"name": "Otto Kievimaa" "name": "Otto kievimaa"
}
]
}, },
{ {
"name_fi": "Toimittaja, Taittaja", "name": "Sampo Haarala"
"name_en": "", },
"representatives": [
{ {
"name": "Atte Vitie" "name": "Venla Nikkanen"
} }
] ]
}, },
@@ -65,8 +68,17 @@
"name_fi": "Taittaja", "name_fi": "Taittaja",
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{
"name": "Atte Vitie"
},
{
"name": "Lauri Anttila"
},
{ {
"name": "Otto Kievimaa" "name": "Otto Kievimaa"
},
{
"name": "Partrik Varteva"
} }
] ]
}, },
@@ -74,29 +86,23 @@
"name_fi": "Graafikko", "name_fi": "Graafikko",
"name_en": "Photographer & Graphic Artist", "name_en": "Photographer & Graphic Artist",
"representatives": [ "representatives": [
{
"name": "Annika Tattari"
},
{ {
"name": "Elian Salmimaa" "name": "Elian Salmimaa"
},
{
"name": "Lotta Kähönen"
} }
] ]
}, },
{ {
"name_fi": "Valokuvaaja", "name_fi": "Heevistriimaaja",
"name_en": "Photographer", "name_en": "Heevistreamer",
"representatives": [ "representatives": [
{
"name": "Veikko Räty"
},
{
"name": "Into Saarinen"
},
{ {
"name": "Aaro Rasilainen" "name": "Aaro Rasilainen"
},
{
"name": "Anton Niemi"
},
{
"name": "Veera Melvasalo"
} }
] ]
} }
+44 -52
View File
@@ -5,32 +5,20 @@
"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.", "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": [ "roles": [
{ {
"name_fi": "N-toimikunnan nestori", "name_fi": "N-toimikunnan puheenjohtaja",
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Karoliina Talvikangas" "name": "Elina Huttunen"
} }
] ]
}, },
{ {
"name_fi": "N-toimikunnan varanestori, Kiltapatruuna", "name_fi": "N-toimikunnan Varapuheenjohtaja",
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Aaron Löfgren" "name": "Ville Lairila"
}
]
},
{
"name_fi": "Sklubi-yhdyshenkilö",
"name_en": "",
"representatives": [
{
"name": "Melisa Dönmez"
},
{
"name": "Eveliina Ahonen"
} }
] ]
}, },
@@ -39,57 +27,61 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Ville Lairila" "name": "Aaron Löfgren"
},
{
"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": "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": "Elian Salmimaa"
}, },
{ {
"name": "Elias Damski" "name": "Johannes Viirimäki"
}, },
{ {
"name": "Elias Lindberg" "name": "Karoliina Talvikangas"
}, },
{ {
"name": "Eero Ketonen" "name": "Markus Aaltio"
},
{
"name": "Miika Helminen"
},
{
"name": "Mikael Siikonen"
},
{
"name": "Peter Lindahl"
},
{
"name": "Veikko Räty"
}, },
{ {
"name": "Verneri Turkki" "name": "Verneri Turkki"
},
{
"name": "Akseli Heikkinen"
} }
] ]
} }
+20 -7
View File
@@ -9,7 +9,7 @@
"name_en": "Master of Studies", "name_en": "Master of Studies",
"representatives": [ "representatives": [
{ {
"name": "Mikael Vatiainen" "name": "Elida Widgren"
} }
] ]
}, },
@@ -18,23 +18,36 @@
"name_en": "Study Coordinator", "name_en": "Study Coordinator",
"representatives": [ "representatives": [
{ {
"name": "Atu Vahla" "name": "Aapo Tynninen"
},
{
"name": "Antti Lehtonen"
}, },
{ {
"name": "Aleksi Liukkonen" "name": "Aleksi Liukkonen"
}, },
{
"name": "Antti Lehtonen"
},
{
"name": "Atu Vahla"
},
{
"name": "Iiris Kuulusa"
},
{ {
"name": "Ilmari Reponen" "name": "Ilmari Reponen"
}, },
{ {
"name": "Milla Heino" "name": "Jesper Seppäläinen"
}, },
{ {
"name": "Samuel Södervall" "name": "Mikael Vatiainen"
},
{
"name": "Vi Tam"
},
{
"name": "Yassine Ramid"
} }
] ]
} }
] ]
+28 -8
View File
@@ -5,27 +5,47 @@
"info": "", "info": "",
"roles": [ "roles": [
{ {
"name_fi": "Merikapteeni", "name_fi": "Arkistovastaava",
"name_en": "Sea captain", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Ville Lairila", "name": "Aaron Löfgren",
"phone_number": null, "phone_number": null,
"email": null "email": null
} }
] ]
}, },
{ {
"name_fi": "Meripojankloppi", "name_fi": "Sklubi-yhdyshenkilö",
"name_en": "ship's boy", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Peter Lindahl", "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",
"phone_number": null, "phone_number": null,
"email": null "email": null
} }
] ]
} }
] ]
+83
View File
@@ -0,0 +1,83 @@
{
"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"
}
]
}
]
}
+20 -17
View File
@@ -9,7 +9,19 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Jere Oinonen" "name": "Simeon Pursiainen"
}
]
},
{
"name_fi": "Pajavastaava",
"name_en": "",
"representatives": [
{
"name": "Axel Söderberg"
},
{
"name": "Đình Minh Trần"
} }
] ]
}, },
@@ -18,34 +30,25 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Otto Kievimaa" "name": "Aapo Tynninen"
}, },
{ {
"name": "Đình Minh Trần" "name": "Aarni Kämppi"
}, },
{ {
"name": "Valentin Juhela" "name": "Atte Elo"
}, },
{ {
"name": "Axel Söderberg" "name": "Emma Uusküla"
}, },
{ {
"name": "Auli Purolinna" "name": "Jusi Seppälä"
}, },
{ {
"name": "Karl Lipping" "name": "Tuomas Rantamäki"
}, },
{ {
"name": "Petrus Asikainen" "name": "Vi Tam"
},
{
"name": "Elmo Kankkunen"
},
{
"name": "Samu Nyman"
},
{
"name": "Hilkka Gröhn"
} }
] ]
} }
+44
View File
@@ -0,0 +1,44 @@
{
"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
@@ -0,0 +1,45 @@
{
"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"
}
]
}
]
}
+15 -6
View File
@@ -9,7 +9,7 @@
"name_en": "Head of sales", "name_en": "Head of sales",
"representatives": [ "representatives": [
{ {
"name": "Tiitus Koski" "name": "Leevi Oikarinen"
} }
] ]
}, },
@@ -18,19 +18,28 @@
"name_en": "Clerk", "name_en": "Clerk",
"representatives": [ "representatives": [
{ {
"name": "Arvi Virkkunen" "name": "Alexandr Lemin"
}, },
{ {
"name": "Valentin Juhela" "name": "Henri Aito"
}, },
{ {
"name": "Otto Rinne" "name": "Ossi Jalkanen"
}, },
{ {
"name": "Auli Purolinna" "name": "Tiitus Koski"
}, },
{ {
"name": "Patrik Varteva" "name": "Veikko Räty"
}
]
},
{
"name_fi": "Kiltapäiväkerhovastaava",
"name_en": "",
"representatives": [
{
"name": "Matilda Ahonen"
} }
] ]
} }
+5 -8
View File
@@ -9,7 +9,7 @@
"name_en": "Master of technology", "name_en": "Master of technology",
"representatives": [ "representatives": [
{ {
"name": "Simeon Pursiainen" "name": "Joona Maaranen"
} }
] ]
}, },
@@ -18,19 +18,16 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Joona Maaranen" "name": "Alekdsandr Lemin"
}, },
{ {
"name": "Aleksi Liukkonen" "name": "Atte Elo"
}, },
{ {
"name": "Elmo Kankkunen" "name": "Dat Tram"
}, },
{ {
"name": "Justus Ojala" "name": "Oiva Haapaniemi"
},
{
"name": "Tommi Sytelä"
} }
] ]
} }
+38 -24
View File
@@ -9,7 +9,7 @@
"name_en": "Head of communcations", "name_en": "Head of communcations",
"representatives": [ "representatives": [
{ {
"name": "Yassine Ramid" "name": "Aino Svahn"
} }
] ]
}, },
@@ -18,25 +18,22 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Aaron Löfgren" "name": "Aada Tättilä"
}, },
{ {
"name": "Elina Huttunen" "name": "Ada Minkkinen"
}, },
{ {
"name": "Aura Friman" "name": "Aino Tasapuro"
}
]
}, },
{ {
"name_fi": "Somevastaava, Brändivastaava", "name": "Ira Kosunen"
"name_en": "",
"representatives": [
{
"name": "Aapo Saranpää"
}, },
{ {
"name": "Aino Svahn" "name": "Lukas Iles"
},
{
"name": "Tytti Solonen"
} }
] ]
}, },
@@ -45,23 +42,15 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Aleksandr Lemin" "name": "Aapo Saranpää"
},
{
"name": "Roope Jaskari"
},
{
"name": "Sauli Hakala"
},
{
"name": "Ville Lairila"
}, },
{ {
"name": "Aapo Nyyssönen" "name": "Aapo Nyyssönen"
}, },
{ {
"name": "Mikko Sandström" "name": "Kehrä Halme"
} }
] ]
}, },
{ {
@@ -69,12 +58,37 @@
"name_en": "", "name_en": "",
"representatives": [ "representatives": [
{ {
"name": "Veera Melvasalo" "name": "Apollo Ailus"
}, },
{
"name": "Julius Männistö"
}
]
},
{
"name_fi": "Valokuvaaja",
"name_en": "",
"representatives": [
{ {
"name": "Aaro Rasilainen" "name": "Aaro Rasilainen"
},
{
"name": "Apollo Ailus"
},
{
"name": "Arvi Virkkunen"
},
{
"name": "Julius Männistö"
},
{
"name": "Lotta Kähönen"
},
{
"name": "Veikko Räty"
} }
] ]
} }
] ]
} }
+16 -46
View File
@@ -7,6 +7,15 @@
{ {
"name_fi": "Yrityssuhdemestari", "name_fi": "Yrityssuhdemestari",
"name_en": "Head of Corporate Relations", "name_en": "Head of Corporate Relations",
"representatives": [
{
"name": "Into Saarinen"
}
]
},
{
"name_fi": "Yrityssuhdeguru",
"name_en": "Guru of yritysuhde",
"representatives": [ "representatives": [
{ {
"name": "Tuomas Hintikka" "name": "Tuomas Hintikka"
@@ -18,67 +27,28 @@
"name_en": "Head of Excursions", "name_en": "Head of Excursions",
"representatives": [ "representatives": [
{ {
"name": "Aino Tasapuro" "name": "Roope Palo"
} }
] ]
}, },
{ {
"name_fi": "Yrityssuhdevastaava", "name_fi": "Yrityssuhde- ja excursiovastaava",
"name_en": "Apprentice of Corporate Relations", "name_en": "Apprentice of Corporate Relations",
"representatives": [ "representatives": [
{
"name": "Axel Aurola"
},
{ {
"name": "Mikael Sundell" "name": "Mikael Sundell"
}, },
{ {
"name": "Henrik Ervasti" "name": "Kaisa Lehtimäki"
}, },
{ {
"name": "Samuel Södervall" "name": "Timo Kaleva"
},
{
"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": "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"
} }
] ]
} }
@@ -100,8 +100,8 @@ const CorporatePageView: React.FC<CorporatePageViewProps> = ({ jobAds }) => (
<CTASection <CTASection
bgColor="orange1" bgColor="orange1"
link="https://sosso.fi/wp-content/uploads/2023/01/sossomediakortti23.pdf" link="https://static.sahkoinsinoorikilta.fi/sekalaista/sossomediakortti25-web.pdf"
linkText="Killan lehden mediakortin löydät täältä&nbsp;" linkText="Killan lehden mediakortti&nbsp;"
> >
Mainos Sössöön? Mainos Sössöön?
</CTASection> </CTASection>
@@ -110,7 +110,7 @@ const CorporatePageView: React.FC<CorporatePageViewProps> = ({ jobAds }) => (
<h3 id="tyopaikat">Työpaikkailmoitukset</h3> <h3 id="tyopaikat">Työpaikkailmoitukset</h3>
<div> <div>
<JobAdList jobAds={jobAds} /> <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> </div>
</TextSection> </TextSection>
@@ -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,172 @@
import React from "react";
import Image from "next/legacy/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 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%;
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 &quot;teekkari&quot; and later a Master of Science in Engineering &quot;Diplomi-insinööri&quot;.
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&apos;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&apos;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/kipparit-26.jpg"
alt="Kipparit"
layout="responsive"
width={100}
height={80}
objectFit="contain"
/>
</ImageContainer>
<h6>Freshmen captains</h6>
<p>
We are your freshman captains <strong>Teemu</strong> and <strong>Henri</strong> and we&apos;ll be here to support you and monitor your
progress throughout the freshman year adventures toward earning your engineer&apos;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&apos;t be alarmed by them!
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!
</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!&nbsp;">
Join the guild!
</PageLink>
<PageLink to={FUKSI_POINTS_LINK} desc="Take a look at the fuksipoints&nbsp;">
Fuksipoint guide - This will be translated later so don&apos;t worry if you don&apos;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&apos;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={SIK_QR}
/>
<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"
/>
<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&apos;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&apos;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&apos;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,193 @@
import React from "react";
import Image from "next/legacy/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 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%;
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&apos;ve not only become a new student at Aalto, but also what&apos;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&apos;ve learned about this before or it&apos;s your first time hearing about it, it&apos;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&apos;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&apos;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, weve 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/Captains2026.jpg"
alt="Kipparit"
layout="responsive"
width={100}
height={80}
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&apos;t be intimidated! Over time, the pieces of the puzzle will come together and you&apos;ll be
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
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!
</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!&nbsp;">
Join the guild!
</PageLink>
<PageLink to={FUKSI_POINTS_LINK} desc="Take a look at the fuksipoints&nbsp;">
Fuksipoint guide - This will be translated later so don&apos;t worry if you don&apos;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&apos;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={SIK_QR}
/>
<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}
/>
<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&apos;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;
+1 -1
View File
@@ -13,7 +13,7 @@ const FreshmenPageHero: React.FC = () => (
<HeroAside bgColor="lightTurquoise"> <HeroAside bgColor="lightTurquoise">
<HeroAsideItem <HeroAsideItem
header="Lue killan fuksiopas" 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ä!" linkText="lue fuksiopas täältä!"
/> />
+19 -17
View File
@@ -7,10 +7,12 @@ import {
import FreshmenPageHero from "./FreshmenPageHero"; import FreshmenPageHero from "./FreshmenPageHero";
const FUKSI_POINTS_LINK = "https://static.sahkoinsinoorikilta.fi/FTMK/Fuksipisteohje.pdf"; const FUKSI_POINTS_LINK = "https://static.sahkoinsinoorikilta.fi/FTMK/Fuksipisteohje.pdf";
const TG_GROUP_CHAT_LINK = "https://t.me/+8McxwmHvXu80YmFk"; const TG_GROUP_CHAT_LINK = "https://t.me/+ctpg4H0-Y3hlZTY0";
const TG_NOTIFICATIONS_LINK = "https://t.me/+GGTLMfwce1gxM2Q8"; const TG_NOTIFICATIONS_LINK = "https://t.me/+v30Nts-MrIMyMjNk";
const EMAIL_LINK = "ftmk@sahkoinsinoorikilta.fi"; const EMAIL_LINK = "ftmk@sahkoinsinoorikilta.fi";
const EMAIL_LINK_MAILTO = `mailto:${EMAIL_LINK}`; 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` const ImageContainer = styled.div`
width: 100%; width: 100%;
@@ -43,7 +45,7 @@ const FreshmenPageView: React.FC = () => (
<p> <p>
Ensi askeleina suosittelemme, että liityt teille fukseille tehdyille Telegram-kanaville. 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> </p>
<h6>Matka nimeltä Teekkarius</h6> <h6>Matka nimeltä Teekkarius</h6>
@@ -58,7 +60,7 @@ const FreshmenPageView: React.FC = () => (
<ImageContainer> <ImageContainer>
<Image <Image
src="https://static.sahkoinsinoorikilta.fi/FTMK/fuksikipparit-2024.jpg" src="https://static.sahkoinsinoorikilta.fi/FTMK/kipparit-26.jpg"
alt="Kipparit" alt="Kipparit"
layout="responsive" layout="responsive"
width={100} width={100}
@@ -69,7 +71,7 @@ const FreshmenPageView: React.FC = () => (
<h6>Fuksikapteenit</h6> <h6>Fuksikapteenit</h6>
<p> <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ä. 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>. 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> </p>
@@ -80,15 +82,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ää. Ajan myötä palapelin palat muodostavat sinun näköisesi kuvan ja pääset itse vaikuttamaan siihen, miltä lopputulos näyttää.
</p> </p>
<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. 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 17.8.2024. Siitä lisää Telegram-ryhmissä! Varaslähtö fuksivuoteen järjestetään lauantaina 16.8.2026. Siitä lisää Telegram-ryhmissä!
</p> </p>
<h6>Sauli Hakala</h6> <h6>Teemu Heikkinen</h6>
<p>045 317 1800<br />sauli.hakala (ät) sahkoinsinoorikilta.fi <br />@saulihakala</p> <p>040 097 1835<br />teemu.heikkinen (ät) sahkoinsinoorikilta.fi <br />@heikkinenteemu</p>
<h6>Valentin Juhela</h6> <h6>Henri Aito</h6>
<p>040 968 1644<br />valentin.juhela (ät) sahkoinsinoorikilta.fi <br />@ValentinJuhela</p> <p>045 328 2883<br />henri.aito (ät) sahkoinsinoorikilta.fi <br />@henriaito</p>
</div> </div>
<aside> <aside>
<div> <div>
@@ -96,7 +98,7 @@ const FreshmenPageView: React.FC = () => (
Fuksikipparit tavoitat Fuksikipparit tavoitat
</PageLink> </PageLink>
<PageLink to="https://api.sahkoinsinoorikilta.fi/members/application" desc="ja tule mukaan toimintaamme&nbsp;"> <PageLink to="https://api.sahkoinsinoorikilta.fi/members/application" desc="ja tule mukaan toimintaamme&nbsp;">
Liity jäseneksi Liity jäseneksi tästä
</PageLink> </PageLink>
<PageLink to={FUKSI_POINTS_LINK} desc="Katso fuksipisteitä&nbsp;"> <PageLink to={FUKSI_POINTS_LINK} desc="Katso fuksipisteitä&nbsp;">
Fuksipisteohje Fuksipisteohje
@@ -105,15 +107,15 @@ const FreshmenPageView: React.FC = () => (
<div> <div>
<InfoBox> <InfoBox>
<h6>Killan Fuksiopas</h6> <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 <FopasImage
src="https://static.sahkoinsinoorikilta.fi/FTMK/Fuksiopas2024-kansi.jpg" src="https://static.sahkoinsinoorikilta.fi/FTMK/Fopas_25_kansi.jpg"
/> />
</Link> </Link>
<p> <p>
Ennen opintojen alkua on hyvä tutustua killan fuksioppaaseen. 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> </p>
<br /> <br />
<h6>Telegram?</h6> <h6>Telegram?</h6>
@@ -126,12 +128,12 @@ const FreshmenPageView: React.FC = () => (
SIK:n fukseilla on oma Telegram-ryhmä, jonne pääset liitymään tästä: SIK:n fukseilla on oma Telegram-ryhmä, jonne pääset liitymään tästä:
</p> </p>
<QRImages <QRImages
src="https://static.sahkoinsinoorikilta.fi/FTMK/sik-fuksit-2024.jpg" src={SIK_QR}
/> />
<p>tai <Link to={TG_GROUP_CHAT_LINK} target="_blank">tästä</Link></p> <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> <p>Liity myös samalla SIK-fuksien tiedotuskanavalle tästä:</p>
<QRImages <QRImages
src="https://static.sahkoinsinoorikilta.fi/FTMK/sik-fuksit-2024-tiedotus.jpg" src={SIK_QR_TIEDOTUS}
/> />
<p>tai <Link to={TG_NOTIFICATIONS_LINK} target="_blank">tästä</Link></p> <p>tai <Link to={TG_NOTIFICATIONS_LINK} target="_blank">tästä</Link></p>
</InfoBox> </InfoBox>
+1 -1
View File
@@ -30,7 +30,7 @@ const FrontPageHero: React.FC = () => (
<HeroAsideItem <HeroAsideItem
header="Vasta-aloittaneelle opiskelijalle" header="Vasta-aloittaneelle opiskelijalle"
text="Fuksikasvatusta ja ISOtoimintaa" text="Fuksikasvatusta ja ISOtoimintaa"
link="/kilta/fuksi" link="/newStudent/fuksi"
linkText="Fuksit&nbsp; " linkText="Fuksit&nbsp; "
/> />
<HeroAsideItem <HeroAsideItem
+16 -8
View File
@@ -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 Caruna = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/caruna.jpg";
const Ensto = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/ensto.jpg"; const Ensto = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/ensto.jpg";
const eSett = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/esett.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 Okmetic = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/okmetic.jpg";
const Nokia = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/nokia.jpg"; const Nokia = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/nokia.jpg";
const Granlund = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/granlund.jpg"; const Granlund = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/granlund.jpg";
const Eaton = "https://static.sahkoinsinoorikilta.fi/img/corporate_logos/eaton.png"; 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 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 { interface FrontPageViewProps {
events: Event[]; events: Event[];
@@ -105,6 +107,9 @@ const FrontPageView: React.FC<FrontPageViewProps> = ({ events, feed }) => (
<Link to="https://www.esett.com/"> <Link to="https://www.esett.com/">
<Image src={eSett} alt="eSett" layout="responsive" width={200} height={100} objectFit="contain" /> <Image src={eSett} alt="eSett" layout="responsive" width={200} height={100} objectFit="contain" />
</Link> </Link>
<Link to="https://www.fingrid.fi/">
<Image src={Fingrid} alt="Fingrid" layout="responsive" width={200} height={100} objectFit="contain" />
</Link>
<Link to="https://www.okmetic.com/fi/"> <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" layout="responsive" width={200} height={100} objectFit="contain" />
</Link> </Link>
@@ -114,15 +119,18 @@ const FrontPageView: React.FC<FrontPageViewProps> = ({ events, feed }) => (
<Link to="https://www.eaton.com/fi/fi-fi.html"> <Link to="https://www.eaton.com/fi/fi-fi.html">
<Image src={Eaton} alt="Eaton" layout="responsive" width={200} height={100} objectFit="contain" /> <Image src={Eaton} alt="Eaton" layout="responsive" width={200} height={100} objectFit="contain" />
</Link> </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" />
</Link>
<Link to="https://www.ericsson.com/en"> <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" layout="responsive" width={200} height={100} objectFit="contain" />
</Link> </Link>
<Link to="https://www.saab.com/fi/markets/finland">
<Image src={Saab} alt="Saab" layout="responsive" width={200} height={100} objectFit="contain" />
</Link>
<Link to="https://www.stul.fi/">
<Image src={STUL} alt="STUL" layout="responsive" width={200} height={100} objectFit="contain" />
</Link>
<Link to="https://www.metso.com/fi/">
<Image src={Metso} alt="Metso" layout="responsive" width={200} height={100} objectFit="contain" />
</Link>
</div> </div>
<Link to="/yritysyhteistyo">Haluatko kuulla lisää yhteistyöstä kanssamme?</Link> <Link to="/yritysyhteistyo">Haluatko kuulla lisää yhteistyöstä kanssamme?</Link>
</SponsorReel> </SponsorReel>
@@ -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;
+24 -1
View File
@@ -40,7 +40,8 @@ const HonoraryPageView: React.FC = () => (
<li>Keijo Nikoskinen 20112014</li> <li>Keijo Nikoskinen 20112014</li>
<li>Jussi Ryynänen 20142017</li> <li>Jussi Ryynänen 20142017</li>
<li>Ville Viikari 20172020</li> <li>Ville Viikari 20172020</li>
<li>Anu Lehtovuori 2020</li> <li>Anu Lehtovuori 20202026</li>
<li>Marko Hinkkanen 2026-</li>
</ul> </ul>
<h2>Pro SIK</h2> <h2>Pro SIK</h2>
<p> <p>
@@ -91,6 +92,8 @@ const HonoraryPageView: React.FC = () => (
<li>2023 Emmaleena Ahonen</li> <li>2023 Emmaleena Ahonen</li>
<li>2024 Jonna Tammikivi</li> <li>2024 Jonna Tammikivi</li>
<li>2025 Eveliina Ahonen</li> <li>2025 Eveliina Ahonen</li>
<li>2026 Otto Julkunen</li>
<li>2026 Melisa Dönmez</li>
</ul> </ul>
<h2>Standaari</h2> <h2>Standaari</h2>
<p>Standaari voidaan hallituksen päätöksellä lahjoittaa killan toimintaan myönteisesti vaikuttaneille tahoille. Standaarit on numeroitu lahjoittamisjärjestyksessä.</p> <p>Standaari voidaan hallituksen päätöksellä lahjoittaa killan toimintaan myönteisesti vaikuttaneille tahoille. Standaarit on numeroitu lahjoittamisjärjestyksessä.</p>
@@ -233,6 +236,12 @@ const HonoraryPageView: React.FC = () => (
<li>2025 Iikka Huttu</li> <li>2025 Iikka Huttu</li>
<li>2025 Heidi Mäkitalo</li> <li>2025 Heidi Mäkitalo</li>
</ul> </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> <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> <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> <ul>
@@ -630,6 +639,20 @@ const HonoraryPageView: React.FC = () => (
<li>2024 Veikko Räty</li> <li>2024 Veikko Räty</li>
<li>2024 Visa Kurvi</li> <li>2024 Visa Kurvi</li>
</ul> </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> </div>
</TextSection> </TextSection>
</> </>
@@ -15,10 +15,23 @@ const MembershipPageView: React.FC = () => (
sekä pääsyn killan tiloihin kuten kiltahuoneelle ja SIK-pajalle. sekä pääsyn killan tiloihin kuten kiltahuoneelle ja SIK-pajalle.
</p> </p>
<p> <p>
Killan varsinaiseksi jäseneksi voidaan hyväksyä kaikki killan toiminnasta kiinnotuneet AYY:n jäsenet. 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ö, joita ei voida hyväksyä varsinaiseksi jäseneksi. Killan ulkojäseneksi voidaan hyväksyä jäsenmaksun maksanut henkilö, jota ei voida hyväksyä varsinaiseksi jäseneksi.
Killan kannatusjäseneksi voidaan hyväksyä henkilö tai yhteisö, joka haluaa tukea killan toimintaa. Killan kannatusjäseneksi voidaan hyväksyä henkilö tai yhteisö, joka haluaa tukea killan toimintaa.
</p> </p>
<p>
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> <h6 id="jasenmaksu">Jäsenmaksu</h6>
<p> <p>
@@ -36,6 +49,11 @@ const MembershipPageView: React.FC = () => (
Jäsenrekisterin tietosuojaseloste Jäsenrekisterin tietosuojaseloste
</Link> </Link>
</p> </p>
<p>
<Link to="https://static.sahkoinsinoorikilta.fi/saannot/killansaannot.pdf">
Killan säännöt
</Link>
</p>
</div> </div>
</TextSection> </TextSection>
</> </>
+1
View File
@@ -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>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>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>Gongi ilmainen</li>
<li>Kyykkäsetti 10 </li>
<li>80 kpl kevytpeitteet</li> <li>80 kpl kevytpeitteet</li>
<ul> <ul>
<li>Alle 5 kpl ilmainen</li> <li>Alle 5 kpl ilmainen</li>
+1
View File
@@ -9,3 +9,4 @@ services:
order: start-first order: start-first
ports: ports:
- 3000:3000 - 3000:3000