Merge branch 'staging_environment' into libracart

This commit is contained in:
csawatzky 2025-08-06 11:00:20 -06:00
commit e5300b19f4
3 changed files with 211 additions and 57 deletions

View file

@ -6,7 +6,7 @@ import {
DialogActions, DialogActions,
DialogContent, DialogContent,
DialogTitle, DialogTitle,
Grid, Grid2 as Grid,
InputAdornment, InputAdornment,
MenuItem, MenuItem,
Slider, Slider,
@ -19,7 +19,7 @@ import { DevicePreset } from "models/DevicePreset";
import { ObjectTypeString } from "objects/ObjectDescriber"; import { ObjectTypeString } from "objects/ObjectDescriber";
import { pond } from "protobuf-ts/pond"; import { pond } from "protobuf-ts/pond";
import { useSnackbar } from "providers"; import { useSnackbar } from "providers";
// import { useDevicePresetAPI } from "providers/pond/devicePresetAPI"; import { useDevicePresetAPI } from "providers/pond/devicePresetAPI";
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { getTemperatureUnit } from "utils"; import { getTemperatureUnit } from "utils";
@ -43,7 +43,7 @@ export default function DevicePresetCard(props: Props) {
removeCallback, removeCallback,
updateCallback updateCallback
} = props; } = props;
// const devicePresetAPI = useDevicePresetAPI(); const devicePresetAPI = useDevicePresetAPI();
const [presetName, setPresetName] = useState(""); const [presetName, setPresetName] = useState("");
const [presetType, setPresetType] = useState<pond.PresetType>(1); const [presetType, setPresetType] = useState<pond.PresetType>(1);
const [controllerType, setControllerType] = useState<pond.ControllerType>(1); const [controllerType, setControllerType] = useState<pond.ControllerType>(1);
@ -81,22 +81,22 @@ export default function DevicePresetCard(props: Props) {
p.settings.temperature = tempC; p.settings.temperature = tempC;
p.settings.humidity = hum; p.settings.humidity = hum;
// devicePresetAPI devicePresetAPI
// .addDevicePreset(p.name, p.settings, objectKey, typestring) .addDevicePreset(p.name, p.settings, objectKey, typestring)
// .then(resp => { .then(resp => {
// //get the temp key from the preset //get the temp key from the preset
// let temp = p.key; let temp = p.key;
// //update the key in the preset with the key that came back from the add //update the key in the preset with the key that came back from the add
// p.key = resp.data.key; p.key = resp.data.key;
// //use the callback function passing in the preset and the temp key //use the callback function passing in the preset and the temp key
// if (addCallback) { if (addCallback) {
// addCallback(p, temp); addCallback(p, temp);
// } }
// openSnack("New preset saved"); openSnack("New preset saved");
// }) })
// .catch(err => { .catch(err => {
// openSnack("Failed to save new preset"); openSnack("Failed to save new preset");
// }); });
}; };
const updatePreset = () => { const updatePreset = () => {
@ -108,32 +108,32 @@ export default function DevicePresetCard(props: Props) {
newPreset.settings.temperature = tempC; newPreset.settings.temperature = tempC;
newPreset.settings.humidity = hum; newPreset.settings.humidity = hum;
// devicePresetAPI devicePresetAPI
// .updateDevicePreset(newPreset.key, newPreset.name, newPreset.settings) .updateDevicePreset(newPreset.key, newPreset.name, newPreset.settings)
// .then(resp => { .then(resp => {
// if (updateCallback) { if (updateCallback) {
// updateCallback(oldPreset, newPreset); updateCallback(oldPreset, newPreset);
// } }
// openSnack("Preset Updated"); openSnack("Preset Updated");
// }) })
// .catch(err => { .catch(err => {
// openSnack("There was a problem updating the preset"); openSnack("There was a problem updating the preset");
// }); });
}; };
const removePreset = () => { const removePreset = () => {
// devicePresetAPI devicePresetAPI
// .removeDevicePreset(preset.key) .removeDevicePreset(preset.key)
// .then(resp => { .then(resp => {
// openSnack("Preset has been deleted"); openSnack("Preset has been deleted");
// setOpenDeleteConfirmation(false); setOpenDeleteConfirmation(false);
// if (removeCallback) { if (removeCallback) {
// removeCallback(preset); removeCallback(preset);
// } }
// }) })
// .catch(err => { .catch(err => {
// openSnack("There was a problem deleting this preset"); openSnack("There was a problem deleting this preset");
// }); });
}; };
const deleteConfirmation = () => { const deleteConfirmation = () => {
@ -192,7 +192,7 @@ export default function DevicePresetCard(props: Props) {
<Card raised style={{ padding: 10, width: "100%" }}> <Card raised style={{ padding: 10, width: "100%" }}>
{deleteConfirmation()} {deleteConfirmation()}
<Grid container direction="row" alignContent="center" alignItems="center"> <Grid container direction="row" alignContent="center" alignItems="center">
<Grid item xs={12} sm={6}> <Grid size={{xs:12, sm:6}}>
<TextField <TextField
variant="outlined" variant="outlined"
margin="normal" margin="normal"
@ -203,7 +203,7 @@ export default function DevicePresetCard(props: Props) {
}} }}
/> />
</Grid> </Grid>
<Grid item xs={12} sm={6}> <Grid size={{xs:12, sm:6}}>
{presetType !== pond.PresetType.PRESET_TYPE_UNKNOWN && {presetType !== pond.PresetType.PRESET_TYPE_UNKNOWN &&
controllerType !== pond.ControllerType.CONTROLLER_TYPE_UNKNOWN && ( controllerType !== pond.ControllerType.CONTROLLER_TYPE_UNKNOWN && (
<Box paddingLeft={2}> <Box paddingLeft={2}>
@ -216,7 +216,7 @@ export default function DevicePresetCard(props: Props) {
</Box> </Box>
)} )}
</Grid> </Grid>
<Grid item xs={6}> <Grid size={6}>
{/* type */} {/* type */}
<TextField <TextField
style={{ width: "100%", marginRight: 5 }} style={{ width: "100%", marginRight: 5 }}
@ -250,7 +250,7 @@ export default function DevicePresetCard(props: Props) {
</MenuItem> </MenuItem>
</TextField> </TextField>
</Grid> </Grid>
<Grid item xs={6}> <Grid size={6}>
{/* controller type */} {/* controller type */}
<TextField <TextField
style={{ width: "100%", marginLeft: 5 }} style={{ width: "100%", marginLeft: 5 }}
@ -281,7 +281,7 @@ export default function DevicePresetCard(props: Props) {
</Grid> </Grid>
{/* temp slider */} {/* temp slider */}
{isMobile ? ( {isMobile ? (
<Grid item xs={12}> <Grid size={12}>
<Box <Box
display="flex" display="flex"
alignContent="center" alignContent="center"
@ -338,10 +338,10 @@ export default function DevicePresetCard(props: Props) {
</Grid> </Grid>
) : ( ) : (
<React.Fragment> <React.Fragment>
<Grid item xs={2}> <Grid size={2}>
<Typography>Temperature</Typography> <Typography>Temperature</Typography>
</Grid> </Grid>
<Grid item xs={7}> <Grid size={7}>
<Box paddingRight={2}> <Box paddingRight={2}>
<Slider <Slider
//orientation="vertical" //orientation="vertical"
@ -362,7 +362,7 @@ export default function DevicePresetCard(props: Props) {
/> />
</Box> </Box>
</Grid> </Grid>
<Grid item xs={3}> <Grid size={3}>
<TextField <TextField
style={{ width: "100%" }} style={{ width: "100%" }}
margin="dense" margin="dense"
@ -395,7 +395,7 @@ export default function DevicePresetCard(props: Props) {
)} )}
{/* humidity slider */} {/* humidity slider */}
{isMobile ? ( {isMobile ? (
<Grid item xs={12}> <Grid size={12}>
<Box <Box
display="flex" display="flex"
alignContent="center" alignContent="center"
@ -437,10 +437,10 @@ export default function DevicePresetCard(props: Props) {
</Grid> </Grid>
) : ( ) : (
<React.Fragment> <React.Fragment>
<Grid item xs={2}> <Grid size={2}>
<Typography>Humidity</Typography> <Typography>Humidity</Typography>
</Grid> </Grid>
<Grid item xs={7}> <Grid size={7}>
<Box paddingRight={2}> <Box paddingRight={2}>
<Slider <Slider
//orientation="vertical" //orientation="vertical"
@ -456,7 +456,7 @@ export default function DevicePresetCard(props: Props) {
/> />
</Box> </Box>
</Grid> </Grid>
<Grid item xs={3}> <Grid size={3}>
<TextField <TextField
style={{ width: "100%" }} style={{ width: "100%" }}
margin="dense" margin="dense"

View file

@ -0,0 +1,150 @@
import { useHTTP } from "hooks";
import { createContext, PropsWithChildren, useContext } from "react";
import { pond } from "protobuf-ts/pond";
import { pondURL } from "./pond";
import { AxiosResponse } from "axios";
import { useGlobalState } from "providers";
export interface IDevicePresetInterface {
//add
addDevicePreset: (
name: string,
settings: pond.DevicePresetSettings,
parentKey?: string,
parentTypes?: string
) => Promise<AxiosResponse<pond.AddDevicePresetResponse>>;
//list
listDevicePresets: (
limit: number,
offset: number,
order?: "asc" | "desc",
orderBy?: string,
search?: string,
keys?: string[],
types?: string[]
) => Promise<AxiosResponse<pond.ListDevicePresetResponse>>;
//update
updateDevicePreset: (
key: string,
name: string,
settings: pond.DevicePresetSettings
) => Promise<AxiosResponse<pond.UpdateDevicePresetResponse>>;
//remove
removeDevicePreset: (key: string) => Promise<AxiosResponse<pond.DeleteDevicePresetResponse>>;
//get
getDevicePreset: (key: string) => Promise<AxiosResponse<pond.GetDevicePresetResponse>>;
}
export const DevicePresetAPIcontext = createContext<IDevicePresetInterface>(
{} as IDevicePresetInterface
);
interface Props {}
export default function DevicePresetProvider(props: PropsWithChildren<Props>) {
const { children } = props;
const { get, del, post, put } = useHTTP();
const [{ as }] = useGlobalState();
//add
const addDevicePreset = (
name: string,
settings: pond.DevicePresetSettings,
parentKey?: string,
parentType?: string
) => {
let key = "";
let type = "";
if (parentKey && parentType) {
key = "&parentKey=" + parentKey;
type = "&parentType=" + parentType;
}
if (as) {
return post<pond.AddDevicePresetResponse>(
pondURL("/devicePreset?name=" + name + "&as=" + as + key + type),
settings
);
}
return post<pond.AddDevicePresetResponse>(
pondURL("/devicePreset?name=" + name + key + type),
settings
);
};
//list
const listDevicePresets = (
limit: number,
offset: number,
order?: "asc" | "desc",
orderBy?: string,
search?: string,
keys?: string[],
types?: string[]
) => {
let asText = "";
if (as) asText = "&as=" + as;
return get<pond.ListDevicePresetResponse>(
pondURL(
"/devicePresets?limit=" +
limit +
"&offset=" +
offset +
("&order=" + (order ? order : "asc")) +
("&by=" + (orderBy ? orderBy : "key")) +
(search ? "&search=" + search : "") +
(keys ? "&keys=" + keys.toString() : "") +
(types ? "&types=" + types.toString() : "") +
asText
)
);
};
//update
const updateDevicePreset = (key: string, name: string, settings: pond.DevicePresetSettings) => {
if (as) {
return put<pond.UpdateDevicePresetResponse>(
pondURL("/devicePreset/" + key + "?as=" + as + "&name=" + name),
settings
);
}
return put<pond.UpdateDevicePresetResponse>(
pondURL("/devicePreset/" + key + "?name=" + name),
settings
);
};
//remove
const removeDevicePreset = (key: string) => {
if (as) {
return del<pond.DeleteDevicePresetResponse>(pondURL("/devicePreset/" + key + "?as=" + as));
}
return del<pond.DeleteDevicePresetResponse>(pondURL("/devicePreset/" + key + "?as=" + as));
};
//get
const getDevicePreset = (key: string) => {
if (as) {
return del<pond.GetDevicePresetResponse>(pondURL("/devicePreset/" + key + "?as=" + as));
}
return del<pond.GetDevicePresetResponse>(pondURL("/devicePreset/" + key + "?as=" + as));
};
return (
<DevicePresetAPIcontext.Provider
value={{
//add
addDevicePreset,
//list
listDevicePresets,
//update
updateDevicePreset,
//remove
removeDevicePreset,
//get
getDevicePreset
}}>
{children}
</DevicePresetAPIcontext.Provider>
);
}
export const useDevicePresetAPI = () => useContext(DevicePresetAPIcontext);

View file

@ -37,6 +37,7 @@ import KeyManagerProvider, { useKeyManagerAPI } from "./keyManagerAPI";
import JohnDeereProvider, { useJohnDeereProxyAPI } from "./johnDeereProxyAPI"; import JohnDeereProvider, { useJohnDeereProxyAPI } from "./johnDeereProxyAPI";
import LibraCartProvider, { useLibraCartProxyAPI } from "./libracartProxyAPI"; import LibraCartProvider, { useLibraCartProxyAPI } from "./libracartProxyAPI";
import CNHiProvider, { useCNHiProxyAPI } from "./cnhiProxyAPI"; import CNHiProvider, { useCNHiProxyAPI } from "./cnhiProxyAPI";
import DevicePresetProvider, { useDevicePresetAPI } from "./devicePresetAPI";
// import NoteProvider from "providers/noteAPI"; // import NoteProvider from "providers/noteAPI";
export const pondURL = (partial: string, demo: boolean = false): string => { export const pondURL = (partial: string, demo: boolean = false): string => {
@ -90,7 +91,9 @@ export default function PondProvider(props: PropsWithChildren<any>) {
<LibraCartProvider> <LibraCartProvider>
<UsageProvider> <UsageProvider>
<KeyManagerProvider> <KeyManagerProvider>
<DevicePresetProvider>
{children} {children}
</DevicePresetProvider>
</KeyManagerProvider> </KeyManagerProvider>
</UsageProvider> </UsageProvider>
</LibraCartProvider> </LibraCartProvider>
@ -167,5 +170,6 @@ export {
useKeyManagerAPI, useKeyManagerAPI,
useJohnDeereProxyAPI, useJohnDeereProxyAPI,
useCNHiProxyAPI, useCNHiProxyAPI,
useLibraCartProxyAPI useLibraCartProxyAPI,
useDevicePresetAPI
}; };