# 问卷

## 功能概述

本模块用于接收处理讲师、助教和管理员等用户的问卷操作，可以监听"开始问卷调查"和"问卷结果"等事件，以及进行观众端的提交答案操作。

## 初始化及销毁

在实例化该模块并进行使用之前，需要对SDK进行初始化配置，详细见[参考文档](https://git.polyv.net/help-center/document-center/-/blob/master/live/js/new_sdk/interactions_receive_sdk/sdk/overview/README.md#%E5%88%9D%E5%A7%8B%E5%8C%96)。

#### 在线文件引入方式

```javascript
<script src="https://websdk.videocc.net/interactions-receive-sdk/0.24.0/lib/polyv-ir.umd.js"></script>

<script>
    const { Questionnaire } = window.PolyvIRSDK;
</script>
```

#### import 方式引入（推荐）

```javascript
import { Questionnaire } from '@polyv/interactions-receive-sdk';

const questionnaireSdk = new Questionnaire();
// 销毁 SDK 实例，清除逻辑
questionnaireSdk.destroy();
```

## 使用流程

### 监听“开始问卷调查”事件

收到此事件时，表示讲师端发起了一次问卷调查，消息参数中包含问卷详细内容，接入方可以使用其中的数据字段，将完整的问卷展示给观众。

```javascript
questionnaireSdk.on(questionnaireSdk.events.START_QUESTIONNAIRE, (msg) => {
  console.log('收到问卷消息', msg);
});
```

### 提交用户答案

观众作答后，把答案作为字符串数组传入到 `answerQuestion` 方法中，就可以将答题提交到服务端。该方法是异步方法，返回具体的处理结果状态码，有提交成功、问卷已结束和已提交过答案这几种状态。可以根据该状态码提示用户该提交操作是否成功。通过 questionnaireSdk.answerQuestionResCode 能够访问到所有状态的枚举。

```javascript
/**
   * 提交问卷
   * @param answers 提交问卷答案, 字符串数组如：
     [
        {"questionId":"bab16ae6ce", "answer": "A"},
        {"questionId":"4a9f9e3139", "answer": "AB"}
     ]
   * @param questionnaireId 问卷Id
   * @returns 状态码
*/
// 单选题答案格式 [{"questionId":"bab16ae6ce", "answer": "A"}]
// 多选题答案格式 [{"questionId":"4a9f9e3139", "answer": "AB"}]
// 判断题答案格式 [{"questionId":"4a9f9e3139", "answer": "A"}]
// 问答题答案格式 [{"questionId":"4a9f9e3139", "answer": "你好"}]
// 评星题（五星）答案格式 [{"questionId":"4a9f9e3139", "answer": "A"}] A 一颗星， B 两颗星， C 三颗星，D 四颗星， E 五颗星
// 评分题（10分）答案格式 [{"questionId":"4a9f9e3139", "answer": "A"}] A 一分， B 两分... 以此类推 J 10分
const res = await questionnaireSdk.answerQuestion(answers: string[], questionnaireId: string);{"questionId":"4a9f9e3139", "answer": "AB"}]);
if (res.code === questionnaireSdk.answerQuestionResCode.SubmitSuccess) {
  console.log('提交成功');
}
```

### 监听“结束问卷”事件

收到此事件时，问卷已经结束，观众不能再提交答案，需要将问卷隐藏。

```javascript
questionnaireSdk.on(questionnaireSdk.events.STOP_QUESTIONNAIRE, (msg) => {
    console.log('收到问卷结束消息', msg);
});
```

### 监听“问卷结果”事件和“问卷统计”事件

如果当前问卷设置了得分题以及相应正确答案，而且有用户提交了个人的答案，那么当问卷结束后，讲师可以使用"发送结果"功能，以便于观众查看问卷答案及个人回答情况。\
观众端展示问卷回答情况，可以监听这两个事件—— `SEND_QUESTIONNAIRE_RESULT` 和 `QUESTIONNAIRE_ACHIEVEMENT`。\
**注意**：这两个事件的触发顺序是不定的，若界面内容展示跟这两个事件都有关，请务必确保收到并记录到两个事件的数据后再做后续处理。

* 问卷结果事件\
  本事件包含了问卷标题、题目列表及正确答案等详细信息，可以据此再次展示问卷。具体字段请参考 [typedoc](https://help.polyv.net/live/js/new_sdk/interactions_launch_sdk/sdk/docs/modules/interfaces_apps_questionnaire.html)

```javascript
questionnaireSdk.on(questionnaireSdk.events.SEND_QUESTIONNAIRE_RESULT, (msg) => {
  console.log('收到问卷结果事件：', msg);
});
```

* 问卷统计事件\
  本事件包含了当前观众在此次问卷的题目统计数据和个人回答情况，可以据此展示问卷具体回答情况。具体字段请参考 [typedoc](https://help.polyv.net/live/js/new_sdk/interactions_launch_sdk/sdk/docs/modules/interfaces_apps_questionnaire.html)。

```javascript
questionnaireSdk.on(questionnaireSdk.events.QUESTIONNAIRE_ACHIEVEMENT, (msg) => {
  console.log('收到问卷统计事件：', msg);
});
```

### 注意

如果不需要再使用问卷SDK时，请调用SDK实例的destroy方法去销毁实例。
