keepyourmouthshut/Admin Dashboard/src/index.js

146 lines
4.0 KiB
JavaScript

/* eslint-disable camelcase */
import React from 'react'
import ReactDOM from 'react-dom'
import { ApolloClient } from 'apollo-client'
import { ApolloProvider } from 'react-apollo'
import gql from 'graphql-tag'
import { getMainDefinition } from 'apollo-utilities'
import { ApolloLink, split, concat, Observable } from 'apollo-link'
import { createHttpLink } from 'apollo-link-http'
import { WebSocketLink } from 'apollo-link-ws'
import { InMemoryCache } from 'apollo-cache-inmemory'
import * as firebase from 'firebase/app'
import 'firebase/messaging'
import 'assets/vendor/nucleo/css/nucleo.css'
import 'assets/vendor/@fortawesome/fontawesome-free/css/all.min.css'
import 'assets/scss/argon-dashboard-react.scss'
import { getOrders, uploadToken } from '../src/apollo/server'
import { ws_server_url, server_url } from './config/config'
import App from './app'
const GET_ORDERS = gql`
${getOrders}
`
const UPLOAD_TOKEN = gql`
${uploadToken}
`
const firebaseConfig = {
apiKey: 'AIzaSyDCnSTWqbN7NWg9oVDzWz5dvhw2dX-RTb0',
authDomain: 'foodapp-77e88.firebaseapp.com',
databaseURL: 'https://foodapp-77e88.firebaseio.com',
projectId: 'foodapp-77e88',
storageBucket: 'foodapp-77e88.appspot.com',
messagingSenderId: '678143951107',
appId: '1:678143951107:web:498eca9a1eca6c0b'
}
const cache = new InMemoryCache()
const httpLink = createHttpLink({
uri: `${server_url}graphql`
})
const wsLink = new WebSocketLink({
uri: `${ws_server_url}graphql`,
options: {
reconnect: true
}
})
const request = async operation => {
const data = localStorage.getItem('user-enatega')
let token = null
if (data) {
token = JSON.parse(data).token
}
operation.setContext({
headers: {
authorization: token ? `Bearer ${token}` : ''
}
})
}
const requestLink = new ApolloLink(
(operation, forward) =>
new Observable(observer => {
console.log(observer)
let handle
Promise.resolve(operation)
.then(oper => request(oper))
.then(() => {
handle = forward(operation).subscribe({
next: observer.next.bind(observer),
error: observer.error.bind(observer),
complete: observer.complete.bind(observer)
})
})
.catch(observer.error.bind(observer))
return () => {
if (handle) handle.unsubscribe()
}
})
)
const terminatingLink = split(
({ query }) => {
const { kind, operation } = getMainDefinition(query)
return kind === 'OperationDefinition' && operation === 'subscription'
},
wsLink
// httpLink,
)
const client = new ApolloClient({
link: concat(ApolloLink.from([terminatingLink, requestLink]), httpLink),
cache
})
// // Initialize Firebase
firebase.initializeApp(firebaseConfig)
const messaging = firebase.messaging()
messaging.usePublicVapidKey(
'BBFzJyX1yDzhRcnK07MEBYKqI5muEFTwnxPwg94IdPTAbFi1KstIQVeyuvWAo3-5LH_oBsfivWns53iMXEuS6Lg'
)
messaging
.requestPermission()
.then(function() {
messaging
.getToken()
.then(function(currentToken) {
if (currentToken) {
client
.mutate({
mutation: UPLOAD_TOKEN,
variables: { pushToken: currentToken }
})
.then(() => {})
.catch(() => {})
} else {
}
})
.catch(function() {})
})
.catch(function() {})
messaging.onMessage(function(payload) {
var notificationTitle = 'New Order on Enatega'
var notificationOptions = {
body: payload.data.orderid,
icon: 'https://www.enatega.com/assets/images/logo.png'
}
const nt = new Notification(notificationTitle, notificationOptions)
nt.onclick = function(event) {
event.preventDefault() // prevent the browser from focusing the Notification's tab
window.open('https://enatega.com/dashboard')
nt.close()
}
// console.log('Message received. ', payload);
client.query({ query: GET_ORDERS, fetchPolicy: 'network-only' })
})
ReactDOM.render(
<ApolloProvider client={client}>
<App />
</ApolloProvider>,
document.getElementById('root')
)