From 05097e44a4b96814c200d5f34b6e61a2603bb010 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Mon, 15 Mar 2021 20:05:39 +0200 Subject: [PATCH] Split model files into apis, hooks and models --- package-lock.json | 72 +------ package.json | 1 - src/api/eventApi.ts | 90 +++++++++ src/api/feedApi.ts | 66 +++++++ src/api/jobAdApi.ts | 76 ++++++++ src/api/signupApi.ts | 180 ++++++++++++++++++ src/api/tagApi.ts | 24 +++ src/hooks/useFetchEvents.ts | 44 +++++ src/hooks/useFetchFeed.ts | 40 ++++ src/hooks/useFetchJobAds.ts | 40 ++++ src/models/Event.ts | 130 +------------ src/models/Feed.ts | 99 +--------- src/models/JobAd.ts | 113 +---------- src/models/Signup.ts | 88 ++------- src/models/SignupForm.ts | 123 ------------ src/models/Tag.ts | 16 +- src/pages/admin/events/[id].tsx | 21 +- src/pages/admin/events/index.tsx | 5 +- src/pages/admin/feed/[id].tsx | 16 +- src/pages/admin/feed/index.tsx | 5 +- src/pages/admin/jobads/[id].tsx | 11 +- src/pages/admin/jobads/index.tsx | 5 +- src/pages/admin/signups/[id].tsx | 11 +- src/pages/admin/signups/[id]/email.tsx | 7 +- src/pages/admin/signups/[id]/list.tsx | 10 +- src/pages/admin/signups/index.tsx | 5 +- src/pages/events/[id].tsx | 14 +- src/pages/in_english.tsx | 20 +- src/pages/index.tsx | 20 +- src/pages/kilta/toiminta.tsx | 20 +- src/pages/signup/[id].tsx | 10 +- src/pages/signup/edit/[id]/[uuid].tsx | 10 +- src/pages/yritysyhteistyo.tsx | 9 +- src/views/ActualPage/ActualPageView.tsx | 4 +- src/views/ActualPage/EventCalendar.tsx | 2 +- src/views/ActualPage/News.tsx | 2 +- src/views/CorporatePage/CorporatePageView.tsx | 2 +- src/views/CorporatePage/JobAdList.tsx | 2 +- src/views/EventPage/EventPageView.tsx | 2 +- src/views/FrontPage/FrontPageView.tsx | 4 +- src/views/InEnglishPage/InEnglishPageView.tsx | 4 +- src/views/SignUpPage/FormUtils.tsx | 2 +- src/views/SignUpPage/SignUpPageView.tsx | 2 +- src/views/admin/AdminCreateCommon.tsx | 8 +- tsconfig.json | 3 + 45 files changed, 707 insertions(+), 731 deletions(-) create mode 100644 src/api/eventApi.ts create mode 100644 src/api/feedApi.ts create mode 100644 src/api/jobAdApi.ts create mode 100644 src/api/signupApi.ts create mode 100644 src/api/tagApi.ts create mode 100644 src/hooks/useFetchEvents.ts create mode 100644 src/hooks/useFetchFeed.ts create mode 100644 src/hooks/useFetchJobAds.ts delete mode 100644 src/models/SignupForm.ts diff --git a/package-lock.json b/package-lock.json index a7b7b21..7bd8878 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,6 @@ "lodash": "4.17.21", "next": "10.0.7", "normalize.css": "8.0.1", - "query-string": "6.14.1", "react": "17.0.1", "react-beautiful-dnd": "13.0.0", "react-csv": "2.0.3", @@ -5591,6 +5590,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, "engines": { "node": ">=0.10" } @@ -7217,14 +7217,6 @@ "node": ">=0.10.0" } }, - "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/find-babel-config": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", @@ -11192,23 +11184,6 @@ "qrcode-terminal": "bin/qrcode-terminal.js" } }, - "node_modules/query-string": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", - "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", - "dependencies": { - "decode-uri-component": "^0.2.0", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/querystring": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", @@ -12645,14 +12620,6 @@ "specificity": "bin/specificity" } }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "engines": { - "node": ">=6" - } - }, "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -12760,14 +12727,6 @@ "xtend": "^4.0.0" } }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", - "engines": { - "node": ">=4" - } - }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -20892,7 +20851,8 @@ "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true }, "decompress-response": { "version": "4.2.1", @@ -22233,11 +22193,6 @@ } } }, - "filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=" - }, "find-babel-config": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", @@ -25503,17 +25458,6 @@ "integrity": "sha1-p2pI4mEKGPl/o6K9UytoKs/4bFM=", "dev": true }, - "query-string": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", - "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", - "requires": { - "decode-uri-component": "^0.2.0", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - } - }, "querystring": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", @@ -26751,11 +26695,6 @@ "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", "dev": true }, - "split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" - }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -26849,11 +26788,6 @@ "xtend": "^4.0.0" } }, - "strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", diff --git a/package.json b/package.json index 38a7071..39f8752 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,6 @@ "lodash": "4.17.21", "next": "10.0.7", "normalize.css": "8.0.1", - "query-string": "6.14.1", "react": "17.0.1", "react-beautiful-dnd": "13.0.0", "react-csv": "2.0.3", diff --git a/src/api/eventApi.ts b/src/api/eventApi.ts new file mode 100644 index 0000000..799e772 --- /dev/null +++ b/src/api/eventApi.ts @@ -0,0 +1,90 @@ +import axios from "axios"; +import Event from "@models/Event"; +import { getAuthHeader } from "@utils/auth"; + +export const URL = `${process.env.NEXT_PUBLIC_API_URL}/events/`; + +export interface Options { + onlyNonPast?: boolean; + limit?: number; + auth?: boolean; +} + +class EventApi { + static async getEvent(id: number, auth = false): Promise { + try { + const headers = auth ? { Authorization: getAuthHeader() } : null; + const resp = await axios.get(`${URL}${id}/`, { + headers, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async getEvents(options: Options = {}): Promise { + const { onlyNonPast, limit, auth } = options; + try { + const params = { + since: onlyNonPast ? (new Date()).toISOString() : undefined, + limit, + }; + const headers = auth ? { Authorization: getAuthHeader() } : null; + const resp = await axios.get(`${URL}`, { + headers, + params, + }); + return resp.data.results; + } catch (err) { + console.error(err); + throw err; + } + } + + static async createEvent(data: any): Promise { + try { + const resp = await axios.post(URL, data, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async updateEvent(data: any): Promise { + try { + const putUrl = `${URL}${data.id}/`; + const resp = await axios.put(putUrl, data, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async deleteEvent(id: number) { + try { + const resp = await axios.delete(`${URL}${id}`, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } +} + +export default EventApi; diff --git a/src/api/feedApi.ts b/src/api/feedApi.ts new file mode 100644 index 0000000..2e2c366 --- /dev/null +++ b/src/api/feedApi.ts @@ -0,0 +1,66 @@ +import axios from "axios"; +import Post from "@models/Feed"; +import { getAuthHeader } from "@utils/auth"; + +export const URL = `${process.env.NEXT_PUBLIC_API_URL}/feed/`; + +export interface Options { + auth?: boolean; +} + +class FeedApi { + static async getFeed(options: Options = {}): Promise { + const { auth } = options; + const headers = auth ? { Authorization: getAuthHeader() } : null; + try { + const resp = await axios.get(URL, { headers }); + return resp.data.results; + } catch (err) { + console.error(err); + throw err; + } + } + + static async getPost(id: number, options: Options = {}): Promise { + const { auth } = options; + const headers = auth ? { Authorization: getAuthHeader() } : null; + try { + const resp = await axios.get(`${URL}${id}/`, { headers }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async createPost(data): Promise { + try { + const resp = await axios.post(URL, data, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async updatePost(data): Promise { + try { + const putUrl = `${URL}${data.id}/`; + const resp = await axios.put(putUrl, data, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } +} + +export default FeedApi; diff --git a/src/api/jobAdApi.ts b/src/api/jobAdApi.ts new file mode 100644 index 0000000..4ed51b7 --- /dev/null +++ b/src/api/jobAdApi.ts @@ -0,0 +1,76 @@ +import axios from "axios"; +import JobAd from "@models/JobAd"; +import { getAuthHeader } from "@utils/auth"; + +export const URL = `${process.env.NEXT_PUBLIC_API_URL}/jobads/`; + +export interface Options { + onlyNonPast?: boolean; + limit?: number; + auth?: boolean; +} + +class JobAdApi { + static async getJobAds(options: Options = {}): Promise { + const { onlyNonPast, limit, auth } = options; + try { + const params = { + since: onlyNonPast ? (new Date()).toISOString() : undefined, + limit, + }; + const headers = auth ? { Authorization: getAuthHeader() } : null; + const resp = await axios.get(`${URL}`, { + headers, + params, + }); + return resp.data.results; + } catch (err) { + console.error(err); + throw err; + } + } + + static async getJobAd(id: number, auth = false): Promise { + try { + const headers = auth ? { Authorization: getAuthHeader() } : null; + const resp = await axios.get(`${URL}${id}/`, { + headers, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async createJobAd(data: any): Promise { + try { + const resp = await axios.post(URL, data, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async updateJobAd(data: any): Promise { + try { + const putUrl = `${URL}${data.id}/`; + const resp = await axios.put(putUrl, data, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } +} + +export default JobAdApi; diff --git a/src/api/signupApi.ts b/src/api/signupApi.ts new file mode 100644 index 0000000..d312b89 --- /dev/null +++ b/src/api/signupApi.ts @@ -0,0 +1,180 @@ +import axios from "axios"; +import { Signup, SignupForm } from "@models/Signup"; +import { getAuthHeader } from "@utils/auth"; + +export const URL = `${process.env.NEXT_PUBLIC_API_URL}/signup/`; +export const FORM_URL = `${process.env.NEXT_PUBLIC_API_URL}/signupForm/`; + +export interface Options { + onlyNonPast?: boolean; + limit?: number; + auth?: boolean; +} + +class SignupApi { + static async getSignup(id: number): Promise { + try { + const resp = await axios.get(`${URL}${id}`, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async createSignup(data: Signup): Promise { + try { + const resp = await axios.post(URL, data); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async updateSignup(data: Signup, uuid: string): Promise { + try { + const { id } = data; + if (!id) throw new Error("SignupId required!"); + const resp = await axios.put(`${URL}${id}/edit/`, data, { + params: { uuid }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async getSignupUUID(id: number, uuid: string): Promise { + try { + const resp = await axios.get(`${URL}${id}/edit/`, { + params: { + uuid, + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async deleteSignup(id: number) { + try { + const resp = await axios.delete(`${URL}${id}`, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async getForms(auth = false): Promise { + try { + const headers = auth ? { Authorization: getAuthHeader() } : null; + const resp = await axios.get(FORM_URL, { + headers, + }); + const { results } = resp.data; + return results; + } catch (err) { + console.error(err); + throw err; + } + } + + static async getForm(id: number, auth = false): Promise { + try { + const headers = auth ? { Authorization: getAuthHeader() } : null; + const resp = await axios.get(`${FORM_URL}${id}/`, { + headers, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async createForm(data): Promise { + try { + const resp = await axios.post(FORM_URL, data, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async updateForm(data): Promise { + try { + const putUrl = `${FORM_URL}${data.id}/`; + const resp = await axios.put(putUrl, data, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async deleteForm(id: number) { + try { + const resp = await axios.delete(`${FORM_URL}${id}`, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async signupFormSendEmail(data, id): Promise { + try { + const resp = await axios.post(`${FORM_URL}${id}/sendemail/`, data, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } + + static async getSignups(id): Promise { + try { + const resp = await axios.get(`${FORM_URL}${id}/signups/`, { + headers: { + Authorization: getAuthHeader(), + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } + } +} + +export default SignupApi; diff --git a/src/api/tagApi.ts b/src/api/tagApi.ts new file mode 100644 index 0000000..6a7e26c --- /dev/null +++ b/src/api/tagApi.ts @@ -0,0 +1,24 @@ +import axios from "axios"; +import Tag from "@models/Tag"; + +export const URL = `${process.env.NEXT_PUBLIC_API_URL}/tags/`; + +export interface Options { + onlyNonPast?: boolean; + limit?: number; + auth?: boolean; +} + +class TagApi { + static async getTags(): Promise { + try { + const resp = await axios.get(URL); + return resp.data.results; + } catch (err) { + console.error(err); + throw err; + } + } +} + +export default TagApi; diff --git a/src/hooks/useFetchEvents.ts b/src/hooks/useFetchEvents.ts new file mode 100644 index 0000000..627140e --- /dev/null +++ b/src/hooks/useFetchEvents.ts @@ -0,0 +1,44 @@ +import useSWR from "swr"; +import axios, { AxiosRequestConfig } from "axios"; +import Event from "@models/Event"; +import { getAuthHeader } from "@utils/auth"; +import { URL, Options } from "@api/eventApi"; + +const fetcher = (url: string, config: AxiosRequestConfig) => axios.get(url, config).then((res) => res.data); + +const generateFetchParams = (id = "", options: Options = {}) => { + const url = `${URL}${id}`; + const { auth, onlyNonPast, limit } = options; + + return { + url, + config: { + params: { + since: onlyNonPast ? (new Date()).toISOString() : undefined, + limit, + }, + headers: auth ? { Authorization: getAuthHeader() } : null, + }, + }; +}; + +interface FetchArguments { + initialData?: Event | Event[], + id?: string; + options?: Options +} + +const useFetchEvents = ({ + initialData, + id = "", + options = {}, +}: FetchArguments) => { + const { url, config } = generateFetchParams(id, options); + const { data, error } = useSWR([url, config], fetcher, { initialData }); + return { + data: data?.results || data, + error, + }; +}; + +export default useFetchEvents; diff --git a/src/hooks/useFetchFeed.ts b/src/hooks/useFetchFeed.ts new file mode 100644 index 0000000..ce8fa57 --- /dev/null +++ b/src/hooks/useFetchFeed.ts @@ -0,0 +1,40 @@ +import useSWR from "swr"; +import axios, { AxiosRequestConfig } from "axios"; +import Post from "@models/Feed"; +import { getAuthHeader } from "@utils/auth"; +import { URL, Options } from "@api/feedApi"; + +const feedFetcher = (url: string, config?: AxiosRequestConfig) => axios.get(url, config).then((res) => res.data); + +const generateFetchParams = (id = "", options: Options = {}) => { + const url = `${URL}${id}`; + const { auth } = options; + + return { + url, + config: { + headers: auth ? { Authorization: getAuthHeader() } : null, + }, + }; +}; + +interface FetchArguments { + initialData?: Post | Post[], + id?: string; + options?: Options +} + +const useFetchFeed = ({ + initialData, + id = "", + options = {}, +}: FetchArguments) => { + const { url, config } = generateFetchParams(id, options); + const { data, error } = useSWR([url, config], feedFetcher, { initialData }); + return { + data: data?.results || data, + error, + }; +}; + +export default useFetchFeed; diff --git a/src/hooks/useFetchJobAds.ts b/src/hooks/useFetchJobAds.ts new file mode 100644 index 0000000..96a7404 --- /dev/null +++ b/src/hooks/useFetchJobAds.ts @@ -0,0 +1,40 @@ +import axios, { AxiosRequestConfig } from "axios"; +import useSWR from "swr"; +import JobAd from "@models/JobAd"; +import { getAuthHeader } from "@utils/auth"; +import { URL, Options } from "@api/jobAdApi"; + +const jobAdFetcher = (url: string, config?: AxiosRequestConfig) => axios.get(url, config).then((res) => res.data); + +const generateFetchParams = (id = "", options: Options = {}) => { + const url = `${URL}${id}`; + const { auth } = options; + + return { + url, + config: { + headers: auth ? { Authorization: getAuthHeader() } : null, + }, + }; +}; + +interface FetchArguments { + initialData?: JobAd | JobAd[], + id?: string; + options?: Options; +} + +const useFetchJobAds = ({ + initialData, + id = "", + options = {}, +}: FetchArguments) => { + const { url, config } = generateFetchParams(id, options); + const { data, error } = useSWR([url, config], jobAdFetcher, { initialData }); + return { + data: data?.results || data, + error, + }; +}; + +export default useFetchJobAds; diff --git a/src/models/Event.ts b/src/models/Event.ts index 7476b3d..d2ba762 100644 --- a/src/models/Event.ts +++ b/src/models/Event.ts @@ -1,13 +1,7 @@ -import axios, { AxiosRequestConfig } from "axios"; -import useSWR from "swr"; -import qs from "query-string"; -import { getAuthHeader } from "@utils/auth"; -import { Tag } from "./Tag"; -import { SignupForm } from "./SignupForm"; +import Tag from "./Tag"; +import { SignupForm } from "./Signup"; -const URL = `${process.env.NEXT_PUBLIC_API_URL}/events/`; - -export interface Event { +interface Event { id: number; title_fi: string; title_en: string; @@ -25,120 +19,4 @@ export interface Event { signupForm: SignupForm[]; } -interface Options { - onlyNonPast?: boolean; - limit?: number; - auth?: boolean; -} - -export async function getEvents(options: Options = {}): Promise { - const { onlyNonPast, limit, auth } = options; - try { - const params = { - since: onlyNonPast ? (new Date()).toISOString() : undefined, - limit, - }; - const search = qs.stringify(params); - const headers = auth ? { Authorization: getAuthHeader() } : null; - const resp = await axios.get(`${URL}?${search}`, { - headers, - }); - return resp.data.results; - } catch (err) { - console.error(err); - throw err; - } -} - -export async function getEvent(id: number, auth = false): Promise { - try { - const headers = auth ? { Authorization: getAuthHeader() } : null; - const resp = await axios.get(`${URL}${id}/`, { - headers, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -} - -export async function createEvent(data): Promise { - try { - const resp = await axios.post(URL, data, { - headers: { - Authorization: getAuthHeader(), - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -} - -export async function updateEvent(data): Promise { - try { - const putUrl = `${URL}${data.id}/`; - const resp = await axios.put(putUrl, data, { - headers: { - Authorization: getAuthHeader(), - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -} - -export async function deleteEvent(id: number) { - try { - const resp = await axios.delete(`${URL}${id}`, { - headers: { - Authorization: getAuthHeader(), - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -} - -export const eventFetcher = (url: string, config?: AxiosRequestConfig) => axios.get(url, config).then((res) => res.data); - -export const generateFetchParams = (id = "", options: Options = {}) => { - const url = `${URL}${id}`; - const { auth, onlyNonPast, limit } = options; - - return { - url, - config: { - params: { - since: onlyNonPast ? (new Date()).toISOString() : undefined, - limit, - }, - headers: auth ? { Authorization: getAuthHeader() } : null, - }, - }; -}; - -interface FetchArguments { - initialData?: Event | Event[], - id?: string; - options?: Options -} - -export const useFetchEvents = ({ - initialData, - id = "", - options = {}, -}: FetchArguments) => { - const { url, config } = generateFetchParams(id, options); - const { data, error } = useSWR([url, config], eventFetcher, { initialData }); - return { - data: data?.results || data, - error, - }; -}; +export default Event; diff --git a/src/models/Feed.ts b/src/models/Feed.ts index 6da243f..743f4c9 100644 --- a/src/models/Feed.ts +++ b/src/models/Feed.ts @@ -1,11 +1,6 @@ -import axios, { AxiosRequestConfig } from "axios"; -import useSWR from "swr"; -import { getAuthHeader } from "@utils/auth"; -import { Tag } from "./Tag"; +import Tag from "./Tag"; -const URL = `${process.env.NEXT_PUBLIC_API_URL}/feed/`; - -export interface Post { +interface Post { id: number; tags: Tag[]; visible: boolean; @@ -21,92 +16,4 @@ export interface Post { autohide_enabled: boolean; } -interface Options { - auth?: boolean; -} - -export async function getFeed(options: Options = {}): Promise { - const { auth } = options; - const headers = auth ? { Authorization: getAuthHeader() } : null; - try { - const resp = await axios.get(URL, { headers }); - return resp.data.results; - } catch (err) { - console.error(err); - throw err; - } -} - -export async function getPost(id: number, options: Options = {}): Promise { - const { auth } = options; - const headers = auth ? { Authorization: getAuthHeader() } : null; - try { - const resp = await axios.get(`${URL}${id}/`, { headers }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -} - -export async function createPost(data): Promise { - try { - const resp = await axios.post(URL, data, { - headers: { - Authorization: getAuthHeader(), - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -} - -export async function updatePost(data): Promise { - try { - const putUrl = `${URL}${data.id}/`; - const resp = await axios.put(putUrl, data, { - headers: { - Authorization: getAuthHeader(), - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -} - -export const feedFetcher = (url: string, config?: AxiosRequestConfig) => axios.get(url, config).then((res) => res.data); - -export const generateFetchParams = (id = "", options: Options = {}) => { - const url = `${URL}${id}`; - const { auth } = options; - - return { - url, - config: { - headers: auth ? { Authorization: getAuthHeader() } : null, - }, - }; -}; - -interface FetchArguments { - initialData?: Post | Post[], - id?: string; - options?: Options -} - -export const useFetchFeed = ({ - initialData, - id = "", - options = {}, -}: FetchArguments) => { - const { url, config } = generateFetchParams(id, options); - const { data, error } = useSWR([url, config], feedFetcher, { initialData }); - return { - data: data?.results || data, - error, - }; -}; +export default Post; diff --git a/src/models/JobAd.ts b/src/models/JobAd.ts index 39ada99..0641cb1 100644 --- a/src/models/JobAd.ts +++ b/src/models/JobAd.ts @@ -1,11 +1,4 @@ -import axios, { AxiosRequestConfig } from "axios"; -import useSWR from "swr"; -import qs from "query-string"; -import { getAuthHeader } from "@utils/auth"; - -const URL = `${process.env.NEXT_PUBLIC_API_URL}/jobads/`; - -export interface JobAd { +interface JobAd { id: number; title_fi: string; title_en: string; @@ -17,106 +10,4 @@ export interface JobAd { autohide_enabled: boolean; } -export interface GetJobAdsOptions { - onlyNonPast?: boolean; - limit?: number; - auth?: boolean; -} - -export const getJobAds = async (options: GetJobAdsOptions = {}): Promise => { - const { onlyNonPast, limit, auth } = options; - try { - const params = { - since: onlyNonPast ? (new Date()).toISOString() : undefined, - limit, - }; - const search = qs.stringify(params); - const headers = auth ? { Authorization: getAuthHeader() } : null; - const resp = await axios.get(`${URL}?${search}`, { - headers, - }); - return resp.data.results; - } catch (err) { - console.error(err); - throw err; - } -}; - -export const getJobAd = async (id: number, auth = false): Promise => { - try { - const headers = auth ? { Authorization: getAuthHeader() } : null; - const resp = await axios.get(`${URL}${id}/`, { - headers, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -}; - -export const createJobAd = async (data: any): Promise => { - try { - const resp = await axios.post(URL, data, { - headers: { - Authorization: getAuthHeader(), - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -}; - -export const updateJobAd = async (data: any): Promise => { - try { - const putUrl = `${URL}${data.id}/`; - const resp = await axios.put(putUrl, data, { - headers: { - Authorization: getAuthHeader(), - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -}; - -export const jobAdFetcher = (url: string, config?: AxiosRequestConfig) => axios.get(url, config).then((res) => res.data); - -export const generateFetchParams = (id = "", options: Options = {}) => { - const url = `${URL}${id}`; - const { auth } = options; - - return { - url, - config: { - headers: auth ? { Authorization: getAuthHeader() } : null, - }, - }; -}; - -interface Options { - auth?: boolean; -} - -interface FetchArguments { - initialData?: JobAd | JobAd[], - id?: string; - options?: Options; -} - -export const useFetchJobAds = ({ - initialData, - id = "", - options = {}, -}: FetchArguments) => { - const { url, config } = generateFetchParams(id, options); - const { data, error } = useSWR([url, config], jobAdFetcher, { initialData }); - return { - data: data?.results || data, - error, - }; -}; +export default JobAd; diff --git a/src/models/Signup.ts b/src/models/Signup.ts index 7c4626c..c6588d3 100644 --- a/src/models/Signup.ts +++ b/src/models/Signup.ts @@ -1,7 +1,4 @@ -import axios from "axios"; -import { getAuthHeader } from "@utils/auth"; - -const url = `${process.env.NEXT_PUBLIC_API_URL}/signup/`; +import { Question } from "@components/Widgets/SignupQuestionsWidget/common"; export interface Signup { id?: number; @@ -9,68 +6,21 @@ export interface Signup { answer: string; } -export const getSignup = async (id: number): Promise => { - try { - const resp = await axios.get(`${url}${id}`, { - headers: { - Authorization: getAuthHeader(), - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -}; - -export const createSignup = async (data: Signup): Promise => { - try { - const resp = await axios.post(url, data); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -}; - -export const updateSignup = async (data: Signup, uuid: string): Promise => { - try { - const { id } = data; - if (!id) throw new Error("SignupId required!"); - const resp = await axios.put(`${url}${id}/edit/`, data, { - params: { uuid }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -}; - -export const getSignupUUID = async (id: number, uuid: string): Promise => { - try { - const resp = await axios.get(`${url}${id}/edit/`, { - params: { - uuid, - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -}; - -export const deleteSignup = async (id: number) => { - try { - const resp = await axios.delete(`${url}${id}`, { - headers: { - Authorization: getAuthHeader(), - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -}; +export interface SignupForm { + id?: number; + title_fi: string; + title_en: string; + visible: boolean; + start_time: string; + end_time: string; + questions: Question[]; + signups: string[]; + quota: number; + schema: { + title?: string; + type: string; + required: string[]; + properties: any; + minProperties?: number; + }; +} diff --git a/src/models/SignupForm.ts b/src/models/SignupForm.ts deleted file mode 100644 index 49fee10..0000000 --- a/src/models/SignupForm.ts +++ /dev/null @@ -1,123 +0,0 @@ -import axios from "axios"; -import { getAuthHeader } from "@utils/auth"; -import { Question } from "@components/Widgets/SignupQuestionsWidget/common"; -import { Signup } from "./Signup"; - -const URL = `${process.env.NEXT_PUBLIC_API_URL}/signupForm/`; - -export interface SignupForm { - id?: number; - title_fi: string; - title_en: string; - visible: boolean; - start_time: string; - end_time: string; - questions: Question[]; - signups: string[]; - quota: number; - schema: { - title?: string; - type: string; - required: string[]; - properties: any; - minProperties?: number; - }; -} - -export async function getForms(auth = false): Promise { - try { - const headers = auth ? { Authorization: getAuthHeader() } : null; - const resp = await axios.get(URL, { - headers, - }); - const { results } = resp.data; - return results; - } catch (err) { - console.error(err); - throw err; - } -} - -export async function getForm(id: number, auth = false): Promise { - try { - const headers = auth ? { Authorization: getAuthHeader() } : null; - const resp = await axios.get(`${URL}${id}/`, { - headers, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -} - -export async function createForm(data): Promise { - try { - const resp = await axios.post(URL, data, { - headers: { - Authorization: getAuthHeader(), - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -} - -export async function updateForm(data): Promise { - try { - const putUrl = `${URL}${data.id}/`; - const resp = await axios.put(putUrl, data, { - headers: { - Authorization: getAuthHeader(), - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -} - -export async function deleteForm(id: number) { - try { - const resp = await axios.delete(`${URL}${id}`, { - headers: { - Authorization: getAuthHeader(), - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -} - -export const signupFormSendEmail = async (data, id): Promise => { - try { - const resp = await axios.post(`${URL}${id}/sendemail/`, data, { - headers: { - Authorization: getAuthHeader(), - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -}; - -export const getSignups = async (id): Promise => { - try { - const resp = await axios.get(`${URL}${id}/signups/`, { - headers: { - Authorization: getAuthHeader(), - }, - }); - return resp.data; - } catch (err) { - console.error(err); - throw err; - } -}; diff --git a/src/models/Tag.ts b/src/models/Tag.ts index 6a4ef37..e78a995 100644 --- a/src/models/Tag.ts +++ b/src/models/Tag.ts @@ -1,8 +1,4 @@ -import axios from "axios"; - -const url = `${process.env.NEXT_PUBLIC_API_URL}/tags/`; - -export interface Tag { +interface Tag { id: number; name_fi: string; name_en: string; @@ -10,12 +6,4 @@ export interface Tag { icon: string; } -export async function getTags(): Promise { - try { - const resp = await axios.get(url); - return resp.data.results; - } catch (err) { - console.error(err); - throw err; - } -} +export default Tag; diff --git a/src/pages/admin/events/[id].tsx b/src/pages/admin/events/[id].tsx index 9e51ea9..acc92f8 100644 --- a/src/pages/admin/events/[id].tsx +++ b/src/pages/admin/events/[id].tsx @@ -3,11 +3,12 @@ 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"; -import { - Event, createEvent, getEvent, updateEvent, -} from "@models/Event"; +import Tag from "@models/Tag"; +import TagApi from "@api/tagApi"; +import { SignupForm } from "@models/Signup"; +import SignupApi from "@api/signupApi"; +import Event from "@models/Event"; +import EventApi from "@api/eventApi"; import DatetimeWidget from "@components/Widgets/DatetimeWidget"; import SectionDividerWidget from "@components/Widgets/SectionDividerWidget"; import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget"; @@ -177,17 +178,17 @@ const EventCreatePage: NextPage = () => { } useEffect(() => { - getTags() + TagApi.getTags() .then((res) => setTags(res)) .catch((err) => setError(err)); - getForms(true) + SignupApi.getForms(true) .then((res) => setSignupForms(res)) .catch((err) => setError(err)); const eventId = id && Number(id); if (eventId !== undefined) { - getEvent(eventId, true) + EventApi.getEvent(eventId, true) .then((res) => setFormData({ ...res, tags: (res.tags).map((inst) => inst.id) as any, @@ -205,7 +206,7 @@ const EventCreatePage: NextPage = () => { if (typeof payload.image === "string" && payload.image.startsWith("http")) payload.image = undefined; if (payload.id === undefined) { - const resp = await createEvent(payload); + const resp = await EventApi.createEvent(payload); // TODO: Backend return old data because of Prefetch (used for filtering invisble signupForms from GET) // Copy from old state instead... // resp.tags = (resp.tags as any).map(inst => inst.id); @@ -215,7 +216,7 @@ const EventCreatePage: NextPage = () => { setStatusMessage("Event created successfully"); setFormData(resp); } else { - const resp = await updateEvent(payload); + const resp = await EventApi.updateEvent(payload); // TODO: Backend return old data because of Prefetch (used for filtering invisble signupForms from GET) // Copy from old state instead... // resp.tags = (resp.tags as any).map(inst => inst.id); diff --git a/src/pages/admin/events/index.tsx b/src/pages/admin/events/index.tsx index 2eaa288..a6830d6 100644 --- a/src/pages/admin/events/index.tsx +++ b/src/pages/admin/events/index.tsx @@ -5,7 +5,8 @@ import { formatRelative } from "date-fns"; import AdminListCommon from "@views/admin/AdminListCommon"; import { Link } from "@components/index"; import AddLink from "@components/AddLink"; -import { Event, getEvents } from "@models/Event"; +import Event from "@models/Event"; +import EventApi from "@api/eventApi"; const URL = "/admin/events"; @@ -39,7 +40,7 @@ const AdminEventPage: NextPage = () => { const [events, setEvents] = useState(null); useEffect(() => { - getEvents({ auth: true }) + EventApi.getEvents({ auth: true }) .then((res) => setEvents(res)); }, []); diff --git a/src/pages/admin/feed/[id].tsx b/src/pages/admin/feed/[id].tsx index a6704d7..643fe78 100644 --- a/src/pages/admin/feed/[id].tsx +++ b/src/pages/admin/feed/[id].tsx @@ -3,10 +3,10 @@ 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"; +import Tag from "@models/Tag"; +import TagApi from "@api/tagApi"; +import Post from "@models/Feed"; +import FeedApi from "@api/feedApi"; import DatetimeWidget from "@components/Widgets/DatetimeWidget"; import SectionDividerWidget from "@components/Widgets/SectionDividerWidget"; import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget"; @@ -145,13 +145,13 @@ const FeedCreatePage: NextPage = () => { } useEffect(() => { - getTags() + TagApi.getTags() .then((res) => setTags(res)) .catch((err) => setError(err)); const feedId = id && Number(id); if (feedId !== undefined) { - getPost(feedId, { auth: true }) + FeedApi.getPost(feedId, { auth: true }) .then((res) => setFormData({ ...res, tags: (res.tags).map((inst) => inst.id) as any, @@ -166,12 +166,12 @@ const FeedCreatePage: NextPage = () => { payload.tag_id = payload.tags; payload.autohide = payload.autohide || new Date(); if (payload.id === undefined) { - const resp = await createPost(payload); + const resp = await FeedApi.createPost(payload); // resp.tags = resp.tags; setStatusMessage("Post created successfully"); setFormData(resp); } else { - const resp = await updatePost(payload); + const resp = await FeedApi.updatePost(payload); // resp.tags = resp.tag_id; setStatusMessage("Post updated successfully"); setFormData(resp); diff --git a/src/pages/admin/feed/index.tsx b/src/pages/admin/feed/index.tsx index c52d306..df4d964 100644 --- a/src/pages/admin/feed/index.tsx +++ b/src/pages/admin/feed/index.tsx @@ -5,7 +5,8 @@ import { formatRelative } from "date-fns"; import AdminListCommon from "@views/admin/AdminListCommon"; import { Link } from "@components/index"; import AddLink from "@components/AddLink"; -import { Post, getFeed } from "@models/Feed"; +import Post from "@models/Feed"; +import FeedApi from "@api/feedApi"; const URL = "/admin/feed"; @@ -40,7 +41,7 @@ const AdminFeedPage: NextPage = () => { const [forms, setForms] = useState(null); useEffect(() => { - getFeed({ auth: true }) + FeedApi.getFeed({ auth: true }) .then((res) => setForms(res)); }, []); diff --git a/src/pages/admin/jobads/[id].tsx b/src/pages/admin/jobads/[id].tsx index 8406dbf..d03eee2 100644 --- a/src/pages/admin/jobads/[id].tsx +++ b/src/pages/admin/jobads/[id].tsx @@ -3,9 +3,8 @@ 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 JobAd from "@models/JobAd"; +import JobAdApi from "@api/jobAdApi"; import DatetimeWidget from "@components/Widgets/DatetimeWidget"; import SectionDividerWidget from "@components/Widgets/SectionDividerWidget"; import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget"; @@ -123,7 +122,7 @@ const JobAdCreatePage: NextPage = () => { useEffect(() => { const jobId = id && Number(id); if (jobId !== undefined) { - getJobAd(jobId, true) + JobAdApi.getJobAd(jobId, true) .then((res) => setFormData(res)) .catch((err) => setError(err)); } @@ -133,11 +132,11 @@ const JobAdCreatePage: NextPage = () => { try { const payload = data.formData; if (payload.id === undefined) { - const resp = await createJobAd(payload); + const resp = await JobAdApi.createJobAd(payload); setStatusMessage("Post created successfully"); setFormData(resp); } else { - const resp = await updateJobAd(payload); + const resp = await JobAdApi.updateJobAd(payload); setStatusMessage("Post updated successfully"); setFormData(resp); } diff --git a/src/pages/admin/jobads/index.tsx b/src/pages/admin/jobads/index.tsx index 356497a..a781aa2 100644 --- a/src/pages/admin/jobads/index.tsx +++ b/src/pages/admin/jobads/index.tsx @@ -5,7 +5,8 @@ import { formatRelative } from "date-fns"; import AdminListCommon from "@views/admin/AdminListCommon"; import { Link } from "@components/index"; import AddLink from "@components/AddLink"; -import { JobAd, getJobAds } from "@models/JobAd"; +import JobAd from "@models/JobAd"; +import JobAdApi from "@api/jobAdApi"; const URL = "/admin/jobads"; @@ -44,7 +45,7 @@ const AdminJobAdPage: NextPage = () => { const [jobAds, setAds] = useState(null); useEffect(() => { - getJobAds({ auth: true }) + JobAdApi.getJobAds({ auth: true }) .then((res) => setAds(res)); }, []); diff --git a/src/pages/admin/signups/[id].tsx b/src/pages/admin/signups/[id].tsx index bb5d895..dd51232 100644 --- a/src/pages/admin/signups/[id].tsx +++ b/src/pages/admin/signups/[id].tsx @@ -3,9 +3,8 @@ 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 { SignupForm } from "@models/Signup"; +import SignupApi from "@api/signupApi"; import DatetimeWidget from "@components/Widgets/DatetimeWidget"; import SignupQuestionsWidget from "@components/Widgets/SignupQuestionsWidget/SignupQuestionsWidget"; import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget"; @@ -113,7 +112,7 @@ const SignupCreatePage: NextPage = () => { useEffect(() => { const suId = id && Number(id); if (suId !== undefined) { - getForm(suId, true) + SignupApi.getForm(suId, true) .then((res) => { setFormData({ ...res, @@ -134,14 +133,14 @@ const SignupCreatePage: NextPage = () => { }; if (payload.id === undefined) { - const resp = await createForm(payload); + const resp = await SignupApi.createForm(payload); setStatusMessage("Sign-up created successfully"); setFormData({ ...resp, questions: JSON.stringify(resp.questions) as any, }); } else { - const resp = await updateForm(payload); + const resp = await SignupApi.updateForm(payload); setStatusMessage("Sign-up updated successfully"); setFormData({ ...resp, diff --git a/src/pages/admin/signups/[id]/email.tsx b/src/pages/admin/signups/[id]/email.tsx index d16a1c0..a7f0eaa 100644 --- a/src/pages/admin/signups/[id]/email.tsx +++ b/src/pages/admin/signups/[id]/email.tsx @@ -3,7 +3,8 @@ import { NextPage } from "next"; import { useRouter } from "next/router"; import AdminCreateCommon from "@views/admin/AdminCreateCommon"; import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget"; -import { SignupForm, getForm, signupFormSendEmail } from "@models/SignupForm"; +import { SignupForm } from "@models/Signup"; +import SignupApi from "@api/signupApi"; const widgets = { markdownEditor: MarkdownEditorWidget, @@ -52,7 +53,7 @@ const SignupEmailPage: NextPage = () => { useEffect(() => { const formId = Number(id); if (formId !== undefined) { - getForm(formId, true) + SignupApi.getForm(formId, true) .then((res) => setSignupForm(res)); } }, [id]); @@ -63,7 +64,7 @@ const SignupEmailPage: NextPage = () => { const onSubmit = async (data) => { try { const payload = data.formData; - await signupFormSendEmail(payload, id); + await SignupApi.signupFormSendEmail(payload, id); setStatusMessage("Email sent successfully"); } catch (err) { setError(err); diff --git a/src/pages/admin/signups/[id]/list.tsx b/src/pages/admin/signups/[id]/list.tsx index a9713ff..4ebe5a6 100644 --- a/src/pages/admin/signups/[id]/list.tsx +++ b/src/pages/admin/signups/[id]/list.tsx @@ -4,8 +4,8 @@ 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 { Signup, SignupForm } from "@models/Signup"; +import SignupApi from "@api/signupApi"; import { Button } from "@components/index"; import noop from "@utils/noop"; @@ -22,16 +22,16 @@ const SignupEmailPage: NextPage = () => { useEffect(() => { const formId = Number(id); - getForm(formId, true) + SignupApi.getForm(formId, true) .then((res) => setSignupForm(res)); - getSignups(formId).then((res) => setSignups(res)); + SignupApi.getSignups(formId).then((res) => setSignups(res)); }, [id]); const confirmDelete = async (signup: Signup, question: any) => { if (window.confirm(`Delete: ${signup.id}: ${signup.answer[question.id]}; Are you sure?`) === true) { try { - await deleteSignup(signup.id); + await SignupApi.deleteSignup(signup.id); setSignups(signups.filter((s) => s.id !== signup.id)); } catch (err) { window.alert("Delete failed!"); diff --git a/src/pages/admin/signups/index.tsx b/src/pages/admin/signups/index.tsx index 04e72eb..9e4710c 100644 --- a/src/pages/admin/signups/index.tsx +++ b/src/pages/admin/signups/index.tsx @@ -5,7 +5,8 @@ import { formatRelative } from "date-fns"; import AdminListCommon from "@views/admin/AdminListCommon"; import { Link } from "@components/index"; import AddLink from "@components/AddLink"; -import { SignupForm, getForms } from "@models/SignupForm"; +import { SignupForm } from "@models/Signup"; +import SignupApi from "@api/signupApi"; const URL = "/admin/signups"; @@ -44,7 +45,7 @@ const AdminSignupPage: NextPage = () => { const [forms, setForms] = useState(null); useEffect(() => { - getForms(true) + SignupApi.getForms(true) .then((res) => setForms(res)); }, []); diff --git a/src/pages/events/[id].tsx b/src/pages/events/[id].tsx index df50dc9..1391696 100644 --- a/src/pages/events/[id].tsx +++ b/src/pages/events/[id].tsx @@ -2,9 +2,9 @@ import React from "react"; import { NextPage, GetStaticProps, GetStaticPaths } from "next"; import Head from "next/head"; import { useRouter } from "next/router"; -import { - Event, useFetchEvents, eventFetcher, generateFetchParams, -} from "@models/Event"; +import Event from "@models/Event"; +import EventApi from "@api/eventApi"; +import useFetchEvents from "@hooks/useFetchEvents"; import EventPageView from "@views/EventPage/EventPageView"; import PageWrapper from "@views/common/PageWrapper"; import LoadingView from "@views/common/LoadingView"; @@ -35,9 +35,8 @@ const EventPage: NextPage = ({ initialEvent }) => { }; export const getStaticPaths: GetStaticPaths = async () => { - const { url, config } = generateFetchParams(); - const allEvents = await eventFetcher(url, config); - const paths = allEvents.results.map((e: Event) => ({ + const allEvents = await EventApi.getEvents(); + const paths = allEvents.map((e: Event) => ({ params: { id: String(e.id), }, @@ -51,8 +50,7 @@ export const getStaticPaths: GetStaticPaths = async () => { export const getStaticProps: GetStaticProps = async ({ params }) => { const { id } = params; - const { url, config } = generateFetchParams(id as string); - const initialEvent = await eventFetcher(url, config); + const initialEvent = await EventApi.getEvent(Number(id)); return { props: { initialEvent, diff --git a/src/pages/in_english.tsx b/src/pages/in_english.tsx index 653fc92..f5fe3fa 100644 --- a/src/pages/in_english.tsx +++ b/src/pages/in_english.tsx @@ -1,12 +1,12 @@ import React from "react"; import { NextPage, GetStaticProps } from "next"; import Head from "next/head"; -import { - Event, useFetchEvents, eventFetcher, generateFetchParams as eventParams, -} from "@models/Event"; -import { - Post, useFetchFeed, feedFetcher, generateFetchParams as feedParams, -} from "@models/Feed"; +import Event from "@models/Event"; +import EventApi from "@api/eventApi"; +import useFetchEvents from "@hooks/useFetchEvents"; +import Post from "@models/Feed"; +import FeedApi from "@api/feedApi"; +import useFetchFeed from "@hooks/useFetchFeed"; import InEnglishPageView from "@views/InEnglishPage/InEnglishPageView"; import PageWrapper from "@views/common/PageWrapper"; @@ -37,12 +37,8 @@ const InEnglishPage: NextPage = ({ initialEvents, initialFeed }) = }; export const getStaticProps: GetStaticProps = async () => { - let url: string; - let config: any; - ({ url, config } = eventParams("", eventOptions)); - const initialEvents = await eventFetcher(url, config); - ({ url, config } = feedParams("")); - const initialFeed = await feedFetcher(url, config); + const initialEvents = await EventApi.getEvents(eventOptions); + const initialFeed = await FeedApi.getFeed(); return { props: { initialEvents, diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 53b15ed..698ed52 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,12 +1,12 @@ import React from "react"; import { NextPage, GetStaticProps } from "next"; import Head from "next/head"; -import { - Event, useFetchEvents, eventFetcher, generateFetchParams as eventParams, -} from "@models/Event"; -import { - Post, useFetchFeed, feedFetcher, generateFetchParams as feedParams, -} from "@models/Feed"; +import Event from "@models/Event"; +import EventApi from "@api/eventApi"; +import useFetchEvents from "@hooks/useFetchEvents"; +import Post from "@models/Feed"; +import FeedApi from "@api/feedApi"; +import useFetchFeed from "@hooks/useFetchFeed"; import FrontPageView from "@views/FrontPage/FrontPageView"; import PageWrapper from "@views/common/PageWrapper"; @@ -37,12 +37,8 @@ const FrontPage: NextPage = ({ initialEvents, initialFeed }) => { }; export const getStaticProps: GetStaticProps = async () => { - let url: string; - let config: any; - ({ url, config } = eventParams("", eventOptions)); - const initialEvents = await eventFetcher(url, config); - ({ url, config } = feedParams("")); - const initialFeed = await feedFetcher(url, config); + const initialEvents = await EventApi.getEvents(eventOptions); + const initialFeed = await FeedApi.getFeed(); return { props: { initialEvents, diff --git a/src/pages/kilta/toiminta.tsx b/src/pages/kilta/toiminta.tsx index e021fe1..f82aa40 100644 --- a/src/pages/kilta/toiminta.tsx +++ b/src/pages/kilta/toiminta.tsx @@ -1,12 +1,12 @@ import React from "react"; import { NextPage, GetStaticProps } from "next"; import Head from "next/head"; -import { - Event, useFetchEvents, eventFetcher, generateFetchParams as eventParams, -} from "@models/Event"; -import { - Post, useFetchFeed, feedFetcher, generateFetchParams as feedParams, -} from "@models/Feed"; +import Event from "@models/Event"; +import EventApi from "@api/eventApi"; +import useFetchEvents from "@hooks/useFetchEvents"; +import Post from "@models/Feed"; +import FeedApi from "@api/feedApi"; +import useFetchFeed from "@hooks/useFetchFeed"; import ActualPageView from "@views/ActualPage/ActualPageView"; import PageWrapper from "@views/common/PageWrapper"; @@ -36,12 +36,8 @@ const ActualPage: NextPage = ({ initialEvents, initialFeed }) => { }; export const getStaticProps: GetStaticProps = async () => { - let url: string; - let config: any; - ({ url, config } = eventParams("", eventOptions)); - const initialEvents = await eventFetcher(url, config); - ({ url, config } = feedParams("")); - const initialFeed = await feedFetcher(url, config); + const initialEvents = await EventApi.getEvents(eventOptions); + const initialFeed = await FeedApi.getFeed(); return { props: { initialEvents, diff --git a/src/pages/signup/[id].tsx b/src/pages/signup/[id].tsx index 7aa07b6..980d7f5 100644 --- a/src/pages/signup/[id].tsx +++ b/src/pages/signup/[id].tsx @@ -2,8 +2,8 @@ import React, { useState } from "react"; import { NextPage, GetStaticProps, GetStaticPaths } from "next"; import Head from "next/head"; import { useRouter } from "next/router"; -import { getForm, SignupForm, getForms } from "@models/SignupForm"; -import { createSignup, Signup } from "@models/Signup"; +import { Signup, SignupForm } from "@models/Signup"; +import SignupApi from "@api/signupApi"; import SignUpPageView from "@views/SignUpPage/SignUpPageView"; import PageWrapper from "@views/common/PageWrapper"; import LoadingView from "@views/common/LoadingView"; @@ -28,7 +28,7 @@ const SignUpPage: NextPage = ({ form }) => { }; try { - await createSignup(payload); + await SignupApi.createSignup(payload); // TODO: Fetch/update signup list, so user sees the signup in the list setStatus("Sign-up submitted successfully"); } catch (error) { @@ -56,7 +56,7 @@ const SignUpPage: NextPage = ({ form }) => { }; export const getStaticPaths: GetStaticPaths = async () => { - const allForms = await getForms(); + const allForms = await SignupApi.getForms(); const paths = allForms.map((e: SignupForm) => ({ params: { id: String(e.id), @@ -71,7 +71,7 @@ export const getStaticPaths: GetStaticPaths = async () => { export const getStaticProps: GetStaticProps = async ({ params }) => { const { id } = params; - const form = await getForm(Number(id)); + const form = await SignupApi.getForm(Number(id)); return { props: { form, diff --git a/src/pages/signup/edit/[id]/[uuid].tsx b/src/pages/signup/edit/[id]/[uuid].tsx index 319de28..1cf2c1a 100644 --- a/src/pages/signup/edit/[id]/[uuid].tsx +++ b/src/pages/signup/edit/[id]/[uuid].tsx @@ -1,8 +1,8 @@ import React, { useEffect, useState } from "react"; import { NextPage } from "next"; import { useRouter } from "next/router"; -import { getForm, SignupForm } from "@models/SignupForm"; -import { updateSignup, getSignupUUID, Signup } from "@models/Signup"; +import { Signup, SignupForm } from "@models/Signup"; +import SignupApi from "@api/signupApi"; import SignUpPageView from "@views/SignUpPage/SignUpPageView"; import PageWrapper from "@views/common/PageWrapper"; import noop from "@utils/noop"; @@ -30,7 +30,7 @@ const EditSignUpPage: NextPage = () => { useEffect(() => { const fetchSignUpForm = async (id: number): Promise => { - const formPromise = getForm(id); + const formPromise = SignupApi.getForm(id); formPromise.then((form) => { setForm(form); }); @@ -38,7 +38,7 @@ const EditSignUpPage: NextPage = () => { }; const fetchSignUp = async (id: number, uniqueId: string): Promise => { - const signupPromise = getSignupUUID(id, uniqueId); + const signupPromise = SignupApi.getSignupUUID(id, uniqueId); signupPromise.then((signup) => setFormData(signup.answer)); return signupPromise; }; @@ -56,7 +56,7 @@ const EditSignUpPage: NextPage = () => { }; try { - await updateSignup(payload, uuid); + await SignupApi.updateSignup(payload, uuid); // TODO: Update signup list, so user sees possible changes in the list setStatus("Sign-up submission updated successfully"); } catch (error) { diff --git a/src/pages/yritysyhteistyo.tsx b/src/pages/yritysyhteistyo.tsx index d24f747..da5c1bf 100644 --- a/src/pages/yritysyhteistyo.tsx +++ b/src/pages/yritysyhteistyo.tsx @@ -1,9 +1,9 @@ import React from "react"; import { NextPage, GetStaticProps } from "next"; import Head from "next/head"; -import { - JobAd, useFetchJobAds, jobAdFetcher, generateFetchParams, -} from "@models/JobAd"; +import JobAd from "@models/JobAd"; +import JobAdApi from "@api/jobAdApi"; +import useFetchJobAds from "@hooks/useFetchJobAds"; import CorporatePageView from "@views/CorporatePage/CorporatePageView"; import PageWrapper from "@views/common/PageWrapper"; @@ -27,8 +27,7 @@ const CorporatePage: NextPage = ({ initialJobAds }) => { }; export const getStaticProps: GetStaticProps = async () => { - const { url } = generateFetchParams(); - const initialJobAds = await jobAdFetcher(url); + const initialJobAds = await JobAdApi.getJobAds(); return { props: { initialJobAds, diff --git a/src/views/ActualPage/ActualPageView.tsx b/src/views/ActualPage/ActualPageView.tsx index e6cf836..027d461 100644 --- a/src/views/ActualPage/ActualPageView.tsx +++ b/src/views/ActualPage/ActualPageView.tsx @@ -1,8 +1,8 @@ import React from "react"; import styled from "styled-components"; import breakpoints from "@theme/breakpoints"; -import { Event } from "@models/Event"; -import { Post } from "@models/Feed"; +import Event from "@models/Event"; +import Post from "@models/Feed"; import { Divider, CTASection, TextSection, Link, CrossFadeImages, diff --git a/src/views/ActualPage/EventCalendar.tsx b/src/views/ActualPage/EventCalendar.tsx index bb0a61b..8c0b7d7 100644 --- a/src/views/ActualPage/EventCalendar.tsx +++ b/src/views/ActualPage/EventCalendar.tsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import { Event } from "@models/Event"; +import Event from "@models/Event"; import Button from "@components/Button"; import { CardSection, Card, FullWidthSection } from "@components/index"; diff --git a/src/views/ActualPage/News.tsx b/src/views/ActualPage/News.tsx index aafad0a..ea7f6f6 100644 --- a/src/views/ActualPage/News.tsx +++ b/src/views/ActualPage/News.tsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import { Post } from "@models/Feed"; +import Post from "@models/Feed"; import Button from "@components/Button"; import { CardSection, Card, FullWidthSection } from "@components/index"; diff --git a/src/views/CorporatePage/CorporatePageView.tsx b/src/views/CorporatePage/CorporatePageView.tsx index aa32772..2fe2a33 100644 --- a/src/views/CorporatePage/CorporatePageView.tsx +++ b/src/views/CorporatePage/CorporatePageView.tsx @@ -2,7 +2,7 @@ import React from "react"; import { CTASection, TextSection, PageLink, Link, } from "@components/index"; -import { JobAd } from "@models/JobAd"; +import JobAd from "@models/JobAd"; import CorporatePageHero from "./CorporatePageHero"; import JobAdList from "./JobAdList"; diff --git a/src/views/CorporatePage/JobAdList.tsx b/src/views/CorporatePage/JobAdList.tsx index ad44b09..12338c9 100644 --- a/src/views/CorporatePage/JobAdList.tsx +++ b/src/views/CorporatePage/JobAdList.tsx @@ -1,6 +1,6 @@ import React from "react"; import styled from "styled-components"; -import { JobAd } from "@models/JobAd"; +import JobAd from "@models/JobAd"; import { Accordion } from "@components/index"; import ReactMarkdown from "react-markdown"; diff --git a/src/views/EventPage/EventPageView.tsx b/src/views/EventPage/EventPageView.tsx index 085ed27..343fc06 100644 --- a/src/views/EventPage/EventPageView.tsx +++ b/src/views/EventPage/EventPageView.tsx @@ -2,7 +2,7 @@ import React from "react"; import Image from "next/image"; import styled from "styled-components"; import colors from "@theme/colors"; -import { Event } from "@models/Event"; +import Event from "@models/Event"; import Button from "@components/Button"; import { Link, TextSection } from "@components/index"; import noop from "@utils/noop"; diff --git a/src/views/FrontPage/FrontPageView.tsx b/src/views/FrontPage/FrontPageView.tsx index a4342ae..05d859a 100644 --- a/src/views/FrontPage/FrontPageView.tsx +++ b/src/views/FrontPage/FrontPageView.tsx @@ -9,8 +9,8 @@ import { CTASection, Link, } from "@components/index"; -import { Event } from "@models/Event"; -import { Post } from "@models/Feed"; +import Event from "@models/Event"; +import Post from "@models/Feed"; import { colors } from "@theme/colors"; import FullWidthSection from "@components/Sections/FullWidthSection"; diff --git a/src/views/InEnglishPage/InEnglishPageView.tsx b/src/views/InEnglishPage/InEnglishPageView.tsx index 77ebc36..d61a045 100644 --- a/src/views/InEnglishPage/InEnglishPageView.tsx +++ b/src/views/InEnglishPage/InEnglishPageView.tsx @@ -11,8 +11,8 @@ import { PageLink, TextSection, } from "@components/index"; -import { Event } from "@models/Event"; -import { Post } from "@models/Feed"; +import Event from "@models/Event"; +import Post from "@models/Feed"; import noop from "@utils/noop"; import InEnglishPageHero from "./InEnglishPageHero"; diff --git a/src/views/SignUpPage/FormUtils.tsx b/src/views/SignUpPage/FormUtils.tsx index 71a1d62..22cade2 100644 --- a/src/views/SignUpPage/FormUtils.tsx +++ b/src/views/SignUpPage/FormUtils.tsx @@ -1,5 +1,5 @@ import { Question } from "@components/Widgets/SignupQuestionsWidget/common"; -import { SignupForm } from "@models/SignupForm"; +import { SignupForm } from "@models/Signup"; import { EMAIL_REGEX } from "@utils/regexes"; import escapeRegExp from "lodash/escapeRegExp"; diff --git a/src/views/SignUpPage/SignUpPageView.tsx b/src/views/SignUpPage/SignUpPageView.tsx index 4797a5f..07a90c9 100644 --- a/src/views/SignUpPage/SignUpPageView.tsx +++ b/src/views/SignUpPage/SignUpPageView.tsx @@ -1,7 +1,7 @@ import React from "react"; import styled from "styled-components"; import { IChangeEvent, ISubmitEvent, ErrorSchema } from "react-jsonschema-form"; -import { SignupForm } from "@models/SignupForm"; +import { SignupForm } from "@models/Signup"; import Checkboxes from "@components/Widgets/Checkbox/Checkboxes"; import RadioButtonWidget from "@components/Widgets/RadioButton/RadioButtonWidget"; import { TextSection } from "@components/index"; diff --git a/src/views/admin/AdminCreateCommon.tsx b/src/views/admin/AdminCreateCommon.tsx index 63737f2..7b3284e 100644 --- a/src/views/admin/AdminCreateCommon.tsx +++ b/src/views/admin/AdminCreateCommon.tsx @@ -2,10 +2,10 @@ import React from "react"; import styled from "styled-components"; import { ISubmitEvent, IChangeEvent, ErrorSchema } from "react-jsonschema-form"; import { colors } from "@theme/colors"; -import { Event } from "@models/Event"; -import { Post } from "@models/Feed"; -import { SignupForm } from "@models/SignupForm"; -import { JobAd } from "@models/JobAd"; +import Event from "@models/Event"; +import Post from "@models/Feed"; +import { SignupForm } from "@models/Signup"; +import JobAd from "@models/JobAd"; import FormWrapper from "@views/common/FormWrapper"; import AdminPageWrapper from "@views/common/AdminPageWrapper"; diff --git a/tsconfig.json b/tsconfig.json index e51222d..3a9954a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,6 +21,9 @@ "typeRoots": ["types", "node_modules/@types"], "baseUrl": "./", "paths": { + "@api/*": [ + "src/api/*" + ], "@components/*": [ "src/components/*" ],