diff --git a/App.js b/App.js
index c9bc9f9..edce35a 100644
--- a/App.js
+++ b/App.js
@@ -8,7 +8,8 @@ import { PersistGate } from "redux-persist/integration/react";
import ScreenMainComponent from "./components/screen-main/screen-main.component";
import { persistor, store } from "./redux/store";
import "./translations/i18n";
-
+import { client } from "./graphql/client";
+import { ApolloProvider } from "@apollo/client";
export default class App extends React.Component {
constructor(props) {
super(props);
@@ -34,7 +35,9 @@ export default class App extends React.Component {
return (
-
+
+
+
);
diff --git a/app.json b/app.json
index 71c1336..a04af49 100644
--- a/app.json
+++ b/app.json
@@ -3,8 +3,8 @@
"name": "imexmobile",
"slug": "imexmobile",
"version": "1.0.0",
- "orientation": "both",
- "icon": "./assets/icon240.png",
+ "orientation": "portrait",
+ "icon": "./assets/logo240.png",
"splash": {
"image": "./assets/logo1024.png",
"resizeMode": "contain",
diff --git a/components/screen-job-list/screen-job-list.component.jsx b/components/screen-job-list/screen-job-list.component.jsx
index 5f9b678..8362852 100644
--- a/components/screen-job-list/screen-job-list.component.jsx
+++ b/components/screen-job-list/screen-job-list.component.jsx
@@ -1,8 +1,14 @@
import React from "react";
-import { View, Text } from "react-native";
+import { View, Text, Button } from "react-native";
import { useTranslation } from "react-i18next";
+import { useQuery, useLazyQuery, useSubscription } from "@apollo/client";
+import { QUERY_BODYSHOP } from "../../graphql/bodyshop.queries.js";
export default function ScreenJobList({ navigation }) {
const { t } = useTranslation();
+ const { loading, error, data } = useSubscription(QUERY_BODYSHOP);
+ console.log("ScreenJobList -> error", error);
+ console.log("ScreenJobList -> loading", loading);
+ console.log("BodyshopData", data);
return (
This is the Job List.
diff --git a/components/screen-main/screen-main.component.jsx b/components/screen-main/screen-main.component.jsx
index d38d125..0319400 100644
--- a/components/screen-main/screen-main.component.jsx
+++ b/components/screen-main/screen-main.component.jsx
@@ -3,12 +3,16 @@ import { NavigationContainer } from "@react-navigation/native";
import { createStackNavigator } from "@react-navigation/stack";
import { createDrawerNavigator } from "@react-navigation/drawer";
import i18n from "i18next";
-import React from "react";
+import React, { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { StatusBar as rnStatusBar, StyleSheet } from "react-native";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
-import { emailSignInStart, signOutStart } from "../../redux/user/user.actions";
+import {
+ emailSignInStart,
+ signOutStart,
+ checkUserSession,
+} from "../../redux/user/user.actions";
import {
selectBodyshop,
selectCurrentUser,
@@ -19,6 +23,8 @@ import ScreenMessagingConversation from "../screen-messaging-conversation/screen
import ScreenMessagingList from "../screen-messaging-list/screen-messaging-list.component";
import ScreenSignIn from "../screen-sign-in/screen-sign-in.component";
import ScreenSettingsComponent from "../screen-settings/screen-settings.component";
+import ScreenSplash from "../screen-splash/screen-splash.component";
+
const JobStack = createStackNavigator();
const MessagingStack = createStackNavigator();
const BottomTabs = createBottomTabNavigator();
@@ -30,6 +36,7 @@ const mapStateToProps = createStructuredSelector({
});
const mapDispatchToProps = (dispatch) => ({
+ checkUserSession: () => dispatch(checkUserSession()),
emailSignInStart: (email, password) =>
dispatch(emailSignInStart({ email, password })),
signOutStart: () => dispatch(signOutStart()),
@@ -89,11 +96,22 @@ const DrawerNavigator = () => (
);
-export function ScreenMainComponent({ currentUser }) {
+export function ScreenMainComponent({ checkUserSession, currentUser }) {
+ useEffect(() => {
+ checkUserSession();
+ }, [checkUserSession]);
+
const { t } = useTranslation();
+
return (
- {currentUser.authorized ? : }
+ {currentUser.authorized === null ? (
+
+ ) : currentUser.authorized ? (
+
+ ) : (
+
+ )}
);
}
diff --git a/components/screen-sign-in/screen-sign-in.component.jsx b/components/screen-sign-in/screen-sign-in.component.jsx
index ed6ecd6..797e802 100644
--- a/components/screen-sign-in/screen-sign-in.component.jsx
+++ b/components/screen-sign-in/screen-sign-in.component.jsx
@@ -3,31 +3,28 @@ import {
Button,
Container,
Content,
- Form,
+ H1,
Input,
Item,
- H1,
Label,
Text,
} from "native-base";
import React from "react";
import { useTranslation } from "react-i18next";
-import { StyleSheet, View, ActivityIndicator, Image } from "react-native";
+import { ActivityIndicator, Image, StyleSheet, View } from "react-native";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
+import Logo from "../../assets/logo240.png";
import { emailSignInStart } from "../../redux/user/user.actions";
import {
selectCurrentUser,
- selectSignInError,
selectSigningIn,
} from "../../redux/user/user.selectors";
import SignInErrorAlertComponent from "../sign-in-error-alert/sign-in-error-alert.component";
import styles from "../styles";
-import Logo from "../../assets/logo240.png";
const mapStateToProps = createStructuredSelector({
currentUser: selectCurrentUser,
- signInError: selectSignInError,
signingIn: selectSigningIn,
});
@@ -36,7 +33,7 @@ const mapDispatchToProps = (dispatch) => ({
dispatch(emailSignInStart({ email, password })),
});
-export function SignIn({ emailSignInStart, signInError, signingIn }) {
+export function SignIn({ emailSignInStart, signingIn }) {
const { t } = useTranslation();
const formSubmit = (values) => {
diff --git a/components/screen-splash/screen-splash.component.jsx b/components/screen-splash/screen-splash.component.jsx
new file mode 100644
index 0000000..5ede3a3
--- /dev/null
+++ b/components/screen-splash/screen-splash.component.jsx
@@ -0,0 +1,32 @@
+import React from "react";
+import { StyleSheet, Image } from "react-native";
+import Logo from "../../assets/logo240.png";
+import { useTranslation } from "react-i18next";
+import { H1, Container, Content } from "native-base";
+import styles from "../styles";
+
+export default function ScreenSplash() {
+ const { t } = useTranslation();
+ return (
+
+
+
+ {t("app.title")}
+
+
+ );
+}
+const localStyles = StyleSheet.create({
+ middleAlign: {
+ alignItems: "center",
+ },
+ content: {
+ paddingBottom: 150,
+ },
+ logo: { width: 100, height: 100, margin: 20 },
+});
diff --git a/graphql/bodyshop.queries.js b/graphql/bodyshop.queries.js
new file mode 100644
index 0000000..1e8fc37
--- /dev/null
+++ b/graphql/bodyshop.queries.js
@@ -0,0 +1,73 @@
+import gql from "graphql-tag";
+
+export const QUERY_BODYSHOP = gql`
+ subscription QUERY_BODYSHOP {
+ bodyshops(where: { associations: { active: { _eq: true } } }) {
+ associations {
+ authlevel
+ useremail
+ user {
+ authid
+ email
+ dashboardlayout
+ employee {
+ id
+ }
+ }
+ }
+ address1
+ address2
+ city
+ country
+ created_at
+ email
+ federal_tax_id
+ id
+ insurance_vendor_id
+ logo_img_path
+ md_ro_statuses
+ md_order_statuses
+ shopname
+ state
+ state_tax_id
+ updated_at
+ zip_post
+ shoprates
+ region_config
+ md_responsibility_centers
+ messagingservicesid
+ template_header
+ textid
+ production_config
+ invoice_tax_rates
+ inhousevendorid
+ accountingconfig
+ appt_length
+ stripe_acct_id
+ ssbuckets
+ scoreboard_target
+ md_referral_sources
+ md_messaging_presets
+ intakechecklist
+ speedprint
+ md_parts_locations
+ md_notes_presets
+ md_rbac
+ employees {
+ id
+ first_name
+ last_name
+ employee_number
+ cost_center
+ }
+ }
+ }
+`;
+
+export const QUERY_SHOP_ID = gql`
+ query QUERY_SHOP_ID {
+ bodyshops(where: { associations: { active: { _eq: true } } }) {
+ id
+ }
+ }
+`;
diff --git a/graphql/client.js b/graphql/client.js
new file mode 100644
index 0000000..d5ba050
--- /dev/null
+++ b/graphql/client.js
@@ -0,0 +1,138 @@
+//GQL Imports
+import {
+ ApolloClient,
+ InMemoryCache,
+ split,
+ ApolloLink,
+ HttpLink,
+ from,
+} from "@apollo/client";
+import { setContext } from "@apollo/client/link/context";
+import apolloLogger from "apollo-link-logger";
+import { RetryLink } from "@apollo/client/link/retry";
+import { WebSocketLink } from "@apollo/client/link/ws";
+import { SubscriptionClient } from "subscriptions-transport-ws";
+import { auth } from "../firebase/firebase.utils";
+import { onError } from "@apollo/client/link/error";
+import { getMainDefinition } from "@apollo/client/utilities";
+
+const httpLink = new HttpLink({
+ uri: "https://bodyshop-dev-db.herokuapp.com/v1/graphql",
+});
+
+const wsLink = new WebSocketLink({
+ uri: "wss://bodyshop-dev-db.herokuapp.com/v1/graphql",
+ options: {
+ lazy: true,
+ reconnect: true,
+ connectionParams: async () => {
+ const token =
+ auth.currentUser && (await auth.currentUser.getIdToken(true));
+ if (token) {
+ return {
+ headers: {
+ authorization: token ? `Bearer ${token}` : "",
+ },
+ };
+ }
+ },
+ },
+});
+
+//https://stackoverflow.com/questions/57163454/refreshing-a-token-with-apollo-client-firebase-auth
+
+const errorLink = onError(
+ ({ graphQLErrors, networkError, operation, forward }) => {
+ console.log(graphQLErrors);
+ if (graphQLErrors)
+ graphQLErrors.forEach(({ message, locations, path }) =>
+ console.log(
+ `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`
+ )
+ );
+ if (networkError)
+ console.log(`[Network error]: ${JSON.stringify(networkError)}`);
+ console.log(operation.getContext());
+ }
+);
+
+const subscriptionMiddleware = {
+ applyMiddleware: async (options, next) => {
+ options.authToken =
+ auth.currentUser && (await auth.currentUser.getIdToken(true));
+ next();
+ },
+};
+wsLink.subscriptionClient.use([subscriptionMiddleware]);
+
+const link = split(
+ // split based on operation type
+ ({ query }) => {
+ const definition = getMainDefinition(query);
+ // console.log(
+ // "##Intercepted GQL Transaction : " +
+ // definition.operation +
+ // "|" +
+ // definition.name.value +
+ // "##",
+ // query
+ // );
+ return (
+ definition.kind === "OperationDefinition" &&
+ definition.operation === "subscription"
+ );
+ },
+ wsLink,
+ httpLink
+);
+
+const authLink = setContext((_, { headers }) => {
+ return (
+ auth.currentUser &&
+ auth.currentUser.getIdToken().then((token) => {
+ if (token) {
+ return {
+ headers: {
+ ...headers,
+ authorization: token ? `Bearer ${token}` : "",
+ },
+ };
+ } else {
+ return { headers };
+ }
+ })
+ );
+});
+
+const retryLink = new RetryLink({
+ delay: {
+ initial: 500,
+ max: 5,
+ jitter: true,
+ },
+ attempts: {
+ max: 5,
+ retryIf: (error, _operation) => !!error,
+ },
+});
+
+const middlewares = [];
+if (process.env.NODE_ENV === "development") {
+ middlewares.push(apolloLogger);
+}
+
+middlewares.push(retryLink.concat(errorLink.concat(authLink.concat(link))));
+
+const cache = new InMemoryCache({});
+
+export const client = new ApolloClient({
+ //link: ApolloLink.from(middlewares),
+ link: from([authLink, link]),
+ cache,
+ // connectToDevTools: process.env.NODE_ENV !== "production",
+ // defaultOptions: {
+ // watchQuery: {
+ // fetchPolicy: "cache-and-network",
+ // },
+ // },
+});
diff --git a/graphql/jobs.queries.js b/graphql/jobs.queries.js
new file mode 100644
index 0000000..7303079
--- /dev/null
+++ b/graphql/jobs.queries.js
@@ -0,0 +1,1115 @@
+import gql from "graphql-tag";
+
+export const QUERY_ALL_ACTIVE_JOBS = gql`
+ query QUERY_ALL_ACTIVE_JOBS($statuses: [String!]!) {
+ jobs(where: { status: { _in: $statuses } }) {
+ ownr_fn
+ ownr_ln
+ ownr_ph1
+ ownr_ea
+ owner {
+ id
+ allow_text_message
+ preferred_contact
+ }
+ plate_no
+ plate_st
+ v_vin
+ v_model_yr
+ v_model_desc
+ v_make_desc
+ v_color
+ vehicleid
+ actual_completion
+ actual_delivery
+ actual_in
+ est_number
+ id
+ ins_co_nm
+ ins_ct_fn
+ ins_ct_ln
+ ins_ph1
+ ins_ea
+ est_co_nm
+ est_ph1
+ est_ea
+ est_ct_fn
+ est_ct_ln
+ clm_no
+ clm_total
+ owner_owing
+ ro_number
+ scheduled_completion
+ scheduled_in
+ scheduled_delivery
+ status
+ updated_at
+ ded_amt
+ vehicleid
+ }
+ }
+`;
+
+export const SUBSCRIPTION_JOBS_IN_PRODUCTION = gql`
+ subscription SUBSCRIPTION_JOBS_IN_PRODUCTION($statusList: [String!]!) {
+ jobs(where: { inproduction: { _eq: true } }) {
+ id
+ status
+ ro_number
+ est_number
+ ownr_fn
+ ownr_ln
+ v_model_yr
+ v_model_desc
+ clm_no
+ v_make_desc
+ v_color
+ plate_no
+ actual_in
+ scheduled_completion
+ scheduled_delivery
+ ins_co_nm
+ clm_total
+ ownr_ph1
+ special_coverage_policy
+ production_vars
+ kanbanparent
+ employee_body
+ employee_body_rel {
+ id
+ first_name
+ last_name
+ }
+ employee_refinish
+ employee_refinish_rel {
+ id
+ first_name
+ last_name
+ }
+ employee_prep
+ employee_prep_rel {
+ id
+ first_name
+ last_name
+ }
+ partcount: joblines_aggregate {
+ nodes {
+ status
+ }
+ }
+
+ labhrs: joblines_aggregate(where: { mod_lbr_ty: { _eq: "LAB" } }) {
+ aggregate {
+ sum {
+ mod_lb_hrs
+ }
+ }
+ }
+ larhrs: joblines_aggregate(where: { mod_lbr_ty: { _eq: "LAR" } }) {
+ aggregate {
+ sum {
+ mod_lb_hrs
+ }
+ }
+ }
+ }
+ }
+`;
+
+export const QUERY_JOB_COSTING_DETAILS = gql`
+ query QUERY_JOB_COSTING_DETAILS($id: uuid!) {
+ jobs_by_pk(id: $id) {
+ est_number
+ ro_number
+ clm_total
+ id
+ ded_amt
+ ded_status
+ depreciation_taxes
+ federal_tax_payable
+ other_amount_payable
+ towing_payable
+ storage_payable
+ adjustment_bottom_line
+ federal_tax_rate
+ state_tax_rate
+ local_tax_rate
+ tax_tow_rt
+ tax_str_rt
+ tax_paint_mat_rt
+ tax_sub_rt
+ tax_lbr_rt
+ tax_levies_rt
+ parts_tax_rates
+ job_totals
+ labor_rate_desc
+ rate_atp
+ rate_la1
+ rate_la2
+ rate_la3
+ rate_la4
+ rate_laa
+ rate_lab
+ rate_lad
+ rate_lae
+ rate_laf
+ rate_lag
+ rate_lam
+ rate_lar
+ rate_las
+ rate_lau
+ rate_ma2s
+ rate_ma2t
+ rate_ma3s
+ rate_mabl
+ rate_macs
+ rate_mahw
+ rate_mapa
+ rate_mash
+ rate_matd
+ actual_in
+ status
+ joblines {
+ id
+ unq_seq
+ line_ind
+ tax_part
+ line_desc
+ prt_dsmk_p
+ prt_dsmk_m
+ part_type
+ oem_partno
+ db_price
+ act_price
+ part_qty
+ mod_lbr_ty
+ db_hrs
+ mod_lb_hrs
+ lbr_op
+ lbr_amt
+ op_code_desc
+ }
+ invoices {
+ id
+ federal_tax_rate
+ local_tax_rate
+ state_tax_rate
+ is_credit_memo
+ invoicelines {
+ actual_cost
+ cost_center
+ id
+ quantity
+ }
+ }
+ timetickets {
+ id
+ rate
+ cost_center
+ actualhrs
+ }
+ }
+ }
+`;
+
+export const GET_JOB_BY_PK = gql`
+ query GET_JOB_BY_PK($id: uuid!) {
+ jobs_by_pk(id: $id) {
+ updated_at
+ employee_body_rel {
+ id
+ first_name
+ last_name
+ }
+ employee_refinish_rel {
+ id
+ first_name
+ last_name
+ }
+ employee_prep_rel {
+ id
+ first_name
+ last_name
+ }
+ csr
+ loss_desc
+ kmin
+ kmout
+ referral_source
+ unit_number
+ po_number
+ special_coverage_policy
+ scheduled_delivery
+ converted
+ est_number
+ ro_number
+ clm_total
+ inproduction
+ vehicleid
+ plate_no
+ v_vin
+ v_model_yr
+ v_model_desc
+ v_make_desc
+ v_color
+ vehicle {
+ id
+ plate_no
+ v_vin
+ v_model_yr
+ v_model_desc
+ v_make_desc
+ v_color
+ }
+ ins_co_id
+ policy_no
+ loss_date
+ clm_no
+ area_of_damage
+ ins_co_nm
+ ins_addr1
+ ins_city
+ ins_ct_ln
+ ins_ct_fn
+ ins_ea
+ ins_ph1
+ est_co_nm
+ est_ct_fn
+ est_ct_ln
+ pay_date
+ est_ph1
+ est_ea
+ selling_dealer
+ servicing_dealer
+ selling_dealer_contact
+ servicing_dealer_contact
+ regie_number
+ scheduled_completion
+ id
+ ded_amt
+ ded_status
+ depreciation_taxes
+ federal_tax_payable
+ other_amount_payable
+ towing_payable
+ storage_payable
+ adjustment_bottom_line
+ federal_tax_rate
+ state_tax_rate
+ local_tax_rate
+ tax_tow_rt
+ tax_str_rt
+ tax_paint_mat_rt
+ tax_sub_rt
+ tax_lbr_rt
+ tax_levies_rt
+ parts_tax_rates
+ job_totals
+ ownr_fn
+ ownr_ln
+ ownr_ea
+ ownr_addr1
+ ownr_addr2
+ ownr_city
+ ownr_st
+ ownr_zip
+ ownr_ctry
+ ownr_ph1
+ owner {
+ id
+ ownr_fn
+ ownr_ln
+ ownr_ea
+ ownr_addr1
+ ownr_addr2
+ ownr_city
+ ownr_st
+ ownr_zip
+ ownr_ctry
+ ownr_ph1
+ }
+ labor_rate_desc
+ rate_atp
+ rate_la1
+ rate_la2
+ rate_la3
+ rate_la4
+ rate_laa
+ rate_lab
+ rate_lad
+ rate_lae
+ rate_laf
+ rate_lag
+ rate_lam
+ rate_lar
+ rate_las
+ rate_lau
+ rate_ma2s
+ rate_ma2t
+ rate_ma3s
+ rate_mabl
+ rate_macs
+ rate_mahw
+ rate_mapa
+ rate_mash
+ rate_matd
+ actual_in
+ scheduled_completion
+ scheduled_in
+ actual_completion
+ scheduled_delivery
+ actual_delivery
+ date_estimated
+ date_open
+ date_scheduled
+ date_invoiced
+ date_closed
+ date_exported
+ status
+ owner_owing
+ joblines {
+ id
+ unq_seq
+ line_ind
+ tax_part
+ line_desc
+ prt_dsmk_p
+ prt_dsmk_m
+ part_type
+ oem_partno
+ db_price
+ act_price
+ part_qty
+ mod_lbr_ty
+ db_hrs
+ mod_lb_hrs
+ lbr_op
+ lbr_amt
+ op_code_desc
+ }
+ payments {
+ id
+ amount
+ payer
+ created_at
+ stripeid
+ transactionid
+ memo
+ }
+ cccontracts {
+ id
+ status
+ start
+ scheduledreturn
+ agreementnumber
+ }
+ cieca_ttl
+ csiinvites {
+ id
+ completedon
+ }
+ }
+ }
+`;
+
+export const QUERY_JOB_CARD_DETAILS = gql`
+ query QUERY_JOB_CARD_DETAILS($id: uuid!) {
+ jobs_by_pk(id: $id) {
+ ownr_fn
+ employee_body
+ employee_refinish
+ ownr_ln
+ ownr_ph1
+ ownr_ea
+ joblines_status {
+ part_type
+ count
+ status
+ }
+ owner {
+ id
+ allow_text_message
+ preferred_contact
+ }
+ vehicleid
+ v_model_yr
+ v_make_desc
+ v_model_desc
+ v_color
+ plate_no
+ vehicle {
+ id
+ v_model_yr
+ v_make_desc
+ v_model_desc
+ v_color
+ plate_no
+ }
+ actual_completion
+ actual_delivery
+ actual_in
+ est_number
+ id
+ ins_co_nm
+ ins_ct_fn
+ ins_ct_ln
+ ins_ph1
+ ins_ea
+ est_co_nm
+ est_ph1
+ est_ea
+ est_ct_fn
+ est_ct_ln
+ clm_no
+ status
+ job_totals
+ area_of_damage
+ ro_number
+ scheduled_completion
+ scheduled_in
+ scheduled_delivery
+ date_invoiced
+ date_open
+ date_exported
+ date_closed
+ date_scheduled
+ date_estimated
+
+ notes {
+ id
+ text
+ critical
+ private
+ created_at
+ }
+ updated_at
+ clm_total
+ ded_amt
+ cccontracts {
+ id
+ agreementnumber
+ status
+ start
+ scheduledreturn
+ }
+ documents(limit: 3, order_by: { created_at: desc }) {
+ id
+ key
+ }
+ }
+ }
+`;
+
+export const QUERY_TECH_JOB_DETAILS = gql`
+ query QUERY_TECH_JOB_DETAILS($id: uuid!) {
+ jobs_by_pk(id: $id) {
+ ownr_fn
+ ownr_ln
+ v_model_yr
+ v_make_desc
+ v_model_desc
+ v_color
+ plate_no
+ actual_completion
+ actual_delivery
+ actual_in
+ est_number
+ id
+ ins_co_nm
+ clm_no
+ status
+ job_totals
+ area_of_damage
+ ro_number
+ scheduled_completion
+ scheduled_in
+ scheduled_delivery
+ date_invoiced
+ date_open
+ date_exported
+ date_closed
+ date_scheduled
+ date_estimated
+ employee_body
+ employee_refinish
+ employee_prep
+ joblines {
+ id
+ unq_seq
+ line_ind
+ tax_part
+ line_desc
+ prt_dsmk_p
+ prt_dsmk_m
+ part_type
+ oem_partno
+ db_price
+ act_price
+ part_qty
+ mod_lbr_ty
+ db_hrs
+ mod_lb_hrs
+ lbr_op
+ lbr_amt
+ op_code_desc
+ }
+ notes {
+ id
+ text
+ critical
+ private
+ created_at
+ }
+ updated_at
+ documents(order_by: { created_at: desc }) {
+ id
+ key
+ }
+ }
+ }
+`;
+
+export const UPDATE_JOB = gql`
+ mutation UPDATE_JOB($jobId: uuid!, $job: jobs_set_input!) {
+ update_jobs(where: { id: { _eq: $jobId } }, _set: $job) {
+ returning {
+ id
+ date_exported
+ status
+ }
+ }
+ }
+`;
+
+export const UPDATE_JOBS = gql`
+ mutation UPDATE_JOBS($jobIds: [uuid!]!, $fields: jobs_set_input!) {
+ update_jobs(where: { id: { _in: $jobIds } }, _set: $fields) {
+ returning {
+ id
+ }
+ }
+ }
+`;
+
+export const CONVERT_JOB_TO_RO = gql`
+ mutation CONVERT_JOB_TO_RO($jobId: uuid!) {
+ update_jobs(where: { id: { _eq: $jobId } }, _set: { converted: true }) {
+ returning {
+ id
+ ro_number
+ converted
+ }
+ }
+ }
+`;
+
+export const INSERT_NEW_JOB = gql`
+ mutation INSERT_JOB($job: [jobs_insert_input!]!) {
+ insert_jobs(objects: $job) {
+ returning {
+ id
+ est_number
+ }
+ }
+ }
+`;
+
+export const UPDATE_JOB_STATUS = gql`
+ mutation UPDATE_JOB_STATUS($jobId: uuid!, $status: String!) {
+ update_jobs(where: { id: { _eq: $jobId } }, _set: { status: $status }) {
+ returning {
+ id
+ }
+ }
+ }
+`;
+
+export const ACTIVE_JOBS_FOR_AUTOCOMPLETE = gql`
+ query ACTIVE_JOBS_FOR_AUTOCOMPLETE($statuses: [String!]!) {
+ jobs(where: { status: { _in: $statuses } }) {
+ id
+ ownr_fn
+ ownr_ln
+ ro_number
+ est_number
+ vehicleid
+ v_make_desc
+ v_model_desc
+ v_model_yr
+ }
+ }
+`;
+
+export const SEARCH_FOR_JOBS = gql`
+ query SEARCH_FOR_JOBS($search: String!) {
+ jobs(where: { ro_number: { _ilike: $search } }) {
+ id
+ ro_number
+ ownr_fn
+ ownr_ln
+ }
+ }
+`;
+//TODO Ensure this is always up to date.
+export const QUERY_ALL_JOB_FIELDS = gql`
+ query QUERY_ALL_JOB_FIELDS($id: uuid!) {
+ jobs_by_pk(id: $id) {
+ id
+ adj_g_disc
+ adj_strdis
+ adj_towdis
+ adjustment_bottom_line
+ agt_addr1
+ agt_addr2
+ agt_city
+ agt_co_id
+ agt_co_nm
+ agt_ct_fn
+ agt_ct_ln
+ agt_ct_ph
+ agt_ct_phx
+ agt_ctry
+ agt_ea
+ agt_faxx
+ agt_fax
+ agt_lic_no
+ agt_ph1
+ agt_ph1x
+ agt_ph2
+ agt_zip
+ agt_st
+ agt_ph2x
+ area_of_damage
+ cat_no
+ cieca_stl
+ cieca_ttl
+ clm_addr1
+ clm_addr2
+ clm_city
+ clm_ct_fn
+ clm_ct_ln
+ clm_ct_ph
+ clm_ct_phx
+ clm_ctry
+ clm_ea
+ clm_fax
+ clm_faxx
+ clm_ofc_id
+ clm_ofc_nm
+ clm_ph1
+ clm_ph1x
+ clm_ph2
+ clm_ph2x
+ clm_st
+ clm_title
+ clm_total
+ clm_zip
+ csr
+ cust_pr
+ ded_amt
+ ded_status
+ depreciation_taxes
+ est_addr1
+ est_addr2
+ est_city
+ est_co_nm
+ est_ct_fn
+ est_ct_ln
+ est_ctry
+ est_ea
+ est_ph1
+ est_st
+ est_zip
+ federal_tax_payable
+ federal_tax_rate
+ g_bett_amt
+ ins_addr1
+ ins_addr2
+ ins_city
+ ins_co_id
+ ins_co_nm
+ ins_ct_fn
+ ins_ct_ln
+ ins_ct_ph
+ ins_ct_phx
+ ins_ctry
+ ins_ea
+ ins_fax
+ ins_faxx
+ ins_memo
+ ins_ph1
+ ins_ph1x
+ ins_ph2
+ ins_ph2x
+ ins_st
+ ins_title
+ ins_zip
+ insd_addr1
+ insd_addr2
+ insd_city
+ insd_co_nm
+ insd_ctry
+ insd_ea
+ insd_fax
+ insd_faxx
+ insd_fn
+ insd_ln
+ insd_ph1
+ insd_ph1x
+ insd_ph2
+ insd_ph2x
+ insd_st
+ insd_title
+ insd_zip
+ job_totals
+ labor_rate_desc
+ labor_rate_id
+ local_tax_rate
+ other_amount_payable
+ owner_owing
+ ownerid
+ ownr_addr1
+ ownr_addr2
+ ownr_city
+ ownr_co_nm
+ ownr_ctry
+ ownr_ea
+ ownr_fax
+ ownr_faxx
+ ownr_fn
+ ownr_ln
+ ownr_ph1
+ ownr_ph1x
+ ownr_ph2
+ ownr_ph2x
+ ownr_st
+ ownr_title
+ ownr_zip
+ parts_tax_rates
+ pay_amt
+ pay_chknm
+ pay_date
+ pay_type
+ payee_nms
+ plate_no
+ plate_st
+ po_number
+ policy_no
+ rate_atp
+ rate_la1
+ rate_la2
+ rate_la3
+ rate_la4
+ rate_laa
+ rate_lab
+ rate_lad
+ rate_lae
+ rate_lag
+ rate_laf
+ rate_lam
+ rate_lar
+ rate_las
+ rate_lau
+ rate_ma2s
+ rate_ma2t
+ rate_ma3s
+ rate_mabl
+ rate_macs
+ rate_mahw
+ rate_mapa
+ rate_mash
+ rate_matd
+ referral_source
+ regie_number
+ selling_dealer
+ selling_dealer_contact
+ servicing_dealer
+ servicing_dealer_contact
+ shopid
+ special_coverage_policy
+ state_tax_rate
+ storage_payable
+ tax_lbr_rt
+ tax_levies_rt
+ tax_paint_mat_rt
+ tax_predis
+ tax_prethr
+ tax_pstthr
+ tax_str_rt
+ tax_sub_rt
+ tax_thramt
+ tax_tow_rt
+ theft_ind
+ tlos_ind
+ towing_payable
+ unit_number
+ v_color
+ v_make_desc
+ v_model_desc
+ v_model_yr
+ v_vin
+ vehicleid
+ joblines {
+ act_price
+ alt_co_id
+ alt_overrd
+ alt_part_i
+ alt_partm
+ bett_amt
+ alt_partno
+ bett_pctg
+ bett_tax
+ bett_type
+ cert_part
+ db_hrs
+ db_price
+ db_ref
+ est_seq
+ glass_flag
+ id
+ lbr_amt
+ lbr_hrs_j
+ lbr_inc
+ lbr_op
+ lbr_op_j
+ lbr_tax
+ lbr_typ_j
+ line_desc
+ line_ind
+ line_ref
+ misc_amt
+ misc_sublt
+ misc_tax
+ mod_lb_hrs
+ mod_lbr_ty
+ oem_partno
+ op_code_desc
+ paint_stg
+ paint_tone
+ part_qty
+ part_type
+ price_inc
+ price_j
+ prt_dsmk_m
+ prt_dsmk_p
+ status
+ tax_part
+ unq_seq
+ }
+ employee_body
+ employee_refinish
+ employee_prep
+ }
+ }
+`;
+
+export const QUERY_ALL_JOBS_PAGINATED = gql`
+ query QUERY_ALL_JOBS_PAGINATED(
+ $search: String
+ $offset: Int
+ $limit: Int
+ $order: [jobs_order_by!]!
+ ) {
+ search_jobs(
+ args: { search: $search }
+ offset: $offset
+ limit: $limit
+ order_by: $order
+ ) {
+ ownr_fn
+ ownr_ln
+ ownr_ph1
+ ownr_ea
+ plate_no
+ plate_st
+ v_vin
+ v_model_yr
+ v_model_desc
+ v_make_desc
+ v_color
+ vehicleid
+ actual_completion
+ actual_delivery
+ actual_in
+ est_number
+ id
+ ins_co_nm
+ ins_ct_fn
+ ins_ct_ln
+ ins_ph1
+ ins_ea
+ est_co_nm
+ est_ph1
+ est_ea
+ est_ct_fn
+ est_ct_ln
+ clm_no
+ clm_total
+ owner_owing
+ ro_number
+ scheduled_completion
+ scheduled_in
+ scheduled_delivery
+ status
+ updated_at
+ ded_amt
+ vehicleid
+ }
+ search_jobs_aggregate(args: { search: $search }) {
+ aggregate {
+ count(distinct: true)
+ }
+ }
+ }
+`;
+
+export const QUERY_JOB_CLOSE_DETAILS = gql`
+ query QUERY_JOB_CLOSE_DETAILS($id: uuid!) {
+ jobs_by_pk(id: $id) {
+ ro_number
+ clm_total
+ inproduction
+ plate_no
+ v_vin
+ v_model_yr
+ v_model_desc
+ v_make_desc
+ v_color
+ invoice_allocation
+ ins_co_id
+ policy_no
+ clm_no
+ ins_co_nm
+ regie_number
+ id
+ ded_amt
+ ded_status
+ depreciation_taxes
+ federal_tax_payable
+ other_amount_payable
+ towing_payable
+ storage_payable
+ adjustment_bottom_line
+ federal_tax_rate
+ state_tax_rate
+ local_tax_rate
+ tax_tow_rt
+ tax_str_rt
+ tax_paint_mat_rt
+ tax_sub_rt
+ tax_lbr_rt
+ tax_levies_rt
+ parts_tax_rates
+ job_totals
+ ownr_fn
+ ownr_ln
+ ownr_ea
+ ownr_addr1
+ ownr_addr2
+ ownr_city
+ ownr_st
+ ownr_zip
+ ownr_ctry
+ ownr_ph1
+ rate_atp
+ rate_la1
+ rate_la2
+ rate_la3
+ rate_la4
+ rate_laa
+ rate_lab
+ rate_lad
+ rate_lae
+ rate_laf
+ rate_lag
+ rate_lam
+ rate_lar
+ rate_las
+ rate_lau
+ rate_ma2s
+ rate_ma2t
+ rate_ma3s
+ rate_mabl
+ rate_macs
+ rate_mahw
+ rate_mapa
+ rate_mash
+ rate_matd
+ status
+ owner_owing
+ date_exported
+ joblines {
+ id
+ tax_part
+ line_desc
+ prt_dsmk_p
+ prt_dsmk_m
+ part_type
+ oem_partno
+ db_price
+ act_price
+ part_qty
+ mod_lbr_ty
+ db_hrs
+ mod_lb_hrs
+ lbr_op
+ lbr_amt
+ op_code_desc
+ }
+ }
+ }
+`;
+
+export const generate_UPDATE_JOB_KANBAN = (
+ oldChildId,
+ oldChildNewParent,
+ movedId,
+ movedNewParent,
+ movedNewStatus,
+ newChildId,
+ newChildParent
+) => {
+ // console.log("oldChildId", oldChildId, "oldChildNewParent", oldChildNewParent);
+ // console.log("Moved", movedId, movedNewParent, movedNewStatus);
+ // console.log("new", newChildId, newChildParent);
+
+ const oldChildQuery = `
+ updateOldChild: update_jobs(where: { id: { _eq: "${oldChildId}" } },
+ _set: {kanbanparent: ${
+ oldChildNewParent ? `"${oldChildNewParent}"` : null
+ }}) {
+ returning {
+ id
+ kanbanparent
+ }
+ }`;
+
+ const movedQuery = `
+ updateMovedChild: update_jobs(where: { id: { _eq: "${movedId}" } },
+ _set: {kanbanparent: ${
+ movedNewParent ? `"${movedNewParent}"` : null
+ } , status: "${movedNewStatus}"}) {
+ returning {
+ id
+ status
+ kanbanparent
+ }
+ }`;
+
+ const newChildQuery = `
+ updateNewChild: update_jobs(where: { id: { _eq: "${newChildId}" } },
+ _set: {kanbanparent: ${newChildParent ? `"${newChildParent}"` : null}}) {
+ returning {
+ id
+ kanbanparent
+ }
+ }`;
+
+ return gql`
+ mutation UPDATE_JOB_KANBAN {
+ ${oldChildId ? oldChildQuery : ""}
+ ${movedId ? movedQuery : ""}
+ ${newChildId ? newChildQuery : ""}
+ }
+ `;
+};
diff --git a/package.json b/package.json
index 39edaea..b155ea4 100644
--- a/package.json
+++ b/package.json
@@ -8,18 +8,26 @@
"eject": "expo eject"
},
"dependencies": {
+ "@apollo/client": "^3.1.3",
"@react-native-community/async-storage": "^1.11.0",
"@react-native-community/masked-view": "0.1.10",
"@react-navigation/bottom-tabs": "^5.8.0",
"@react-navigation/drawer": "^5.9.0",
"@react-navigation/native": "^5.7.3",
"@react-navigation/stack": "^5.9.0",
+ "apollo-link-context": "^1.0.20",
+ "apollo-link-error": "^1.1.13",
+ "apollo-link-http": "^1.5.17",
+ "apollo-link-logger": "^1.2.3",
+ "apollo-link-retry": "^2.2.16",
+ "apollo-link-ws": "^1.0.20",
"expo": "~38.0.8",
"expo-font": "~8.2.1",
"expo-localization": "~8.2.1",
"expo-status-bar": "^1.0.2",
"firebase": "^7.17.1",
"formik": "^2.1.5",
+ "graphql": "^15.3.0",
"i18next": "^19.6.3",
"native-base": "^2.13.13",
"react": "~16.11.0",
@@ -36,7 +44,8 @@
"redux-logger": "^3.0.6",
"redux-persist": "^6.0.0",
"redux-saga": "^1.1.3",
- "reselect": "^4.0.0"
+ "reselect": "^4.0.0",
+ "subscriptions-transport-ws": "^0.9.17"
},
"devDependencies": {
"@babel/core": "^7.8.6",
diff --git a/redux/root.reducer.js b/redux/root.reducer.js
index 1bc2eb0..38653fb 100644
--- a/redux/root.reducer.js
+++ b/redux/root.reducer.js
@@ -12,6 +12,8 @@ import userReducer from "./user/user.reducer";
const persistConfig = {
key: "root",
storage: AsyncStorage,
+ whitelist: [],
+ blacklist: ["user"],
// whitelist: ["messaging", "tech", "application"],
// blacklist: ["user", "email", "modals"],
};
diff --git a/yarn.lock b/yarn.lock
index e79dce4..d961b24 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,24 @@
# yarn lockfile v1
+"@apollo/client@^3.1.3":
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.1.3.tgz#4ea9c3818bd2836a3dbe26088227c3d8cb46ad2b"
+ integrity sha512-zXMiaj+dX0sgXIwEV5d/PI6B8SZT2bqlKNjZWcEXRY7NjESF5J3nd4v8KOsrhHe+A3YhNv63tIl35Sq7uf41Pg==
+ dependencies:
+ "@types/zen-observable" "^0.8.0"
+ "@wry/context" "^0.5.2"
+ "@wry/equality" "^0.2.0"
+ fast-json-stable-stringify "^2.0.0"
+ graphql-tag "^2.11.0"
+ hoist-non-react-statics "^3.3.2"
+ optimism "^0.12.1"
+ prop-types "^15.7.2"
+ symbol-observable "^1.2.0"
+ ts-invariant "^0.4.4"
+ tslib "^1.10.0"
+ zen-observable "^0.8.14"
+
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
@@ -1688,6 +1706,11 @@
dependencies:
"@types/yargs-parser" "*"
+"@types/zen-observable@0.8.0", "@types/zen-observable@^0.8.0":
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d"
+ integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==
+
"@unimodules/core@~5.3.0":
version "5.3.0"
resolved "https://registry.yarnpkg.com/@unimodules/core/-/core-5.3.0.tgz#c425e59b1f9c1e2c91b235b6192e5f622a47d833"
@@ -1704,6 +1727,27 @@
lodash "^4.5.0"
prop-types "^15.6.1"
+"@wry/context@^0.5.2":
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.5.2.tgz#f2a5d5ab9227343aa74c81e06533c1ef84598ec7"
+ integrity sha512-B/JLuRZ/vbEKHRUiGj6xiMojST1kHhu4WcreLfNN7q9DqQFrb97cWgf/kiYsPSUCAMVN0HzfFc8XjJdzgZzfjw==
+ dependencies:
+ tslib "^1.9.3"
+
+"@wry/equality@^0.1.2":
+ version "0.1.11"
+ resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790"
+ integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==
+ dependencies:
+ tslib "^1.9.3"
+
+"@wry/equality@^0.2.0":
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.2.0.tgz#a312d1b6a682d0909904c2bcd355b02303104fb7"
+ integrity sha512-Y4d+WH6hs+KZJUC8YKLYGarjGekBrhslDbf/R20oV+AakHPINSitHfDRQz3EGcEWc1luXYNUvMhawWtZVWNGvQ==
+ dependencies:
+ tslib "^1.9.3"
+
abort-controller@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
@@ -1824,6 +1868,83 @@ anymatch@^2.0.0:
micromatch "^3.1.4"
normalize-path "^2.1.1"
+apollo-link-context@^1.0.20:
+ version "1.0.20"
+ resolved "https://registry.yarnpkg.com/apollo-link-context/-/apollo-link-context-1.0.20.tgz#1939ac5dc65d6dff0c855ee53521150053c24676"
+ integrity sha512-MLLPYvhzNb8AglNsk2NcL9AvhO/Vc9hn2ZZuegbhRHGet3oGr0YH9s30NS9+ieoM0sGT11p7oZ6oAILM/kiRBA==
+ dependencies:
+ apollo-link "^1.2.14"
+ tslib "^1.9.3"
+
+apollo-link-error@^1.1.13:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.13.tgz#c1a1bb876ffe380802c8df0506a32c33aad284cd"
+ integrity sha512-jAZOOahJU6bwSqb2ZyskEK1XdgUY9nkmeclCrW7Gddh1uasHVqmoYc4CKdb0/H0Y1J9lvaXKle2Wsw/Zx1AyUg==
+ dependencies:
+ apollo-link "^1.2.14"
+ apollo-link-http-common "^0.2.16"
+ tslib "^1.9.3"
+
+apollo-link-http-common@^0.2.16:
+ version "0.2.16"
+ resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz#756749dafc732792c8ca0923f9a40564b7c59ecc"
+ integrity sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==
+ dependencies:
+ apollo-link "^1.2.14"
+ ts-invariant "^0.4.0"
+ tslib "^1.9.3"
+
+apollo-link-http@^1.5.17:
+ version "1.5.17"
+ resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.17.tgz#499e9f1711bf694497f02c51af12d82de5d8d8ba"
+ integrity sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg==
+ dependencies:
+ apollo-link "^1.2.14"
+ apollo-link-http-common "^0.2.16"
+ tslib "^1.9.3"
+
+apollo-link-logger@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/apollo-link-logger/-/apollo-link-logger-1.2.3.tgz#1f3e6f7849ce7a7e3aa822141fe062cfa278b1e1"
+ integrity sha512-GaVwdHyXmawfvBlHfZkFkBHH3+YH7wibzSCc4/YpIbPVtbtZqi0Qop18w++jgpw385W083DMOdYe2eJsKkZdag==
+
+apollo-link-retry@^2.2.16:
+ version "2.2.16"
+ resolved "https://registry.yarnpkg.com/apollo-link-retry/-/apollo-link-retry-2.2.16.tgz#745ff51e60a7a68b34c8d382832856c43a9c306c"
+ integrity sha512-7F9+meFAz4dw5gtgtLsRFqJW6QzNOhTzt5R5Hsy+yFhkTW9LddgYO7gxN9n7RN/7Ouosh3TcpUkdHs2laC+0sA==
+ dependencies:
+ "@types/zen-observable" "0.8.0"
+ apollo-link "^1.2.14"
+ tslib "^1.9.3"
+
+apollo-link-ws@^1.0.20:
+ version "1.0.20"
+ resolved "https://registry.yarnpkg.com/apollo-link-ws/-/apollo-link-ws-1.0.20.tgz#dfad44121f8445c6d7b7f8101a1b24813ba008ed"
+ integrity sha512-mjSFPlQxmoLArpHBeUb2Xj+2HDYeTaJqFGOqQ+I8NVJxgL9lJe84PDWcPah/yMLv3rB7QgBDSuZ0xoRFBPlySw==
+ dependencies:
+ apollo-link "^1.2.14"
+ tslib "^1.9.3"
+
+apollo-link@^1.2.14:
+ version "1.2.14"
+ resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9"
+ integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==
+ dependencies:
+ apollo-utilities "^1.3.0"
+ ts-invariant "^0.4.0"
+ tslib "^1.9.3"
+ zen-observable-ts "^0.8.21"
+
+apollo-utilities@^1.3.0:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf"
+ integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==
+ dependencies:
+ "@wry/equality" "^0.1.2"
+ fast-json-stable-stringify "^2.0.0"
+ ts-invariant "^0.4.0"
+ tslib "^1.10.0"
+
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@@ -1914,6 +2035,11 @@ astral-regex@^1.0.0:
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+async-limiter@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
async@^2.4.0:
version "2.6.3"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
@@ -2021,6 +2147,11 @@ babel-preset-fbjs@^3.2.0, babel-preset-fbjs@^3.3.0:
"@babel/plugin-transform-template-literals" "^7.0.0"
babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0"
+backo2@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+ integrity sha1-MasayLEpNjRj41s+u2n038+6eUc=
+
badgin@^1.1.2:
version "1.1.8"
resolved "https://registry.yarnpkg.com/badgin/-/badgin-1.1.8.tgz#6e4c930554945d31752e5de2d8a316036dccda5e"
@@ -2812,7 +2943,7 @@ event-target-shim@^5.0.0, event-target-shim@^5.0.1:
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
-eventemitter3@^3.0.0:
+eventemitter3@^3.0.0, eventemitter3@^3.1.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==
@@ -3051,6 +3182,11 @@ fancy-log@^1.3.2:
parse-node-version "^1.0.0"
time-stamp "^1.0.0"
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
faye-websocket@0.11.3:
version "0.11.3"
resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e"
@@ -3358,6 +3494,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+graphql-tag@^2.11.0:
+ version "2.11.0"
+ resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.11.0.tgz#1deb53a01c46a7eb401d6cb59dec86fa1cccbffd"
+ integrity sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA==
+
graphql@^14.0.0:
version "14.7.0"
resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.7.0.tgz#7fa79a80a69be4a31c27dda824dc04dac2035a72"
@@ -3365,6 +3506,11 @@ graphql@^14.0.0:
dependencies:
iterall "^1.2.2"
+graphql@^15.3.0:
+ version "15.3.0"
+ resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.3.0.tgz#3ad2b0caab0d110e3be4a5a9b2aa281e362b5278"
+ integrity sha512-GTCJtzJmkFLWRfFJuoo9RWWa/FfamUHgiFosxi/X1Ani4AVWbeyBenZTNX6dM+7WSbbFfTo/25eh0LLkwHMw2w==
+
has-ansi@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
@@ -3440,7 +3586,7 @@ hoist-non-react-statics@^2.3.1:
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47"
integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==
-hoist-non-react-statics@^3.3.0:
+hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
@@ -3814,7 +3960,7 @@ isomorphic-fetch@2.2.1, isomorphic-fetch@^2.1.1:
node-fetch "^1.0.1"
whatwg-fetch ">=0.10.0"
-iterall@^1.2.2:
+iterall@^1.2.1, iterall@^1.2.2:
version "1.3.0"
resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea"
integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==
@@ -4763,6 +4909,13 @@ opencollective-postinstall@^2.0.2:
resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259"
integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==
+optimism@^0.12.1:
+ version "0.12.1"
+ resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.12.1.tgz#933f9467b9aef0e601655adb9638f893e486ad02"
+ integrity sha512-t8I7HM1dw0SECitBYAqFOVHoBAHEQBTeKjIL9y9ImHzAVkdyPK4ifTgM4VJRDtTUY4r/u5Eqxs4XcGPHaoPkeQ==
+ dependencies:
+ "@wry/context" "^0.5.2"
+
options@>=0.0.5:
version "0.0.6"
resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
@@ -5898,6 +6051,17 @@ strip-eof@^1.0.0:
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
+subscriptions-transport-ws@^0.9.17:
+ version "0.9.17"
+ resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.17.tgz#e30e40f0caae0d2781903c01a8cb51b6e2682098"
+ integrity sha512-hNHi2N80PBz4T0V0QhnnsMGvG3XDFDS9mS6BhZ3R12T6EBywC8d/uJscsga0cVO4DKtXCkCRrWm2sOYrbOdhEA==
+ dependencies:
+ backo2 "^1.0.2"
+ eventemitter3 "^3.1.0"
+ iterall "^1.2.1"
+ symbol-observable "^1.0.4"
+ ws "^5.2.0"
+
sudo-prompt@^9.0.0:
version "9.2.1"
resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd"
@@ -5934,7 +6098,7 @@ symbol-observable@1.0.1:
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=
-symbol-observable@^1.2.0:
+symbol-observable@^1.0.4, symbol-observable@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
@@ -6027,7 +6191,14 @@ toidentifier@1.0.0:
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
-tslib@^1.10.0, tslib@^1.11.1:
+ts-invariant@^0.4.0, ts-invariant@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86"
+ integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==
+ dependencies:
+ tslib "^1.9.3"
+
+tslib@^1.10.0, tslib@^1.11.1, tslib@^1.9.3:
version "1.13.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
@@ -6383,6 +6554,13 @@ ws@^1.1.0, ws@^1.1.5:
options ">=0.0.5"
ultron "1.0.x"
+ws@^5.2.0:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
+ integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==
+ dependencies:
+ async-limiter "~1.0.0"
+
ws@^7:
version "7.3.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8"
@@ -6502,3 +6680,16 @@ yargs@^15.0.2, yargs@^15.1.0:
which-module "^2.0.0"
y18n "^4.0.0"
yargs-parser "^18.1.2"
+
+zen-observable-ts@^0.8.21:
+ version "0.8.21"
+ resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d"
+ integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==
+ dependencies:
+ tslib "^1.9.3"
+ zen-observable "^0.8.0"
+
+zen-observable@^0.8.0, zen-observable@^0.8.14:
+ version "0.8.15"
+ resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"
+ integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==