frontend/src/integrations/LibraCart/LibraCartAccess.tsx

220 lines
6.7 KiB
TypeScript

import { Help } from "@mui/icons-material";
import {
Avatar,
Box,
Button,
DialogActions,
DialogContent,
DialogTitle,
Grid2 as Grid,
MenuItem,
TextField,
Tooltip,
Typography
} from "@mui/material";
import ResponsiveDialog from "common/ResponsiveDialog";
import { teamScope, User } from "models";
import { pond } from "protobuf-ts/pond";
import { useGlobalState, useSnackbar, useUserAPI } from "providers";
import { useLibraCartProxyAPI } from "providers/pond/libracartProxyAPI";
import React, { useEffect, useState } from "react";
import TeamSearch from "teams/TeamSearch";
export default function LibraCartAccess() {
const [openDialog, setOpenDialog] = useState(false);
const [teamKey, setTeamKey] = useState("");
const [teamUsers, setTeamUsers] = useState<User[]>([]);
const [primaryUser, setPrimaryUser] = useState("");
const [libracartUsername, setLibraCartUserName] = useState("");
const [libracartCode, setLibraCartCode] = useState<string | null>("");
const [libracartAuth, setLibraCartAuth] = useState<string | null>("");
//const [activeStep, setActiveStep] = useState<number>(0);
const userAPI = useUserAPI();
const libracartAPI = useLibraCartProxyAPI();
//const [dataOps, setDataOps] = useState<pond.DataOption[]>([]);
const { openSnack } = useSnackbar();
const [{ as }] = useGlobalState();
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 (
<Box>
<TextField
margin="dense"
label="Libra Cart Email"
fullWidth
variant="outlined"
value={libracartUsername}
onChange={e => setLibraCartUserName(e.target.value)}
/>
<TeamSearch label="Team" setTeamCallback={setTeamKey} />
<TextField
disabled={teamKey === ""}
margin="dense"
label="Primary User"
select
fullWidth
variant="outlined"
value={primaryUser}
onChange={e => setPrimaryUser(e.target.value)}>
{teamUsers.map(u => (
<MenuItem key={u.id()} value={u.id()}>
<Grid container direction="row" alignItems="center">
<Grid>
<Avatar
alt={u.name()}
src={
u.settings.avatar && u.settings.avatar !== "" ? u.settings.avatar : undefined
}
/>
</Grid>
<Grid>
<Box marginLeft={2}>{u.name()}</Box>
</Grid>
</Grid>
</MenuItem>
))}
</TextField>
<TextField
margin="dense"
label="code"
disabled
fullWidth
variant="outlined"
value={libracartCode}
/>
<TextField
margin="dense"
label="authorization token"
disabled
fullWidth
variant="outlined"
value={libracartAuth}
/>
</Box>
);
};
const newOrgDialog = () => {
return (
<ResponsiveDialog
open={openDialog}
onClose={() => {
setOpenDialog(false);
}}>
<DialogTitle>Enter New Integration Link</DialogTitle>
<DialogContent>{general()}</DialogContent>
<DialogActions>
<Button
onClick={() => {
setOpenDialog(false);
}}>
Close
</Button>
<Button
disabled={validate()}
onClick={submitNewOrganization}
variant="contained"
color="primary">
Submit
</Button>
</DialogActions>
</ResponsiveDialog>
);
};
return (
<Box style={{ padding: 10 }}>
<Grid container direction="row" alignContent="center" alignItems="center" wrap="nowrap" width="100%" justifyContent="space-between">
<Grid container direction="row" alignContent="center" alignItems="center" wrap="nowrap">
<Grid>
<Button
variant="contained"
color="primary"
onClick={e => {
e.preventDefault();
window.open(`https://cloud.agrimatics.com/grain/integrations`, "_blank");
}}>
Link Libra Cart Account
</Button>
</Grid>
<Grid>
<Tooltip
title='The integration can be found by selecting my account in the corner,
selecting the "Manage Account" option and then selecting integrations in the left side menu'>
<Help />
</Tooltip>
</Grid>
</Grid>
<Grid>
<Tooltip title={"This will Sync the data for all Libra Cart accounts linked to " + (as ? "this team" : "your account")}>
<Button
variant="contained"
color="primary"
onClick={e => {
libracartAPI.syncData().then(resp => {}).catch(err => {})
}}>
Sync
</Button>
</Tooltip>
</Grid>
</Grid>
<Box paddingTop={2}>
<Typography>
Libra Cart data will sync every 6 hours, if the data is needed immediately you can select the Sync button. It may take up to 15 minutes for the data to appear in our platform.
</Typography>
</Box>
{newOrgDialog()}
</Box>
);
}