From f9ffb85f8f8c3c26a7f5ed678bb00956545d0b6d Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Mon, 11 Mar 2019 22:37:37 +0200 Subject: [PATCH] Add kinds of improvements to event create page --- src/models/Event.ts | 10 +++ src/models/Tag.ts | 20 +++++ .../EventCreatePage/EventCreatePage.scss | 11 +++ src/pages/EventCreatePage/EventCreatePage.tsx | 77 +++++++++++++++---- 4 files changed, 105 insertions(+), 13 deletions(-) create mode 100644 src/models/Tag.ts diff --git a/src/models/Event.ts b/src/models/Event.ts index 7ac9bcd..276c203 100644 --- a/src/models/Event.ts +++ b/src/models/Event.ts @@ -19,3 +19,13 @@ export async function getEvents(): Promise { throw err; } } + +export async function createEvent(data): Promise { + try { + const resp = await axios.post(url, data); + return resp.data["results"]; + } catch (err) { + console.error(err); + throw err; + } +} diff --git a/src/models/Tag.ts b/src/models/Tag.ts new file mode 100644 index 0000000..8eb36f3 --- /dev/null +++ b/src/models/Tag.ts @@ -0,0 +1,20 @@ +import axios from "axios"; + +const url = `${process.env.API_URL}/tags/`; + +export interface Tag { + id: number; + name: string; + slug: string; + 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; + } +} diff --git a/src/pages/EventCreatePage/EventCreatePage.scss b/src/pages/EventCreatePage/EventCreatePage.scss index 318a75c..cdd4d56 100644 --- a/src/pages/EventCreatePage/EventCreatePage.scss +++ b/src/pages/EventCreatePage/EventCreatePage.scss @@ -1,3 +1,5 @@ +@import "../../assets/scss/globals"; + .event-create-page { width: 100%; @@ -21,4 +23,13 @@ font-weight: bold; margin: 0.5rem 0; } + + button { + background-color: $blue; + color: $white; + padding: 0.5rem 1rem; + border: none; + outline: none; + cursor: pointer; + } } diff --git a/src/pages/EventCreatePage/EventCreatePage.tsx b/src/pages/EventCreatePage/EventCreatePage.tsx index 22d9fe8..5303686 100644 --- a/src/pages/EventCreatePage/EventCreatePage.tsx +++ b/src/pages/EventCreatePage/EventCreatePage.tsx @@ -3,14 +3,68 @@ import Helmet from "react-helmet"; import "./EventCreatePage.scss"; import { isAuthenticated } from "../../auth"; import Form from "react-jsonschema-form"; +import { Tag, getTags } from "../../models/Tag"; +import { createEvent } from "../../models/Event"; -export interface EventCreatePageProps {} +export interface EventCreatePageProps { + history: { + push: (to: string) => void; + }; +} export interface EventCreatePageState { + tags: Tag[]; + error?: string; } class EventCreatePage extends React.Component { + constructor(props) { + super(props); + this.state = { + tags: [], + }; + + this.fetchTags(); + } + + fetchTags = async () => { + const getTagsPromise = getTags(); + try { + const tags = await getTagsPromise; + this.setState({ + tags, + }); + return getTagsPromise; + } catch (err) { + this.setState({ + error: String(err), + }); + } + } + + onSubmit = async (data) => { + console.log("submitted, data:"); + console.log(data); + + const { history } = this.props; + + try { + const payload = data.formData; + await createEvent(payload); + history.push("/admin/events"); + } catch (err) { + this.setState({ + error: String(err), + }); + } + } + + onError = (data) => { + console.error("error, data:"); + console.log(data); + } render() { + const { tags, error } = this.state; const schema = { title: "New Event", type: "object", @@ -18,7 +72,7 @@ class EventCreatePage extends React.Component t.id), + enumNames: tags.map(t => t.name), }, uniqueItems: true }, @@ -51,8 +101,9 @@ class EventCreatePage extends React.Component console.log("changed")} - onSubmit={() => console.log("submitted")} - onError={() => console.log("error")} /> + onSubmit={this.onSubmit} + onError={this.onError} /> + { error &&
{error}
} ); }