import { CodeJarEditor } from "../../../elements/CodeJar/CodeJarEditor"; import { Component, JSX, render } from "preact"; import { Page } from "../../../types/Page"; import { SecretTitleElement } from "../SecretTitleElement"; import { createOrUpdateSecret } from "../../../api/kv/createOrUpdateSecret"; import { getSecret } from "../../../api/kv/getSecret"; import { setErrorText } from "../../../pageUtils"; import { sortedObjectMap, verifyJSONString } from "../../../utils"; import i18next from "i18next"; //import { highlightElement } from "prismjs"; export type KVEditProps = { page: Page; }; type KVEditState = | { dataLoaded: false; } | { dataLoaded: true; kvData: Record; code: string; }; export class KVEditor extends Component { constructor() { super(); this.state = { dataLoaded: false, }; } async editorSave(): Promise { if (!this.state.dataLoaded) return; const editorContent = this.state.code; if (!verifyJSONString(editorContent)) { setErrorText(i18next.t("kv_sec_edit_invalid_json_err")); return; } await createOrUpdateSecret( this.props.page.state.baseMount, this.props.page.state.secretMountType, this.props.page.state.secretPath, this.props.page.state.secretItem, JSON.parse(editorContent), ); await this.props.page.router.changePage("KEY_VALUE_SECRET"); } onCodeUpdate(code: string): void { this.setState({ code: code, }); } loadData(): void { void getSecret( this.props.page.state.baseMount, this.props.page.state.secretMountType, this.props.page.state.secretPath, this.props.page.state.secretItem, ).then((kvData) => { this.setState({ dataLoaded: true, kvData: kvData, }); }); return; } componentDidMount(): void { if (!this.state.dataLoaded) { this.loadData(); } } render(): JSX.Element { if (!this.state.dataLoaded) { return

{i18next.t("kv_sec_edit_loading")}

; } const secretsJSON = JSON.stringify( Object.fromEntries(sortedObjectMap(this.state.kvData)), null, 4, ); return (

{}} code={secretsJSON} onUpdate={(code) => this.onCodeUpdate(code)} />

); } } export class KeyValueSecretEditPage extends Page { constructor() { super(); } async goBack(): Promise { await this.router.changePage("KEY_VALUE_SECRET"); } async render(): Promise { render(, this.router.pageContentElement); } async renderPageTitle(): Promise { render( , this.router.pageTitleElement, ); } get name(): string { return i18next.t("kv_sec_edit_title"); } }