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(() => {
 | 
			
		||||
    window.matrixclient = client;
 | 
			
		||||
    window.isPasswordlessUser = isPasswordlessUser;
 | 
			
		||||
 | 
			
		||||
    if (PosthogAnalytics.hasInstance())
 | 
			
		||||
      PosthogAnalytics.instance.onLoginStatusChanged();
 | 
			
		||||
  }, [client, isPasswordlessUser]);
 | 
			
		||||
 | 
			
		||||
  if (error) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -102,6 +102,10 @@ export class PosthogAnalytics {
 | 
			
		|||
  private platformSuperProperties = {};
 | 
			
		||||
  private registrationType: RegistrationType = RegistrationType.Guest;
 | 
			
		||||
 | 
			
		||||
  public static hasInstance(): boolean {
 | 
			
		||||
    return Boolean(this.internalInstance);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public static get instance(): PosthogAnalytics {
 | 
			
		||||
    if (!this.internalInstance) {
 | 
			
		||||
      this.internalInstance = new PosthogAnalytics(posthog);
 | 
			
		||||
| 
						 | 
				
			
			@ -227,7 +231,7 @@ export class PosthogAnalytics {
 | 
			
		|||
      .join("");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public async identifyUser(analyticsIdGenerator: () => string) {
 | 
			
		||||
  private async identifyUser(analyticsIdGenerator: () => string) {
 | 
			
		||||
    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
 | 
			
		||||
      // different devices to send the same ID.
 | 
			
		||||
| 
						 | 
				
			
			@ -319,7 +323,12 @@ export class PosthogAnalytics {
 | 
			
		|||
    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).
 | 
			
		||||
    // These properties will be subsequently passed in every event.
 | 
			
		||||
    //
 | 
			
		||||
| 
						 | 
				
			
			@ -339,7 +348,7 @@ export class PosthogAnalytics {
 | 
			
		|||
    return this.eventSignup.getSignupEndTime() > new Date(0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public async updateAnonymityAndIdentifyUser(
 | 
			
		||||
  private async updateAnonymityAndIdentifyUser(
 | 
			
		||||
    pseudonymousOptIn: boolean
 | 
			
		||||
  ): Promise<void> {
 | 
			
		||||
    // Update this.anonymity based on the user's analytics opt-in settings
 | 
			
		||||
| 
						 | 
				
			
			@ -348,6 +357,10 @@ export class PosthogAnalytics {
 | 
			
		|||
      : Anonymity.Disabled;
 | 
			
		||||
    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) {
 | 
			
		||||
      this.setRegistrationType(
 | 
			
		||||
        window.matrixclient.isGuest() || window.isPasswordlessUser
 | 
			
		||||
| 
						 | 
				
			
			@ -385,7 +398,7 @@ export class PosthogAnalytics {
 | 
			
		|||
    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.
 | 
			
		||||
    // This is called -
 | 
			
		||||
    //  * On page load, when the account data is first received by sync
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -124,6 +124,8 @@ export class OTelGroupCallMembership {
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  public onJoinCall() {
 | 
			
		||||
    if (!ElementCallOpenTelemetry.instance) return;
 | 
			
		||||
 | 
			
		||||
    // Create the main span that tracks the time we intend to be in the call
 | 
			
		||||
    this.callMembershipSpan =
 | 
			
		||||
      ElementCallOpenTelemetry.instance.tracer.startSpan(
 | 
			
		||||
| 
						 | 
				
			
			@ -174,6 +176,7 @@ export class OTelGroupCallMembership {
 | 
			
		|||
    for (const [userId, userCalls] of calls.entries()) {
 | 
			
		||||
      for (const [deviceId, call] of userCalls.entries()) {
 | 
			
		||||
        if (!this.callsByCallId.has(call.callId)) {
 | 
			
		||||
          if (ElementCallOpenTelemetry.instance) {
 | 
			
		||||
            const span = ElementCallOpenTelemetry.instance.tracer.startSpan(
 | 
			
		||||
              `matrix.call`,
 | 
			
		||||
              undefined,
 | 
			
		||||
| 
						 | 
				
			
			@ -192,6 +195,7 @@ export class OTelGroupCallMembership {
 | 
			
		|||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (const callTrackingInfo of this.callsByCallId.values()) {
 | 
			
		||||
      const userCalls = calls.get(callTrackingInfo.userId);
 | 
			
		||||
| 
						 | 
				
			
			@ -321,6 +325,8 @@ export class OTelGroupCallMembership {
 | 
			
		|||
  public onConnectionStatsReport(
 | 
			
		||||
    statsReport: GroupCallStatsReport<ConnectionStatsReport>
 | 
			
		||||
  ) {
 | 
			
		||||
    if (!ElementCallOpenTelemetry.instance) return;
 | 
			
		||||
 | 
			
		||||
    const type = OTelStatsReportType.ConnectionReport;
 | 
			
		||||
    const data =
 | 
			
		||||
      ObjectFlattener.flattenConnectionStatsReportObject(statsReport);
 | 
			
		||||
| 
						 | 
				
			
			@ -330,6 +336,8 @@ export class OTelGroupCallMembership {
 | 
			
		|||
  public onByteSentStatsReport(
 | 
			
		||||
    statsReport: GroupCallStatsReport<ByteSentStatsReport>
 | 
			
		||||
  ) {
 | 
			
		||||
    if (!ElementCallOpenTelemetry.instance) return;
 | 
			
		||||
 | 
			
		||||
    const type = OTelStatsReportType.ByteSentReport;
 | 
			
		||||
    const data = ObjectFlattener.flattenByteSentStatsReportObject(statsReport);
 | 
			
		||||
    this.buildStatsEventSpan({ type, data });
 | 
			
		||||
| 
						 | 
				
			
			@ -338,6 +346,8 @@ export class OTelGroupCallMembership {
 | 
			
		|||
  public onSummaryStatsReport(
 | 
			
		||||
    statsReport: GroupCallStatsReport<SummaryStatsReport>
 | 
			
		||||
  ) {
 | 
			
		||||
    if (!ElementCallOpenTelemetry.instance) return;
 | 
			
		||||
 | 
			
		||||
    const type = OTelStatsReportType.SummaryReport;
 | 
			
		||||
    const data = ObjectFlattener.flattenSummaryStatsReportObject(statsReport);
 | 
			
		||||
    this.buildStatsEventSpan({ type, data });
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue