/* Copyright 2024 New Vector Ltd. Copyright 2017-2021 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ import React, { ChangeEvent } from "react"; import { _t } from "../../../languageHandler"; import Field from "./Field"; import AccessibleButton, { ButtonEvent } from "./AccessibleButton"; interface IItemProps { index: number; value?: string; onRemove?(index: number): void; } interface IItemState { verifyRemove: boolean; } export class EditableItem extends React.Component { public state = { verifyRemove: false, }; private onRemove = (e: ButtonEvent): void => { e.stopPropagation(); e.preventDefault(); this.setState({ verifyRemove: true }); }; private onDontRemove = (e: ButtonEvent): void => { e.stopPropagation(); e.preventDefault(); this.setState({ verifyRemove: false }); }; private onActuallyRemove = (e: ButtonEvent): void => { e.stopPropagation(); e.preventDefault(); if (this.props.onRemove) this.props.onRemove(this.props.index); this.setState({ verifyRemove: false }); }; public render(): React.ReactNode { if (this.state.verifyRemove) { return (
{_t("common|are_you_sure")} {_t("action|yes")} {_t("action|no")}
); } return (
{this.props.value}
); } } interface IProps { id: string; items: string[]; itemsLabel?: string; noItemsLabel?: string; placeholder?: string; newItem?: string; canEdit?: boolean; canRemove?: boolean; suggestionsListId?: string; onItemAdded?(item?: string): void; onItemRemoved?(index: number): void; onNewItemChanged?(item: string): void; } export default class EditableItemList

extends React.PureComponent { protected onItemAdded = (e: ButtonEvent): void => { e.stopPropagation(); e.preventDefault(); this.props.onItemAdded?.(this.props.newItem); }; protected onItemRemoved = (index: number): void => { this.props.onItemRemoved?.(index); }; protected onNewItemChanged = (e: ChangeEvent): void => { this.props.onNewItemChanged?.(e.target.value); }; protected renderNewItemField(): JSX.Element { return (

{_t("action|add")} ); } public render(): React.ReactNode { const editableItems = this.props.items.map((item, index) => { if (!this.props.canRemove) { return
  • {item}
  • ; } return ; }); const editableItemsSection = this.props.canRemove ? editableItems :
      {editableItems}
    ; const label = this.props.items.length > 0 ? this.props.itemsLabel : this.props.noItemsLabel; return (
    {label}
    {editableItemsSection} {this.props.canEdit ? this.renderNewItemField() :
    }
    ); } }