Merge pull request #985 from vector-im/dbkr/fix_posthog_exception
Fix exception when loading PostHog
This commit is contained in:
commit
b2317dac84
3 changed files with 45 additions and 19 deletions
|
@ -342,6 +342,9 @@ export const ClientProvider: FC<Props> = ({ children }) => {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
window.matrixclient = client;
|
window.matrixclient = client;
|
||||||
window.isPasswordlessUser = isPasswordlessUser;
|
window.isPasswordlessUser = isPasswordlessUser;
|
||||||
|
|
||||||
|
if (PosthogAnalytics.hasInstance())
|
||||||
|
PosthogAnalytics.instance.onLoginStatusChanged();
|
||||||
}, [client, isPasswordlessUser]);
|
}, [client, isPasswordlessUser]);
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
|
|
|
@ -102,6 +102,10 @@ export class PosthogAnalytics {
|
||||||
private platformSuperProperties = {};
|
private platformSuperProperties = {};
|
||||||
private registrationType: RegistrationType = RegistrationType.Guest;
|
private registrationType: RegistrationType = RegistrationType.Guest;
|
||||||
|
|
||||||
|
public static hasInstance(): boolean {
|
||||||
|
return Boolean(this.internalInstance);
|
||||||
|
}
|
||||||
|
|
||||||
public static get instance(): PosthogAnalytics {
|
public static get instance(): PosthogAnalytics {
|
||||||
if (!this.internalInstance) {
|
if (!this.internalInstance) {
|
||||||
this.internalInstance = new PosthogAnalytics(posthog);
|
this.internalInstance = new PosthogAnalytics(posthog);
|
||||||
|
@ -227,7 +231,7 @@ export class PosthogAnalytics {
|
||||||
.join("");
|
.join("");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async identifyUser(analyticsIdGenerator: () => string) {
|
private async identifyUser(analyticsIdGenerator: () => string) {
|
||||||
if (this.anonymity == Anonymity.Pseudonymous && this.enabled) {
|
if (this.anonymity == Anonymity.Pseudonymous && this.enabled) {
|
||||||
// Check the user's account_data for an analytics ID to use. Storing the ID in account_data allows
|
// Check the user's account_data for an analytics ID to use. Storing the ID in account_data allows
|
||||||
// different devices to send the same ID.
|
// different devices to send the same ID.
|
||||||
|
@ -319,7 +323,12 @@ export class PosthogAnalytics {
|
||||||
this.setAnonymity(Anonymity.Disabled);
|
this.setAnonymity(Anonymity.Disabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
public updateSuperProperties() {
|
public onLoginStatusChanged(): void {
|
||||||
|
const optInAnalytics = getSetting("opt-in-analytics", false);
|
||||||
|
this.updateAnonymityAndIdentifyUser(optInAnalytics);
|
||||||
|
}
|
||||||
|
|
||||||
|
private updateSuperProperties() {
|
||||||
// Update super properties in posthog with our platform (app version, platform).
|
// Update super properties in posthog with our platform (app version, platform).
|
||||||
// These properties will be subsequently passed in every event.
|
// These properties will be subsequently passed in every event.
|
||||||
//
|
//
|
||||||
|
@ -339,7 +348,7 @@ export class PosthogAnalytics {
|
||||||
return this.eventSignup.getSignupEndTime() > new Date(0);
|
return this.eventSignup.getSignupEndTime() > new Date(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async updateAnonymityAndIdentifyUser(
|
private async updateAnonymityAndIdentifyUser(
|
||||||
pseudonymousOptIn: boolean
|
pseudonymousOptIn: boolean
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
// Update this.anonymity based on the user's analytics opt-in settings
|
// Update this.anonymity based on the user's analytics opt-in settings
|
||||||
|
@ -348,6 +357,10 @@ export class PosthogAnalytics {
|
||||||
: Anonymity.Disabled;
|
: Anonymity.Disabled;
|
||||||
this.setAnonymity(anonymity);
|
this.setAnonymity(anonymity);
|
||||||
|
|
||||||
|
// We may not yet have a Matrix client at this point, if not, bail. This should get
|
||||||
|
// triggered again by onLoginStatusChanged once we do have a client.
|
||||||
|
if (!window.matrixclient) return;
|
||||||
|
|
||||||
if (anonymity === Anonymity.Pseudonymous) {
|
if (anonymity === Anonymity.Pseudonymous) {
|
||||||
this.setRegistrationType(
|
this.setRegistrationType(
|
||||||
window.matrixclient.isGuest() || window.isPasswordlessUser
|
window.matrixclient.isGuest() || window.isPasswordlessUser
|
||||||
|
@ -385,7 +398,7 @@ export class PosthogAnalytics {
|
||||||
this.capture(eventName, properties, options);
|
this.capture(eventName, properties, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
public startListeningToSettingsChanges(): void {
|
private startListeningToSettingsChanges(): void {
|
||||||
// Listen to account data changes from sync so we can observe changes to relevant flags and update.
|
// Listen to account data changes from sync so we can observe changes to relevant flags and update.
|
||||||
// This is called -
|
// This is called -
|
||||||
// * On page load, when the account data is first received by sync
|
// * On page load, when the account data is first received by sync
|
||||||
|
|
|
@ -124,6 +124,8 @@ export class OTelGroupCallMembership {
|
||||||
}
|
}
|
||||||
|
|
||||||
public onJoinCall() {
|
public onJoinCall() {
|
||||||
|
if (!ElementCallOpenTelemetry.instance) return;
|
||||||
|
|
||||||
// Create the main span that tracks the time we intend to be in the call
|
// Create the main span that tracks the time we intend to be in the call
|
||||||
this.callMembershipSpan =
|
this.callMembershipSpan =
|
||||||
ElementCallOpenTelemetry.instance.tracer.startSpan(
|
ElementCallOpenTelemetry.instance.tracer.startSpan(
|
||||||
|
@ -174,6 +176,7 @@ export class OTelGroupCallMembership {
|
||||||
for (const [userId, userCalls] of calls.entries()) {
|
for (const [userId, userCalls] of calls.entries()) {
|
||||||
for (const [deviceId, call] of userCalls.entries()) {
|
for (const [deviceId, call] of userCalls.entries()) {
|
||||||
if (!this.callsByCallId.has(call.callId)) {
|
if (!this.callsByCallId.has(call.callId)) {
|
||||||
|
if (ElementCallOpenTelemetry.instance) {
|
||||||
const span = ElementCallOpenTelemetry.instance.tracer.startSpan(
|
const span = ElementCallOpenTelemetry.instance.tracer.startSpan(
|
||||||
`matrix.call`,
|
`matrix.call`,
|
||||||
undefined,
|
undefined,
|
||||||
|
@ -192,6 +195,7 @@ export class OTelGroupCallMembership {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (const callTrackingInfo of this.callsByCallId.values()) {
|
for (const callTrackingInfo of this.callsByCallId.values()) {
|
||||||
const userCalls = calls.get(callTrackingInfo.userId);
|
const userCalls = calls.get(callTrackingInfo.userId);
|
||||||
|
@ -321,6 +325,8 @@ export class OTelGroupCallMembership {
|
||||||
public onConnectionStatsReport(
|
public onConnectionStatsReport(
|
||||||
statsReport: GroupCallStatsReport<ConnectionStatsReport>
|
statsReport: GroupCallStatsReport<ConnectionStatsReport>
|
||||||
) {
|
) {
|
||||||
|
if (!ElementCallOpenTelemetry.instance) return;
|
||||||
|
|
||||||
const type = OTelStatsReportType.ConnectionReport;
|
const type = OTelStatsReportType.ConnectionReport;
|
||||||
const data =
|
const data =
|
||||||
ObjectFlattener.flattenConnectionStatsReportObject(statsReport);
|
ObjectFlattener.flattenConnectionStatsReportObject(statsReport);
|
||||||
|
@ -330,6 +336,8 @@ export class OTelGroupCallMembership {
|
||||||
public onByteSentStatsReport(
|
public onByteSentStatsReport(
|
||||||
statsReport: GroupCallStatsReport<ByteSentStatsReport>
|
statsReport: GroupCallStatsReport<ByteSentStatsReport>
|
||||||
) {
|
) {
|
||||||
|
if (!ElementCallOpenTelemetry.instance) return;
|
||||||
|
|
||||||
const type = OTelStatsReportType.ByteSentReport;
|
const type = OTelStatsReportType.ByteSentReport;
|
||||||
const data = ObjectFlattener.flattenByteSentStatsReportObject(statsReport);
|
const data = ObjectFlattener.flattenByteSentStatsReportObject(statsReport);
|
||||||
this.buildStatsEventSpan({ type, data });
|
this.buildStatsEventSpan({ type, data });
|
||||||
|
@ -338,6 +346,8 @@ export class OTelGroupCallMembership {
|
||||||
public onSummaryStatsReport(
|
public onSummaryStatsReport(
|
||||||
statsReport: GroupCallStatsReport<SummaryStatsReport>
|
statsReport: GroupCallStatsReport<SummaryStatsReport>
|
||||||
) {
|
) {
|
||||||
|
if (!ElementCallOpenTelemetry.instance) return;
|
||||||
|
|
||||||
const type = OTelStatsReportType.SummaryReport;
|
const type = OTelStatsReportType.SummaryReport;
|
||||||
const data = ObjectFlattener.flattenSummaryStatsReportObject(statsReport);
|
const data = ObjectFlattener.flattenSummaryStatsReportObject(statsReport);
|
||||||
this.buildStatsEventSpan({ type, data });
|
this.buildStatsEventSpan({ type, data });
|
||||||
|
|
Loading…
Add table
Reference in a new issue