220 lines
6.7 KiB
TypeScript
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://staging.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 LibraCart 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>
|
|
LibraCart 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>
|
|
);
|
|
}
|