chore(electron): self-hosted mixpanel flag (#11561)

fix AF-2341

![image.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/T2klNLEk0wxLh4NRDzhk/a9a2f71d-7a1f-4718-9ae7-28192c640e85.png)
This commit is contained in:
pengx17
2025-04-09 08:34:27 +00:00
parent 15abb78a6b
commit c09bd8c422
3 changed files with 51 additions and 21 deletions
@@ -577,8 +577,8 @@ export type LiveDataOperation = 'set' | 'get' | 'watch' | 'unwatch';
export type Unwrap<T> = export type Unwrap<T> =
T extends LiveData<infer Z> T extends LiveData<infer Z>
? Unwrap<Z> ? Unwrap<Z>
: T extends LiveData<infer A>[] : T extends readonly [...infer Elements]
? Unwrap<A>[] ? { [K in keyof Elements]: Unwrap<Elements[K]> }
: T; : T;
export type Flat<T> = T extends LiveData<infer P> ? LiveData<Unwrap<P>> : T; export type Flat<T> = T extends LiveData<infer P> ? LiveData<Unwrap<P>> : T;
@@ -1,3 +1,5 @@
import { shallowEqual } from '@affine/component';
import { ServerDeploymentType } from '@affine/graphql';
import { mixpanel } from '@affine/track'; import { mixpanel } from '@affine/track';
import { LiveData, OnEvent, Service } from '@toeverything/infra'; import { LiveData, OnEvent, Service } from '@toeverything/infra';
@@ -16,8 +18,21 @@ export class TelemetryService extends Service {
: new LiveData<Server | undefined>(undefined) : new LiveData<Server | undefined>(undefined)
) )
.flat() .flat()
.selector(server => server?.account$) .selector(
.flat(); server =>
[
server?.account$,
server?.config$.selector(
c => c.type === ServerDeploymentType.Selfhosted
),
] as const
)
.flat()
.map(([account, selfHosted]) => ({
account,
selfHosted,
}))
.distinctUntilChanged(shallowEqual);
constructor( constructor(
private readonly globalContextService: GlobalContextService, private readonly globalContextService: GlobalContextService,
@@ -28,20 +43,30 @@ export class TelemetryService extends Service {
// TODO: support multiple servers // TODO: support multiple servers
let prevAccount: AuthAccountInfo | null = null; let prevAccount: AuthAccountInfo | null = null;
const unsubscribe = this.currentAccount$.subscribe(account => { let prevSelfHosted: boolean | undefined = undefined;
if (prevAccount) { const unsubscribe = this.currentAccount$.subscribe(
mixpanel.reset(); ({ account, selfHosted }) => {
if (prevAccount) {
mixpanel.reset();
}
// the isSelfHosted property from environment is not reliable
if (selfHosted !== prevSelfHosted) {
mixpanel.register({
isSelfHosted: selfHosted,
});
}
prevSelfHosted = selfHosted;
prevAccount = account ?? null;
if (account) {
mixpanel.identify(account.id);
mixpanel.people.set({
$email: account.email,
$name: account.label,
$avatar: account.avatar,
});
}
} }
prevAccount = account ?? null; );
if (account) {
mixpanel.identify(account.id);
mixpanel.people.set({
$email: account.email,
$name: account.label,
$avatar: account.avatar,
});
}
});
this.disposableFns.push(() => { this.disposableFns.push(() => {
unsubscribe.unsubscribe(); unsubscribe.unsubscribe();
}); });
+9 -4
View File
@@ -1,5 +1,5 @@
import { DebugLogger } from '@affine/debug'; import { DebugLogger } from '@affine/debug';
import type { OverridedMixpanel } from 'mixpanel-browser'; import type { Dict, OverridedMixpanel } from 'mixpanel-browser';
import mixpanelBrowser from 'mixpanel-browser'; import mixpanelBrowser from 'mixpanel-browser';
const logger = new DebugLogger('mixpanel'); const logger = new DebugLogger('mixpanel');
@@ -30,14 +30,19 @@ function createMixpanel() {
const wrapped = { const wrapped = {
init() { init() {
mixpanel.register({ const defaultProps = {
appVersion: BUILD_CONFIG.appVersion, appVersion: BUILD_CONFIG.appVersion,
environment: BUILD_CONFIG.appBuildType, environment: BUILD_CONFIG.appBuildType,
editorVersion: BUILD_CONFIG.editorVersion, editorVersion: BUILD_CONFIG.editorVersion,
isDesktop: BUILD_CONFIG.isElectron, isDesktop: BUILD_CONFIG.isElectron,
isSelfHosted: environment.isSelfHosted,
distribution: BUILD_CONFIG.distribution, distribution: BUILD_CONFIG.distribution,
}); };
this.register(defaultProps);
},
// provide a way to override the default properties
register(props: Dict) {
logger.debug('register with', props);
mixpanel.register(props);
}, },
reset() { reset() {
mixpanel.reset(); mixpanel.reset();