openreplay/frontend/app/player/mobile/IOSPlayer.ts
Delirium 35461acaf3
[WIP] Mobile replayer (#1452)
* fix(ui): fix up mobile recordings display

* fix(ui): some messages

* fix(ui): some messages

* fix(player): fix msg generation for ios messages

* feat(player): add generic mmanager interface for ios player impl

* feat(player): mobile player and message manager; touch manager; videoplayer

* feat(player): add iphone shells, add log panel,

* feat(player): detect ios sessions and inject correct player

* feat(player): move screen mapper to utils

* feat(player): events panel for mobile, map shell sizes to device type data,

* feat(player): added network tab to mobile player; unify network message (ios and web)

* feat(player): resize canvas up to phone screen size, fix capitalize util

* feat(player): some general changes to support mobile events and network entries

* feat(player): remove swipes from timeline

* feat(player): more stuff for list walker

* fix(ui): performance tab, mobile project typings and form

* fix(ui):some ui touches for ios replayer shell

* fix(ui): more fixes for ui, new onboarding screen for mobile projects

* feat(ui): mobile overview panel (xray)

* feat(ui): fixes for phone shell and tap events

* fix(tracker): change phone shells and sizes

* fix(tracker): fix border on replay screen

* feat(ui): use crashes from db to show in session

* feat(ui): use event name for xray

* feat(ui): some overall ui fixes

* feat(ui): IOS -> iOS

* feat(ui): change tags to ant d

* fix(ui): fast fix

* fix(ui): fix for capitalizer

* fix(ui): fix for browser display

* fix(ui): fix for note popup

* fix(ui): change exceptions display

* fix(ui): add click rage to ios xray

* fix(ui): some icons and resizing

* fix(ui): fix ios context menu overlay, fix console logs creation for ios

* feat(ui): added icons

* feat(ui): performance warnings

* feat(ui): performance warnings

* feat(ui): different styles

* feat(ui): rm debug true

* feat(ui): fix warnings display

* feat(ui): some styles for animation

* feat(ui): add some animations to warnings

* feat(ui): move perf warnings to performance graph

* feat(ui): hide/show warns dynamically

* feat(ui): new mobile touch animation

* fix(tracker): update msg for ios

* fix(ui): taprage fixes

* fix(ui): regenerate icons and messages

* fix(ui): fix msgs

* fix(backend): fix events gen

* fix(backend): fix userid msg
2023-10-27 12:12:09 +02:00

131 lines
3.6 KiB
TypeScript

import { Log, LogLevel, SessionFilesInfo } from 'Player'
import type { Store } from 'Player'
import MessageLoader from "Player/web/MessageLoader";
import Player from '../player/Player'
import Screen, { ScaleMode } from '../web/Screen/Screen'
import IOSMessageManager from "Player/mobile/IOSMessageManager";
export default class IOSPlayer extends Player {
static readonly INITIAL_STATE = {
...Player.INITIAL_STATE,
...MessageLoader.INITIAL_STATE,
...IOSMessageManager.INITIAL_STATE,
scale: 1,
}
public screen: Screen
protected messageManager: IOSMessageManager
protected readonly messageLoader: MessageLoader
constructor(
protected wpState: Store<any>,
session: SessionFilesInfo,
public readonly uiErrorHandler?: { error: (msg: string) => void }
) {
const screen = new Screen(true, ScaleMode.Embed)
const messageManager = new IOSMessageManager(session, wpState, screen, uiErrorHandler)
const messageLoader = new MessageLoader(
session,
wpState,
messageManager,
false,
uiErrorHandler
)
super(wpState, messageManager);
this.screen = screen
this.messageManager = messageManager
this.messageLoader = messageLoader
void messageLoader.loadFiles()
const endTime = session.duration?.valueOf() || 0
wpState.update({
session,
endTime,
})
}
attach = (parent: HTMLElement) => {
this.screen.attach(parent)
}
public updateDimensions(dimensions: { width: number; height: number }) {
return this.messageManager.updateDimensions(dimensions)
}
public updateLists(session: any) {
const exceptions = session.crashes.concat(session.errors || [])
const lists = {
event: session.events.map((e: Record<string, any>) => {
if (e.name === 'Click') e.name = 'Touch'
return e
}) || [],
frustrations: session.frustrations || [],
stack: session.stackEvents || [],
exceptions: exceptions.map(({ name, ...rest }: any) =>
Log({
level: LogLevel.ERROR,
value: name,
name,
message: rest.reason,
errorId: rest.crashId || rest.errorId,
...rest,
})
) || [],
}
return this.messageManager.updateLists(lists)
}
public updateOverlayStyle(style: Partial<CSSStyleDeclaration>) {
this.screen.updateOverlayStyle(style)
}
injectPlayer = (player: HTMLElement) => {
this.screen.addToBody(player)
this.screen.addMobileStyles()
window.addEventListener('resize', () =>
this.customScale(this.customConstrains.width, this.customConstrains.height)
)
}
scale = () => {
// const { width, height } = this.wpState.get()
if (!this.screen) return;
console.debug("using customConstrains to scale player")
// sometimes happens in live assist sessions for some reason
this.screen?.scale?.(this.customConstrains)
}
customConstrains = {
width: 0,
height: 0,
}
customScale = (width: number, height: number) => {
if (!this.screen) return;
this.screen?.scale?.({ width, height })
this.customConstrains = { width, height }
this.wpState.update({ scale: this.screen.getScale() })
}
addFullscreenBoundary = (isFullscreen?: boolean) => {
if (isFullscreen) {
this.screen?.addFullscreenBoundary()
} else {
this.screen?.addMobileStyles()
}
}
clean = () => {
super.clean()
this.screen.clean()
// @ts-ignore
this.screen = undefined;
this.messageLoader.clean()
// @ts-ignore
this.messageManager = undefined;
window.removeEventListener('resize', this.scale)
}
}