-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathindex.js
124 lines (111 loc) · 2.64 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
var request = require('superagent');
var xtend = require('xtend');
var DEFAULT_SERVER = 'https://app.satismeter.com';
class Client {
constructor({
writeKey,
server = DEFAULT_SERVER
} = {}) {
this.writeKey = writeKey;
this.server = server;
}
survey(options, callback) {
var survey = new Survey(xtend(options, {client: this}));
survey.init(function(err, res) {
if (err) {
callback(err);
}
else {
survey.visible = res.visible;
callback(null, survey);
}
});
}
}
class Survey {
constructor({
client,
method = 'In-app',
userId,
traits,
trackAnonymous = false,
preview = false,
referrer = ''
}) {
this.client = client;
this.method = method;
this.userId = userId;
this.traits = traits;
this.trackAnonymous = trackAnonymous;
this.preview = preview;
this.referrer = referrer;
this.buffer = [];
this.responseUrl = null;
this.authToken = null;
this.saving = false;
}
init(callback) {
request
.post(this.client.server + '/api/widget')
.send({
writeKey: this.client.writeKey,
method: this.method,
trackAnonymous: this.trackAnonymous,
userId: this.userId,
traits: this.traits,
preview: this.preview,
referrer: this.referrer
})
.set('Content-Type', 'application/json')
.set('Accept', 'application/json')
.end(function(err, res) {
if (err) {
callback(err);
} else {
callback(null, res.body.widget);
}
});
}
save() {
var data = {
writeKey: this.client.writeKey,
userId: this.userId,
traits: this.traits,
method: this.method,
trackAnonymous: this.trackAnonymous,
referrer: this.referrer,
rating: this.rating,
feedback: this.feedback,
dismissed: this.dismissed
};
if (this.saving) {
this.buffer.push(data);
return;
}
this.saving = true;
var req;
if (this.responseUrl) {
req = request.put(this.responseUrl).set('auth-token', this.authToken);
} else {
req = request.post(this.client.server + '/api/responses');
}
req.send(data)
.set('Content-Type', 'application/json')
.set('Accept', 'application/json')
.end((err, res) => {
this.saving = false;
if (err) {
return console.log(err);
}
this.responseUrl = res.header.location;
this.authToken = res.header['auth-token'];
if (this.buffer.length > 0) {
this.saveResponse(this.buffer.shift());
}
});
}
}
function satismeter(options) {
return new Client(options);
}
module.exports = satismeter;