More posthog tracking around joining rooms and room search (#7807)

This commit is contained in:
Michael Telatynski 2022-02-17 18:03:27 +00:00 committed by GitHub
parent e997676ae2
commit 658590e5bc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
59 changed files with 276 additions and 116 deletions

View file

@ -154,7 +154,7 @@ export class CommunityPrototypeStore extends AsyncStoreWithClient<IState> {
dis.dispatch<ViewRoomPayload>({
action: Action.ViewRoom,
room_id: chat.roomId,
_trigger: undefined, // Deprecated groups
metricsTrigger: undefined, // Deprecated groups
});
}
}

View file

@ -21,7 +21,9 @@ import { Store } from 'flux/utils';
import { MatrixError } from "matrix-js-sdk/src/http-api";
import { logger } from "matrix-js-sdk/src/logger";
import { ViewRoom as ViewRoomEvent } from "matrix-analytics-events/types/typescript/ViewRoom";
import { JoinedRoom as JoinedRoomEvent } from "matrix-analytics-events/types/typescript/JoinedRoom";
import { JoinRule } from "matrix-js-sdk/src/@types/partials";
import { Room } from "matrix-js-sdk/src/models/room";
import dis from '../dispatcher/dispatcher';
import { MatrixClientPeg } from '../MatrixClientPeg';
@ -38,6 +40,8 @@ import { ViewRoomPayload } from "../dispatcher/payloads/ViewRoomPayload";
import DMRoomMap from "../utils/DMRoomMap";
import SpaceStore from "./spaces/SpaceStore";
import { isMetaSpace, MetaSpace } from "./spaces";
import { JoinRoomPayload } from "../dispatcher/payloads/JoinRoomPayload";
import { JoinRoomReadyPayload } from "../dispatcher/payloads/JoinRoomReadyPayload";
const NUM_JOIN_RETRY = 5;
@ -149,11 +153,42 @@ class RoomViewStore extends Store<ActionPayload> {
case Action.JoinRoomError:
this.joinRoomError(payload);
break;
case Action.JoinRoomReady:
case Action.JoinRoomReady: {
if (this.state.roomId === payload.roomId) {
this.setState({ shouldPeek: false });
}
const cli = MatrixClientPeg.get();
const updateMetrics = () => {
const room = cli.getRoom(payload.roomId);
const numMembers = room.getJoinedMemberCount();
const roomSize = numMembers > 1000 ? "MoreThanAThousand"
: numMembers > 100 ? "OneHundredAndOneToAThousand"
: numMembers > 10 ? "ElevenToOneHundred"
: numMembers > 2 ? "ThreeToTen"
: numMembers > 1 ? "Two"
: "One";
PosthogAnalytics.instance.trackEvent<JoinedRoomEvent>({
eventName: "JoinedRoom",
trigger: payload.metricsTrigger,
roomSize,
isDM: !!DMRoomMap.shared().getUserIdForRoomId(room.roomId),
isSpace: room.isSpaceRoom(),
});
cli.off("Room", updateMetrics);
};
if (cli.getRoom(payload.roomId)) {
updateMetrics();
} else {
cli.on("Room", updateMetrics);
}
break;
}
case 'on_client_not_viable':
case 'on_logged_out':
this.reset();
@ -168,7 +203,7 @@ class RoomViewStore extends Store<ActionPayload> {
action: Action.ViewRoom,
room_id: payload.event.getRoomId(),
replyingToEvent: payload.event,
_trigger: undefined, // room doesn't change
metricsTrigger: undefined, // room doesn't change
});
} else {
this.setState({
@ -191,7 +226,7 @@ class RoomViewStore extends Store<ActionPayload> {
private async viewRoom(payload: ViewRoomPayload): Promise<void> {
if (payload.room_id) {
if (payload._trigger !== null && payload.room_id !== this.state.roomId) {
if (payload.metricsTrigger !== null && payload.room_id !== this.state.roomId) {
let activeSpace: ViewRoomEvent["activeSpace"];
if (SpaceStore.instance.activeSpace === MetaSpace.Home) {
activeSpace = "Home";
@ -205,8 +240,8 @@ class RoomViewStore extends Store<ActionPayload> {
PosthogAnalytics.instance.trackEvent<ViewRoomEvent>({
eventName: "ViewRoom",
trigger: payload._trigger,
viaKeyboard: payload._viaKeyboard,
trigger: payload.metricsTrigger,
viaKeyboard: payload.metricsViaKeyboard,
isDM: !!DMRoomMap.shared().getUserIdForRoomId(payload.room_id),
isSpace: MatrixClientPeg.get().getRoom(payload.room_id)?.isSpaceRoom(),
activeSpace,
@ -240,10 +275,11 @@ class RoomViewStore extends Store<ActionPayload> {
this.setState(newState);
if (payload.auto_join) {
dis.dispatch({
dis.dispatch<JoinRoomPayload>({
...payload,
action: Action.JoinRoom,
roomId: payload.room_id,
metricsTrigger: payload.metricsTrigger as JoinRoomPayload["metricsTrigger"],
});
}
} else if (payload.room_alias) {
@ -297,7 +333,7 @@ class RoomViewStore extends Store<ActionPayload> {
});
}
private async joinRoom(payload: ActionPayload) {
private async joinRoom(payload: JoinRoomPayload) {
this.setState({
joining: true,
});
@ -308,9 +344,9 @@ class RoomViewStore extends Store<ActionPayload> {
const address = roomAlias || roomId;
const viaServers = this.state.viaServers || [];
try {
await retry<any, MatrixError>(() => cli.joinRoom(address, {
await retry<Room, MatrixError>(() => cli.joinRoom(address, {
viaServers,
...payload.opts,
...(payload.opts || {}),
}), NUM_JOIN_RETRY, (err) => {
// if we received a Gateway timeout then retry
return err.httpStatus === 504;
@ -319,9 +355,10 @@ class RoomViewStore extends Store<ActionPayload> {
// We do *not* clear the 'joining' flag because the Room object and/or our 'joined' member event may not
// have come down the sync stream yet, and that's the point at which we'd consider the user joined to the
// room.
dis.dispatch({
dis.dispatch<JoinRoomReadyPayload>({
action: Action.JoinRoomReady,
roomId,
metricsTrigger: payload.metricsTrigger,
});
} catch (err) {
dis.dispatch({

View file

@ -161,7 +161,8 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
defaultDispatcher.dispatch<ViewRoomPayload>({
action: Action.ViewRoom,
room_id: roomId,
_trigger: "WebSpacePanelNotificationBadge",
context_switch: true,
metricsTrigger: "WebSpacePanelNotificationBadge",
});
} else {
const lists = RoomListStore.instance.unfilteredLists;
@ -178,7 +179,8 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
defaultDispatcher.dispatch<ViewRoomPayload>({
action: Action.ViewRoom,
room_id: unreadRoom.roomId,
_trigger: "WebSpacePanelNotificationBadge",
context_switch: true,
metricsTrigger: "WebSpacePanelNotificationBadge",
});
break;
}
@ -227,14 +229,14 @@ export class SpaceStoreClass extends AsyncStoreWithClient<IState> {
action: Action.ViewRoom,
room_id: roomId,
context_switch: true,
_trigger: "WebSpaceContextSwitch",
metricsTrigger: "WebSpaceContextSwitch",
});
} else if (cliSpace) {
defaultDispatcher.dispatch<ViewRoomPayload>({
action: Action.ViewRoom,
room_id: space,
context_switch: true,
_trigger: "WebSpaceContextSwitch",
metricsTrigger: "WebSpaceContextSwitch",
});
} else {
defaultDispatcher.dispatch({

View file

@ -296,7 +296,7 @@ export class StopGapWidget extends EventEmitter {
defaultDispatcher.dispatch<ViewRoomPayload>({
action: Action.ViewRoom,
room_id: targetRoomId,
_trigger: "Widget",
metricsTrigger: "Widget",
});
// acknowledge so the widget doesn't freak out