为分配的任务更新 flex 中的任务属性

Update task attributes in flex for assigned task

我正在通过向我的后端请求分配的任务来更新任务 属性,此请求是在自定义组件上发出的,在调用期间单击按钮。

我可以在我的 twilio 控制台中看到更新很顺利,新值显示在那里,但是我的 flex 组件上的任务道具没有更新,自分配以来保持相同的属性。

有没有办法在 flex 中“刷新”任务?我需要这个更新的属性才能在我的自定义组件上执行条件渲染。

提前感谢所有帮助我的人。

import React from 'react';
import { withTaskContext } from '@twilio/flex-ui';

class IsRecording extends React.Component {
    constructor(props) {
        super(props);
    }

    render() {
        // this.task = this.props.tasks
            return (
                <div>
                    <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#E50000">
                        <path
                            d="M16 16c0 1.104-.896 2-2 2h-12c-1.104 0-2-.896-2-2v-8c0-1.104.896-2 2-2h12c1.104 0 2 .896 2 2v8zm8-10l-6 4.223v3.554l6 4.223v-12z"/>
                        <animate
                            attributeType="XML"
                            attributeName="fill"
                            values="#800;#f00;#800;#800"
                            dur="1.5s"
                            repeatCount="indefinite"/>
                    </svg>
                </div>
            )
    }
};

export default withTaskContext(IsRecording);

这里是 Twilio 开发人员布道者。

如果您可以访问 Flex 中的任务对象,则无需通过后端访问。相反,您可以调用 task.setAttributes,这将直接更新任务属性并导致它更新 Flex 中各处的状态。

然而,这里的困难在于主管不会实时查看任务,因此您需要做更多的工作才能让主管监听任务的变化。我玩了一把,让它工作了。它使用 Sync liveQuery interface 订阅工作人员任务的更新。

我们在 componentDidMount 上创建实时查询订阅。创建实时查询时的第一个参数是“tr-task”,它指的是系统中的所有任务。第二个参数是查询,在本例中我们正在查询该工作人员的所有任务。

一旦我们得到查询,我们就可以加载当前项目并将它们设置在状态中。然后我们监听添加、更新和删除并相应地更新状态。

render 函数中,我们计算是否有任何任务具有 isRecording 属性并相应地显示图标。

这是 <IsRecording> 组件:

import React from "react";
import { Manager } from "@twilio/flex-ui";

class IsRecording extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      tasks: [],
    };
  }

  componentDidMount() {
    Manager.getInstance()
      .insightsClient.liveQuery(
        "tr-task",
        `data.worker_sid == "${this.props.worker.sid}"`
      )
      .then((query) => {
        this.liveQuery = query;
        const items = query.getItems();
        this.setState({ tasks: Object.values(items) });
        query.on("itemAdded", (item) => {
          this.setState((prevState) => ({
            tasks: [...prevState.tasks, item.value],
          }));
        });
        query.on("itemUpdated", (item) => {
          this.setState((prevState) => ({
            tasks: [
              ...prevState.tasks.filter((task) => task.sid !== item.value.sid),
              item.value,
            ],
          }));
        });
        query.on("itemRemoved", (item) => {
          this.setState((prevState) => ({
            tasks: prevState.tasks.filter(
              (task) => task.sid !== item.previousItemData.sid
            ),
          }));
        });
      })
      .catch((err) =>
        console.debug(`Error when subscribing to live updates for Tasks`, err)
      );
  }

  componentWillUnmount() {
    if (this.liveQuery) {
      this.liveQuery.removeAllListeners();
      this.liveQuery.close();
    }
  }

  render() {
    if (this.state.tasks.some((task) => task.attributes.isRecording)) {
      return (
        <div>
          <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#E50000">
            <path d="M16 16c0 1.104-.896 2-2 2h-12c-1.104 0-2-.896-2-2v-8c0-1.104.896-2 2-2h12c1.104 0 2 .896 2 2v8zm8-10l-6 4.223v3.554l6 4.223v-12z" />
            <animate attributeType="XML" attributeName="fill" values="#800;#f00;#800;#800" dur="1.5s" repeatCount="indefinite" />
          </svg>
        </div>
      );
    } else {
      return null;
    }
  }
}

export default IsRecording;

您可以像这样将其附加到 WorkersDataTable

    flex.WorkersDataTable.Content.add(
      <ColumnDefinition
        key="is-recording"
        header={"Recording"}
        content={(items) => {
          return (
            <IsRecording
              key={`is-recording-${items.worker.sid}`}
              worker={items.worker}
            />
          );
        }}
      />
    );

我正在通过从 redux 存储中读取来完成此操作。以下内容已被修改,因此我不会泄露专有知识。

  1. 为 Twilio reservationCreated 事件创建自定义侦听器
manager.workerClient.on("reservationCreated", this.acceptTask);
  1. 下面获取更新的任务。如果我们直接使用任务,除非事情发生变化,否则它将是陈旧的对象。
async acceptTask(reservation) {
  const updatedTask = this.manager.store.getState().flex.worker.tasks.get(reservation.task.sid);
  // consume it
  // get the updated attributes with updatedTask.attributes
}

希望对您有用/有所帮助。