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

View File

@@ -577,8 +577,8 @@ export type LiveDataOperation = 'set' | 'get' | 'watch' | 'unwatch';
export type Unwrap<T> =
T extends LiveData<infer Z>
? Unwrap<Z>
: T extends LiveData<infer A>[]
? Unwrap<A>[]
: T extends readonly [...infer Elements]
? { [K in keyof Elements]: Unwrap<Elements[K]> }
: T;
export type Flat<T> = T extends LiveData<infer P> ? LiveData<Unwrap<P>> : T;

View File

@@ -1,3 +1,5 @@
import { shallowEqual } from '@affine/component';
import { ServerDeploymentType } from '@affine/graphql';
import { mixpanel } from '@affine/track';
import { LiveData, OnEvent, Service } from '@toeverything/infra';
@@ -16,8 +18,21 @@ export class TelemetryService extends Service {
: new LiveData<Server | undefined>(undefined)
)
.flat()
.selector(server => server?.account$)
.flat();
.selector(
server =>
[
server?.account$,
server?.config$.selector(
c => c.type === ServerDeploymentType.Selfhosted
),
] as const
)
.flat()
.map(([account, selfHosted]) => ({
account,
selfHosted,
}))
.distinctUntilChanged(shallowEqual);
constructor(
private readonly globalContextService: GlobalContextService,
@@ -28,20 +43,30 @@ export class TelemetryService extends Service {
// TODO: support multiple servers
let prevAccount: AuthAccountInfo | null = null;
const unsubscribe = this.currentAccount$.subscribe(account => {
if (prevAccount) {
mixpanel.reset();
let prevSelfHosted: boolean | undefined = undefined;
const unsubscribe = this.currentAccount$.subscribe(
({ 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(() => {
unsubscribe.unsubscribe();
});

View File

@@ -1,5 +1,5 @@
import { DebugLogger } from '@affine/debug';
import type { OverridedMixpanel } from 'mixpanel-browser';
import type { Dict, OverridedMixpanel } from 'mixpanel-browser';
import mixpanelBrowser from 'mixpanel-browser';
const logger = new DebugLogger('mixpanel');
@@ -30,14 +30,19 @@ function createMixpanel() {
const wrapped = {
init() {
mixpanel.register({
const defaultProps = {
appVersion: BUILD_CONFIG.appVersion,
environment: BUILD_CONFIG.appBuildType,
editorVersion: BUILD_CONFIG.editorVersion,
isDesktop: BUILD_CONFIG.isElectron,
isSelfHosted: environment.isSelfHosted,
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() {
mixpanel.reset();