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)