/* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). You * may not use this file except in compliance with the License. A copy of * the License is located at * * http://aws.amazon.com/apache2.0/ * * or in the "license" file accompanying this file. This file is * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF * ANY KIND, either express or implied. See the License for the specific * language governing permissions and limitations under the License. */ import { IStateDB } from "@jupyterlab/coreutils"; import { ReadonlyJSONObject } from "@phosphor/coreutils"; import * as React from "react"; import { requestAPIServer } from "../sagemaker-studio-autoshutdown"; import { runSidebarSectionClass, sidebarButtonClass, alertAreaClass } from "../style/SettingsPanel"; import { AlertProps } from "./Alert"; import { InputColumn, LabeledTextInput } from "./InputColumn"; import { LabeledCheckboxInput } from "./InputCheckbox"; import { Alert } from "./Alert" const KEY = "sagemaker-auto-shutdown:settings:data"; /** Interface for AutoShutDownPanel component props */ export interface IAutoShutDownPanelProps { stateDB: IStateDB; } interface PersistentState { IDLE_TIME: number; keepTerminals: boolean; } interface IAutoShutDownPanelState extends PersistentState { alerts: (AlertProps & { key: string })[]; } /** A React component for the autoshutdown extension's main display */ export class AutoShutDownPanel extends React.Component< IAutoShutDownPanelProps, IAutoShutDownPanelState > { constructor(props: IAutoShutDownPanelProps) { super(props); this.state = { IDLE_TIME: 120, keepTerminals: false, alerts: [], }; this.loadState(); } /** * Renders the component. * * @returns React element */ render = (): React.ReactElement => { const notebookIndependent =
{this.renderViewButtons()}
; return
{notebookIndependent}
; }; private renderViewButtons() { return (
{this.state.alerts.map((alert) => ( ))}
); } private onIdleTimeChange = ( event: React.ChangeEvent ): void => { if(isNaN(Number(event.target.value)) || isNaN(parseInt(event.target.value))) { event.target.value=this.state.IDLE_TIME.toString(); } const valid = event.target.validity.valid; if(!valid) { event.target.value=this.state.IDLE_TIME.toString(); } this.setState({ IDLE_TIME: parseInt(event.target.value), keepTerminals: this.state.keepTerminals }, () => this.saveState()); }; private onKeepTerminalChange = ( event: React.ChangeEvent ): void => { console.log(event.target.checked); const newState = { IDLE_TIME: this.state.IDLE_TIME, keepTerminals: event.target.checked }; this.setState(newState, () => this.saveState()); }; private handleSubmit = async (): Promise => { console.log("Updating settings!!!"); console.log("Idle Time value to update is : " + this.state.IDLE_TIME); console.log("keep terminal : " + this.state.keepTerminals); const dataToSend = { idle_time: this.state.IDLE_TIME, keep_terminals: this.state.keepTerminals }; this.clearAlerts(); try { const reply = await requestAPIServer("settings", { body: JSON.stringify(dataToSend), method: "POST", }); console.log(reply); this.addAlert({ message: `Updated settings` }); } catch (reason) { console.error( `Error on POST /sagemaker-studio-autoshutdown/settings ${dataToSend}.\n${reason}` ); this.addAlert({ type: "error", message: `Error updating settings! "`, }); } setInterval(() => this.clearAlerts(), 5000); }; private alertKey = 0; private addAlert(alert: AlertProps) { const key = this.alertKey++; const keyedAlert: AlertProps & { key: string } = { ...alert, key: `alert-${key}`, }; this.setState({ alerts: [keyedAlert] }); } private clearAlerts() { this.setState({ alerts: [] }); } private saveState() { const state = { IDLE_TIME: this.state.IDLE_TIME, keepTerminals: this.state.keepTerminals }; console.log('save state', state) this.props.stateDB.save(KEY, state); } private loadState() { this.props.stateDB.fetch(KEY).then((s) => { const state = s as ReadonlyJSONObject; console.log('load state: ', state) if (state) { this.setState({ IDLE_TIME: state["IDLE_TIME"] as number, keepTerminals: state["keepTerminals"] as boolean }); } }); } }