diff --git a/src/pages/admin/events/create.tsx b/src/pages/admin/events/[id].tsx similarity index 95% rename from src/pages/admin/events/create.tsx rename to src/pages/admin/events/[id].tsx index cd90f26..4a5548f 100644 --- a/src/pages/admin/events/create.tsx +++ b/src/pages/admin/events/[id].tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from "react"; -import { Helmet } from "react-helmet"; -import { RouteComponentProps } from "react-router-dom"; +import { NextPage } from "next"; +import Head from "next/head"; +import { useRouter } from "next/router"; import AdminCreateCommon from "@views/admin/AdminCreateCommon"; import { Tag, getTags } from "@models/Tag"; import { SignupForm, getForms } from "@models/SignupForm"; @@ -157,19 +158,21 @@ const buildUISchema = () => { return uiSchema; } -interface MatchParams { - id?: string; -} - -type EventCreatePageProps = RouteComponentProps; - -const EventCreatePage: React.FC = ({ match: { params: { id } } }) => { +const EventCreatePage: NextPage = () => { const [formData, setFormData] = useState(null); const [tags, setTags] = useState([]); const [signupForms, setSignupForms] = useState([]); const [error, setError] = useState(null); const [statusMessage, setStatusMessage] = useState(null); + const router = useRouter(); + + let id: string; + + if (router.query?.id && router.query.id !== "create") { + id = router.query.id as string; + } + useEffect(() => { getTags() @@ -233,9 +236,9 @@ const EventCreatePage: React.FC = ({ match: { params: { id return ( <> - + - + { ); } -const AdminEventPage: React.FC = () => { +const AdminEventPage: NextPage= () => { const [events, setEvents] = useState(null); useEffect(() => { @@ -43,14 +44,16 @@ const AdminEventPage: React.FC = () => { }, []); return ( - - + <> + - -

Events

- - {renderData(events)} -
+ + +

Events

+ + {renderData(events)} +
+ ); } diff --git a/src/pages/admin/feed/create.tsx b/src/pages/admin/feed/[id].tsx similarity index 94% rename from src/pages/admin/feed/create.tsx rename to src/pages/admin/feed/[id].tsx index 6c651d2..16c7a16 100644 --- a/src/pages/admin/feed/create.tsx +++ b/src/pages/admin/feed/[id].tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from "react"; -import { Helmet } from "react-helmet"; -import { RouteComponentProps } from "react-router-dom"; +import { NextPage } from "next"; +import Head from "next/head"; +import { useRouter } from "next/router"; import AdminCreateCommon from "@views/admin/AdminCreateCommon"; import { Tag, getTags } from "@models/Tag"; import { Post, createPost, getPost, updatePost } from "@models/Feed"; @@ -127,18 +128,20 @@ const buildUISchema = (formData: Post) => { return uiSchema; } -interface MatchParams { - id?: string; -} - -type FeedCreatePageProps = RouteComponentProps; - -const FeedCreatePage: React.FC = ({ match: { params: { id } } }) => { +const FeedCreatePage: NextPage = () => { const [formData, setFormData] = useState(null); const [tags, setTags] = useState([]); const [error, setError] = useState(null); const [statusMessage, setStatusMessage] = useState(null); + const router = useRouter(); + + let id: string; + + if (router.query?.id && router.query.id !== "create") { + id = router.query.id as string; + } + useEffect(() => { getTags() @@ -187,9 +190,9 @@ const FeedCreatePage: React.FC = ({ match: { params: { id } return ( <> - + - + { ); } -const AdminFeedPage: React.FC = () => { +const AdminFeedPage: NextPage = () => { const [forms, setForms] = useState(null); useEffect(() => { @@ -44,14 +45,16 @@ const AdminFeedPage: React.FC = () => { }, []); return ( - - + <> + - -

Feed

- - {renderData(forms)} -
+ + +

Feed

+ + {renderData(forms)} +
+ ); } diff --git a/src/pages/admin/index.tsx b/src/pages/admin/index.tsx index b989cb7..3befe28 100644 --- a/src/pages/admin/index.tsx +++ b/src/pages/admin/index.tsx @@ -1,20 +1,20 @@ import React from "react"; import { NextPage } from "next"; import Head from "next/head"; -import PageWrapper from "@views/common/AdminPageWrapper"; +import AdminPageWrapper from "@views/common/AdminPageWrapper"; const AdminFrontPage: NextPage = () => { return ( <> - - - - -
-

SIK Admin

-
-
- + + + + +
+

SIK Admin

+
+
+ ) }; diff --git a/src/pages/admin/jobads/create.tsx b/src/pages/admin/jobads/[id].tsx similarity index 92% rename from src/pages/admin/jobads/create.tsx rename to src/pages/admin/jobads/[id].tsx index 5674ea0..dc0da99 100644 --- a/src/pages/admin/jobads/create.tsx +++ b/src/pages/admin/jobads/[id].tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from "react"; -import { Helmet } from "react-helmet"; -import { RouteComponentProps } from "react-router-dom"; +import { NextPage } from "next"; +import Head from "next/head"; +import { useRouter } from "next/router"; import AdminCreateCommon from "@views/admin/AdminCreateCommon"; import { JobAd, getJobAd, createJobAd, updateJobAd } from "@models/JobAd"; import DatetimeWidget from "@components/Widgets/DatetimeWidget"; @@ -104,16 +105,20 @@ const buildUISchema = (formData: JobAd) => ({ }, }); -interface MatchParams { - id?: string; -} - -type JobAdCreatePageProps = RouteComponentProps; - -const JobAdCreatePage: React.FC = ({ match: { params: { id } } }) => { +const JobAdCreatePage: NextPage = () => { const [formData, setFormData] = useState(null); const [error, setError] = useState(null); const [statusMessage, setStatusMessage] = useState(null); + + + const router = useRouter(); + + let id: string; + + if (router.query?.id && router.query.id !== "create") { + id = router.query.id as string; + } + useEffect(() => { const jobId = id && Number(id); if (jobId !== undefined) { @@ -150,9 +155,9 @@ const JobAdCreatePage: React.FC = ({ match: { params: { id return ( <> - + - + { ); } -const AdminJobAdPage: React.FC = () => { +const AdminJobAdPage: NextPage = () => { // const { data, error } = useFetchJobAds({ options: { auth: true } ); return ( - - + <> + - -

Job advertisements

- - {/* {renderData(jobAds)} */} -
+ + +

Job advertisements

+ + {/* {renderData(jobAds)} */} +
+ ) } diff --git a/src/pages/admin/login.tsx b/src/pages/admin/login.tsx index 269aea9..a4cfdca 100644 --- a/src/pages/admin/login.tsx +++ b/src/pages/admin/login.tsx @@ -1,9 +1,10 @@ import React, { useState, useEffect } from "react"; -import styled from "styled-components"; -import { Helmet } from "react-helmet"; +import { NextPage } from "next"; +import Head from "next/head"; import { useRouter } from "next/router"; +import styled from "styled-components"; import { generateToken, setTokenCookie, isAuthenticated } from "@utils/auth"; -import PageWrapper from "@views/common/AdminPageWrapper"; +import AdminPageWrapper from "@views/common/AdminPageWrapper"; const Main = styled.div` input { @@ -12,7 +13,7 @@ const Main = styled.div` `; const DEFAULT_REDIRECT = "/admin"; -const AdminLoginPage: React.FC = () => { +const AdminLoginPage: NextPage = () => { const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [error, setError] = useState(""); @@ -39,45 +40,47 @@ const AdminLoginPage: React.FC = () => { } return ( - -
- - - -

Log in to SIK Admin

- {next && next !== DEFAULT_REDIRECT && ( -
You have to log in first.
- )} -
- - - -
- {error && ( -
- {error} -
- )} -
-
+ <> + + + + +
+

Log in to SIK Admin

+ {next && next !== DEFAULT_REDIRECT && ( +
You have to log in first.
+ )} +
+ + + +
+ {error && ( +
+ {error} +
+ )} +
+
+ ); } diff --git a/src/pages/admin/logout.tsx b/src/pages/admin/logout.tsx index 4b667cb..161a510 100644 --- a/src/pages/admin/logout.tsx +++ b/src/pages/admin/logout.tsx @@ -1,11 +1,14 @@ -import React from "react"; +import { NextPage } from "next"; import { useRouter } from "next/router"; import { deleteTokenCookie } from "@utils/auth"; -const AdminLogoutPage: React.FC = () => { - deleteTokenCookie(); +const AdminLogoutPage: NextPage = () => { const router = useRouter(); - router.push("/admin/login"); + // client-side-only code + if (typeof window !== "undefined") { + deleteTokenCookie(); + router.push("/admin/login"); + } return null; } diff --git a/src/pages/admin/signups/create.tsx b/src/pages/admin/signups/[id].tsx similarity index 93% rename from src/pages/admin/signups/create.tsx rename to src/pages/admin/signups/[id].tsx index a2cc984..8fa31f0 100644 --- a/src/pages/admin/signups/create.tsx +++ b/src/pages/admin/signups/[id].tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from "react"; -import { Helmet } from "react-helmet"; -import { RouteComponentProps } from "react-router-dom"; +import { NextPage } from "next"; +import Head from "next/head"; +import { useRouter } from "next/router"; import AdminCreateCommon from "@views/admin/AdminCreateCommon"; import { SignupForm, createForm, getForm, updateForm } from "@models/SignupForm"; import DatetimeWidget from "@components/Widgets/DatetimeWidget"; @@ -96,16 +97,19 @@ const buildUISchema = () => { return uiSchema; } -interface MatchParams { - id?: string; -} - -type SignupCreatePageProps = RouteComponentProps; - -const SignupCreatePage: React.FC = ({ match: { params: { id } } }) => { +const SignupCreatePage: NextPage = () => { const [formData, setFormData] = useState(null); const [error, setError] = useState(null); const [statusMessage, setStatusMessage] = useState(null); + + const router = useRouter(); + + let id: string; + + if (router.query?.id && router.query.id !== "create") { + id = router.query.id as string; + } + useEffect(() => { const suId = id && Number(id); if (suId !== undefined) { @@ -158,9 +162,9 @@ const SignupCreatePage: React.FC = ({ match: { params: { return ( <> - + - + ({ }, }); -interface MatchParams { - id?: string; -} -type SignupEmailPageProps = RouteComponentProps; - - -const SignupEmailPage: React.FC = ({ match: { params: { id } } }) => { +const SignupEmailPage: NextPage = () => { const [signupForm, setSignupForm] = useState(null); + + const router = useRouter(); + const { id } = router.query; + useEffect(() => { const formId = Number(id); if (formId !== undefined) { @@ -83,23 +81,18 @@ const SignupEmailPage: React.FC = ({ match: { params: { id const title = signupForm ? signupForm.title_fi : "Loading..." return ( - <> - - - - - + )}; export default SignupEmailPage; diff --git a/src/pages/admin/signups/[id]/list.tsx b/src/pages/admin/signups/[id]/list.tsx index 68a4845..87bf87c 100644 --- a/src/pages/admin/signups/[id]/list.tsx +++ b/src/pages/admin/signups/[id]/list.tsx @@ -1,26 +1,25 @@ import React, { useEffect, useState } from "react"; -import { Helmet } from "react-helmet"; -import { RouteComponentProps } from "react-router-dom"; +import { NextPage } from "next"; +import { useRouter } from "next/router"; import styled from "styled-components"; import { CSVLink } from "react-csv"; import AdminListCommon from "@views/admin/AdminListCommon"; import { SignupForm, getForm, getSignups } from "@models/SignupForm"; import { Signup, deleteSignup } from "@models/Signup"; import { Button } from "@components/index"; - -interface MatchParams { - id?: string; -} - -type SignupEmailPageProps = RouteComponentProps; +import noop from "@utils/noop"; const StyledButton = styled(Button)<{ colorOverride: "red" | "green" }>` background-color: ${(p: any) => p.colorOverride}; `; -const SignupEmailPage: React.FC = ({ match: { params: { id } } }) => { +const SignupEmailPage: NextPage = () => { const [signupForm, setSignupForm] = useState(null); const [signups, setSignups] = useState([]); + + const router = useRouter(); + const { id } = router.query; + useEffect(() => { const formId = Number(id); getForm(formId, true) @@ -58,9 +57,6 @@ const SignupEmailPage: React.FC = ({ match: { params: { id return ( - - -

{title}: Sign-ups

@@ -70,7 +66,7 @@ const SignupEmailPage: React.FC = ({ match: { params: { id ))}
q.title)} separator=";"> - + Download CSV diff --git a/src/pages/admin/signups/index.tsx b/src/pages/admin/signups/index.tsx index edf66d7..5189a08 100644 --- a/src/pages/admin/signups/index.tsx +++ b/src/pages/admin/signups/index.tsx @@ -1,5 +1,6 @@ import React, { useEffect, useState } from "react"; -import { Helmet } from "react-helmet"; +import { NextPage } from "next"; +import Head from "next/head"; import { formatRelative } from "date-fns"; import AdminListCommon from "@views/admin/AdminListCommon"; import { Link } from "@components/index"; @@ -39,7 +40,7 @@ const renderData = (signupForms: SignupForm[]) => { ); } -const AdminSignupPage: React.FC = () => { +const AdminSignupPage: NextPage = () => { const [forms, setForms] = useState(null); useEffect(() => { @@ -48,14 +49,16 @@ const AdminSignupPage: React.FC = () => { }, []); return ( - - + <> + - -

Sign-up forms

- - {renderData(forms)} -
+ + +

Sign-up forms

+ + {renderData(forms)} +
+ ); } diff --git a/src/routes.tsx b/src/routes.tsx deleted file mode 100644 index 090773f..0000000 --- a/src/routes.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import React from "react"; -import { Switch, Route } from "react-router-dom"; -import { Helmet } from "react-helmet"; -import JsonLD from "@components/JsonLD"; -import "./index.scss"; - -import FrontPage from "./pages"; -import GuildPage from "./pages/kilta"; -import NotFoundPage from "./pages/404"; -import AdminFrontPage from "./pages/admin"; -import AdminEventPage from "./pages/admin/events"; -import AdminFeedPage from "./pages/admin/feed"; -import AdminSignupPage from "./pages/admin/signups"; -import AdminLoginPage from "./pages/admin/login"; -import AdminLogoutPage from "./pages/admin/logout"; -import EventCreatePage from "./pages/admin/events/create"; -import FeedCreatePage from "./pages/admin/feed/create"; -import ContactsPage from "./pages/yhteystiedot"; -import SignupCreatePage from "./pages/admin/signups/create"; -import SignupEmailPage from "./pages/admin/signups/[id]/email"; -import SignupListPage from "./pages/admin/signups/[id]/list"; -import SignUpPage from "./pages/signup/[...params]"; -import ActualPage from "./pages/kilta/toiminta"; -import FreshmenPage from "./pages/kilta/fuksi"; -import HonoraryPage from "./pages/kilta/kunnia"; -import StudiesPage from "./pages/opinnot_ja_ura"; -import CorporatePage from "./pages/yritysyhteistyo"; -import InEnglishPage from "./pages/in_english"; -import EventPage from "./pages/events/[id]"; -import AdminJobAdPage from "@pages/admin/jobads"; -import JobAdCreatePage from "@pages/admin/jobads/create"; -import commonPageWrapper from "@views/common/PageWrapper"; -import adminPageWrapper from "@views/common/AdminPageWrapper"; - -const commonRoutes = [ - { path: "/", page: FrontPage }, - { path: "/signup/:formId", page: SignUpPage }, - { path: "/signup/edit/:signupId/:uuid", page: SignUpPage }, - { path: "/events/:id", page: EventPage }, - { path: "/kilta", page: GuildPage }, - { path: "/kilta/toiminta", page: ActualPage }, - { path: "/kilta/fuksi", page: FreshmenPage }, - { path: "/kilta/kunnia", page: HonoraryPage}, - { path: "/opinnot_ja_ura", page: StudiesPage }, - { path: "/yritysyhteistyo", page: CorporatePage }, - { path: "/yhteystiedot", page: ContactsPage }, - { path: "/in_english", page: InEnglishPage }, -]; - -const adminLoginRoutes = [ - { path: "/admin/login", page: AdminLoginPage }, -]; - -const adminRoutes = [ - { path: "/admin/feed", page: AdminFeedPage }, - { path: "/admin/feed/create", page: FeedCreatePage }, - { path: "/admin/feed/:id", page: FeedCreatePage }, - { path: "/admin/events", page: AdminEventPage }, - { path: "/admin/events/create", page: EventCreatePage }, - { path: "/admin/events/:id", page: EventCreatePage }, - { path: "/admin/signups", page: AdminSignupPage }, - { path: "/admin/signups/create", page: SignupCreatePage }, - { path: "/admin/signups/:id", page: SignupCreatePage }, - { path: "/admin/signups/:id/list", page: SignupListPage }, - { path: "/admin/signups/:id/email", page: SignupEmailPage }, - { path: "/admin/jobads", page: AdminJobAdPage }, - { path: "/admin/jobads/create", page: JobAdCreatePage }, - { path: "/admin/jobads/:id", page: JobAdCreatePage }, - { path: "/admin/logout", page: AdminLogoutPage }, - { path: "/admin", page: AdminFrontPage }, -]; - -const Routes: React.FC = () => ( - <> - - Aalto-yliopiston Sähköinsinoorikilta ry - - - - - - - {commonRoutes.map(r => )} - {adminLoginRoutes.map(r => )} - {adminRoutes.map(r => )} - - - -); - -export default Routes; diff --git a/src/theme/fontSizes.ts b/src/theme/fontSizes.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/views/admin/AdminCreateCommon.tsx b/src/views/admin/AdminCreateCommon.tsx index 2ebd2ec..4a99221 100644 --- a/src/views/admin/AdminCreateCommon.tsx +++ b/src/views/admin/AdminCreateCommon.tsx @@ -7,6 +7,7 @@ import { Post } from "@models/Feed"; import { SignupForm } from "@models/SignupForm"; import { JobAd } from "@models/JobAd"; import FormWrapper from "@views/common/FormWrapper"; +import AdminPageWrapper from "@views/common/AdminPageWrapper"; const Common = styled.div` legend { @@ -71,26 +72,28 @@ const AdminCreateCommon: React.FC = ({ } return ( - -

{title}

- {statusMessage && ( - {statusMessage} - )} - - {error && ( - {error} - )} -
+ + +

{title}

+ {statusMessage && ( + {statusMessage} + )} + + {error && ( + {error} + )} +
+
) } diff --git a/src/views/admin/AdminListCommon.tsx b/src/views/admin/AdminListCommon.tsx index b49d0dd..d19bd05 100644 --- a/src/views/admin/AdminListCommon.tsx +++ b/src/views/admin/AdminListCommon.tsx @@ -1,5 +1,7 @@ +import React from "react"; import styled from "styled-components"; import { colors } from "@theme/colors"; +import AdminPageWrapper from "@views/common/AdminPageWrapper"; const Main = styled.div` table { @@ -19,4 +21,12 @@ const Main = styled.div` } `; -export default Main; \ No newline at end of file +const AdminListCommon: React.FC = ({ children }) => ( + +
+ {children} +
+
+) + +export default AdminListCommon; diff --git a/src/views/common/AdminPageWrapper.tsx b/src/views/common/AdminPageWrapper.tsx index c82a4af..a6412d1 100644 --- a/src/views/common/AdminPageWrapper.tsx +++ b/src/views/common/AdminPageWrapper.tsx @@ -61,7 +61,7 @@ type PageProps = { requiresAuthentication: boolean; } -const PageWrapper: React.FC = ({ requiresAuthentication, children }) => { +const AdminPageWrapper: React.FC = ({ requiresAuthentication, children }) => { const router = useRouter(); const { completed, redirecting } = useShouldRedirect(requiresAuthentication); @@ -88,4 +88,4 @@ const PageWrapper: React.FC = ({ requiresAuthentication, children }) ) } -export default PageWrapper; \ No newline at end of file +export default AdminPageWrapper; \ No newline at end of file