From add87dca1c8257f8f747f54024db2b63496d1ce6 Mon Sep 17 00:00:00 2001 From: Saiyida Noor Date: Wed, 6 Aug 2025 15:30:39 +0000 Subject: [PATCH] moved all of the libracart suff from the old frontend into the new new, also... --- src/app/App.tsx | 3 +- .../marketplaceImages/LibraCartGrey.png | Bin 0 -> 45281 bytes .../LibraCart/LibraCartAccess.tsx | 191 ++++++++++++++++++ src/navigation/Router.tsx | 4 + src/navigation/SideNavigator.tsx | 15 ++ src/pages/CNHi.tsx | 2 +- src/pages/LibraCart.tsx | 148 ++++++++++++++ src/pages/Users.tsx | 3 +- src/products/CommonIcons/libracartIcon.tsx | 24 +++ src/providers/index.ts | 3 +- src/providers/pond/libracartProxyAPI.tsx | 137 +++++++++++++ src/providers/pond/pond.tsx | 16 +- src/userFeatures/UserFeatures.tsx | 9 + 13 files changed, 545 insertions(+), 10 deletions(-) create mode 100644 src/assets/marketplaceImages/LibraCartGrey.png create mode 100644 src/integrations/LibraCart/LibraCartAccess.tsx create mode 100644 src/pages/LibraCart.tsx create mode 100644 src/products/CommonIcons/libracartIcon.tsx create mode 100644 src/providers/pond/libracartProxyAPI.tsx diff --git a/src/app/App.tsx b/src/app/App.tsx index 16bb781..2c6b94b 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -50,7 +50,8 @@ function App() { const skipCallbacks = [ "/johndeere", - "/cnhi" + "/cnhi", + "/libracart" ] return ( diff --git a/src/assets/marketplaceImages/LibraCartGrey.png b/src/assets/marketplaceImages/LibraCartGrey.png new file mode 100644 index 0000000000000000000000000000000000000000..331ac297778c42435f0e66f276fb771917f78b67 GIT binary patch literal 45281 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⪼^)J{g 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 literal 0 HcmV?d00001 diff --git a/src/integrations/LibraCart/LibraCartAccess.tsx b/src/integrations/LibraCart/LibraCartAccess.tsx new file mode 100644 index 0000000..391a3fa --- /dev/null +++ b/src/integrations/LibraCart/LibraCartAccess.tsx @@ -0,0 +1,191 @@ +import { + Avatar, + Box, + Button, + DialogActions, + DialogContent, + DialogTitle, + Grid, + MenuItem, + TextField +} from "@mui/material"; +import ResponsiveDialog from "common/ResponsiveDialog"; +import { teamScope, User } from "models"; +import { pond } from "protobuf-ts/pond"; +import { useSnackbar, useUserAPI } from "providers"; +import { useLibraCartProxyAPI } from "providers/pond/libracartProxyAPI"; +import React, { useEffect, useState } from "react"; +import { useLocation } from "react-router"; +import TeamSearch from "teams/TeamSearch"; + +export default function LibraCartAccess() { + const [openDialog, setOpenDialog] = useState(false); + const [teamKey, setTeamKey] = useState(""); + const [teamUsers, setTeamUsers] = useState([]); + const [primaryUser, setPrimaryUser] = useState(""); + const [libracartUsername, setLibraCartUserName] = useState(""); + const [libracartCode, setLibraCartCode] = useState(""); + const [libracartAuth, setLibraCartAuth] = useState(""); + //const [activeStep, setActiveStep] = useState(0); + const userAPI = useUserAPI(); + const libracartAPI = useLibraCartProxyAPI(); + //const [dataOps, setDataOps] = useState([]); + const { openSnack } = useSnackbar(); + //const [{ as }] = useGlobalState(); + // const integration_url = process.env.REACT_APP_LIBRACART_INTEGRATION_URL; + const integration_url = import.meta.env.VITE_LIBRACART_INTEGRATION_URL; + + + const submitNewOrganization = () => { + if (libracartCode && libracartAuth) { + libracartAPI + .addAccount(teamKey, primaryUser, libracartCode, libracartAuth, libracartUsername) + .then(resp => { + openSnack("Added New Libra Cart Account Link"); + }) + .catch(err => { + openSnack("Failed to Add New Libra Cart Account Link"); + }); + setOpenDialog(false); + } + }; + + useEffect(() => { + if (teamKey !== "") { + userAPI.listObjectUsers(teamScope(teamKey)).then(resp => { + setTeamUsers(resp.data.users.map((u: pond.User) => User.any(u))); + }); + } + }, [teamKey, userAPI]); + + // useEffect(() => { + // let code = localStorage.getItem("state"); + // if (code) { + // setLibraCartCode(code); + // setOpenDialog(true); + // } + // }, [searchParams, libracartCode]); + + useEffect(() => { + let code = new URLSearchParams(window.location.search).get("state"); // this is the account_code + let auth = new URLSearchParams(window.location.search).get("authorization_token"); // this is the authorization used to verify where it came from + + if (code && auth) { + setLibraCartCode(code); + setLibraCartAuth(auth); + setOpenDialog(true); + } + }, [window.location]); + + const validate = () => { + let invalid = false; + if (libracartUsername === "" || teamKey === "" || primaryUser === "" || libracartCode === "") { + invalid = true; + } + return invalid; + }; + + const general = () => { + return ( + + setLibraCartUserName(e.target.value)} + /> + + setPrimaryUser(e.target.value)}> + {teamUsers.map(u => ( + + + + + + + {u.name()} + + + + ))} + + + + + ); + }; + + const newOrgDialog = () => { + return ( + { + setOpenDialog(false); + }}> + Enter New Integration Link + {general()} + + + + + + ); + }; + + return ( + + + To integrate with Libra Cart, navigate to Integrations page on Libra Cart and "Connect" to + Adaptive Agriculture App: https://staging.cloud.agrimatics.com/grain/integrations + {newOrgDialog()} + + ); +} diff --git a/src/navigation/Router.tsx b/src/navigation/Router.tsx index 6fa48c8..afe12c5 100644 --- a/src/navigation/Router.tsx +++ b/src/navigation/Router.tsx @@ -46,6 +46,7 @@ const Contracts = lazy(() => import("pages/Contracts")); const Contract = lazy(() => import("pages/Contract")); const JohnDeere = lazy(() => import("pages/JohnDeere")); const CNHi = lazy(() => import("pages/CNHi")); +const LibraCart = lazy(() => import("pages/LibraCart")); export const appendToUrl = (appendage: number | string) => { const basePath = location.pathname.replace(/\/$/, ""); @@ -340,6 +341,9 @@ export default function Router() { {user.hasFeature("cnhi") && } /> } + {user.hasFeature("libra-cart") && + } /> + } {/* Map routes */} } /> } /> diff --git a/src/navigation/SideNavigator.tsx b/src/navigation/SideNavigator.tsx index 86f823f..ade8daa 100644 --- a/src/navigation/SideNavigator.tsx +++ b/src/navigation/SideNavigator.tsx @@ -48,6 +48,7 @@ import DataDuckIcon from "products/Bindapt/DataDuckIcon"; import ContractsIcon from "products/CommonIcons/contractIcon"; import JohnDeereIcon from "products/CommonIcons/johnDeereIcon"; import CNHiIcon from "products/CommonIcons/cnhiIcon"; +import LibraCartIcon from "products/CommonIcons/libracartIcon"; const drawerWidth = 230; @@ -477,6 +478,20 @@ export default function SideNavigator(props: Props) { {open && } + } + {user.hasFeature("libra-cart") && + + goTo("/libracart")} + classes={getClasses("/libracart")} + > + + + + {open && } + + } ) diff --git a/src/pages/CNHi.tsx b/src/pages/CNHi.tsx index 24be24c..260d614 100644 --- a/src/pages/CNHi.tsx +++ b/src/pages/CNHi.tsx @@ -20,7 +20,7 @@ import PageContainer from "./PageContainer"; export default function CNHi() { const [currentOrg, setCurrentOrg] = useState(""); const cnhiAPI = useCNHiProxyAPI(); - const [organizations, setOrganizations] = useState>(new Map()); + const [organizations, setOrganizations] = useState>(new Map()); const [fieldAccordion, setFieldAccordion] = useState(false); const [dataOptions, setDataOptions] = useState([]); const [{ as }] = useGlobalState(); diff --git a/src/pages/LibraCart.tsx b/src/pages/LibraCart.tsx new file mode 100644 index 0000000..5fc06eb --- /dev/null +++ b/src/pages/LibraCart.tsx @@ -0,0 +1,148 @@ +import { + Accordion, + AccordionDetails, + AccordionSummary, + Box, + Button, + Checkbox, + FormControlLabel, + Grid2 as Grid, + MenuItem, + Select +} from "@mui/material"; +import { ExpandMore } from "@mui/icons-material"; +import LibraCartAccess from "integrations/LibraCart/LibraCartAccess"; +import { pond } from "protobuf-ts/pond"; +import { useGlobalState } from "providers"; +import { useLibraCartProxyAPI } from "providers/pond/libracartProxyAPI"; +import React, { useEffect, useState } from "react"; +import PageContainer from "./PageContainer"; + +export default function LibraCart() { + const [currentOrg, setCurrentOrg] = useState(""); + const libracartAPI = useLibraCartProxyAPI(); + const [organizations, setOrganizations] = useState>(new Map()); + const [fieldAccordion, setFieldAccordion] = useState(false); + const [dataOptions, setDataOptions] = useState([]); + const [{ as }] = useGlobalState(); + + //load organizations for the user + useEffect(() => { + setCurrentOrg(""); + libracartAPI + .listAccounts(0, 0, as) + .then(resp => { + let tempOrgs: Map = new Map(); + resp.data.accounts.forEach(org => { + let organization = pond.JDAccount.fromObject(org); + tempOrgs.set(organization.key, organization); + }); + setOrganizations(tempOrgs); + }) + .catch(err => {}); + }, [libracartAPI, as]); + + useEffect(() => { + let organization = organizations.get(currentOrg); + if (organization) { + let currentOptions: pond.DataOption[] = organization.options ?? []; + setDataOptions(currentOptions); + } + }, [currentOrg, organizations]); + + const updateOrgData = (checked: boolean, option: pond.DataOption) => { + let currentOps: pond.DataOption[] = dataOptions; + if (checked && !currentOps.includes(option)) { + currentOps.push(option); + } else if (!checked && currentOps.includes(option)) { + currentOps.splice(currentOps.indexOf(option), 1); + } + setDataOptions([...currentOps]); + }; + + const submit = () => { + libracartAPI.updateAccount(currentOrg, dataOptions, as ?? undefined).then(resp => { + //update the organization in the map to have the correct dataOptions + let org = organizations.get(currentOrg); + if (org) { + org.options = dataOptions; + } + }); + }; + + const fieldOptions = () => { + return ( + + { + setFieldAccordion(expanded); + }}> + }>Field Data + + + + { + //setFields(!fields); + updateOrgData(checked, pond.DataOption.DATA_OPTION_FIELDS); + }} + /> + } + /> + + + View your data from Libra Cart on your visual Farm + + + + + + ); + }; + return ( + + + + + + + + + + + {fieldOptions()} + + ); +} diff --git a/src/pages/Users.tsx b/src/pages/Users.tsx index 296c60a..45dd476 100644 --- a/src/pages/Users.tsx +++ b/src/pages/Users.tsx @@ -128,7 +128,8 @@ export default function Users() { "developer", "marketplace", "installer", - "cnhi" + "cnhi", + "libracart" ].sort(); const [rows, setRows] = useState([]) diff --git a/src/products/CommonIcons/libracartIcon.tsx b/src/products/CommonIcons/libracartIcon.tsx new file mode 100644 index 0000000..c71c55a --- /dev/null +++ b/src/products/CommonIcons/libracartIcon.tsx @@ -0,0 +1,24 @@ +// update logo images when they share official black and white +import LibraCartLogoWhite from "assets/marketplaceImages/LibraCartGrey.png"; +import LibraCartLogoBlack from "assets/marketplaceImages/LibraCartGrey.png"; +import { ImgIcon } from "common/ImgIcon"; +import { useThemeType } from "hooks"; + +interface Props { + type?: "light" | "dark"; +} + +export default function LibraCartIcon(props: Props) { + const themeType = useThemeType(); + const { type } = props; + + const src = () => { + if (type) { + return type === "light" ? LibraCartLogoWhite : LibraCartLogoBlack; + } + + return themeType === "light" ? LibraCartLogoBlack : LibraCartLogoWhite; + }; + + return ; +} \ No newline at end of file diff --git a/src/providers/index.ts b/src/providers/index.ts index 9689df0..cede030 100644 --- a/src/providers/index.ts +++ b/src/providers/index.ts @@ -45,7 +45,8 @@ export { useFileControllerAPI, useContractAPI, //TODO: update api with resolve, reject useJohnDeereProxyAPI, //TODO: update api with resolve, reject - useCNHiProxyAPI //TODO: update api with resolve, reject + useCNHiProxyAPI, //TODO: update api with resolve, reject + useLibraCartProxyAPI //TODO: update api with resolve, reject } from "./pond/pond"; // export { SecurityContext, useSecurity } from "./security"; export { SnackbarContext, useSnackbar } from "./Snackbar"; diff --git a/src/providers/pond/libracartProxyAPI.tsx b/src/providers/pond/libracartProxyAPI.tsx new file mode 100644 index 0000000..3b056c1 --- /dev/null +++ b/src/providers/pond/libracartProxyAPI.tsx @@ -0,0 +1,137 @@ +import { AxiosResponse } from "axios"; +import { useHTTP } from "hooks"; +import { pond } from "protobuf-ts/pond"; +import React, { createContext, PropsWithChildren, useContext } from "react"; +//import { or } from "utils"; +import { pondURL } from "./pond"; + +export interface ILibraCartProxyAPIContext { + //add new organization + addAccount: ( + teamKey: string, + userID: string, + libracartCode: string, + libracartAuth: string, + libracartUsername: string + ) => Promise>; + //list organizations + listAccounts: ( + limit: number, + offset: number, + as?: string, + keys?: string[], + types?: string[] + ) => Promise>; + updateAccount: ( + key: string, + options: pond.DataOption[], + as?: string + ) => Promise>; + listFields: ( + limit: number, + offset: number, + // order?: "asc" | "desc", + // orderBy?: string, + // search?: string, + as?: string, + asRoot?: boolean + ) => Promise>; +} + +export const LibraCartProxyAPIContext = createContext( + {} as ILibraCartProxyAPIContext +); + +interface Props {} + +export default function LibraCartProvider(props: PropsWithChildren) { + const { children } = props; + const { post, get, put } = useHTTP(); + + const addAccount = ( + teamKey: string, + userID: string, + libracartCode: string, + libracartAuth: string, + libracartUsername: string + ) => { + return post( + pondURL( + "/libracartAccounts?team=" + + teamKey + + "&user=" + + userID + + "&code=" + + libracartCode + + "&auth=" + + libracartAuth + + "&libracartUsername=" + + libracartUsername + ) + ); + }; + + const listAccounts = ( + limit: number, + offset: number, + as?: string, + keys?: string[], + types?: string[] + ) => { + return get( + pondURL( + "/libracartAccounts?limit=" + + limit + + "&offset=" + + offset + + (as ? "&as=" + as : "") + + (keys ? "&keys=" + keys.join(",") : "") + + (types ? "&types=" + types.join(",") : "") + ) + ); + }; + + const listFields = ( + limit: number, + offset: number, + // order?: "asc" | "desc", + // orderBy?: string, + // search?: string, + as?: string, + asRoot?: boolean + ) => { + return get( + pondURL( + "/libracartFields" + + "?limit=" + + limit + + "&offset=" + + offset + + (as ? "&as=" + as : "") + + (asRoot ? "&asRoot=" + asRoot.toString() : "") + ) + ); + }; + + const updateAccount = (key: string, options: pond.DataOption[], as?: string) => { + return put( + pondURL( + "/libracartAccounts/" + key + "?options=" + options.toString() + (as ? "&as=" + as : "") + ) + ); + }; + + return ( + + {children} + + ); +} + +export const useLibraCartProxyAPI = () => useContext(LibraCartProxyAPIContext); diff --git a/src/providers/pond/pond.tsx b/src/providers/pond/pond.tsx index 8e879f9..0efc34d 100644 --- a/src/providers/pond/pond.tsx +++ b/src/providers/pond/pond.tsx @@ -35,6 +35,7 @@ import ContractProvider, { useContractAPI } from "./contractAPI"; import UsageProvider, { useUsageAPI } from "./usageAPI"; import KeyManagerProvider, { useKeyManagerAPI } from "./keyManagerAPI"; import JohnDeereProvider, { useJohnDeereProxyAPI } from "./johnDeereProxyAPI"; +import LibraCartProvider, { useLibraCartProxyAPI } from "./libracartProxyAPI"; import CNHiProvider, { useCNHiProxyAPI } from "./cnhiProxyAPI"; // import NoteProvider from "providers/noteAPI"; @@ -86,11 +87,13 @@ export default function PondProvider(props: PropsWithChildren) { - - - {children} - - + + + + {children} + + + @@ -163,5 +166,6 @@ export { useUsageAPI, useKeyManagerAPI, useJohnDeereProxyAPI, - useCNHiProxyAPI + useCNHiProxyAPI, + useLibraCartProxyAPI }; diff --git a/src/userFeatures/UserFeatures.tsx b/src/userFeatures/UserFeatures.tsx index 85df209..c61cebc 100644 --- a/src/userFeatures/UserFeatures.tsx +++ b/src/userFeatures/UserFeatures.tsx @@ -5,6 +5,7 @@ import { useSnackbar, useUserAPI } from "hooks"; import React, { useEffect, useState } from "react"; import JohnDeereIcon from "products/CommonIcons/johnDeereIcon"; import CNHiIcon from "products/CommonIcons/cnhiIcon"; +import LibraCartIcon from "products/CommonIcons/libracartIcon"; //import AgLogo from "assets/whitelabels/AdaptiveAgriculture/AGLogoSquare.png"; import { IsAdaptiveAgriculture @@ -60,6 +61,14 @@ const agFeatureList: ProductDetails[] = [ "Integrate with the Case New Holland Industrial Center to bring your data into our platform" // bulletPoints: ["bullet one", "bullet two"], // questions: [], + }, + { + featureName: "libra-cart", + featureLogo: , + featureCost: 0, + cardImage: FeatureImageTest, + featureTitle: "Libra Cart", + longDescription: "Integrate with Libra Cart to bring your data into our platform" } ];