This repository has been archived by the owner on Apr 26, 2018. It is now read-only.
/
feedback.coffee
87 lines (73 loc) · 2.76 KB
/
feedback.coffee
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
{CompositeDisposable} = require 'atom'
FeedbackAPI = null
Reporter = null
module.exports =
config:
alwaysShowInDevMode:
type: 'boolean'
default: false
feedbackSource: 'survey-2015-1'
activate: ->
@statusBarPromise = new Promise (resolve) =>
@resolveStatusBarPromise = resolve
process.nextTick =>
FeedbackAPI = require './feedback-api'
@checkShouldRequestFeedback().then (shouldRequestFeedback) =>
Reporter ?= require './reporter'
if shouldRequestFeedback
@addStatusBarItem()
@subscriptions = new CompositeDisposable
@subscriptions.add atom.commands.add 'atom-workspace', 'feedback:show', => @showModal()
Reporter.sendEvent('did-show-status-bar-link')
consumeStatusBar: (statusBar) ->
@resolveStatusBarPromise(statusBar)
consumeReporter: (realReporter) ->
Reporter ?= require './reporter'
Reporter.setReporter(realReporter)
getStatusBar: ->
@statusBarPromise
addStatusBarItem: ->
return if @statusBarTile?
FeedbackStatusElement = require './feedback-status-element'
workspaceElement = atom.views.getView(atom.workspace)
@getStatusBar().then (statusBar) =>
item = new FeedbackStatusElement()
item.initialize({@feedbackSource})
@statusBarTile = statusBar.addRightTile {item, priority: -1}
showModal: ->
unless @modal?
FeedbackModalElement = require './feedback-modal-element'
@modal = new FeedbackModalElement()
@modal.initialize({@feedbackSource})
@modal.onDidStartSurvey => @detectCompletedSurvey()
@modal.show()
checkShouldRequestFeedback: ->
client = FeedbackAPI.getClientID()
FeedbackAPI.fetchSurveyMetadata(@feedbackSource).then (metadata) =>
new Promise (resolve) =>
shouldRequest = if atom.inSpecMode() or (atom.inDevMode() and atom.config.get('feedback.alwaysShowInDevMode'))
true
else if client
{crc32} = require 'crc'
checksum = crc32(client + @feedbackSource + metadata.display_seed)
checksum % 100 < (metadata.display_percent ? 0)
else
false
if shouldRequest
FeedbackAPI.fetchDidCompleteFeedback(@feedbackSource).then (didCompleteSurvey) ->
Reporter ?= require './reporter'
Reporter.sendEvent('already-finished-survey') if didCompleteSurvey
resolve(not didCompleteSurvey)
else
resolve(false)
detectCompletedSurvey: ->
FeedbackAPI.detectDidCompleteFeedback(@feedbackSource).then =>
Reporter ?= require './reporter'
Reporter.sendEvent('did-finish-survey')
@statusBarTile.destroy()
deactivate: ->
@subscriptions?.dispose()
@statusBarTile?.destroy()
@statusBarTile = null
@modal?.destroy()
@modal = null