mirror of
https://github.com/quepasaevents/qpa-client.git
synced 2023-12-14 05:33:02 +01:00
Edit own events
This commit is contained in:
parent
c84d9712e6
commit
899da9a6a8
12 changed files with 147 additions and 44 deletions
|
@ -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}>
|
||||
<AppContextProvider>
|
||||
<Router>
|
||||
<h1>what</h1>
|
||||
<Link to="/create">Create event</Link>
|
||||
<Switch>
|
||||
<Route path="/create" component={CreateEvent} />
|
||||
<Route path="/create" component={CreateEvent}/>
|
||||
<Route
|
||||
path="/event/:eventId/edit"
|
||||
render={(routeProps: RouteComponentProps<{ eventId: string }>) => (
|
||||
<EditEvent eventId={routeProps.match.params.eventId} />
|
||||
<EditEvent eventId={routeProps.match.params.eventId}/>
|
||||
)}
|
||||
/>
|
||||
<Route path="/" component={Calendar} />
|
||||
<Redirect to="/" />
|
||||
<Route path="/" component={Calendar}/>
|
||||
<Redirect to="/"/>
|
||||
</Switch>
|
||||
</Router>
|
||||
</AppContextProvider>
|
||||
</ApolloProvider>
|
||||
)
|
||||
export default App
|
||||
|
|
22
client/App/Context/AppContext.tsx
Normal file
22
client/App/Context/AppContext.tsx
Normal 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 }
|
34
client/App/Context/MeQuery.ts
Normal file
34
client/App/Context/MeQuery.ts
Normal 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
|
||||
}
|
||||
}
|
|
@ -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 (
|
||||
<AppContext>
|
||||
{({ me }) => (
|
||||
<div>
|
||||
{
|
||||
startTime
|
||||
}
|
||||
{startTime}
|
||||
|
||||
{info.title}
|
||||
{
|
||||
info.title
|
||||
me && me.events.find(myEvent => myEvent.id === event.id) ? (
|
||||
<Link to={`/event/${event.id}/edit`}>Edit</Link>
|
||||
) : null
|
||||
}
|
||||
</div>
|
||||
)}
|
||||
</AppContext>
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -3,6 +3,7 @@ type User {
|
|||
username: String!
|
||||
email: String!
|
||||
id: ID!
|
||||
events: [CalendarEvent]!
|
||||
}
|
||||
|
||||
scalar Date
|
||||
|
|
|
@ -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
|
||||
|
|
9
server/src/Auth/userResolvers.ts
Normal file
9
server/src/Auth/userResolvers.ts
Normal file
|
@ -0,0 +1,9 @@
|
|||
export default {
|
||||
Query: {},
|
||||
Mutation: {},
|
||||
User: {
|
||||
events: (user) => {
|
||||
return user.events
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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})
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
||||
},
|
||||
})
|
||||
|
||||
|
|
17
yarn.lock
17
yarn.lock
|
@ -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"
|
||||
|
|
Loading…
Reference in a new issue