Split model files into apis, hooks and models

This commit is contained in:
Aarni Halinen
2021-03-15 20:05:39 +02:00
parent 61d045b9d7
commit 05097e44a4
45 changed files with 707 additions and 731 deletions
+3 -69
View File
@@ -15,7 +15,6 @@
"lodash": "4.17.21", "lodash": "4.17.21",
"next": "10.0.7", "next": "10.0.7",
"normalize.css": "8.0.1", "normalize.css": "8.0.1",
"query-string": "6.14.1",
"react": "17.0.1", "react": "17.0.1",
"react-beautiful-dnd": "13.0.0", "react-beautiful-dnd": "13.0.0",
"react-csv": "2.0.3", "react-csv": "2.0.3",
@@ -5591,6 +5590,7 @@
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "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,
"engines": { "engines": {
"node": ">=0.10" "node": ">=0.10"
} }
@@ -7217,14 +7217,6 @@
"node": ">=0.10.0" "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": { "node_modules/find-babel-config": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", "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" "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": { "node_modules/querystring": {
"version": "0.2.1", "version": "0.2.1",
"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz",
@@ -12645,14 +12620,6 @@
"specificity": "bin/specificity" "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": { "node_modules/split-string": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
@@ -12760,14 +12727,6 @@
"xtend": "^4.0.0" "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": { "node_modules/string_decoder": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -20892,7 +20851,8 @@
"decode-uri-component": { "decode-uri-component": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "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": { "decompress-response": {
"version": "4.2.1", "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": { "find-babel-config": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz",
@@ -25503,17 +25458,6 @@
"integrity": "sha1-p2pI4mEKGPl/o6K9UytoKs/4bFM=", "integrity": "sha1-p2pI4mEKGPl/o6K9UytoKs/4bFM=",
"dev": true "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": { "querystring": {
"version": "0.2.1", "version": "0.2.1",
"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz",
@@ -26751,11 +26695,6 @@
"integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
"dev": true "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": { "split-string": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
@@ -26849,11 +26788,6 @@
"xtend": "^4.0.0" "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": { "string_decoder": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-1
View File
@@ -69,7 +69,6 @@
"lodash": "4.17.21", "lodash": "4.17.21",
"next": "10.0.7", "next": "10.0.7",
"normalize.css": "8.0.1", "normalize.css": "8.0.1",
"query-string": "6.14.1",
"react": "17.0.1", "react": "17.0.1",
"react-beautiful-dnd": "13.0.0", "react-beautiful-dnd": "13.0.0",
"react-csv": "2.0.3", "react-csv": "2.0.3",
+90
View File
@@ -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<Event> {
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<Event[]> {
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<Event> {
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<Event> {
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;
+66
View File
@@ -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<Post[]> {
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<Post> {
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<Post> {
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<Post> {
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;
+76
View File
@@ -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<JobAd[]> {
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<JobAd> {
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<JobAd> {
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<JobAd> {
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;
+180
View File
@@ -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<Signup> {
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<Signup> {
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<Signup> {
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<Signup> {
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<SignupForm[]> {
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<SignupForm> {
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<SignupForm> {
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<SignupForm> {
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<any> {
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<Signup[]> {
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;
+24
View File
@@ -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<Tag[]> {
try {
const resp = await axios.get(URL);
return resp.data.results;
} catch (err) {
console.error(err);
throw err;
}
}
}
export default TagApi;
+44
View File
@@ -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;
+40
View File
@@ -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;
+40
View File
@@ -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;
+4 -126
View File
@@ -1,13 +1,7 @@
import axios, { AxiosRequestConfig } from "axios"; import Tag from "./Tag";
import useSWR from "swr"; import { SignupForm } from "./Signup";
import qs from "query-string";
import { getAuthHeader } from "@utils/auth";
import { Tag } from "./Tag";
import { SignupForm } from "./SignupForm";
const URL = `${process.env.NEXT_PUBLIC_API_URL}/events/`; interface Event {
export interface Event {
id: number; id: number;
title_fi: string; title_fi: string;
title_en: string; title_en: string;
@@ -25,120 +19,4 @@ export interface Event {
signupForm: SignupForm[]; signupForm: SignupForm[];
} }
interface Options { export default Event;
onlyNonPast?: boolean;
limit?: number;
auth?: boolean;
}
export async function getEvents(options: Options = {}): Promise<Event[]> {
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<Event> {
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<Event> {
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<Event> {
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,
};
};
+3 -96
View File
@@ -1,11 +1,6 @@
import axios, { AxiosRequestConfig } from "axios"; import Tag from "./Tag";
import useSWR from "swr";
import { getAuthHeader } from "@utils/auth";
import { Tag } from "./Tag";
const URL = `${process.env.NEXT_PUBLIC_API_URL}/feed/`; interface Post {
export interface Post {
id: number; id: number;
tags: Tag[]; tags: Tag[];
visible: boolean; visible: boolean;
@@ -21,92 +16,4 @@ export interface Post {
autohide_enabled: boolean; autohide_enabled: boolean;
} }
interface Options { export default Post;
auth?: boolean;
}
export async function getFeed(options: Options = {}): Promise<Post[]> {
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<Post> {
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<Post> {
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<Post> {
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,
};
};
+2 -111
View File
@@ -1,11 +1,4 @@
import axios, { AxiosRequestConfig } from "axios"; interface JobAd {
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 {
id: number; id: number;
title_fi: string; title_fi: string;
title_en: string; title_en: string;
@@ -17,106 +10,4 @@ export interface JobAd {
autohide_enabled: boolean; autohide_enabled: boolean;
} }
export interface GetJobAdsOptions { export default JobAd;
onlyNonPast?: boolean;
limit?: number;
auth?: boolean;
}
export const getJobAds = async (options: GetJobAdsOptions = {}): Promise<JobAd[]> => {
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<JobAd> => {
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<JobAd> => {
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<JobAd> => {
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,
};
};
+19 -69
View File
@@ -1,7 +1,4 @@
import axios from "axios"; import { Question } from "@components/Widgets/SignupQuestionsWidget/common";
import { getAuthHeader } from "@utils/auth";
const url = `${process.env.NEXT_PUBLIC_API_URL}/signup/`;
export interface Signup { export interface Signup {
id?: number; id?: number;
@@ -9,68 +6,21 @@ export interface Signup {
answer: string; answer: string;
} }
export const getSignup = async (id: number): Promise<Signup> => { export interface SignupForm {
try { id?: number;
const resp = await axios.get(`${url}${id}`, { title_fi: string;
headers: { title_en: string;
Authorization: getAuthHeader(), visible: boolean;
}, start_time: string;
}); end_time: string;
return resp.data; questions: Question[];
} catch (err) { signups: string[];
console.error(err); quota: number;
throw err; schema: {
} title?: string;
}; type: string;
required: string[];
export const createSignup = async (data: Signup): Promise<Signup> => { properties: any;
try { minProperties?: number;
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<Signup> => {
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<Signup> => {
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;
}
};
-123
View File
@@ -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<SignupForm[]> {
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<SignupForm> {
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<SignupForm> {
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<SignupForm> {
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<any> => {
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<Signup[]> => {
try {
const resp = await axios.get(`${URL}${id}/signups/`, {
headers: {
Authorization: getAuthHeader(),
},
});
return resp.data;
} catch (err) {
console.error(err);
throw err;
}
};
+2 -14
View File
@@ -1,8 +1,4 @@
import axios from "axios"; interface Tag {
const url = `${process.env.NEXT_PUBLIC_API_URL}/tags/`;
export interface Tag {
id: number; id: number;
name_fi: string; name_fi: string;
name_en: string; name_en: string;
@@ -10,12 +6,4 @@ export interface Tag {
icon: string; icon: string;
} }
export async function getTags(): Promise<Tag[]> { export default Tag;
try {
const resp = await axios.get(url);
return resp.data.results;
} catch (err) {
console.error(err);
throw err;
}
}
+11 -10
View File
@@ -3,11 +3,12 @@ import { NextPage } from "next";
import Head from "next/head"; import Head from "next/head";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import AdminCreateCommon from "@views/admin/AdminCreateCommon"; import AdminCreateCommon from "@views/admin/AdminCreateCommon";
import { Tag, getTags } from "@models/Tag"; import Tag from "@models/Tag";
import { SignupForm, getForms } from "@models/SignupForm"; import TagApi from "@api/tagApi";
import { import { SignupForm } from "@models/Signup";
Event, createEvent, getEvent, updateEvent, import SignupApi from "@api/signupApi";
} from "@models/Event"; import Event from "@models/Event";
import EventApi from "@api/eventApi";
import DatetimeWidget from "@components/Widgets/DatetimeWidget"; import DatetimeWidget from "@components/Widgets/DatetimeWidget";
import SectionDividerWidget from "@components/Widgets/SectionDividerWidget"; import SectionDividerWidget from "@components/Widgets/SectionDividerWidget";
import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget"; import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget";
@@ -177,17 +178,17 @@ const EventCreatePage: NextPage = () => {
} }
useEffect(() => { useEffect(() => {
getTags() TagApi.getTags()
.then((res) => setTags(res)) .then((res) => setTags(res))
.catch((err) => setError(err)); .catch((err) => setError(err));
getForms(true) SignupApi.getForms(true)
.then((res) => setSignupForms(res)) .then((res) => setSignupForms(res))
.catch((err) => setError(err)); .catch((err) => setError(err));
const eventId = id && Number(id); const eventId = id && Number(id);
if (eventId !== undefined) { if (eventId !== undefined) {
getEvent(eventId, true) EventApi.getEvent(eventId, true)
.then((res) => setFormData({ .then((res) => setFormData({
...res, ...res,
tags: (res.tags).map((inst) => inst.id) as any, 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 (typeof payload.image === "string" && payload.image.startsWith("http")) payload.image = undefined;
if (payload.id === 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) // TODO: Backend return old data because of Prefetch (used for filtering invisble signupForms from GET)
// Copy from old state instead... // Copy from old state instead...
// resp.tags = (resp.tags as any).map(inst => inst.id); // resp.tags = (resp.tags as any).map(inst => inst.id);
@@ -215,7 +216,7 @@ const EventCreatePage: NextPage = () => {
setStatusMessage("Event created successfully"); setStatusMessage("Event created successfully");
setFormData(resp); setFormData(resp);
} else { } 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) // TODO: Backend return old data because of Prefetch (used for filtering invisble signupForms from GET)
// Copy from old state instead... // Copy from old state instead...
// resp.tags = (resp.tags as any).map(inst => inst.id); // resp.tags = (resp.tags as any).map(inst => inst.id);
+3 -2
View File
@@ -5,7 +5,8 @@ import { formatRelative } from "date-fns";
import AdminListCommon from "@views/admin/AdminListCommon"; import AdminListCommon from "@views/admin/AdminListCommon";
import { Link } from "@components/index"; import { Link } from "@components/index";
import AddLink from "@components/AddLink"; 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"; const URL = "/admin/events";
@@ -39,7 +40,7 @@ const AdminEventPage: NextPage = () => {
const [events, setEvents] = useState<Event[]>(null); const [events, setEvents] = useState<Event[]>(null);
useEffect(() => { useEffect(() => {
getEvents({ auth: true }) EventApi.getEvents({ auth: true })
.then((res) => setEvents(res)); .then((res) => setEvents(res));
}, []); }, []);
+8 -8
View File
@@ -3,10 +3,10 @@ import { NextPage } from "next";
import Head from "next/head"; import Head from "next/head";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import AdminCreateCommon from "@views/admin/AdminCreateCommon"; import AdminCreateCommon from "@views/admin/AdminCreateCommon";
import { Tag, getTags } from "@models/Tag"; import Tag from "@models/Tag";
import { import TagApi from "@api/tagApi";
Post, createPost, getPost, updatePost, import Post from "@models/Feed";
} from "@models/Feed"; import FeedApi from "@api/feedApi";
import DatetimeWidget from "@components/Widgets/DatetimeWidget"; import DatetimeWidget from "@components/Widgets/DatetimeWidget";
import SectionDividerWidget from "@components/Widgets/SectionDividerWidget"; import SectionDividerWidget from "@components/Widgets/SectionDividerWidget";
import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget"; import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget";
@@ -145,13 +145,13 @@ const FeedCreatePage: NextPage = () => {
} }
useEffect(() => { useEffect(() => {
getTags() TagApi.getTags()
.then((res) => setTags(res)) .then((res) => setTags(res))
.catch((err) => setError(err)); .catch((err) => setError(err));
const feedId = id && Number(id); const feedId = id && Number(id);
if (feedId !== undefined) { if (feedId !== undefined) {
getPost(feedId, { auth: true }) FeedApi.getPost(feedId, { auth: true })
.then((res) => setFormData({ .then((res) => setFormData({
...res, ...res,
tags: (res.tags).map((inst) => inst.id) as any, tags: (res.tags).map((inst) => inst.id) as any,
@@ -166,12 +166,12 @@ const FeedCreatePage: NextPage = () => {
payload.tag_id = payload.tags; payload.tag_id = payload.tags;
payload.autohide = payload.autohide || new Date(); payload.autohide = payload.autohide || new Date();
if (payload.id === undefined) { if (payload.id === undefined) {
const resp = await createPost(payload); const resp = await FeedApi.createPost(payload);
// resp.tags = resp.tags; // resp.tags = resp.tags;
setStatusMessage("Post created successfully"); setStatusMessage("Post created successfully");
setFormData(resp); setFormData(resp);
} else { } else {
const resp = await updatePost(payload); const resp = await FeedApi.updatePost(payload);
// resp.tags = resp.tag_id; // resp.tags = resp.tag_id;
setStatusMessage("Post updated successfully"); setStatusMessage("Post updated successfully");
setFormData(resp); setFormData(resp);
+3 -2
View File
@@ -5,7 +5,8 @@ import { formatRelative } from "date-fns";
import AdminListCommon from "@views/admin/AdminListCommon"; import AdminListCommon from "@views/admin/AdminListCommon";
import { Link } from "@components/index"; import { Link } from "@components/index";
import AddLink from "@components/AddLink"; 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"; const URL = "/admin/feed";
@@ -40,7 +41,7 @@ const AdminFeedPage: NextPage = () => {
const [forms, setForms] = useState<Post[]>(null); const [forms, setForms] = useState<Post[]>(null);
useEffect(() => { useEffect(() => {
getFeed({ auth: true }) FeedApi.getFeed({ auth: true })
.then((res) => setForms(res)); .then((res) => setForms(res));
}, []); }, []);
+5 -6
View File
@@ -3,9 +3,8 @@ import { NextPage } from "next";
import Head from "next/head"; import Head from "next/head";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import AdminCreateCommon from "@views/admin/AdminCreateCommon"; import AdminCreateCommon from "@views/admin/AdminCreateCommon";
import { import JobAd from "@models/JobAd";
JobAd, getJobAd, createJobAd, updateJobAd, import JobAdApi from "@api/jobAdApi";
} from "@models/JobAd";
import DatetimeWidget from "@components/Widgets/DatetimeWidget"; import DatetimeWidget from "@components/Widgets/DatetimeWidget";
import SectionDividerWidget from "@components/Widgets/SectionDividerWidget"; import SectionDividerWidget from "@components/Widgets/SectionDividerWidget";
import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget"; import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget";
@@ -123,7 +122,7 @@ const JobAdCreatePage: NextPage = () => {
useEffect(() => { useEffect(() => {
const jobId = id && Number(id); const jobId = id && Number(id);
if (jobId !== undefined) { if (jobId !== undefined) {
getJobAd(jobId, true) JobAdApi.getJobAd(jobId, true)
.then((res) => setFormData(res)) .then((res) => setFormData(res))
.catch((err) => setError(err)); .catch((err) => setError(err));
} }
@@ -133,11 +132,11 @@ const JobAdCreatePage: NextPage = () => {
try { try {
const payload = data.formData; const payload = data.formData;
if (payload.id === undefined) { if (payload.id === undefined) {
const resp = await createJobAd(payload); const resp = await JobAdApi.createJobAd(payload);
setStatusMessage("Post created successfully"); setStatusMessage("Post created successfully");
setFormData(resp); setFormData(resp);
} else { } else {
const resp = await updateJobAd(payload); const resp = await JobAdApi.updateJobAd(payload);
setStatusMessage("Post updated successfully"); setStatusMessage("Post updated successfully");
setFormData(resp); setFormData(resp);
} }
+3 -2
View File
@@ -5,7 +5,8 @@ import { formatRelative } from "date-fns";
import AdminListCommon from "@views/admin/AdminListCommon"; import AdminListCommon from "@views/admin/AdminListCommon";
import { Link } from "@components/index"; import { Link } from "@components/index";
import AddLink from "@components/AddLink"; 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"; const URL = "/admin/jobads";
@@ -44,7 +45,7 @@ const AdminJobAdPage: NextPage = () => {
const [jobAds, setAds] = useState<JobAd[]>(null); const [jobAds, setAds] = useState<JobAd[]>(null);
useEffect(() => { useEffect(() => {
getJobAds({ auth: true }) JobAdApi.getJobAds({ auth: true })
.then((res) => setAds(res)); .then((res) => setAds(res));
}, []); }, []);
+5 -6
View File
@@ -3,9 +3,8 @@ import { NextPage } from "next";
import Head from "next/head"; import Head from "next/head";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import AdminCreateCommon from "@views/admin/AdminCreateCommon"; import AdminCreateCommon from "@views/admin/AdminCreateCommon";
import { import { SignupForm } from "@models/Signup";
SignupForm, createForm, getForm, updateForm, import SignupApi from "@api/signupApi";
} from "@models/SignupForm";
import DatetimeWidget from "@components/Widgets/DatetimeWidget"; import DatetimeWidget from "@components/Widgets/DatetimeWidget";
import SignupQuestionsWidget from "@components/Widgets/SignupQuestionsWidget/SignupQuestionsWidget"; import SignupQuestionsWidget from "@components/Widgets/SignupQuestionsWidget/SignupQuestionsWidget";
import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget"; import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget";
@@ -113,7 +112,7 @@ const SignupCreatePage: NextPage = () => {
useEffect(() => { useEffect(() => {
const suId = id && Number(id); const suId = id && Number(id);
if (suId !== undefined) { if (suId !== undefined) {
getForm(suId, true) SignupApi.getForm(suId, true)
.then((res) => { .then((res) => {
setFormData({ setFormData({
...res, ...res,
@@ -134,14 +133,14 @@ const SignupCreatePage: NextPage = () => {
}; };
if (payload.id === undefined) { if (payload.id === undefined) {
const resp = await createForm(payload); const resp = await SignupApi.createForm(payload);
setStatusMessage("Sign-up created successfully"); setStatusMessage("Sign-up created successfully");
setFormData({ setFormData({
...resp, ...resp,
questions: JSON.stringify(resp.questions) as any, questions: JSON.stringify(resp.questions) as any,
}); });
} else { } else {
const resp = await updateForm(payload); const resp = await SignupApi.updateForm(payload);
setStatusMessage("Sign-up updated successfully"); setStatusMessage("Sign-up updated successfully");
setFormData({ setFormData({
...resp, ...resp,
+4 -3
View File
@@ -3,7 +3,8 @@ import { NextPage } from "next";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import AdminCreateCommon from "@views/admin/AdminCreateCommon"; import AdminCreateCommon from "@views/admin/AdminCreateCommon";
import MarkdownEditorWidget from "@components/Widgets/MarkdownEditorWidget"; 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 = { const widgets = {
markdownEditor: MarkdownEditorWidget, markdownEditor: MarkdownEditorWidget,
@@ -52,7 +53,7 @@ const SignupEmailPage: NextPage = () => {
useEffect(() => { useEffect(() => {
const formId = Number(id); const formId = Number(id);
if (formId !== undefined) { if (formId !== undefined) {
getForm(formId, true) SignupApi.getForm(formId, true)
.then((res) => setSignupForm(res)); .then((res) => setSignupForm(res));
} }
}, [id]); }, [id]);
@@ -63,7 +64,7 @@ const SignupEmailPage: NextPage = () => {
const onSubmit = async (data) => { const onSubmit = async (data) => {
try { try {
const payload = data.formData; const payload = data.formData;
await signupFormSendEmail(payload, id); await SignupApi.signupFormSendEmail(payload, id);
setStatusMessage("Email sent successfully"); setStatusMessage("Email sent successfully");
} catch (err) { } catch (err) {
setError(err); setError(err);
+5 -5
View File
@@ -4,8 +4,8 @@ import { useRouter } from "next/router";
import styled from "styled-components"; import styled from "styled-components";
import { CSVLink } from "react-csv"; import { CSVLink } from "react-csv";
import AdminListCommon from "@views/admin/AdminListCommon"; import AdminListCommon from "@views/admin/AdminListCommon";
import { SignupForm, getForm, getSignups } from "@models/SignupForm"; import { Signup, SignupForm } from "@models/Signup";
import { Signup, deleteSignup } from "@models/Signup"; import SignupApi from "@api/signupApi";
import { Button } from "@components/index"; import { Button } from "@components/index";
import noop from "@utils/noop"; import noop from "@utils/noop";
@@ -22,16 +22,16 @@ const SignupEmailPage: NextPage = () => {
useEffect(() => { useEffect(() => {
const formId = Number(id); const formId = Number(id);
getForm(formId, true) SignupApi.getForm(formId, true)
.then((res) => setSignupForm(res)); .then((res) => setSignupForm(res));
getSignups(formId).then((res) => setSignups(res)); SignupApi.getSignups(formId).then((res) => setSignups(res));
}, [id]); }, [id]);
const confirmDelete = async (signup: Signup, question: any) => { const confirmDelete = async (signup: Signup, question: any) => {
if (window.confirm(`Delete: ${signup.id}: ${signup.answer[question.id]}; Are you sure?`) === true) { if (window.confirm(`Delete: ${signup.id}: ${signup.answer[question.id]}; Are you sure?`) === true) {
try { try {
await deleteSignup(signup.id); await SignupApi.deleteSignup(signup.id);
setSignups(signups.filter((s) => s.id !== signup.id)); setSignups(signups.filter((s) => s.id !== signup.id));
} catch (err) { } catch (err) {
window.alert("Delete failed!"); window.alert("Delete failed!");
+3 -2
View File
@@ -5,7 +5,8 @@ import { formatRelative } from "date-fns";
import AdminListCommon from "@views/admin/AdminListCommon"; import AdminListCommon from "@views/admin/AdminListCommon";
import { Link } from "@components/index"; import { Link } from "@components/index";
import AddLink from "@components/AddLink"; 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"; const URL = "/admin/signups";
@@ -44,7 +45,7 @@ const AdminSignupPage: NextPage = () => {
const [forms, setForms] = useState<SignupForm[]>(null); const [forms, setForms] = useState<SignupForm[]>(null);
useEffect(() => { useEffect(() => {
getForms(true) SignupApi.getForms(true)
.then((res) => setForms(res)); .then((res) => setForms(res));
}, []); }, []);
+6 -8
View File
@@ -2,9 +2,9 @@ import React from "react";
import { NextPage, GetStaticProps, GetStaticPaths } from "next"; import { NextPage, GetStaticProps, GetStaticPaths } from "next";
import Head from "next/head"; import Head from "next/head";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { import Event from "@models/Event";
Event, useFetchEvents, eventFetcher, generateFetchParams, import EventApi from "@api/eventApi";
} from "@models/Event"; import useFetchEvents from "@hooks/useFetchEvents";
import EventPageView from "@views/EventPage/EventPageView"; import EventPageView from "@views/EventPage/EventPageView";
import PageWrapper from "@views/common/PageWrapper"; import PageWrapper from "@views/common/PageWrapper";
import LoadingView from "@views/common/LoadingView"; import LoadingView from "@views/common/LoadingView";
@@ -35,9 +35,8 @@ const EventPage: NextPage<InitialProps> = ({ initialEvent }) => {
}; };
export const getStaticPaths: GetStaticPaths = async () => { export const getStaticPaths: GetStaticPaths = async () => {
const { url, config } = generateFetchParams(); const allEvents = await EventApi.getEvents();
const allEvents = await eventFetcher(url, config); const paths = allEvents.map((e: Event) => ({
const paths = allEvents.results.map((e: Event) => ({
params: { params: {
id: String(e.id), id: String(e.id),
}, },
@@ -51,8 +50,7 @@ export const getStaticPaths: GetStaticPaths = async () => {
export const getStaticProps: GetStaticProps<InitialProps> = async ({ params }) => { export const getStaticProps: GetStaticProps<InitialProps> = async ({ params }) => {
const { id } = params; const { id } = params;
const { url, config } = generateFetchParams(id as string); const initialEvent = await EventApi.getEvent(Number(id));
const initialEvent = await eventFetcher(url, config);
return { return {
props: { props: {
initialEvent, initialEvent,
+8 -12
View File
@@ -1,12 +1,12 @@
import React from "react"; import React from "react";
import { NextPage, GetStaticProps } from "next"; import { NextPage, GetStaticProps } from "next";
import Head from "next/head"; import Head from "next/head";
import { import Event from "@models/Event";
Event, useFetchEvents, eventFetcher, generateFetchParams as eventParams, import EventApi from "@api/eventApi";
} from "@models/Event"; import useFetchEvents from "@hooks/useFetchEvents";
import { import Post from "@models/Feed";
Post, useFetchFeed, feedFetcher, generateFetchParams as feedParams, import FeedApi from "@api/feedApi";
} from "@models/Feed"; import useFetchFeed from "@hooks/useFetchFeed";
import InEnglishPageView from "@views/InEnglishPage/InEnglishPageView"; import InEnglishPageView from "@views/InEnglishPage/InEnglishPageView";
import PageWrapper from "@views/common/PageWrapper"; import PageWrapper from "@views/common/PageWrapper";
@@ -37,12 +37,8 @@ const InEnglishPage: NextPage<InitialProps> = ({ initialEvents, initialFeed }) =
}; };
export const getStaticProps: GetStaticProps<InitialProps> = async () => { export const getStaticProps: GetStaticProps<InitialProps> = async () => {
let url: string; const initialEvents = await EventApi.getEvents(eventOptions);
let config: any; const initialFeed = await FeedApi.getFeed();
({ url, config } = eventParams("", eventOptions));
const initialEvents = await eventFetcher(url, config);
({ url, config } = feedParams(""));
const initialFeed = await feedFetcher(url, config);
return { return {
props: { props: {
initialEvents, initialEvents,
+8 -12
View File
@@ -1,12 +1,12 @@
import React from "react"; import React from "react";
import { NextPage, GetStaticProps } from "next"; import { NextPage, GetStaticProps } from "next";
import Head from "next/head"; import Head from "next/head";
import { import Event from "@models/Event";
Event, useFetchEvents, eventFetcher, generateFetchParams as eventParams, import EventApi from "@api/eventApi";
} from "@models/Event"; import useFetchEvents from "@hooks/useFetchEvents";
import { import Post from "@models/Feed";
Post, useFetchFeed, feedFetcher, generateFetchParams as feedParams, import FeedApi from "@api/feedApi";
} from "@models/Feed"; import useFetchFeed from "@hooks/useFetchFeed";
import FrontPageView from "@views/FrontPage/FrontPageView"; import FrontPageView from "@views/FrontPage/FrontPageView";
import PageWrapper from "@views/common/PageWrapper"; import PageWrapper from "@views/common/PageWrapper";
@@ -37,12 +37,8 @@ const FrontPage: NextPage<InitialProps> = ({ initialEvents, initialFeed }) => {
}; };
export const getStaticProps: GetStaticProps<InitialProps> = async () => { export const getStaticProps: GetStaticProps<InitialProps> = async () => {
let url: string; const initialEvents = await EventApi.getEvents(eventOptions);
let config: any; const initialFeed = await FeedApi.getFeed();
({ url, config } = eventParams("", eventOptions));
const initialEvents = await eventFetcher(url, config);
({ url, config } = feedParams(""));
const initialFeed = await feedFetcher(url, config);
return { return {
props: { props: {
initialEvents, initialEvents,
+8 -12
View File
@@ -1,12 +1,12 @@
import React from "react"; import React from "react";
import { NextPage, GetStaticProps } from "next"; import { NextPage, GetStaticProps } from "next";
import Head from "next/head"; import Head from "next/head";
import { import Event from "@models/Event";
Event, useFetchEvents, eventFetcher, generateFetchParams as eventParams, import EventApi from "@api/eventApi";
} from "@models/Event"; import useFetchEvents from "@hooks/useFetchEvents";
import { import Post from "@models/Feed";
Post, useFetchFeed, feedFetcher, generateFetchParams as feedParams, import FeedApi from "@api/feedApi";
} from "@models/Feed"; import useFetchFeed from "@hooks/useFetchFeed";
import ActualPageView from "@views/ActualPage/ActualPageView"; import ActualPageView from "@views/ActualPage/ActualPageView";
import PageWrapper from "@views/common/PageWrapper"; import PageWrapper from "@views/common/PageWrapper";
@@ -36,12 +36,8 @@ const ActualPage: NextPage<InitialProps> = ({ initialEvents, initialFeed }) => {
}; };
export const getStaticProps: GetStaticProps<InitialProps> = async () => { export const getStaticProps: GetStaticProps<InitialProps> = async () => {
let url: string; const initialEvents = await EventApi.getEvents(eventOptions);
let config: any; const initialFeed = await FeedApi.getFeed();
({ url, config } = eventParams("", eventOptions));
const initialEvents = await eventFetcher(url, config);
({ url, config } = feedParams(""));
const initialFeed = await feedFetcher(url, config);
return { return {
props: { props: {
initialEvents, initialEvents,
+5 -5
View File
@@ -2,8 +2,8 @@ import React, { useState } from "react";
import { NextPage, GetStaticProps, GetStaticPaths } from "next"; import { NextPage, GetStaticProps, GetStaticPaths } from "next";
import Head from "next/head"; import Head from "next/head";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { getForm, SignupForm, getForms } from "@models/SignupForm"; import { Signup, SignupForm } from "@models/Signup";
import { createSignup, Signup } from "@models/Signup"; import SignupApi from "@api/signupApi";
import SignUpPageView from "@views/SignUpPage/SignUpPageView"; import SignUpPageView from "@views/SignUpPage/SignUpPageView";
import PageWrapper from "@views/common/PageWrapper"; import PageWrapper from "@views/common/PageWrapper";
import LoadingView from "@views/common/LoadingView"; import LoadingView from "@views/common/LoadingView";
@@ -28,7 +28,7 @@ const SignUpPage: NextPage<InitialProps> = ({ form }) => {
}; };
try { try {
await createSignup(payload); await SignupApi.createSignup(payload);
// TODO: Fetch/update signup list, so user sees the signup in the list // TODO: Fetch/update signup list, so user sees the signup in the list
setStatus("Sign-up submitted successfully"); setStatus("Sign-up submitted successfully");
} catch (error) { } catch (error) {
@@ -56,7 +56,7 @@ const SignUpPage: NextPage<InitialProps> = ({ form }) => {
}; };
export const getStaticPaths: GetStaticPaths = async () => { export const getStaticPaths: GetStaticPaths = async () => {
const allForms = await getForms(); const allForms = await SignupApi.getForms();
const paths = allForms.map((e: SignupForm) => ({ const paths = allForms.map((e: SignupForm) => ({
params: { params: {
id: String(e.id), id: String(e.id),
@@ -71,7 +71,7 @@ export const getStaticPaths: GetStaticPaths = async () => {
export const getStaticProps: GetStaticProps<InitialProps> = async ({ params }) => { export const getStaticProps: GetStaticProps<InitialProps> = async ({ params }) => {
const { id } = params; const { id } = params;
const form = await getForm(Number(id)); const form = await SignupApi.getForm(Number(id));
return { return {
props: { props: {
form, form,
+5 -5
View File
@@ -1,8 +1,8 @@
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { NextPage } from "next"; import { NextPage } from "next";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { getForm, SignupForm } from "@models/SignupForm"; import { Signup, SignupForm } from "@models/Signup";
import { updateSignup, getSignupUUID, Signup } from "@models/Signup"; import SignupApi from "@api/signupApi";
import SignUpPageView from "@views/SignUpPage/SignUpPageView"; import SignUpPageView from "@views/SignUpPage/SignUpPageView";
import PageWrapper from "@views/common/PageWrapper"; import PageWrapper from "@views/common/PageWrapper";
import noop from "@utils/noop"; import noop from "@utils/noop";
@@ -30,7 +30,7 @@ const EditSignUpPage: NextPage = () => {
useEffect(() => { useEffect(() => {
const fetchSignUpForm = async (id: number): Promise<SignupForm> => { const fetchSignUpForm = async (id: number): Promise<SignupForm> => {
const formPromise = getForm(id); const formPromise = SignupApi.getForm(id);
formPromise.then((form) => { formPromise.then((form) => {
setForm(form); setForm(form);
}); });
@@ -38,7 +38,7 @@ const EditSignUpPage: NextPage = () => {
}; };
const fetchSignUp = async (id: number, uniqueId: string): Promise<Signup> => { const fetchSignUp = async (id: number, uniqueId: string): Promise<Signup> => {
const signupPromise = getSignupUUID(id, uniqueId); const signupPromise = SignupApi.getSignupUUID(id, uniqueId);
signupPromise.then((signup) => setFormData(signup.answer)); signupPromise.then((signup) => setFormData(signup.answer));
return signupPromise; return signupPromise;
}; };
@@ -56,7 +56,7 @@ const EditSignUpPage: NextPage = () => {
}; };
try { try {
await updateSignup(payload, uuid); await SignupApi.updateSignup(payload, uuid);
// TODO: Update signup list, so user sees possible changes in the list // TODO: Update signup list, so user sees possible changes in the list
setStatus("Sign-up submission updated successfully"); setStatus("Sign-up submission updated successfully");
} catch (error) { } catch (error) {
+4 -5
View File
@@ -1,9 +1,9 @@
import React from "react"; import React from "react";
import { NextPage, GetStaticProps } from "next"; import { NextPage, GetStaticProps } from "next";
import Head from "next/head"; import Head from "next/head";
import { import JobAd from "@models/JobAd";
JobAd, useFetchJobAds, jobAdFetcher, generateFetchParams, import JobAdApi from "@api/jobAdApi";
} from "@models/JobAd"; import useFetchJobAds from "@hooks/useFetchJobAds";
import CorporatePageView from "@views/CorporatePage/CorporatePageView"; import CorporatePageView from "@views/CorporatePage/CorporatePageView";
import PageWrapper from "@views/common/PageWrapper"; import PageWrapper from "@views/common/PageWrapper";
@@ -27,8 +27,7 @@ const CorporatePage: NextPage<InitialProps> = ({ initialJobAds }) => {
}; };
export const getStaticProps: GetStaticProps<InitialProps> = async () => { export const getStaticProps: GetStaticProps<InitialProps> = async () => {
const { url } = generateFetchParams(); const initialJobAds = await JobAdApi.getJobAds();
const initialJobAds = await jobAdFetcher(url);
return { return {
props: { props: {
initialJobAds, initialJobAds,
+2 -2
View File
@@ -1,8 +1,8 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import breakpoints from "@theme/breakpoints"; import breakpoints from "@theme/breakpoints";
import { Event } from "@models/Event"; import Event from "@models/Event";
import { Post } from "@models/Feed"; import Post from "@models/Feed";
import { import {
Divider, CTASection, TextSection, Link, CrossFadeImages, Divider, CTASection, TextSection, Link, CrossFadeImages,
+1 -1
View File
@@ -1,5 +1,5 @@
import React, { useState } from "react"; import React, { useState } from "react";
import { Event } from "@models/Event"; import Event from "@models/Event";
import Button from "@components/Button"; import Button from "@components/Button";
import { CardSection, Card, FullWidthSection } from "@components/index"; import { CardSection, Card, FullWidthSection } from "@components/index";
+1 -1
View File
@@ -1,5 +1,5 @@
import React, { useState } from "react"; import React, { useState } from "react";
import { Post } from "@models/Feed"; import Post from "@models/Feed";
import Button from "@components/Button"; import Button from "@components/Button";
import { CardSection, Card, FullWidthSection } from "@components/index"; import { CardSection, Card, FullWidthSection } from "@components/index";
@@ -2,7 +2,7 @@ import React from "react";
import { import {
CTASection, TextSection, PageLink, Link, CTASection, TextSection, PageLink, Link,
} from "@components/index"; } from "@components/index";
import { JobAd } from "@models/JobAd"; import JobAd from "@models/JobAd";
import CorporatePageHero from "./CorporatePageHero"; import CorporatePageHero from "./CorporatePageHero";
import JobAdList from "./JobAdList"; import JobAdList from "./JobAdList";
+1 -1
View File
@@ -1,6 +1,6 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { JobAd } from "@models/JobAd"; import JobAd from "@models/JobAd";
import { Accordion } from "@components/index"; import { Accordion } from "@components/index";
import ReactMarkdown from "react-markdown"; import ReactMarkdown from "react-markdown";
+1 -1
View File
@@ -2,7 +2,7 @@ import React from "react";
import Image from "next/image"; import Image from "next/image";
import styled from "styled-components"; import styled from "styled-components";
import colors from "@theme/colors"; import colors from "@theme/colors";
import { Event } from "@models/Event"; import Event from "@models/Event";
import Button from "@components/Button"; import Button from "@components/Button";
import { Link, TextSection } from "@components/index"; import { Link, TextSection } from "@components/index";
import noop from "@utils/noop"; import noop from "@utils/noop";
+2 -2
View File
@@ -9,8 +9,8 @@ import {
CTASection, CTASection,
Link, Link,
} from "@components/index"; } from "@components/index";
import { Event } from "@models/Event"; import Event from "@models/Event";
import { Post } from "@models/Feed"; import Post from "@models/Feed";
import { colors } from "@theme/colors"; import { colors } from "@theme/colors";
import FullWidthSection from "@components/Sections/FullWidthSection"; import FullWidthSection from "@components/Sections/FullWidthSection";
@@ -11,8 +11,8 @@ import {
PageLink, PageLink,
TextSection, TextSection,
} from "@components/index"; } from "@components/index";
import { Event } from "@models/Event"; import Event from "@models/Event";
import { Post } from "@models/Feed"; import Post from "@models/Feed";
import noop from "@utils/noop"; import noop from "@utils/noop";
import InEnglishPageHero from "./InEnglishPageHero"; import InEnglishPageHero from "./InEnglishPageHero";
+1 -1
View File
@@ -1,5 +1,5 @@
import { Question } from "@components/Widgets/SignupQuestionsWidget/common"; import { Question } from "@components/Widgets/SignupQuestionsWidget/common";
import { SignupForm } from "@models/SignupForm"; import { SignupForm } from "@models/Signup";
import { EMAIL_REGEX } from "@utils/regexes"; import { EMAIL_REGEX } from "@utils/regexes";
import escapeRegExp from "lodash/escapeRegExp"; import escapeRegExp from "lodash/escapeRegExp";
+1 -1
View File
@@ -1,7 +1,7 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { IChangeEvent, ISubmitEvent, ErrorSchema } from "react-jsonschema-form"; 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 Checkboxes from "@components/Widgets/Checkbox/Checkboxes";
import RadioButtonWidget from "@components/Widgets/RadioButton/RadioButtonWidget"; import RadioButtonWidget from "@components/Widgets/RadioButton/RadioButtonWidget";
import { TextSection } from "@components/index"; import { TextSection } from "@components/index";
+4 -4
View File
@@ -2,10 +2,10 @@ import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { ISubmitEvent, IChangeEvent, ErrorSchema } from "react-jsonschema-form"; import { ISubmitEvent, IChangeEvent, ErrorSchema } from "react-jsonschema-form";
import { colors } from "@theme/colors"; import { colors } from "@theme/colors";
import { Event } from "@models/Event"; import Event from "@models/Event";
import { Post } from "@models/Feed"; import Post from "@models/Feed";
import { SignupForm } from "@models/SignupForm"; import { SignupForm } from "@models/Signup";
import { JobAd } from "@models/JobAd"; import JobAd from "@models/JobAd";
import FormWrapper from "@views/common/FormWrapper"; import FormWrapper from "@views/common/FormWrapper";
import AdminPageWrapper from "@views/common/AdminPageWrapper"; import AdminPageWrapper from "@views/common/AdminPageWrapper";
+3
View File
@@ -21,6 +21,9 @@
"typeRoots": ["types", "node_modules/@types"], "typeRoots": ["types", "node_modules/@types"],
"baseUrl": "./", "baseUrl": "./",
"paths": { "paths": {
"@api/*": [
"src/api/*"
],
"@components/*": [ "@components/*": [
"src/components/*" "src/components/*"
], ],