Edit own events

This commit is contained in:
Amit Jakubowicz 2019-06-10 19:50:51 +02:00
parent c84d9712e6
commit 899da9a6a8
12 changed files with 147 additions and 44 deletions

View file

@ -7,13 +7,14 @@ import {
Link
} from "react-router-dom"
import Calendar from "../Calendar/Calendar"
import { ApolloProvider } from "react-apollo"
import { ApolloClient } from "apollo-client"
import { HttpLink } from "apollo-link-http"
import { IdGetterObj, InMemoryCache } from "apollo-cache-inmemory"
import {ApolloProvider} from "react-apollo"
import {ApolloClient} from "apollo-client"
import {HttpLink} from "apollo-link-http"
import {IdGetterObj, InMemoryCache} from "apollo-cache-inmemory"
import CreateEvent from "../Event/CreateEvent"
import EditEvent from "../Event/EditEvent"
import { RouteComponentProps } from "react-router"
import {RouteComponentProps} from "react-router"
import {AppContextProvider} from "./Context/AppContext"
const httpLink = new HttpLink({
uri: "/graphql"
@ -27,21 +28,23 @@ const graphqlClient = new ApolloClient({
const App = () => (
<ApolloProvider client={graphqlClient}>
<Router>
<h1>what</h1>
<Link to="/create">Create event</Link>
<Switch>
<Route path="/create" component={CreateEvent} />
<Route
path="/event/:eventId/edit"
render={(routeProps: RouteComponentProps<{ eventId: string }>) => (
<EditEvent eventId={routeProps.match.params.eventId} />
)}
/>
<Route path="/" component={Calendar} />
<Redirect to="/" />
</Switch>
</Router>
<AppContextProvider>
<Router>
<h1>what</h1>
<Link to="/create">Create event</Link>
<Switch>
<Route path="/create" component={CreateEvent}/>
<Route
path="/event/:eventId/edit"
render={(routeProps: RouteComponentProps<{ eventId: string }>) => (
<EditEvent eventId={routeProps.match.params.eventId}/>
)}
/>
<Route path="/" component={Calendar}/>
<Redirect to="/"/>
</Switch>
</Router>
</AppContextProvider>
</ApolloProvider>
)
export default App

View file

@ -0,0 +1,22 @@
import * as React from "react"
import MeQuery, { UserData } from "./MeQuery"
interface IAppContext {
me: UserData
}
const { Provider, Consumer } = React.createContext<IAppContext>({ me: null })
const AppContextProvider = props => (
<MeQuery>
{({ data, loading, error }) => (
<Provider value={data}>
{
props.children
}
</Provider>
)}
</MeQuery>
)
export { AppContextProvider, Consumer as AppContext }

View file

@ -0,0 +1,34 @@
import { Query } from 'react-apollo'
import gql from 'graphql-tag'
const query = gql`
query Me {
me {
id
username
events {
id
}
}
}
`
export interface UserEventData {
id: string
}
export interface UserData {
id: string
username: string
events: UserEventData[]
}
interface Data {
me: UserData
}
export default class MeQuery extends Query<Data> {
static defaultProps = {
query
}
}

View file

@ -1,5 +1,7 @@
import * as React from 'react'
import {OccurrenceData} from "../../Event/OccurrencesQuery"
import * as React from "react"
import { OccurrenceData } from "../../Event/OccurrencesQuery"
import { AppContext } from "../../App/Context/AppContext"
import { Link } from 'react-router-dom'
interface Props {
occurrence: OccurrenceData
@ -9,17 +11,22 @@ const ListItem = (props: Props) => {
const { occurrence } = props
const { event } = occurrence
const info = event.info[0]
const startTime = occurrence.start.split(' ')[1].substring(0, 5)
const startTime = occurrence.start.split(" ")[1].substring(0, 5)
return (
<div>
{
startTime
}
&nbsp;
{
info.title
}
</div>
<AppContext>
{({ me }) => (
<div>
{startTime}
&nbsp;
{info.title}
{
me && me.events.find(myEvent => myEvent.id === event.id) ? (
<Link to={`/event/${event.id}/edit`}>Edit</Link>
) : null
}
</div>
)}
</AppContext>
)
}

View file

@ -8,6 +8,7 @@
"start": "NODE_ENV=development webpack-dev-server --config ./webpack.config.ts --hot --progress"
},
"dependencies": {
"@types/react-router-dom": "^4.3.3",
"apollo-cache-inmemory": "^1.3.8",
"apollo-client": "^2.4.5",
"apollo-link-http": "^1.5.14",

View file

@ -3,6 +3,7 @@ type User {
username: String!
email: String!
id: ID!
events: [CalendarEvent]!
}
scalar Date

View file

@ -2,7 +2,7 @@ import SessionManager, { SessionAlreadyValidatedError } from "./SessionManager"
import { User } from "./User.entity"
import { PostOffice } from "../post_office"
import {GQL} from "../../../@types"
import {Context} from "../@types/graphql-utils";
import {Context} from "../@types/graphql-utils"
interface Dependencies {
sendEmail: PostOffice

View file

@ -0,0 +1,9 @@
export default {
Query: {},
Mutation: {},
User: {
events: (user) => {
return user.events
}
}
}

View file

@ -94,7 +94,7 @@ export class Event extends BaseEntity {
@Column(type => EventLocation)
location: EventLocation
updateOccurrences() {
getOccurrences() {
const occurences = []
console.log('this.time.recurrence', this.time.recurrence)
if (!this.time.recurrence) {
@ -121,10 +121,10 @@ export class Event extends BaseEntity {
occurences.forEach(occ => {
occ.start = this.time.start
occ.end = this.time.end
occ.event = Promise.resolve(this)
})
console.log('occurences', occurences)
this.occurrences = Promise.resolve(occurences)
return
return occurences
}
}
@ -147,7 +147,7 @@ export class EventOccurrence extends BaseEntity {
@PrimaryGeneratedColumn("uuid")
id: number
@ManyToOne(type => Event, event => event.occurrences)
@ManyToOne(type => Event, event => event.occurrences, { nullable: false })
event: Promise<Event>
@Column({type: "tstzrange", nullable: true})

View file

@ -78,7 +78,8 @@ const resolvers: ResolverMap = {
}
event.meta = input.meta
event.location = input.location
event.updateOccurrences()
event.occurrences = Promise.resolve(event.getOccurrences())
await event.save()
return event
},
@ -101,7 +102,9 @@ const resolvers: ResolverMap = {
}
if (input.time) {
event.time = input.time
event.updateOccurrences()
const existingOccurrences = await event.occurrences
await Promise.all(existingOccurrences.map(occ => EventOccurrence.delete(occ.id)))
event.occurrences = Promise.resolve(event.getOccurrences())
}
if (input.info) {
event.info = Promise.resolve(
@ -123,6 +126,7 @@ const resolvers: ResolverMap = {
if (input.location) {
event.location = input.location
}
console.log(JSON.stringify(event,null,'\t'))
return event.save()
}
}

View file

@ -1,13 +1,13 @@
import {ApolloServer} from 'apollo-server'
import {makeExecutableSchema} from "graphql-tools"
import EventsResolvers from './Events/eventsResolvers'
import UserResolvers from './Auth/userResolvers'
import {importSchema} from 'graphql-import'
import AuthResolvers from "./Auth/authResolvers"
import {Connection} from "typeorm"
import {PostOffice} from "./post_office"
import {Session} from "./Auth/Session.entity"
import {Context} from "./@types/graphql-utils"
import {auth} from "google-auth-library";
interface Dependencies {
typeormConnection: Connection
@ -31,6 +31,7 @@ export const createServer = async (dependencies: Dependencies) => {
const typeDefs = importSchema(__dirname + '/../../schema.graphql')
const { Query: EventQueryResolvers, Mutation: EventResolversMutation,...eventResolvers} = EventsResolvers
const { Query: UserQueryResolvers, Mutation: UserMutationResolvers, ...userResolvers} = UserResolvers
const schema = makeExecutableSchema({
typeDefs: [
@ -40,17 +41,21 @@ export const createServer = async (dependencies: Dependencies) => {
Query: {
...resolvers.Query,
...EventQueryResolvers,
...authResolvers.Query
...authResolvers.Query,
...UserQueryResolvers,
},
Mutation: {
...resolvers.Mutation,
...EventResolversMutation,
...authResolvers.Mutation
...authResolvers.Mutation,
...UserMutationResolvers,
},
UserSession: {
...authResolvers.UserSession
},
...eventResolvers
...eventResolvers,
...userResolvers,
},
})

View file

@ -1500,6 +1500,23 @@
"@types/prop-types" "*"
"@types/react" "*"
"@types/react-router-dom@^4.3.3":
version "4.3.3"
resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.3.3.tgz#7837e3e9fefbc84a8f6c8a51dca004f4e83e94e3"
integrity sha512-xj0DmFjgvAqRfh/kJPO7apD5G30yPQe+8slu/dugioQOkdKpyzc4Fgk4hoTelm6CSHz7pI2PPsW5+Y6GRBF2zw==
dependencies:
"@types/history" "*"
"@types/react" "*"
"@types/react-router" "*"
"@types/react-router@*":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.0.1.tgz#9f4548c75755c55b0cffdd743080e5afa87da6dd"
integrity sha512-vOyVO0u3Cs0w6G5DzYqNVqcTsurEnDgOmmkJf2s7VwtunWzpPgI6dHsCBX68vXqeICpP6jCfojgJcHkm5BV7hQ==
dependencies:
"@types/history" "*"
"@types/react" "*"
"@types/react-router@^4.0.31":
version "4.4.5"
resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-4.4.5.tgz#1166997dc7eef2917b5ebce890ebecb32ee5c1b3"