From c1f07122d1857d8efc60463829dd0dba96946287 Mon Sep 17 00:00:00 2001 From: Thomas Citharel <tcit@tcit.fr> Date: Tue, 5 Mar 2019 12:07:58 +0100 Subject: [PATCH] Fix routing between BE & FE and fix event creation Signed-off-by: Thomas Citharel <tcit@tcit.fr> --- js/src/components/NavBar.vue | 5 ++- js/src/types/actor.model.ts | 15 ++++++++- js/src/types/event.model.ts | 23 ++++++++++++- js/src/views/Event/Create.vue | 61 +++++++++++------------------------ lib/mobilizon_web/router.ex | 9 ++++++ 5 files changed, 66 insertions(+), 47 deletions(-) diff --git a/js/src/components/NavBar.vue b/js/src/components/NavBar.vue index 31ef9b0b7..350c0b172 100644 --- a/js/src/components/NavBar.vue +++ b/js/src/components/NavBar.vue @@ -43,14 +43,13 @@ </template> <script lang="ts"> -import { Component, Prop, Vue, Watch } from "vue-property-decorator"; -import { AUTH_USER_ACTOR } from "@/constants"; +import { Component, Vue, Watch } from "vue-property-decorator"; import { SEARCH } from "@/graphql/search"; import { CURRENT_USER_CLIENT } from "@/graphql/user"; import { onLogout } from "@/vue-apollo"; import { deleteUserData } from "@/utils/auth"; import { LOGGED_PERSON } from "@/graphql/actor"; -import { IActor, IPerson } from '../types/actor.model'; +import { IActor, IPerson } from '@/types/actor.model'; import { RouteName } from '@/router' @Component({ diff --git a/js/src/types/actor.model.ts b/js/src/types/actor.model.ts index 215df38cb..749e59e25 100644 --- a/js/src/types/actor.model.ts +++ b/js/src/types/actor.model.ts @@ -1,5 +1,5 @@ export interface IActor { - id: string; + id?: string; url: string; name: string; domain: string|null; @@ -10,6 +10,17 @@ export interface IActor { bannerUrl: string; } +export class Actor implements IActor { + avatarUrl: string = ''; + bannerUrl: string = ''; + domain: string | null = null; + name: string = ''; + preferredUsername: string = ''; + summary: string = ''; + suspended: boolean = false; + url: string = ''; +} + export interface IPerson extends IActor { } @@ -18,6 +29,8 @@ export interface IGroup extends IActor { members: IMember[]; } +export class Person extends Actor implements IPerson {} + export enum MemberRole { PENDING, MEMBER, diff --git a/js/src/types/event.model.ts b/js/src/types/event.model.ts index 42893dec8..9acf0cade 100644 --- a/js/src/types/event.model.ts +++ b/js/src/types/event.model.ts @@ -1,4 +1,4 @@ -import { IActor } from './actor.model'; +import {Actor, IActor} from './actor.model'; export enum EventStatus { TENTATIVE, @@ -70,3 +70,24 @@ export interface IEvent { // online_address: Address; // phone_address: string; } + + +export class EventModel implements IEvent { + begins_on: Date = new Date(); + category: Category = Category.MEETING; + description: string = ''; + ends_on: Date = new Date(); + join_options: EventJoinOptions = EventJoinOptions.FREE; + large_image: string = ''; + local: boolean = true; + participants: IParticipant[] = []; + publish_at: Date = new Date(); + status: EventStatus = EventStatus.CONFIRMED; + thumbnail: string = ''; + title: string = ''; + url: string = ''; + uuid: string = ''; + visibility: EventVisibility = EventVisibility.PUBLIC; + attributedTo: IActor = new Actor(); + organizerActor: IActor = new Actor(); +} \ No newline at end of file diff --git a/js/src/views/Event/Create.vue b/js/src/views/Event/Create.vue index 943d48a1b..93efde77f 100644 --- a/js/src/views/Event/Create.vue +++ b/js/src/views/Event/Create.vue @@ -1,5 +1,3 @@ -import {Category} from "../../types/event.model"; -import {EventJoinOptions} from "../../types/event.model"; <template> <section> <h1 class="title"> @@ -36,55 +34,34 @@ import {EventJoinOptions} from "../../types/event.model"; // import Location from '@/components/Location'; import {CREATE_EVENT, EDIT_EVENT} from "@/graphql/event"; import {Component, Prop, Vue} from "vue-property-decorator"; - import {Category, EventJoinOptions, EventStatus, EventVisibility, IEvent} from "@/types/event.model"; + import { + Category, + IEvent, + EventModel, + } from "@/types/event.model"; import {LOGGED_PERSON} from "@/graphql/actor"; - import {IPerson} from "@/types/actor.model"; + import {IPerson, Person} from "@/types/actor.model"; -@Component({}) +@Component({ + apollo: { + loggedPerson: { + query: LOGGED_PERSON, + } + } +}) export default class CreateEvent extends Vue { @Prop({ required: false, type: String }) uuid!: string; - loggedPerson!: IPerson; + loggedPerson: IPerson = new Person(); categories: string[] = Object.keys(Category); - event!: IEvent; // FIXME: correctly type an event - - // created() { - // if (this.uuid) { - // this.fetchEvent(); - // } - // } - - async created() { - // We put initialization here because we need loggedPerson to be ready before initializing event - const { data } = await this.$apollo.query({ query: LOGGED_PERSON }); - - this.loggedPerson = data.loggedPerson; - - this.event = { - title: "", - organizerActor: this.loggedPerson, - attributedTo: this.loggedPerson, - description: "", - begins_on: new Date(), - ends_on: new Date(), - category: Category.MEETING, - participants: [], - uuid: "", - url: "", - local: true, - status: EventStatus.CONFIRMED, - visibility: EventVisibility.PUBLIC, - join_options: EventJoinOptions.FREE, - thumbnail: "", - large_image: "", - publish_at: new Date() - }; - } + event: IEvent = new EventModel(); createEvent(e: Event) { e.preventDefault(); + this.event.organizerActor = this.loggedPerson; + this.event.attributedTo = this.loggedPerson; - if (this.uuid === undefined) { + if (this.event.uuid === "") { this.$apollo .mutate({ mutation: CREATE_EVENT, @@ -104,7 +81,7 @@ export default class CreateEvent extends Vue { }); }) .catch(error => { - console.log(error); + console.error(error); }); } else { this.$apollo diff --git a/lib/mobilizon_web/router.ex b/lib/mobilizon_web/router.ex index 73d996004..79f783c49 100644 --- a/lib/mobilizon_web/router.ex +++ b/lib/mobilizon_web/router.ex @@ -65,6 +65,15 @@ defmodule MobilizonWeb.Router do get("/@:name/feed/:format", FeedController, :actor) end + scope "/", MobilizonWeb do + pipe_through(:browser) + + # Because the "/events/:uuid" route caches all these, we need to force them + get("/events/create", PageController, :index) + get("/events/list", PageController, :index) + get("/events/:uuid/edit", PageController, :index) + end + scope "/", MobilizonWeb do pipe_through(:activity_pub_and_html) get("/@:name", PageController, :actor)