Skip to content

Commit 49f3290

Browse files
authored
Merge pull request #2494 from digma-ai/early-access-notification
early access program notification Closes #2440
2 parents 24d065f + 94ad676 commit 49f3290

27 files changed

+1156
-1117
lines changed

ide-common/src/main/kotlin/org/digma/intellij/plugin/persistence/PersistenceData.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ internal data class PersistenceData(
1414
var isLocalEngineInstalled: Boolean? = null,
1515
var userId: String? = null,
1616
var userRequestedCourse: Boolean = false,
17+
var userRequestedEarlyAccess: Boolean = false,
1718

1819
//lastInsightsEventTime is different from other timestamps in that it needs to be same format and
1920
// timezone as in the backend

ide-common/src/main/kotlin/org/digma/intellij/plugin/persistence/PersistenceService.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,8 @@ class PersistenceService {
387387
return state.alreadyShowedNewRecentActivityNotification
388388
}
389389

390-
fun setUserRequestedCourse(courseRequested: Boolean) {
391-
state.userRequestedCourse = courseRequested
390+
fun setUserRequestedCourse() {
391+
state.userRequestedCourse = true
392392
}
393393

394394
fun isUserRequestedCourse():Boolean {
@@ -399,4 +399,16 @@ class PersistenceService {
399399
return state.userRequestedCourse.toString()
400400
}
401401

402+
fun setUserRequestedEarlyAccess() {
403+
state.userRequestedEarlyAccess = true
404+
}
405+
406+
fun isUserRequestedEarlyAccess():Boolean {
407+
return state.userRequestedEarlyAccess
408+
}
409+
410+
fun getUserRequestedEarlyAccessString():String {
411+
return state.userRequestedEarlyAccess.toString()
412+
}
413+
402414
}

ide-common/src/main/kotlin/org/digma/intellij/plugin/posthog/ActivityMonitor.kt

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ private const val ENVIRONMENT_ADDED_PROPERTY_NAME = "environment_added"
5151
private const val LOAD_WARNING_APPEARED_PROPERTY_NAME = "load_warning_appeared"
5252
private const val JIRA_FIELD_COPIED_PROPERTY_NAME = "jira_field_copied"
5353
private const val USER_REQUESTED_COURSE_PROPERTY_NAME = "user_requested_course"
54+
private const val USER_REQUESTED_EARLY_ACCESS_PROPERTY_NAME = "user_requested_early_access"
5455
private const val MEANINGFUL_ACTIONS_DAYS_PROPERTY_NAME = "meaningful_actions_days"
5556
private const val MEANINGFUL_ACTIONS_AVG_PROPERTY_NAME = "meaningful_actions_avg"
5657

@@ -222,14 +223,23 @@ class ActivityMonitor(private val project: Project, cs: CoroutineScope) : Dispos
222223
)
223224
}
224225

226+
fun registerUserRequestedEarlyAccess() {
227+
identify(
228+
mapOf(
229+
USER_REQUESTED_EARLY_ACCESS_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedCourseString()
230+
)
231+
)
232+
}
233+
225234

226235
fun registerEmail(email: String) {
227236

228237
identify(
229238
mapOf(
230239
"email" to getEmailForEvent(),
231240
INSTALL_STATUS_PROPERTY_NAME to getCurrentInstallStatus(),
232-
USER_REQUESTED_COURSE_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedCourseString()
241+
USER_REQUESTED_COURSE_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedCourseString(),
242+
USER_REQUESTED_EARLY_ACCESS_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedEarlyAccessString()
233243
)
234244
)
235245
postHog?.alias(UniqueGeneratedUserId.userId, email)
@@ -305,7 +315,6 @@ class ActivityMonitor(private val project: Project, cs: CoroutineScope) : Dispos
305315
}
306316

307317

