diff --git a/.env.example b/.env.example
index d7e32ef01d..bd9529ea79 100644
--- a/.env.example
+++ b/.env.example
@@ -17,4 +17,7 @@ REACT_APP_USE_RECAPTCHA=
# from here for reCAPTCHA v2 and "I'm not a robot" Checkbox, and paste the key here.
# Note: In domains, fill localhost
-REACT_APP_RECAPTCHA_SITE_KEY=
\ No newline at end of file
+REACT_APP_RECAPTCHA_SITE_KEY=
+
+# has to be inserted in the env file to use plugins and other websocket based features.
+REACT_APP_BACKEND_WEBSOCKET_URL=ws://localhost:4000/graphql
\ No newline at end of file
diff --git a/public/locales/en.json b/public/locales/en.json
index fb5d78bc2f..50945e8dde 100644
--- a/public/locales/en.json
+++ b/public/locales/en.json
@@ -65,6 +65,7 @@
"Block/Unblock": "Block/Unblock",
"Plugins": "Plugins",
"Plugin Store": "Plugin Store",
+ "Advertisement": "Advertisements",
"allOrganizations": "All Organizations",
"yourOrganization": "Your Organization",
"notification": "Notification",
@@ -656,6 +657,25 @@
"event": "Event",
"organization": "Organization"
},
+ "advertisement": {
+ "title": "Advertisements",
+ "pHeading": "Manage Ads",
+ "activeAds": "Active Campaigns",
+ "archievedAds": "Completed Campaigns",
+ "pMessage": "Ads not present for this campaign.",
+ "delete": "Delete",
+ "Rname": "Enter name of Advertisement",
+ "Rtype": "Select type of Advertisement",
+ "Rlink": "Provide a link for content to be displayed",
+ "RstartDate": "Select Start Date",
+ "RendDate": "Select End Date",
+ "RClose": "Close the window",
+ "addNew": "Create new advertisement",
+ "EXname": "Ex. Cookie Shop",
+ "EXlink": "Ex. http://yourwebsite.com/photo",
+ "register": "Create Advertisement",
+ "close": "Close "
+ },
"userChat": {
"chat": "Chat",
"search": "Search",
diff --git a/public/locales/fr.json b/public/locales/fr.json
index 97116881e9..75522a0fed 100644
--- a/public/locales/fr.json
+++ b/public/locales/fr.json
@@ -646,6 +646,14 @@
"event": "Événement",
"organization": "Organisation"
},
+ "advertisement": {
+ "title": "Publicités",
+ "pHeading": "Gérer les publicités",
+ "activeAds": "Campagnes actives",
+ "archievedAds": "Campagnes terminées",
+ "pMessage": "Aucune publicité n'est présente pour cette campagne.",
+ "delete": "Supprimer"
+ },
"userChat": {
"chat": "Chat",
"search": "Recherche",
diff --git a/public/locales/hi.json b/public/locales/hi.json
index 490b5b5d04..d952ff7f30 100644
--- a/public/locales/hi.json
+++ b/public/locales/hi.json
@@ -646,6 +646,14 @@
"event": "आयोजन",
"organization": "संगठन"
},
+ "advertisement": {
+ "title": "विज्ञापन",
+ "pHeading": "विज्ञापन प्रबंधन",
+ "activeAds": "सक्रिय अभियान",
+ "archievedAds": "संपन्न अभियान",
+ "pMessage": "इस अभियान के लिए कोई विज्ञापन नहीं हैं।",
+ "delete": "हटाएँ"
+ },
"userChat": {
"chat": "बात",
"search": "खोज",
diff --git a/public/locales/sp.json b/public/locales/sp.json
index 33cb77ed64..9b107afd44 100644
--- a/public/locales/sp.json
+++ b/public/locales/sp.json
@@ -646,6 +646,14 @@
"event": "Evento",
"organization": "Organización"
},
+ "advertisement": {
+ "title": "Anuncios",
+ "pHeading": "Gestionar anuncios",
+ "activeAds": "Campañas activas",
+ "archievedAds": "Campañas completadas",
+ "pMessage": "No hay anuncios disponibles para esta campaña.",
+ "delete": "Eliminar"
+ },
"userChat": {
"chat": "Charlar",
"search": "Buscar",
diff --git a/public/locales/zh.json b/public/locales/zh.json
index 8de1d7c5d9..92e8c14c83 100644
--- a/public/locales/zh.json
+++ b/public/locales/zh.json
@@ -646,6 +646,14 @@
"event": "事件",
"organization": "組織"
},
+ "advertisement": {
+ "title": "广告",
+ "pHeading": "管理广告",
+ "activeAds": "活动广告",
+ "archievedAds": "已完成的广告活动",
+ "pMessage": "此广告活动没有相关广告。",
+ "delete": "删除"
+ },
"userChat": {
"chat": "聊天",
"search": "搜尋",
diff --git a/schema.graphql b/schema.graphql
new file mode 100644
index 0000000000..d200ee7349
--- /dev/null
+++ b/schema.graphql
@@ -0,0 +1,1152 @@
+directive @auth on FIELD_DEFINITION
+
+directive @role(requires: UserType) on FIELD_DEFINITION
+
+type Advertisement {
+ _id: ID
+ endDate: Date!
+ link: String!
+ name: String!
+ orgId: ID
+ startDate: Date!
+ type: String!
+}
+
+type AggregatePost {
+ count: Int!
+}
+
+type AggregateUser {
+ count: Int!
+}
+
+type AndroidFirebaseOptions {
+ apiKey: String
+ appId: String
+ messagingSenderId: String
+ projectId: String
+ storageBucket: String
+}
+
+type AuthData {
+ accessToken: String!
+ androidFirebaseOptions: AndroidFirebaseOptions!
+ iosFirebaseOptions: IOSFirebaseOptions!
+ refreshToken: String!
+ user: User!
+}
+
+type CheckIn {
+ _id: ID!
+ allotedRoom: String
+ allotedSeat: String
+ event: Event!
+ feedbackSubmitted: Boolean!
+ time: DateTime!
+ user: User!
+}
+
+input CheckInInput {
+ allotedRoom: String
+ allotedSeat: String
+ eventId: ID!
+ userId: ID!
+}
+
+type CheckInStatus {
+ _id: ID!
+ checkIn: CheckIn
+ user: User!
+}
+
+type Comment {
+ _id: ID
+ createdAt: DateTime
+ creator: User!
+ likeCount: Int
+ likedBy: [User]
+ post: Post!
+ text: String!
+}
+
+input CommentInput {
+ text: String!
+}
+
+union ConnectionError = InvalidCursor | MaximumValueError
+
+type ConnectionPageInfo {
+ endCursor: String
+ hasNextPage: Boolean!
+ hasPreviousPage: Boolean!
+ startCursor: String
+}
+
+input CreateUserTagInput {
+ name: String!
+ organizationId: ID!
+ parentTagId: ID
+}
+
+input CursorPaginationInput {
+ cursor: String
+ direction: PaginationDirection!
+ limit: PositiveInt!
+}
+
+scalar Date
+
+scalar DateTime
+
+type DeletePayload {
+ success: Boolean!
+}
+
+type DirectChat {
+ _id: ID!
+ creator: User!
+ messages: [DirectChatMessage]
+ organization: Organization!
+ users: [User!]!
+}
+
+type DirectChatMessage {
+ _id: ID!
+ createdAt: DateTime!
+ directChatMessageBelongsTo: DirectChat!
+ messageContent: String!
+ receiver: User!
+ sender: User!
+}
+
+type Donation {
+ _id: ID!
+ amount: Float!
+ nameOfOrg: String!
+ nameOfUser: String!
+ orgId: ID!
+ payPalId: String!
+ userId: ID!
+}
+
+input DonationWhereInput {
+ id: ID
+ id_contains: ID
+ id_in: [ID!]
+ id_not: ID
+ id_not_in: [ID!]
+ id_starts_with: ID
+ name_of_user: String
+ name_of_user_contains: String
+ name_of_user_in: [String!]
+ name_of_user_not: String
+ name_of_user_not_in: [String!]
+ name_of_user_starts_with: String
+}
+
+scalar EmailAddress
+
+interface Error {
+ message: String!
+}
+
+type Event {
+ _id: ID!
+ admins(adminId: ID): [User]
+ allDay: Boolean!
+ attendees: [User!]!
+ attendeesCheckInStatus: [CheckInStatus!]!
+ averageFeedbackScore: Float
+ creator: User!
+ description: String!
+ endDate: Date!
+ endTime: Time
+ feedback: [Feedback!]!
+ isPublic: Boolean!
+ isRegisterable: Boolean!
+ latitude: Latitude
+ location: String
+ longitude: Longitude
+ organization: Organization
+ projects: [EventProject]
+ recurrance: Recurrance
+ recurring: Boolean!
+ startDate: Date!
+ startTime: Time
+ status: Status!
+ title: String!
+}
+
+input EventAttendeeInput {
+ eventId: ID!
+ userId: ID!
+}
+
+input EventInput {
+ allDay: Boolean!
+ description: String!
+ endDate: Date
+ endTime: Time
+ isPublic: Boolean!
+ isRegisterable: Boolean!
+ latitude: Latitude
+ location: String
+ longitude: Longitude
+ organizationId: ID!
+ recurrance: Recurrance
+ recurring: Boolean!
+ startDate: Date!
+ startTime: Time
+ title: String!
+}
+
+enum EventOrderByInput {
+ allDay_ASC
+ allDay_DESC
+ description_ASC
+ description_DESC
+ endDate_ASC
+ endDate_DESC
+ endTime_ASC
+ endTime_DESC
+ id_ASC
+ id_DESC
+ location_ASC
+ location_DESC
+ recurrance_ASC
+ recurrance_DESC
+ startDate_ASC
+ startDate_DESC
+ startTime_ASC
+ startTime_DESC
+ title_ASC
+ title_DESC
+}
+
+type EventProject {
+ _id: ID!
+ description: String!
+ event: Event!
+ tasks: [Task]
+ title: String!
+}
+
+input EventProjectInput {
+ description: String!
+ eventId: ID!
+ title: String!
+}
+
+input EventWhereInput {
+ description: String
+ description_contains: String
+ description_in: [String!]
+ description_not: String
+ description_not_in: [String!]
+ description_starts_with: String
+ id: ID
+ id_contains: ID
+ id_in: [ID!]
+ id_not: ID
+ id_not_in: [ID!]
+ id_starts_with: ID
+ location: String
+ location_contains: String
+ location_in: [String!]
+ location_not: String
+ location_not_in: [String!]
+ location_starts_with: String
+ organization_id: ID
+ title: String
+ title_contains: String
+ title_in: [String!]
+ title_not: String
+ title_not_in: [String!]
+ title_starts_with: String
+}
+
+type ExtendSession {
+ accessToken: String!
+ refreshToken: String!
+}
+
+type Feedback {
+ _id: ID!
+ event: Event!
+ rating: Int!
+ review: String
+}
+
+input FeedbackInput {
+ eventId: ID!
+ rating: Int!
+ review: String
+}
+
+interface FieldError {
+ message: String!
+ path: [String!]!
+}
+
+input ForgotPasswordData {
+ newPassword: String!
+ otpToken: String!
+ userOtp: String!
+}
+
+type Group {
+ _id: ID
+ admins: [User]
+ createdAt: DateTime
+ description: String
+ organization: Organization!
+ title: String
+}
+
+type GroupChat {
+ _id: ID!
+ creator: User!
+ messages: [GroupChatMessage]
+ organization: Organization!
+ users: [User!]!
+}
+
+type GroupChatMessage {
+ _id: ID!
+ createdAt: DateTime!
+ groupChatMessageBelongsTo: GroupChat!
+ messageContent: String!
+ sender: User!
+}
+
+type IOSFirebaseOptions {
+ apiKey: String
+ appId: String
+ iosBundleId: String
+ iosClientId: String
+ messagingSenderId: String
+ projectId: String
+ storageBucket: String
+}
+
+type InvalidCursor implements FieldError {
+ message: String!
+ path: [String!]!
+}
+
+type Language {
+ _id: ID!
+ createdAt: String!
+ en: String!
+ translation: [LanguageModel]
+}
+
+input LanguageInput {
+ en_value: String!
+ translation_lang_code: String!
+ translation_value: String!
+}
+
+type LanguageModel {
+ _id: ID!
+ createdAt: DateTime!
+ lang_code: String!
+ value: String!
+ verified: Boolean!
+}
+
+scalar Latitude
+
+input LoginInput {
+ email: EmailAddress!
+ password: String!
+}
+
+scalar Longitude
+
+type MaximumLengthError implements FieldError {
+ message: String!
+ path: [String!]!
+}
+
+type MaximumValueError implements FieldError {
+ limit: Int!
+ message: String!
+ path: [String!]!
+}
+
+type MembershipRequest {
+ _id: ID!
+ organization: Organization!
+ user: User!
+}
+
+type Message {
+ _id: ID!
+ createdAt: DateTime
+ creator: User
+ imageUrl: URL
+ text: String
+ videoUrl: URL
+}
+
+type MessageChat {
+ _id: ID!
+ createdAt: DateTime!
+ languageBarrier: Boolean
+ message: String!
+ receiver: User!
+ sender: User!
+}
+
+input MessageChatInput {
+ message: String!
+ receiver: ID!
+}
+
+type MinimumLengthError implements FieldError {
+ limit: Int!
+ message: String!
+ path: [String!]!
+}
+
+type MinimumValueError implements FieldError {
+ message: String!
+ path: [String!]!
+}
+
+type Mutation {
+ acceptAdmin(id: ID!): Boolean!
+ acceptMembershipRequest(membershipRequestId: ID!): MembershipRequest!
+ addEventAttendee(data: EventAttendeeInput!): User!
+ addFeedback(data: FeedbackInput!): Feedback!
+ addLanguageTranslation(data: LanguageInput!): Language!
+ addOrganizationImage(file: String!, organizationId: String!): Organization!
+ addUserImage(file: String!): User!
+ addUserToGroupChat(chatId: ID!, userId: ID!): GroupChat!
+ adminRemoveEvent(eventId: ID!): Event!
+ adminRemoveGroup(groupId: ID!): GroupChat!
+ assignUserTag(input: ToggleUserTagAssignInput!): User
+ blockPluginCreationBySuperadmin(blockUser: Boolean!, userId: ID!): User!
+ blockUser(organizationId: ID!, userId: ID!): User!
+ cancelMembershipRequest(membershipRequestId: ID!): MembershipRequest!
+ checkIn(data: CheckInInput!): CheckIn!
+ createAdmin(data: UserAndOrganizationInput!): User!
+ createAdvertisement(
+ endDate: Date!
+ link: String!
+ name: String!
+ orgId: ID!
+ startDate: Date!
+ type: String!
+ ): Advertisement!
+ createComment(data: CommentInput!, postId: ID!): Comment
+ createDirectChat(data: createChatInput!): DirectChat!
+ createDonation(
+ amount: Float!
+ nameOfOrg: String!
+ nameOfUser: String!
+ orgId: ID!
+ payPalId: ID!
+ userId: ID!
+ ): Donation!
+ createEvent(data: EventInput): Event!
+ createEventProject(data: EventProjectInput!): EventProject!
+ createGroupChat(data: createGroupChatInput!): GroupChat!
+ createMember(input: UserAndOrganizationInput!): Organization!
+ createMessageChat(data: MessageChatInput!): MessageChat!
+ createOrganization(data: OrganizationInput, file: String): Organization!
+ createPlugin(
+ pluginCreatedBy: String!
+ pluginDesc: String!
+ pluginName: String!
+ uninstalledOrgs: [ID!]
+ ): Plugin!
+ createPost(data: PostInput!, file: String): Post
+ createTask(data: TaskInput!, eventProjectId: ID!): Task!
+ createUserTag(input: CreateUserTagInput!): UserTag
+ deleteAdvertisementById(id: ID!): DeletePayload!
+ deleteDonationById(id: ID!): DeletePayload!
+ forgotPassword(data: ForgotPasswordData!): Boolean!
+ joinPublicOrganization(organizationId: ID!): User!
+ leaveOrganization(organizationId: ID!): User!
+ likeComment(id: ID!): Comment
+ likePost(id: ID!): Post
+ login(data: LoginInput!): AuthData!
+ logout: Boolean!
+ otp(data: OTPInput!): OtpData!
+ recaptcha(data: RecaptchaVerification!): Boolean!
+ refreshToken(refreshToken: String!): ExtendSession!
+ registerForEvent(id: ID!): Event!
+ rejectAdmin(id: ID!): Boolean!
+ rejectMembershipRequest(membershipRequestId: ID!): MembershipRequest!
+ removeAdmin(data: UserAndOrganizationInput!): User!
+ removeAdvertisement(id: ID!): Advertisement
+ removeComment(id: ID!): Comment
+ removeDirectChat(chatId: ID!, organizationId: ID!): DirectChat!
+ removeEvent(id: ID!): Event!
+ removeEventAttendee(data: EventAttendeeInput!): User!
+ removeEventProject(id: ID!): EventProject!
+ removeGroupChat(chatId: ID!): GroupChat!
+ removeMember(data: UserAndOrganizationInput!): Organization!
+ removeOrganization(id: ID!): User!
+ removeOrganizationImage(organizationId: String!): Organization!
+ removePost(id: ID!): Post
+ removeTask(id: ID!): Task
+ removeUserFromGroupChat(chatId: ID!, userId: ID!): GroupChat!
+ removeUserImage: User!
+ removeUserTag(id: ID!): UserTag
+ revokeRefreshTokenForUser(userId: String!): Boolean!
+ saveFcmToken(token: String): Boolean!
+ sendMembershipRequest(organizationId: ID!): MembershipRequest!
+ sendMessageToDirectChat(
+ chatId: ID!
+ messageContent: String!
+ ): DirectChatMessage!
+ sendMessageToGroupChat(
+ chatId: ID!
+ messageContent: String!
+ ): GroupChatMessage!
+ setTaskVolunteers(id: ID!, volunteers: [ID]!): Task
+ signUp(data: UserInput!, file: String): AuthData!
+ togglePostPin(id: ID!): Post!
+ unassignUserTag(input: ToggleUserTagAssignInput!): User
+ unblockUser(organizationId: ID!, userId: ID!): User!
+ unlikeComment(id: ID!): Comment
+ unlikePost(id: ID!): Post
+ unregisterForEventByUser(id: ID!): Event!
+ updateEvent(data: UpdateEventInput, id: ID!): Event!
+ updateEventProject(data: UpdateEventProjectInput!, id: ID!): EventProject!
+ updateLanguage(languageCode: String!): User!
+ updateOrganization(
+ data: UpdateOrganizationInput
+ file: String
+ id: ID!
+ ): Organization!
+ updatePluginStatus(id: ID!, orgId: ID!): Plugin!
+ updatePost(data: PostUpdateInput, id: ID!): Post!
+ updateTask(data: UpdateTaskInput!, id: ID!): Task
+ updateUserPassword(data: UpdateUserPasswordInput!): User!
+ updateUserProfile(data: UpdateUserInput, file: String): User!
+ updateUserTag(input: UpdateUserTagInput!): UserTag
+ updateUserType(data: UpdateUserTypeInput!): Boolean!
+}
+
+input OTPInput {
+ email: EmailAddress!
+}
+
+type Organization {
+ _id: ID!
+ admins(adminId: ID): [User]
+ apiUrl: URL!
+ blockedUsers: [User]
+ createdAt: DateTime
+ creator: User!
+ description: String!
+ image: String
+ isPublic: Boolean!
+ location: String
+ members: [User]
+ membershipRequests: [MembershipRequest]
+ name: String!
+ pinnedPosts: [Post]
+ userTags(
+ after: String
+ before: String
+ first: PositiveInt
+ last: PositiveInt
+ ): UserTagsConnection
+ visibleInSearch: Boolean!
+}
+
+type OrganizationInfoNode {
+ _id: ID!
+ apiUrl: URL!
+ creator: User!
+ description: String!
+ image: String
+ isPublic: Boolean!
+ name: String!
+ visibleInSearch: Boolean!
+}
+
+input OrganizationInput {
+ apiUrl: URL
+ attendees: String
+ description: String!
+ image: String
+ isPublic: Boolean!
+ location: String
+ name: String!
+ visibleInSearch: Boolean!
+}
+
+enum OrganizationOrderByInput {
+ apiUrl_ASC
+ apiUrl_DESC
+ description_ASC
+ description_DESC
+ id_ASC
+ id_DESC
+ name_ASC
+ name_DESC
+}
+
+input OrganizationWhereInput {
+ apiUrl: URL
+ apiUrl_contains: URL
+ apiUrl_in: [URL!]
+ apiUrl_not: URL
+ apiUrl_not_in: [URL!]
+ apiUrl_starts_with: URL
+ description: String
+ description_contains: String
+ description_in: [String!]
+ description_not: String
+ description_not_in: [String!]
+ description_starts_with: String
+ id: ID
+ id_contains: ID
+ id_in: [ID!]
+ id_not: ID
+ id_not_in: [ID!]
+ id_starts_with: ID
+ isPublic: Boolean
+ name: String
+ name_contains: String
+ name_in: [String!]
+ name_not: String
+ name_not_in: [String!]
+ name_starts_with: String
+ visibleInSearch: Boolean
+}
+
+type OtpData {
+ otpToken: String!
+}
+
+"""
+Information about pagination in a connection.
+"""
+type PageInfo {
+ currPageNo: Int
+
+ """
+ When paginating forwards, are there more items?
+ """
+ hasNextPage: Boolean!
+
+ """
+ When paginating backwards, are there more items?
+ """
+ hasPreviousPage: Boolean!
+ nextPageNo: Int
+ prevPageNo: Int
+ totalPages: Int
+}
+
+enum PaginationDirection {
+ BACKWARD
+ FORWARD
+}
+
+scalar PhoneNumber
+
+type Plugin {
+ _id: ID!
+ pluginCreatedBy: String!
+ pluginDesc: String!
+ pluginName: String!
+ uninstalledOrgs: [ID!]!
+}
+
+type PluginField {
+ createdAt: DateTime
+ key: String!
+ status: Status!
+ value: String!
+}
+
+input PluginFieldInput {
+ key: String!
+ value: String!
+}
+
+input PluginInput {
+ fields: [PluginFieldInput]
+ orgId: ID!
+ pluginKey: String
+ pluginName: String!
+ pluginType: Type
+}
+
+scalar PositiveInt
+
+type Post {
+ _id: ID
+ commentCount: Int
+ comments: [Comment]
+ createdAt: DateTime
+ creator: User!
+ imageUrl: URL
+ likeCount: Int
+ likedBy: [User]
+ organization: Organization!
+ pinned: Boolean
+ text: String!
+ title: String
+ videoUrl: URL
+}
+
+"""
+A connection to a list of items.
+"""
+type PostConnection {
+ aggregate: AggregatePost!
+
+ """
+ A list of edges.
+ """
+ edges: [Post]!
+
+ """
+ Information to aid in pagination.
+ """
+ pageInfo: PageInfo!
+}
+
+input PostInput {
+ _id: ID
+ imageUrl: URL
+ organizationId: ID!
+ pinned: Boolean
+ text: String!
+ title: String
+ videoUrl: URL
+}
+
+enum PostOrderByInput {
+ commentCount_ASC
+ commentCount_DESC
+ createdAt_ASC
+ createdAt_DESC
+ id_ASC
+ id_DESC
+ imageUrl_ASC
+ imageUrl_DESC
+ likeCount_ASC
+ likeCount_DESC
+ text_ASC
+ text_DESC
+ title_ASC
+ title_DESC
+ videoUrl_ASC
+ videoUrl_DESC
+}
+
+input PostUpdateInput {
+ imageUrl: String
+ text: String
+ title: String
+ videoUrl: String
+}
+
+input PostWhereInput {
+ id: ID
+ id_contains: ID
+ id_in: [ID!]
+ id_not: ID
+ id_not_in: [ID!]
+ id_starts_with: ID
+ text: String
+ text_contains: String
+ text_in: [String!]
+ text_not: String
+ text_not_in: [String!]
+ text_starts_with: String
+ title: String
+ title_contains: String
+ title_in: [String!]
+ title_not: String
+ title_not_in: [String!]
+ title_starts_with: String
+}
+
+type Query {
+ adminPlugin(orgId: ID!): [Plugin]
+ checkAuth: User!
+ directChatsByUserID(id: ID!): [DirectChat]
+ directChatsMessagesByChatID(id: ID!): [DirectChatMessage]
+ event(id: ID!): Event
+ eventsByOrganization(id: ID, orderBy: EventOrderByInput): [Event]
+ eventsByOrganizationConnection(
+ first: Int
+ orderBy: EventOrderByInput
+ skip: Int
+ where: EventWhereInput
+ ): [Event!]!
+ getAdvertisements: [Advertisement]
+ getDonationById(id: ID!): Donation!
+ getDonationByOrgId(orgId: ID!): [Donation]
+ getDonationByOrgIdConnection(
+ first: Int
+ orgId: ID!
+ skip: Int
+ where: DonationWhereInput
+ ): [Donation!]!
+ getPlugins: [Plugin]
+ getlanguage(lang_code: String!): [Translation]
+ hasSubmittedFeedback(eventId: ID!, userId: ID!): Boolean
+ joinedOrganizations(id: ID): [Organization]
+ me: User!
+ myLanguage: String
+ organizations(id: ID, orderBy: OrganizationOrderByInput): [Organization]
+ organizationsConnection(
+ first: Int
+ orderBy: OrganizationOrderByInput
+ skip: Int
+ where: OrganizationWhereInput
+ ): [Organization]!
+ organizationsMemberConnection(
+ first: Int
+ orderBy: UserOrderByInput
+ orgId: ID!
+ skip: Int
+ where: UserWhereInput
+ ): UserConnection!
+ plugin(orgId: ID!): [Plugin]
+ post(id: ID!): Post
+ postsByOrganization(id: ID!, orderBy: PostOrderByInput): [Post]
+ postsByOrganizationConnection(
+ first: Int
+ id: ID!
+ orderBy: PostOrderByInput
+ skip: Int
+ where: PostWhereInput
+ ): PostConnection
+ registeredEventsByUser(id: ID, orderBy: EventOrderByInput): [Event]
+ registrantsByEvent(id: ID!): [User]
+ user(id: ID!): User!
+ userLanguage(userId: ID!): String
+ users(orderBy: UserOrderByInput, where: UserWhereInput): [User]
+ usersConnection(
+ first: Int
+ orderBy: UserOrderByInput
+ skip: Int
+ where: UserWhereInput
+ ): [User]!
+}
+
+input RecaptchaVerification {
+ recaptchaToken: String!
+}
+
+enum Recurrance {
+ DAILY
+ MONTHLY
+ ONCE
+ WEEKLY
+ YEARLY
+}
+
+enum Status {
+ ACTIVE
+ BLOCKED
+ DELETED
+}
+
+type Subscription {
+ directMessageChat: MessageChat
+ messageSentToDirectChat: DirectChatMessage
+ messageSentToGroupChat: GroupChatMessage
+ onPluginUpdate: Plugin
+}
+
+type Task {
+ _id: ID!
+ completed: Boolean
+ createdAt: DateTime!
+ creator: User!
+ deadline: DateTime
+ description: String
+ event: Event!
+ title: String!
+ volunteers: [User]
+}
+
+input TaskInput {
+ deadline: DateTime!
+ description: String!
+ title: String!
+}
+
+enum TaskOrderByInput {
+ createdAt_ASC
+ createdAt_DESC
+ deadline_ASC
+ deadline_DESC
+ description_ASC
+ description_DESC
+ id_ASC
+ id_DESC
+ title_ASC
+ title_DESC
+}
+
+scalar Time
+
+input ToggleUserTagAssignInput {
+ tagId: ID!
+ userId: ID!
+}
+
+type Translation {
+ en_value: String
+ lang_code: String
+ translation: String
+ verified: Boolean
+}
+
+enum Type {
+ PRIVATE
+ UNIVERSAL
+}
+
+scalar URL
+
+type UnauthenticatedError implements Error {
+ message: String!
+}
+
+type UnauthorizedError implements Error {
+ message: String!
+}
+
+input UpdateEventInput {
+ allDay: Boolean
+ description: String
+ endDate: Date
+ endTime: Time
+ isPublic: Boolean
+ isRegisterable: Boolean
+ latitude: Latitude
+ location: String
+ longitude: Longitude
+ recurrance: Recurrance
+ recurring: Boolean
+ startDate: Date
+ startTime: Time
+ title: String
+}
+
+input UpdateEventProjectInput {
+ description: String
+ title: String
+}
+
+input UpdateOrganizationInput {
+ description: String
+ isPublic: Boolean
+ location: String
+ name: String
+ visibleInSearch: Boolean
+}
+
+input UpdateTaskInput {
+ completed: Boolean
+ deadline: DateTime
+ description: String
+ title: String
+}
+
+input UpdateUserInput {
+ email: EmailAddress
+ firstName: String
+ lastName: String
+}
+
+input UpdateUserPasswordInput {
+ confirmNewPassword: String!
+ newPassword: String!
+ previousPassword: String!
+}
+
+input UpdateUserTagInput {
+ _id: ID!
+ name: String!
+}
+
+input UpdateUserTypeInput {
+ id: ID
+ userType: String
+}
+
+scalar Upload
+
+type User {
+ _id: ID!
+ adminApproved: Boolean
+ adminFor: [Organization]
+ appLanguageCode: String!
+ assignedTasks: [Task]
+ createdAt: DateTime
+ createdEvents: [Event]
+ createdOrganizations: [Organization]
+ email: EmailAddress!
+ eventAdmin: [Event]
+ firstName: String!
+ image: String
+ joinedOrganizations: [Organization]
+ lastName: String!
+ membershipRequests: [MembershipRequest]
+ organizationUserBelongsTo: Organization
+ organizationsBlockedBy: [Organization]
+ pluginCreationAllowed: Boolean
+ registeredEvents: [Event]
+ tagsAssignedWith(
+ after: String
+ before: String
+ first: PositiveInt
+ last: PositiveInt
+ organizationId: ID
+ ): UserTagsConnection
+ tokenVersion: Int!
+ userType: String
+}
+
+input UserAndOrganizationInput {
+ organizationId: ID!
+ userId: ID!
+}
+
+type UserConnection {
+ aggregate: AggregateUser!
+ edges: [User]!
+ pageInfo: PageInfo!
+}
+
+type UserEdge {
+ cursor: String!
+ node: User!
+}
+
+input UserInput {
+ appLanguageCode: String
+ email: EmailAddress!
+ firstName: String!
+ lastName: String!
+ organizationUserBelongsToId: ID
+ password: String!
+}
+
+enum UserOrderByInput {
+ appLanguageCode_ASC
+ appLanguageCode_DESC
+ email_ASC
+ email_DESC
+ firstName_ASC
+ firstName_DESC
+ id_ASC
+ id_DESC
+ lastName_ASC
+ lastName_DESC
+}
+
+type UserTag {
+ _id: ID!
+ childTags(input: UserTagsConnectionInput!): UserTagsConnectionResult!
+ name: String!
+ organization: Organization
+ parentTag: UserTag
+ usersAssignedTo(input: UsersConnectionInput!): UsersConnectionResult!
+}
+
+type UserTagEdge {
+ cursor: String!
+ node: UserTag!
+}
+
+type UserTagsConnection {
+ edges: [UserTagEdge!]!
+ pageInfo: ConnectionPageInfo!
+}
+
+input UserTagsConnectionInput {
+ cursor: String
+ direction: PaginationDirection!
+ limit: PositiveInt!
+}
+
+type UserTagsConnectionResult {
+ data: UserTagsConnection
+ errors: [ConnectionError!]!
+}
+
+enum UserType {
+ ADMIN
+ SUPERADMIN
+ USER
+}
+
+input UserWhereInput {
+ admin_for: ID
+ appLanguageCode: String
+ appLanguageCode_contains: String
+ appLanguageCode_in: [String!]
+ appLanguageCode_not: String
+ appLanguageCode_not_in: [String!]
+ appLanguageCode_starts_with: String
+ email: EmailAddress
+ email_contains: EmailAddress
+ email_in: [EmailAddress!]
+ email_not: EmailAddress
+ email_not_in: [EmailAddress!]
+ email_starts_with: EmailAddress
+ event_title_contains: String
+ firstName: String
+ firstName_contains: String
+ firstName_in: [String!]
+ firstName_not: String
+ firstName_not_in: [String!]
+ firstName_starts_with: String
+ id: ID
+ id_contains: ID
+ id_in: [ID!]
+ id_not: ID
+ id_not_in: [ID!]
+ id_starts_with: ID
+ lastName: String
+ lastName_contains: String
+ lastName_in: [String!]
+ lastName_not: String
+ lastName_not_in: [String!]
+ lastName_starts_with: String
+}
+
+type UsersConnection {
+ edges: [UserEdge!]!
+ pageInfo: ConnectionPageInfo!
+}
+
+input UsersConnectionInput {
+ cursor: String
+ direction: PaginationDirection!
+ limit: PositiveInt!
+}
+
+type UsersConnectionResult {
+ data: UsersConnection
+ errors: [ConnectionError!]!
+}
+
+input createChatInput {
+ organizationId: ID!
+ userIds: [ID!]!
+}
+
+input createGroupChatInput {
+ organizationId: ID!
+ title: String!
+ userIds: [ID!]!
+}
diff --git a/src/App.tsx b/src/App.tsx
index cf20c722e5..1c69256c32 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -32,6 +32,7 @@ import Settings from 'screens/UserPortal/Settings/Settings';
import Donate from 'screens/UserPortal/Donate/Donate';
import Events from 'screens/UserPortal/Events/Events';
import Tasks from 'screens/UserPortal/Tasks/Tasks';
+import Advertisements from 'components/Advertisements/Advertisements';
import Chat from 'screens/UserPortal/Chat/Chat';
function app(): JSX.Element {
@@ -109,6 +110,7 @@ function app(): JSX.Element {
{t('pHeading')}
+ +