From 1f8d16370a4efa6912347d372c46b90569f14de9 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Tue, 11 Aug 2020 21:42:21 -0700 Subject: [PATCH] Added apollo client and basic provider setup. --- App.js | 7 +- app.json | 4 +- .../screen-job-list.component.jsx | 8 +- .../screen-main/screen-main.component.jsx | 26 +- .../screen-sign-in.component.jsx | 11 +- .../screen-splash/screen-splash.component.jsx | 32 + graphql/bodyshop.queries.js | 73 ++ graphql/client.js | 138 ++ graphql/jobs.queries.js | 1115 +++++++++++++++++ package.json | 11 +- redux/root.reducer.js | 2 + yarn.lock | 201 ++- 12 files changed, 1606 insertions(+), 22 deletions(-) create mode 100644 components/screen-splash/screen-splash.component.jsx create mode 100644 graphql/bodyshop.queries.js create mode 100644 graphql/client.js create mode 100644 graphql/jobs.queries.js 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==