Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c55b07430d | |||
| 983e20ac3c | |||
| 5c584972d0 | |||
| 5d069047c8 | |||
| 6d239d7211 | |||
| 6a6aafcfe5 |
@@ -47,11 +47,5 @@ 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",
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,78 +0,0 @@
|
|||||||
---
|
|
||||||
description: "Use this agent when the user asks to set up or fix ESLint in a project, especially legacy or older projects.\n\nTrigger phrases include:\n- 'get ESLint working'\n- 'fix ESLint'\n- 'setup ESLint for this project'\n- 'enable linting locally'\n- 'ESLint not working'\n- 'get linting working on this old project'\n\nExamples:\n- User says 'get this old projects eslint working so i can lint locally' → invoke this agent to diagnose and repair ESLint setup\n- User asks 'why isn't ESLint running?' → invoke this agent to troubleshoot configuration and dependencies\n- User says 'I need to lint locally but ESLint is broken' → invoke this agent to fix the setup end-to-end"
|
|
||||||
name: eslint-setup-fixer
|
|
||||||
---
|
|
||||||
|
|
||||||
# eslint-setup-fixer instructions
|
|
||||||
|
|
||||||
You are an expert build and tooling engineer specializing in getting ESLint working in legacy and older projects. Your mission is to diagnose ESLint issues and establish a working local linting setup that the user can reliably use.
|
|
||||||
|
|
||||||
Your core responsibilities:
|
|
||||||
- Diagnose why ESLint is not working in the project
|
|
||||||
- Identify and fix configuration issues
|
|
||||||
- Ensure all dependencies are properly installed and compatible
|
|
||||||
- Verify Node.js version compatibility
|
|
||||||
- Establish a working local linting workflow
|
|
||||||
- Document any fixes applied
|
|
||||||
|
|
||||||
Methodology:
|
|
||||||
1. First, examine the current project state:
|
|
||||||
- Check if .eslintrc file exists (any format: .js, .json, .yml, .yaml)
|
|
||||||
- Look for eslintConfig in package.json
|
|
||||||
- Review package.json to see if eslint is listed as a dependency
|
|
||||||
- Check the Node.js version being used
|
|
||||||
|
|
||||||
2. Diagnose the root cause:
|
|
||||||
- Run eslint to see what error messages appear
|
|
||||||
- Check if eslint is installed (node_modules)
|
|
||||||
- Identify dependency version conflicts
|
|
||||||
- Look for missing parser or plugin dependencies
|
|
||||||
- Check for Node version incompatibilities
|
|
||||||
|
|
||||||
3. Fix the issues systematically:
|
|
||||||
- Install or update eslint if needed
|
|
||||||
- Install any missing parser or plugin dependencies
|
|
||||||
- Create or repair .eslintrc configuration if missing
|
|
||||||
- Update package.json scripts with lint commands if needed
|
|
||||||
- Handle any Node version issues (upgrade, use nvm, etc.)
|
|
||||||
|
|
||||||
4. Validate the setup:
|
|
||||||
- Successfully run eslint on the codebase
|
|
||||||
- Verify linting rules are being applied
|
|
||||||
- Test that local linting works reliably
|
|
||||||
- Confirm users can run lint commands
|
|
||||||
|
|
||||||
Common pitfalls to avoid:
|
|
||||||
- Old ESLint versions (< v6) may not work with modern Node versions
|
|
||||||
- Missing @babel/eslint-parser for projects using older Babel
|
|
||||||
- Incompatible parser versions (e.g., wrong TypeScript parser)
|
|
||||||
- Node version too old or too new for the project's dependencies
|
|
||||||
- Configuration files with syntax errors preventing parsing
|
|
||||||
- Circular dependency issues in plugin configurations
|
|
||||||
|
|
||||||
Edge cases to handle:
|
|
||||||
- Project using TypeScript: ensure typescript parser is installed
|
|
||||||
- Project with React: ensure react plugin is installed
|
|
||||||
- Project with old Node version requirements: provide upgrade guidance
|
|
||||||
- Multiple conflicting .eslintrc files: consolidate to single source of truth
|
|
||||||
- Projects with monorepo structure: handle root and package-level configs
|
|
||||||
|
|
||||||
Output format:
|
|
||||||
- Clear summary of what was broken and why
|
|
||||||
- Step-by-step list of all fixes applied
|
|
||||||
- Verification results showing linting now works
|
|
||||||
- Any warnings about compatibility or recommendations for modernization
|
|
||||||
- Command to run linting locally (e.g., `npm run lint` or `npm run eslint`)
|
|
||||||
|
|
||||||
Quality checks:
|
|
||||||
- Verify eslint command runs without errors
|
|
||||||
- Confirm linting actually processes files (not just succeeding with no output)
|
|
||||||
- Test that rules are being enforced
|
|
||||||
- Ensure the fix is reproducible for other developers
|
|
||||||
- Document any version constraints or platform-specific requirements
|
|
||||||
|
|
||||||
When to ask for clarification:
|
|
||||||
- If you're unsure whether the project uses TypeScript, React, or other special configs
|
|
||||||
- If multiple conflicting approaches exist and you need user preference
|
|
||||||
- If Node version constraints prevent a standard fix
|
|
||||||
- If the project has unusual structure that prevents standard ESLint discovery
|
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
. "$(dirname "$0")/_/husky.sh"
|
. "$(dirname "$0")/_/husky.sh"
|
||||||
|
|
||||||
npm run lint:es
|
npm run lint
|
||||||
|
|||||||
@@ -93,9 +93,6 @@
|
|||||||
"swr": "^1.2.2",
|
"swr": "^1.2.2",
|
||||||
"uuid": "^13.0.0"
|
"uuid": "^13.0.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
|
||||||
"node": "16"
|
|
||||||
},
|
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"react-mde": {
|
"react-mde": {
|
||||||
"react": "$react",
|
"react": "$react",
|
||||||
|
|||||||
@@ -1,11 +1,8 @@
|
|||||||
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 {
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ 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;
|
||||||
|
|||||||
+28
-25
@@ -14,13 +14,14 @@ 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/${event.id}`} />
|
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/events/${id}`} />
|
||||||
</Head>
|
</Head>
|
||||||
<PageWrapper>
|
<PageWrapper>
|
||||||
<EventPageView event={event} />
|
<EventPageView event={event} />
|
||||||
@@ -29,34 +30,36 @@ const EventPage: NextPage<InitialProps> = ({ event }) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getStaticPaths: GetStaticPaths = async () => ({
|
export const getStaticPaths: GetStaticPaths = async () => {
|
||||||
paths: [],
|
const allEvents = await EventApi.getEvents();
|
||||||
fallback: "blocking",
|
const paths = allEvents.map((e: Event) => ({
|
||||||
});
|
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 = Number(params?.id);
|
const { id } = params;
|
||||||
if (!id) {
|
let notFound = false;
|
||||||
return {
|
let event: Event;
|
||||||
notFound: true,
|
|
||||||
revalidate: 10,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const event = await EventApi.getEvent(id);
|
event = await EventApi.getEvent(Number(id));
|
||||||
return {
|
} catch (err) {
|
||||||
props: {
|
notFound = true;
|
||||||
event,
|
|
||||||
},
|
|
||||||
revalidate: 10, // Required for deleting hidden pages
|
|
||||||
};
|
|
||||||
} catch {
|
|
||||||
return {
|
|
||||||
notFound: true,
|
|
||||||
revalidate: 10,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
return {
|
||||||
|
props: {
|
||||||
|
event,
|
||||||
|
},
|
||||||
|
revalidate: 10, // Required for deleting hidden pages
|
||||||
|
notFound,
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export default EventPage;
|
export default EventPage;
|
||||||
|
|||||||
+29
-25
@@ -14,13 +14,14 @@ 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/${post.id}`} />
|
<link rel="canonical" href={`${process.env.NEXT_PUBLIC_SITE_URL}/feed/${id}`} />
|
||||||
</Head>
|
</Head>
|
||||||
<PageWrapper>
|
<PageWrapper>
|
||||||
<FeedPageView post={post} />
|
<FeedPageView post={post} />
|
||||||
@@ -29,34 +30,37 @@ const FeedPage: NextPage<InitialProps> = ({ post }) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getStaticPaths: GetStaticPaths = async () => ({
|
export const getStaticPaths: GetStaticPaths = async () => {
|
||||||
paths: [],
|
const feed = await FeedApi.getFeed();
|
||||||
fallback: "blocking",
|
const paths = feed.map((post: Post) => ({
|
||||||
});
|
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 = Number(params?.id);
|
const { id } = params;
|
||||||
if (!id) {
|
let notFound = false;
|
||||||
return {
|
let post: Post;
|
||||||
notFound: true,
|
try {
|
||||||
revalidate: 10,
|
post = await FeedApi.getPost(Number(id));
|
||||||
};
|
} catch (err) {
|
||||||
|
notFound = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return {
|
||||||
const post = await FeedApi.getPost(id);
|
props: {
|
||||||
return {
|
post,
|
||||||
props: {
|
},
|
||||||
post,
|
revalidate: 10, // Required for deleting hidden pages
|
||||||
},
|
notFound,
|
||||||
revalidate: 10, // Required for deleting hidden pages
|
};
|
||||||
};
|
|
||||||
} catch {
|
|
||||||
return {
|
|
||||||
notFound: true,
|
|
||||||
revalidate: 10,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default FeedPage;
|
export default FeedPage;
|
||||||
|
|||||||
@@ -44,15 +44,12 @@ const InEnglishPage: NextPage<InitialProps> = ({ initialEvents, initialFeed }) =
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const getStaticProps: GetStaticProps<InitialProps> = async () => {
|
export const getStaticProps: GetStaticProps<InitialProps> = async () => {
|
||||||
const [eventsResult, feedResult] = await Promise.allSettled([
|
const initialEvents = await fetcher<Event[]>(eventApi);
|
||||||
fetcher<Event[]>(eventApi),
|
const initialFeed = await fetcher<Post[]>(feedApi);
|
||||||
fetcher<Post[]>(feedApi),
|
|
||||||
]);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
props: {
|
props: {
|
||||||
initialEvents: eventsResult.status === "fulfilled" ? eventsResult.value : [],
|
initialEvents,
|
||||||
initialFeed: feedResult.status === "fulfilled" ? feedResult.value : [],
|
initialFeed,
|
||||||
},
|
},
|
||||||
revalidate: 10,
|
revalidate: 10,
|
||||||
};
|
};
|
||||||
|
|||||||
+4
-7
@@ -43,15 +43,12 @@ const FrontPage: NextPage<InitialProps> = ({ initialEvents, initialFeed }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const getStaticProps: GetStaticProps<InitialProps> = async () => {
|
export const getStaticProps: GetStaticProps<InitialProps> = async () => {
|
||||||
const [eventsResult, feedResult] = await Promise.allSettled([
|
const initialEvents = fetcher<Event[]>(eventApi);
|
||||||
fetcher<Event[]>(eventApi),
|
const initialFeed = fetcher<Post[]>(feedApi);
|
||||||
fetcher<Post[]>(feedApi),
|
|
||||||
]);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
props: {
|
props: {
|
||||||
initialEvents: eventsResult.status === "fulfilled" ? eventsResult.value : [],
|
initialEvents: await initialEvents,
|
||||||
initialFeed: feedResult.status === "fulfilled" ? feedResult.value : [],
|
initialFeed: await initialFeed,
|
||||||
},
|
},
|
||||||
revalidate: 10,
|
revalidate: 10,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ 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";
|
||||||
@@ -38,15 +40,12 @@ const ActualPage: NextPage<InitialProps> = ({ initialEvents, initialFeed }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const getStaticProps: GetStaticProps<InitialProps> = async () => {
|
export const getStaticProps: GetStaticProps<InitialProps> = async () => {
|
||||||
const [eventsResult, feedResult] = await Promise.allSettled([
|
const initialEvents = await EventApi.getEvents();
|
||||||
fetcher<Event[]>(eventApi),
|
const initialFeed = await FeedApi.getFeed();
|
||||||
fetcher<Post[]>(feedApi),
|
|
||||||
]);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
props: {
|
props: {
|
||||||
initialEvents: eventsResult.status === "fulfilled" ? eventsResult.value : [],
|
initialEvents,
|
||||||
initialFeed: feedResult.status === "fulfilled" ? feedResult.value : [],
|
initialFeed,
|
||||||
},
|
},
|
||||||
revalidate: 10,
|
revalidate: 10,
|
||||||
};
|
};
|
||||||
|
|||||||
+27
-60
@@ -23,9 +23,6 @@ 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 SUBMIT_ID = uuid(); // Submission key, generated on page refresh
|
||||||
const URL = `${FORM_URL}${id}/`;
|
const URL = `${FORM_URL}${id}/`;
|
||||||
@@ -46,23 +43,11 @@ const SignUpPage: NextPage<InitialProps> = ({ initialForm }) => {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const onSubmit = async ({ formData }: ISubmitEvent<any>) => {
|
const onSubmit = async ({ formData }: ISubmitEvent<string>) => {
|
||||||
// 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
|
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: trackedForm,
|
answer: formData,
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -87,59 +72,41 @@ 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 () => {
|
||||||
paths: [],
|
const allForms = await SignupApi.getForms();
|
||||||
fallback: "blocking",
|
const paths = allForms.map((e: SignupForm) => ({
|
||||||
});
|
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 = Number(params?.id);
|
const { id } = params;
|
||||||
if (!id) {
|
let notFound = false;
|
||||||
return {
|
let initialForm: SignupForm;
|
||||||
notFound: true,
|
|
||||||
revalidate: 10,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const initialForm = await SignupApi.getForm(id);
|
initialForm = await SignupApi.getForm(Number(id));
|
||||||
return {
|
|
||||||
props: {
|
|
||||||
initialForm,
|
|
||||||
},
|
|
||||||
revalidate: 10, // Required for deleting hidden pages
|
|
||||||
};
|
|
||||||
} catch {
|
} catch {
|
||||||
return {
|
notFound = true;
|
||||||
notFound: true,
|
|
||||||
revalidate: 10,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
return {
|
||||||
|
props: {
|
||||||
|
initialForm,
|
||||||
|
},
|
||||||
|
revalidate: 10, // Required for deleting hidden pages
|
||||||
|
notFound,
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export default SignUpPage;
|
export default SignUpPage;
|
||||||
|
|||||||
@@ -30,13 +30,10 @@ const CorporatePage: NextPage<InitialProps> = ({ initialJobAds }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const getStaticProps: GetStaticProps<InitialProps> = async () => {
|
export const getStaticProps: GetStaticProps<InitialProps> = async () => {
|
||||||
const jobAdsResult = await Promise.allSettled([
|
const initialJobAds = await fetcher<JobAd[]>(jobAdApi);
|
||||||
fetcher<JobAd[]>(jobAdApi),
|
|
||||||
]);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
props: {
|
props: {
|
||||||
initialJobAds: jobAdsResult[0].status === "fulfilled" ? jobAdsResult[0].value : [],
|
initialJobAds,
|
||||||
},
|
},
|
||||||
revalidate: 10,
|
revalidate: 10,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -38,17 +38,10 @@ const Container = styled.div`
|
|||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 950px) {
|
@media (max-width: 950px) {
|
||||||
width: 80vw;
|
width: 100vw;
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const BoardImage = styled.img`
|
|
||||||
width: 100%;
|
|
||||||
height: auto;
|
|
||||||
margin-bottom: 2rem;
|
|
||||||
border-radius: 8px;
|
|
||||||
`;
|
|
||||||
|
|
||||||
const ContactContainer = styled.div`
|
const ContactContainer = styled.div`
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
@media (max-width: 950px) {
|
@media (max-width: 950px) {
|
||||||
@@ -61,12 +54,6 @@ 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) => (
|
||||||
@@ -87,7 +74,6 @@ 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>;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"slug": "board",
|
"slug": "board",
|
||||||
"name_fi": "Hallitus 2026",
|
"name_fi": "Hallitus 2024",
|
||||||
"name_en": "Board",
|
"name_en": "Board",
|
||||||
"roles": [
|
"roles": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import VtmkJson from "./vtmk.json";
|
|||||||
import LtmkJson from "./ltmk.json";
|
import LtmkJson from "./ltmk.json";
|
||||||
import SiccJson from "./sicc.json";
|
import SiccJson from "./sicc.json";
|
||||||
import SptmkJson from "./sptmk.json";
|
import SptmkJson from "./sptmk.json";
|
||||||
import PotatmkJson from "./potatmk.json";
|
import PotatmkJson from "./potatmk.json"
|
||||||
import Others from "./others.json";
|
import Others from "./others.json";
|
||||||
|
|
||||||
const orderedCommittees = [
|
const orderedCommittees = [
|
||||||
|
|||||||
@@ -11,8 +11,6 @@ const TG_GROUP_CHAT_LINK = "https://t.me/+ctpg4H0-Y3hlZTY0";
|
|||||||
const TG_NOTIFICATIONS_LINK = "https://t.me/+v30Nts-MrIMyMjNk";
|
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%;
|
||||||
@@ -61,7 +59,7 @@ const ForFreshmenPageView: React.FC = () => (
|
|||||||
|
|
||||||
<ImageContainer>
|
<ImageContainer>
|
||||||
<Image
|
<Image
|
||||||
src="https://static.sahkoinsinoorikilta.fi/FTMK/kipparit-26.jpg"
|
src="https://static.sahkoinsinoorikilta.fi/FTMK/IMG_6539.JPG"
|
||||||
alt="Kipparit"
|
alt="Kipparit"
|
||||||
layout="responsive"
|
layout="responsive"
|
||||||
width={100}
|
width={100}
|
||||||
@@ -84,8 +82,8 @@ const ForFreshmenPageView: React.FC = () => (
|
|||||||
Over time, the pieces of the puzzle will come together to form an image that reflects you, and you'll have the opportunity to shape what the final result looks like.
|
Over time, the pieces of the puzzle will come together to form an image that reflects you, and you'll have the opportunity to shape what the final result looks like.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Orientation week is held from August 25th to 29th, 2026, but even before then, you'll have the chance to meet us, other freshmen, and the ISOs at a relaxed Pre-Start event.
|
Orientation week is held from August 25th to 29th, 2025, but even before then, you'll have the chance to meet us, other freshmen, and the ISOs at a relaxed Pre-Start event.
|
||||||
The Pre-Start for the freshman year is organized on Saturday, August 16th, 2026. Find more details in the Telegram groups!
|
The Pre-Start for the freshman year is organized on Saturday, August 16th, 2025. Find more details in the Telegram groups!
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h6>Teemu Heikkinen</h6>
|
<h6>Teemu Heikkinen</h6>
|
||||||
@@ -130,12 +128,12 @@ const ForFreshmenPageView: React.FC = () => (
|
|||||||
SIK fuksis have a group chat, which you can join by scanning the QR code below:
|
SIK fuksis have a group chat, which you can join by scanning the QR code below:
|
||||||
</p>
|
</p>
|
||||||
<QRImages
|
<QRImages
|
||||||
src={SIK_QR}
|
src="https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-2025.jpg"
|
||||||
/>
|
/>
|
||||||
<p>or <Link to={TG_GROUP_CHAT_LINK} target="_blank">press me!</Link></p>
|
<p>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>
|
<p>Also join the notifications channel for SIK fuksis, to stay in the loop!:</p>
|
||||||
<QRImages
|
<QRImages
|
||||||
src="https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-tiedotus-2026.jpg"
|
src="https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-tiedotus-2025.jpg"
|
||||||
/>
|
/>
|
||||||
<p>or <Link to={TG_NOTIFICATIONS_LINK} target="_blank">press me!</Link></p>
|
<p>or <Link to={TG_NOTIFICATIONS_LINK} target="_blank">press me!</Link></p>
|
||||||
</InfoBox>
|
</InfoBox>
|
||||||
|
|||||||
@@ -11,8 +11,6 @@ const TG_GROUP_CHAT_LINK = "https://t.me/+oNrBDLI5cXZhNDEx";
|
|||||||
const TG_NOTIFICATIONS_LINK = "https://t.me/sikhotline2526";
|
const TG_NOTIFICATIONS_LINK = "https://t.me/sikhotline2526";
|
||||||
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%;
|
||||||
@@ -78,7 +76,7 @@ const ForIntlPageView: React.FC = () => (
|
|||||||
|
|
||||||
<ImageContainer>
|
<ImageContainer>
|
||||||
<Image
|
<Image
|
||||||
src="https://static.sahkoinsinoorikilta.fi/FTMK/Captains2026.jpg"
|
src="https://static.sahkoinsinoorikilta.fi/FTMK/Captains2025.jpg"
|
||||||
alt="Kipparit"
|
alt="Kipparit"
|
||||||
layout="responsive"
|
layout="responsive"
|
||||||
width={100}
|
width={100}
|
||||||
@@ -104,9 +102,9 @@ const ForIntlPageView: React.FC = () => (
|
|||||||
having just as much fun as we are. Always remember that as a teekkari in Otaniemi, you're never alone.
|
having just as much fun as we are. Always remember that as a teekkari in Otaniemi, you're never alone.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Orientation week will be held from 25 to 29 August 2026, but even before that you have the
|
Orientation week will be held from 25 to 29 August 2025, but even before that you have the
|
||||||
opportunity to come and get to know us, other freshmen and ISOs at a relaxed Headstart event.
|
opportunity to come and get to know us, other freshmen and ISOs at a relaxed Headstart event.
|
||||||
This will be held on Saturday 16 August 2026. More about that in the Telegram groups!
|
This will be held on Saturday 16 August 2025. More about that in the Telegram groups!
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h6>Apollo Ailus</h6>
|
<h6>Apollo Ailus</h6>
|
||||||
@@ -151,12 +149,12 @@ const ForIntlPageView: React.FC = () => (
|
|||||||
SIK fuksis have a group chat, which you can join by scanning the QR code below:
|
SIK fuksis have a group chat, which you can join by scanning the QR code below:
|
||||||
</p>
|
</p>
|
||||||
<QRImages
|
<QRImages
|
||||||
src={SIK_QR}
|
src="https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-2025.jpg"
|
||||||
/>
|
/>
|
||||||
<p>or <Link to={TG_GROUP_CHAT_LINK} target="_blank">press me!</Link></p>
|
<p>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>
|
<p>Also join the notifications channel for SIK fuksis, to stay in the loop!:</p>
|
||||||
<QRImages
|
<QRImages
|
||||||
src={SIK_QR_TIEDOTUS}
|
src="https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-tiedotus-2025.jpg"
|
||||||
/>
|
/>
|
||||||
<p>or <Link to={TG_NOTIFICATIONS_LINK} target="_blank">press me!</Link></p>
|
<p>or <Link to={TG_NOTIFICATIONS_LINK} target="_blank">press me!</Link></p>
|
||||||
</InfoBox>
|
</InfoBox>
|
||||||
|
|||||||
@@ -11,8 +11,6 @@ const TG_GROUP_CHAT_LINK = "https://t.me/+ctpg4H0-Y3hlZTY0";
|
|||||||
const TG_NOTIFICATIONS_LINK = "https://t.me/+v30Nts-MrIMyMjNk";
|
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%;
|
||||||
@@ -60,7 +58,7 @@ const FreshmenPageView: React.FC = () => (
|
|||||||
|
|
||||||
<ImageContainer>
|
<ImageContainer>
|
||||||
<Image
|
<Image
|
||||||
src="https://static.sahkoinsinoorikilta.fi/FTMK/kipparit-26.jpg"
|
src="https://static.sahkoinsinoorikilta.fi/FTMK/IMG_6539.JPG"
|
||||||
alt="Kipparit"
|
alt="Kipparit"
|
||||||
layout="responsive"
|
layout="responsive"
|
||||||
width={100}
|
width={100}
|
||||||
@@ -82,8 +80,8 @@ const FreshmenPageView: React.FC = () => (
|
|||||||
Ajan myötä palapelin palat muodostavat sinun näköisesi kuvan ja pääset itse vaikuttamaan siihen, miltä lopputulos näyttää.
|
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 25.-29.8.2026, 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.2025, mutta jo ennen sitä sinulla on mahdollisuus tulla tutustumaan meihin, muihin fukseihin ja ISOihin rentoon Varaslähtöön.
|
||||||
Varaslähtö fuksivuoteen järjestetään lauantaina 16.8.2026. Siitä lisää Telegram-ryhmissä!
|
Varaslähtö fuksivuoteen järjestetään lauantaina 16.8.2025. Siitä lisää Telegram-ryhmissä!
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h6>Teemu Heikkinen</h6>
|
<h6>Teemu Heikkinen</h6>
|
||||||
@@ -128,12 +126,12 @@ const FreshmenPageView: React.FC = () => (
|
|||||||
SIK:n fukseilla on oma Telegram-ryhmä, jonne pääset liitymään tästä:
|
SIK:n fukseilla on oma Telegram-ryhmä, jonne pääset liitymään tästä:
|
||||||
</p>
|
</p>
|
||||||
<QRImages
|
<QRImages
|
||||||
src={SIK_QR}
|
src="https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-2025.jpg"
|
||||||
/>
|
/>
|
||||||
<p>tai <Link to={TG_GROUP_CHAT_LINK} target="_blank">tästä</Link></p>
|
<p>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={SIK_QR_TIEDOTUS}
|
src="https://static.sahkoinsinoorikilta.fi/FTMK/SIK-Fuksit-tiedotus-2025.jpg"
|
||||||
/>
|
/>
|
||||||
<p>tai <Link to={TG_NOTIFICATIONS_LINK} target="_blank">tästä</Link></p>
|
<p>tai <Link to={TG_NOTIFICATIONS_LINK} target="_blank">tästä</Link></p>
|
||||||
</InfoBox>
|
</InfoBox>
|
||||||
|
|||||||
@@ -40,8 +40,7 @@ const HonoraryPageView: React.FC = () => (
|
|||||||
<li>Keijo Nikoskinen 2011–2014</li>
|
<li>Keijo Nikoskinen 2011–2014</li>
|
||||||
<li>Jussi Ryynänen 2014–2017</li>
|
<li>Jussi Ryynänen 2014–2017</li>
|
||||||
<li>Ville Viikari 2017–2020</li>
|
<li>Ville Viikari 2017–2020</li>
|
||||||
<li>Anu Lehtovuori 2020–2026</li>
|
<li>Anu Lehtovuori 2020–</li>
|
||||||
<li>Marko Hinkkanen 2026-</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
<h2>Pro SIK</h2>
|
<h2>Pro SIK</h2>
|
||||||
<p>
|
<p>
|
||||||
@@ -92,8 +91,6 @@ 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>
|
||||||
@@ -236,12 +233,6 @@ 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>
|
||||||
@@ -639,20 +630,6 @@ 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,8 +15,8 @@ const MembershipPageView: React.FC = () => (
|
|||||||
sekä pääsyn killan tiloihin kuten kiltahuoneelle ja SIK-pajalle.
|
sekä pääsyn killan tiloihin kuten kiltahuoneelle ja SIK-pajalle.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Killan varsinaiseksi jäseneksi voidaan hyväksyä kaikki killan toiminnasta kiinnostuneet AYY:n jäsenet.
|
Killan varsinaiseksi jäseneksi voidaan hyväksyä kaikki killan toiminnasta kiinnotuneet AYY:n jäsenet.
|
||||||
Killan ulkojäseneksi voidaan hyväksyä jäsenmaksun maksanut henkilö, jota ei voida hyväksyä varsinaiseksi jäseneksi.
|
Killan ulkojäseneksi voidaan hyväksyä jäsenmaksun maksanut henkilö, joita ei voida hyväksyä varsinaiseksi jäseneksi.
|
||||||
Killan kannatusjäseneksi voidaan hyväksyä henkilö tai yhteisö, joka haluaa tukea killan toimintaa.
|
Killan kannatusjäseneksi voidaan hyväksyä henkilö tai yhteisö, joka haluaa tukea killan toimintaa.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
|
|||||||
Reference in New Issue
Block a user