Skip to content

Commit 7688f59

Browse files
author
LB
authored
(feat): 7 Day Feedback survey (gatsbyjs#27505)
* seven day feedback * update feedback survey, account for seven day in heuristic, trackCli * use seven instead of 7 * always save folks * update survey URL * update message * ignore feedback for CI in all cases * Update packages/gatsby/src/utils/feedback.ts * ignore CI check for tests * mock CI check * missed some mocking * add typing * add typing * add telemetry for current feedback survey
1 parent f774314 commit 7688f59

File tree

6 files changed

+91
-11
lines changed

6 files changed

+91
-11
lines changed

integration-tests/gatsby-cli/__tests__/feedback.js

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { GatsbyCLI } from "../test-helpers"
33
const MAX_TIMEOUT = 2147483647
44
jest.setTimeout(MAX_TIMEOUT)
55

6+
jest.mock('gatsby-core-utils', () => ({ isCI: () => false }))
7+
68
describe(`gatsby feedback`, () => {
79
it(`Prints a note to give feedback`, () => {
810
const [status, logs] = GatsbyCLI.from(`gatsby-sites/gatsby-build`).invoke(

packages/gatsby/src/commands/build.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ import { flush as flushPendingPageDataWrites } from "../utils/page-data"
1818
import * as WorkerPool from "../utils/worker/pool"
1919
import { structureWebpackErrors } from "../utils/webpack-error-utils"
2020
import {
21+
userGetsSevenDayFeedback,
2122
userPassesFeedbackRequestHeuristic,
2223
showFeedbackRequest,
24+
showSevenDayFeedbackRequest,
2325
} from "../utils/feedback"
2426
import * as buildUtils from "./build-utils"
2527
import { boundActionCreators } from "../redux/actions"
@@ -352,7 +354,9 @@ module.exports = async function build(program: IBuildArgs): Promise<void> {
352354
report.info(`.cache/deletedPages.txt created`)
353355
}
354356

355-
if (await userPassesFeedbackRequestHeuristic()) {
357+
if (await userGetsSevenDayFeedback()) {
358+
showSevenDayFeedbackRequest()
359+
} else if (await userPassesFeedbackRequestHeuristic()) {
356360
showFeedbackRequest()
357361
}
358362
}

packages/gatsby/src/commands/clean.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ import path from "path"
33
import findCacheDir from "find-cache-dir"
44

55
import {
6+
userGetsSevenDayFeedback,
67
userPassesFeedbackRequestHeuristic,
78
showFeedbackRequest,
9+
showSevenDayFeedbackRequest,
810
} from "../utils/feedback"
911
import { IProgram } from "./types"
1012

@@ -31,7 +33,9 @@ module.exports = async function clean(program: IProgram): Promise<void> {
3133

3234
report.info(`Successfully deleted directories`)
3335

34-
if (await userPassesFeedbackRequestHeuristic()) {
36+
if (await userGetsSevenDayFeedback()) {
37+
showSevenDayFeedbackRequest()
38+
} else if (await userPassesFeedbackRequestHeuristic()) {
3539
showFeedbackRequest()
3640
}
3741
}

packages/gatsby/src/commands/develop-process.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ import { initTracer } from "../utils/tracer"
88
import { detectPortInUseAndPrompt } from "../utils/detect-port-in-use-and-prompt"
99
import onExit from "signal-exit"
1010
import {
11+
userGetsSevenDayFeedback,
1112
userPassesFeedbackRequestHeuristic,
1213
showFeedbackRequest,
14+
showSevenDayFeedbackRequest,
1315
} from "../utils/feedback"
1416
import { markWebpackStatusAsPending } from "../utils/webpack-status"
1517
import { store } from "../redux"
@@ -86,7 +88,9 @@ module.exports = async (program: IDevelopArgs): Promise<void> => {
8688
process.on(
8789
`SIGINT`,
8890
async (): Promise<void> => {
89-
if (await userPassesFeedbackRequestHeuristic()) {
91+
if (await userGetsSevenDayFeedback()) {
92+
showSevenDayFeedbackRequest()
93+
} else if (await userPassesFeedbackRequestHeuristic()) {
9094
showFeedbackRequest()
9195
}
9296
process.exit(0)

packages/gatsby/src/utils/__tests__/feedback.ts

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ jest.mock(`gatsby-core-utils`, () => {
1313
return {
1414
...jest.requireActual(`gatsby-core-utils`),
1515
getGatsbyVersion: jest.fn(() => `2.1.1`),
16+
isCI: (): boolean => false,
1617
}
1718
})
1819

packages/gatsby/src/utils/feedback.ts

+73-8
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import report from "gatsby-cli/lib/reporter"
2-
import { getConfigStore, getGatsbyVersion } from "gatsby-core-utils"
2+
import { getConfigStore, getGatsbyVersion, isCI } from "gatsby-core-utils"
3+
import { trackCli } from "gatsby-telemetry"
34
import latestVersion from "latest-version"
45
import getDayOfYear from "date-fns/getDayOfYear"
56

67
const feedbackKey = `feedback.disabled`
78
const lastDateKey = `feedback.lastRequestDate`
9+
const firstDateKey = `feedback.firstCheckDate`
10+
const sevenDayKey = `feedback.sevenDayFeedbackDate`
811

912
// This function is designed to be used by `gatsby feedback --disable`
1013
// and `gatsby feedback --enable`. This key is used to determine
@@ -16,12 +19,28 @@ export function setFeedbackDisabledValue(enabled: boolean): void {
1619
// Print the feedback request to the user
1720
export function showFeedbackRequest(): void {
1821
getConfigStore().set(lastDateKey, Date.now())
22+
trackCli(`SHOW_FEEDBACK_LINK`, {
23+
name: `https://gatsby.dev/feedback`,
24+
})
1925
report.log(
2026
`\n\nHello! Will you help Gatsby improve by taking a four question survey?\nIt takes less than five minutes and your ideas and feedback will be very helpful.`
2127
)
2228
report.log(`\nGive us your feedback here: https://gatsby.dev/feedback\n\n`)
2329
}
2430

31+
export function showSevenDayFeedbackRequest(): void {
32+
getConfigStore().set(sevenDayKey, Date.now())
33+
trackCli(`SHOW_SEVEN_DAY_FEEDBACK_LINK`, {
34+
name: `https://gatsby.dev/feedback-survey`,
35+
})
36+
report.log(
37+
`\n\nHi there! Will you tell us about how you're learning Gatsby? \nIt takes less than 5 minutes and your feedback will help us make installing and using Gatsby so much better.`
38+
)
39+
report.log(
40+
`\nGive us your feedback here: https://gatsby.dev/feedback-survey\n\n`
41+
)
42+
}
43+
2544
const randomChanceToBeTrue = (): boolean => {
2645
// This is spreading the request volume over the quarter.
2746
// We are grabbing a randomNumber within the spread of a first day
@@ -59,13 +78,7 @@ export async function userPassesFeedbackRequestHeuristic(): Promise<boolean> {
5978
return false
6079
}
6180

62-
// Heuristic 2
63-
if (getConfigStore().get(feedbackKey) === true) {
64-
return false
65-
}
66-
67-
// Heuristic 3
68-
if (process.env.GATSBY_FEEDBACK_DISABLED === `1`) {
81+
if (isFeedbackDisabled()) {
6982
return false
7083
}
7184

@@ -84,6 +97,18 @@ export async function userPassesFeedbackRequestHeuristic(): Promise<boolean> {
8497
}
8598
}
8699

100+
// we don't want to give them this survey right after the seven day feedback survey
101+
const sevenDayFeedback = getConfigStore().get(sevenDayKey)
102+
if (sevenDayFeedback) {
103+
const sevenDayDate = new Date(sevenDayFeedback)
104+
const threeMonthsAgo = new Date()
105+
threeMonthsAgo.setMonth(threeMonthsAgo.getMonth() - 3)
106+
107+
if (sevenDayDate > threeMonthsAgo) {
108+
return false
109+
}
110+
}
111+
87112
// Heuristic 5
88113
const versionPoints = getGatsbyVersion().split(`.`)
89114
let latestVersionPoints: Array<string> = []
@@ -111,3 +136,43 @@ export async function userPassesFeedbackRequestHeuristic(): Promise<boolean> {
111136
// for feedback
112137
return true
113138
}
139+
140+
function isFeedbackDisabled(): boolean {
141+
// Heuristic 2
142+
if (getConfigStore().get(feedbackKey) === true) {
143+
return true
144+
}
145+
146+
// Heuristic 3
147+
if (process.env.GATSBY_FEEDBACK_DISABLED === `1`) {
148+
return true
149+
}
150+
151+
if (isCI()) {
152+
return true
153+
}
154+
155+
return false
156+
}
157+
158+
export async function userGetsSevenDayFeedback(): Promise<boolean> {
159+
if (isFeedbackDisabled()) return false
160+
161+
if (getConfigStore().get(sevenDayKey)) return false
162+
163+
const firstDateValue = getConfigStore().get(firstDateKey)
164+
165+
if (!firstDateValue) {
166+
getConfigStore().set(firstDateKey, Date.now()) // set this for the first time
167+
return false
168+
} else {
169+
const lastDate = new Date(firstDateValue)
170+
const sevenDaysAgo = new Date()
171+
sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7)
172+
173+
if (lastDate > sevenDaysAgo) {
174+
return false
175+
}
176+
}
177+
return true
178+
}

0 commit comments

Comments
 (0)