308-
309318
fun registerLensClicked(lens: String) {
310319
SessionMetadataProperties.getInstance().put(LAST_LENS_CLICKED_KEY, lens)
311320
registerUserAction("lens clicked", mapOf("lens id" to lens))
@@ -714,6 +723,7 @@ class ActivityMonitor(private val project: Project, cs: CoroutineScope) : Dispos
714723
LOAD_WARNING_APPEARED_PROPERTY_NAME to PersistenceService.getInstance().isLoadWarningAppeared(),
715724
JIRA_FIELD_COPIED_PROPERTY_NAME to PersistenceService.getInstance().isJiraFieldCopied(),
716725
USER_REQUESTED_COURSE_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedCourseString(),
726+
USER_REQUESTED_EARLY_ACCESS_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedEarlyAccessString(),
717727
MEANINGFUL_ACTIONS_DAYS_PROPERTY_NAME to EngagementScoreService.getInstance().getLatestRegisteredActiveDays(),
718728
MEANINGFUL_ACTIONS_AVG_PROPERTY_NAME to EngagementScoreService.getInstance().getLatestRegisteredAverage()
719729
)
@@ -741,6 +751,7 @@ class ActivityMonitor(private val project: Project, cs: CoroutineScope) : Dispos
741751
LOAD_WARNING_APPEARED_PROPERTY_NAME to PersistenceService.getInstance().isLoadWarningAppeared(),
742752
JIRA_FIELD_COPIED_PROPERTY_NAME to PersistenceService.getInstance().isJiraFieldCopied(),
743753
USER_REQUESTED_COURSE_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedCourseString(),
754+
USER_REQUESTED_EARLY_ACCESS_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedEarlyAccessString(),
744755
MEANINGFUL_ACTIONS_DAYS_PROPERTY_NAME to EngagementScoreService.getInstance().getLatestRegisteredActiveDays(),
745756
MEANINGFUL_ACTIONS_AVG_PROPERTY_NAME to EngagementScoreService.getInstance().getLatestRegisteredAverage()
746757
)
@@ -931,7 +942,8 @@ class ActivityMonitor(private val project: Project, cs: CoroutineScope) : Dispos
931942
identify(
932943
mapOf(
933944
LOAD_WARNING_APPEARED_PROPERTY_NAME + "_timestamp" to PersistenceService.getInstance().getLoadWarningAppearedTimestamp(),
934-
USER_REQUESTED_COURSE_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedCourseString()
945+
USER_REQUESTED_COURSE_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedCourseString(),
946+
USER_REQUESTED_EARLY_ACCESS_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedEarlyAccessString()
935947
),
936948
mapOf(
937949
LOAD_WARNING_APPEARED_PROPERTY_NAME to PersistenceService.getInstance().isLoadWarningAppeared(),
@@ -962,7 +974,8 @@ class ActivityMonitor(private val project: Project, cs: CoroutineScope) : Dispos
962974
identify(
963975
mapOf(
964976
ENVIRONMENT_ADDED_PROPERTY_NAME + "_timestamp" to PersistenceService.getInstance().getEnvironmentAddedTimestamp(),
965-
USER_REQUESTED_COURSE_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedCourseString()
977+
USER_REQUESTED_COURSE_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedCourseString(),
978+
USER_REQUESTED_EARLY_ACCESS_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedEarlyAccessString()
966979
),
967980
mapOf(
968981
ENVIRONMENT_ADDED_PROPERTY_NAME to PersistenceService.getInstance().isEnvironmentAdded()
@@ -993,7 +1006,8 @@ class ActivityMonitor(private val project: Project, cs: CoroutineScope) : Dispos
9931006
identify(
9941007
mapOf(
9951008
JIRA_FIELD_COPIED_PROPERTY_NAME + "_timestamp" to PersistenceService.getInstance().getJiraFieldCopiedTimestamp(),
996-
USER_REQUESTED_COURSE_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedCourseString()
1009+
USER_REQUESTED_COURSE_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedCourseString(),
1010+
USER_REQUESTED_EARLY_ACCESS_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedEarlyAccessString()
9971011
),
9981012
mapOf(
9991013
JIRA_FIELD_COPIED_PROPERTY_NAME to PersistenceService.getInstance().isJiraFieldCopied()
@@ -1080,7 +1094,8 @@ class ActivityMonitor(private val project: Project, cs: CoroutineScope) : Dispos
10801094
MEANINGFUL_ACTIONS_DAYS_PROPERTY_NAME to activeDays,
10811095
MEANINGFUL_ACTIONS_AVG_PROPERTY_NAME to average,
10821096
INSTALL_STATUS_PROPERTY_NAME to getCurrentInstallStatus(),
1083-
USER_REQUESTED_COURSE_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedCourseString()
1097+
USER_REQUESTED_COURSE_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedCourseString(),
1098+
USER_REQUESTED_EARLY_ACCESS_PROPERTY_NAME to PersistenceService.getInstance().getUserRequestedEarlyAccessString()
10841099
)
10851100

10861101
capture("daily engagement score", details)

src/main/kotlin/org/digma/intellij/plugin/ui/jcef/UserRegistrationManager.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,19 @@ class UserRegistrationManager(private val project: Project) {
3535
if (!PersistenceService.getInstance().isUserRequestedCourse()) {
3636
val courseRequested = registrationMap["scope"] == "promotion"
3737
if (courseRequested) {
38-
PersistenceService.getInstance().setUserRequestedCourse(true)
38+
PersistenceService.getInstance().setUserRequestedCourse()
3939
ActivityMonitor.getInstance(project).registerUserRequestedCourse()
4040
}
4141
}
4242

43+
if (!PersistenceService.getInstance().isUserRequestedEarlyAccess()) {
44+
val earlyAccessRequested = registrationMap["scope"] == "early-access"
45+
if (earlyAccessRequested) {
46+
PersistenceService.getInstance().setUserRequestedEarlyAccess()
47+
ActivityMonitor.getInstance(project).registerUserRequestedEarlyAccess()
48+
}
49+
}
50+
4351
if (PersistenceService.getInstance().getUserRegistrationEmail().isNullOrBlank() ||
4452
PersistenceService.getInstance().getUserRegistrationEmail() != email
4553
) {

src/main/kotlin/org/digma/intellij/plugin/ui/mainapp/MainAppService.kt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,17 @@ import com.intellij.openapi.components.Service
55
import com.intellij.openapi.components.service
66
import com.intellij.openapi.diagnostic.Logger
77
import com.intellij.openapi.project.Project
8+
import com.intellij.openapi.util.Disposer
9+
import kotlinx.datetime.Clock
10+
import kotlinx.datetime.toKotlinInstant
11+
import org.digma.intellij.plugin.engagement.EngagementScoreService
12+
import org.digma.intellij.plugin.persistence.PersistenceService
13+
import org.digma.intellij.plugin.scheduling.disposingPeriodicTask
814
import org.digma.intellij.plugin.ui.jcef.JCefComponent
15+
import org.digma.intellij.plugin.ui.jcef.sendGenericPluginEvent
16+
import kotlin.time.Duration.Companion.days
17+
import kotlin.time.Duration.Companion.hours
18+
import kotlin.time.Duration.Companion.minutes
919

1020
@Service(Service.Level.PROJECT)
1121
class MainAppService(private val project: Project) : Disposable {
@@ -14,6 +24,29 @@ class MainAppService(private val project: Project) : Disposable {
1424

1525
private var jCefComponent: JCefComponent? = null
1626

27+
init {
28+
29+
if ( //todo: check if user clicked don't show again
30+
!PersistenceService.getInstance().isUserRequestedEarlyAccess() &&
31+
PersistenceService.getInstance().getUserEmail() == null && PersistenceService.getInstance().getUserRegistrationEmail() == null
32+
) {
33+
val disposable = Disposer.newDisposable()
34+
Disposer.register(this, disposable)
35+
disposable.disposingPeriodicTask("EarlyAccessNotificationTimer", 1.minutes.inWholeMilliseconds, 1.hours.inWholeMilliseconds, false) {
36+
jCefComponent?.let { jcefComp ->
37+
val installTime = PersistenceService.getInstance().getFirstTimePluginLoadedTimestamp()
38+
if (installTime != null) {
39+
if (Clock.System.now() > (installTime.toKotlinInstant().plus(14.days))) {
40+
if (EngagementScoreService.getInstance().getLatestRegisteredActiveDays() >= 5){
41+
sendGenericPluginEvent(project,jcefComp.jbCefBrowser.cefBrowser,"SHOW_EARLY_ACCESS_PROMOTION")
42+
Disposer.dispose(disposable)
43+
}
44+
}
45+
}
46+
}
47+
}
48+
}
49+
}
1750

1851
companion object {
1952
@JvmStatic

src/main/resources/webview/common/images/promotion/collapsedContainerBackground.svg

Lines changed: 0 additions & 10 deletions
This file was deleted.

src/main/resources/webview/common/images/promotion/collapsedContainerEllipseShadow.svg

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 12 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)