Compare commits

...
Sign in to create a new pull request.

1 commit

Author SHA1 Message Date
Shekar Siri
8143d8cf1b ui - wip 2021-11-16 20:04:55 +05:30
7 changed files with 109 additions and 59 deletions

View file

@ -1,6 +1,8 @@
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import { connect } from 'react-redux';
import ImagePlayer from 'Player/ios/ImagePlayer'; import ImagePlayer from 'Player/ios/ImagePlayer';
import { CRASHES, NETWORK, LOGS, PERFORMANCE, CUSTOM } from 'Player/ios/state'; import { CRASHES, NETWORK, LOGS, PERFORMANCE, CUSTOM } from 'Player/ios/state';
import { fetchScreenUrls } from 'Duck/sessions';
import Network from './IOSPlayer/Network'; import Network from './IOSPlayer/Network';
import Logs from './IOSPlayer/Logs'; import Logs from './IOSPlayer/Logs';
import IMGScreen from './IOSPlayer/IMGScreen'; import IMGScreen from './IOSPlayer/IMGScreen';
@ -44,7 +46,7 @@ const TOOLBAR = [
]; ];
export default function IOSPlayer({ session }) { function IOSPlayer({ session }) {
const [player] = useState(() => new ImagePlayer(session)); const [player] = useState(() => new ImagePlayer(session));
useEffect(() => { useEffect(() => {
player.attach({ wrapperId: "IOSWrapper", screenId: "IOSscreen" }); player.attach({ wrapperId: "IOSWrapper", screenId: "IOSscreen" });
@ -64,3 +66,7 @@ export default function IOSPlayer({ session }) {
</Layout> </Layout>
); );
} }
export default connect(state => ({
}, { fetchScreenUrls }))(IOSPlayer)

View file

@ -1,6 +1,7 @@
import { observer } from 'mobx-react-lite'; import { observer } from 'mobx-react-lite';
import Screen from './ScreenWithLoaders'; import Screen from './ScreenWithLoaders';
import HTMLScreen from './HTMLScreen'; import HTMLScreen from './HTMLScreen';
import { SCREEN_CHANGE, time } from 'Player/ios/state';
const MODEL_IMG_MAP = { const MODEL_IMG_MAP = {
"iPhone 12" : { "iPhone 12" : {
@ -98,6 +99,12 @@ function IMGScreen(props) {
const { wrapperId, player, screenId } = props; const { wrapperId, player, screenId } = props;
const curScreenWidth = player.state.orientationLandscape ? player.state.height : player.state.width; const curScreenWidth = player.state.orientationLandscape ? player.state.height : player.state.width;
// console.log('player scrrens', player.lists[SCREEN_CHANGE])
// console.log('player scrrens', player.lists[SCREEN_CHANGE].current)
// console.log('player scrrens', player.lists[SCREEN_CHANGE].timeNow)
// console.log('-----', time)
return ( return (
<div id={wrapperId} className="relative"> <div id={wrapperId} className="relative">
<Screen className="absolute inset-0" screenId={ screenId } player={player} /> <Screen className="absolute inset-0" screenId={ screenId } player={player} />

View file

@ -15,6 +15,7 @@ const FETCH_LIST = new RequestTypes('sessions/FETCH_LIST');
const FETCH = new RequestTypes('sessions/FETCH'); const FETCH = new RequestTypes('sessions/FETCH');
const FETCH_FAVORITE_LIST = new RequestTypes('sessions/FETCH_FAVORITE_LIST'); const FETCH_FAVORITE_LIST = new RequestTypes('sessions/FETCH_FAVORITE_LIST');
const FETCH_LIVE_LIST = new RequestTypes('sessions/FETCH_LIVE_LIST'); const FETCH_LIVE_LIST = new RequestTypes('sessions/FETCH_LIVE_LIST');
const FETCH_SCREEN_URLS = new RequestTypes('sessions/FETCH_SCREEN_URLS');
const TOGGLE_FAVORITE = new RequestTypes('sessions/TOGGLE_FAVORITE'); const TOGGLE_FAVORITE = new RequestTypes('sessions/TOGGLE_FAVORITE');
const FETCH_ERROR_STACK = new RequestTypes('sessions/FETCH_ERROR_STACK'); const FETCH_ERROR_STACK = new RequestTypes('sessions/FETCH_ERROR_STACK');
const FETCH_INSIGHTS = new RequestTypes('sessions/FETCH_INSIGHTS'); const FETCH_INSIGHTS = new RequestTypes('sessions/FETCH_INSIGHTS');
@ -315,6 +316,13 @@ export function fetchLiveList() {
}; };
} }
export function fetchScreenUrls(urls) {
return {
types: FETCH_SCREEN_URLS.toArray(),
call: client => client.post('/mobile/urls', { params: urls }),
};
}
export function toggleChatWindow(state) { export function toggleChatWindow(state) {
return { return {
type: TOGGLE_CHAT_WINDOW, type: TOGGLE_CHAT_WINDOW,

View file

@ -3,7 +3,7 @@ export default class PrimitiveReader {
constructor(protected readonly buf: Uint8Array) {} constructor(protected readonly buf: Uint8Array) {}
hasNext() { hasNext() {
return this.buf.length < this.p return this.buf.length > this.p
} }
readUint() { readUint() {

View file

@ -116,6 +116,7 @@ export default class ListWalker<T extends Timed> {
this._p--; this._p--;
changed = true; changed = true;
} }
return changed ? this._list[ this._p - 1 ] : null; return changed ? this._list[ this._p - 1 ] : null;
} }

View file

@ -1,4 +1,4 @@
import { io } from 'socket.io-client'; // import { io } from 'socket.io-client';
import { makeAutoObservable, autorun } from 'mobx'; import { makeAutoObservable, autorun } from 'mobx';
import logger from 'App/logger'; import logger from 'App/logger';
import { import {
@ -8,7 +8,7 @@ import {
PLAYING, PLAYING,
PAUSED, PAUSED,
COMPLETED, COMPLETED,
SOCKET_ERROR, // SOCKET_ERROR,
CRASHES, CRASHES,
LOGS, LOGS,
@ -16,6 +16,7 @@ import {
PERFORMANCE, PERFORMANCE,
CUSTOM, CUSTOM,
EVENTS, // last evemt +clicks EVENTS, // last evemt +clicks
SCREEN_CHANGE,
} from "./state"; } from "./state";
import { import {
createListState, createListState,
@ -40,8 +41,10 @@ export default class ImagePlayer {
[EVENTS]: createListState(), [EVENTS]: createListState(),
[CUSTOM]: createListState(), [CUSTOM]: createListState(),
[PERFORMANCE]: new PerformanceList(), [PERFORMANCE]: new PerformanceList(),
[SCREEN_CHANGE]: createListState(),
} }
_clicks = createListState() _clicks = createListState()
_swipes = createListState()
_screens = createScreenListState() _screens = createScreenListState()
constructor(session) { constructor(session) {
@ -58,6 +61,7 @@ export default class ImagePlayer {
session.crashes.forEach(c => this.lists[CRASHES].append(c)); session.crashes.forEach(c => this.lists[CRASHES].append(c));
session.events.forEach(e => this.lists[EVENTS].append(e)); session.events.forEach(e => this.lists[EVENTS].append(e));
session.stackEvents.forEach(e => this.lists[CUSTOM].append(e)); session.stackEvents.forEach(e => this.lists[CUSTOM].append(e));
window.fetch(session.mobsUrl) window.fetch(session.mobsUrl)
.then(r => r.arrayBuffer()) .then(r => r.arrayBuffer())
.then(b => { .then(b => {
@ -68,13 +72,18 @@ export default class ImagePlayer {
this.lists[LOGS].append(m); this.lists[LOGS].append(m);
} else if (m.tp === "ios_network_call") { } else if (m.tp === "ios_network_call") {
this.lists[NETWORK].append(m); this.lists[NETWORK].append(m);
// } else if (m.tp === "ios_custom_event") {
// this.lists[CUSTOM].append(m);
} else if (m.tp === "ios_click_event") { } else if (m.tp === "ios_click_event") {
m.time -= 600; //for graphic initiation m.time -= 400; //for graphic initiation
this._clicks.append(m); this._clicks.append(m);
} else if (m.tp === "ios_swipe_event") {
m.time -= 400; //for graphic initiation
this._swipes.append(m);
} else if (m.tp === "ios_performance_event") { } else if (m.tp === "ios_performance_event") {
this.lists[PERFORMANCE].append(m); this.lists[PERFORMANCE].append(m);
} else if (m.tp === "ios_screen_changes") {
this.lists[SCREEN_CHANGE].append(m);
// const { time, width, height } = m;
// this._screens.insertScreen(time, width, height)
} }
} catch (e) { } catch (e) {
logger.error(e); logger.error(e);
@ -83,57 +92,58 @@ export default class ImagePlayer {
Object.values(this.lists).forEach(list => list.moveToLast(0)); // In case of negative values Object.values(this.lists).forEach(list => list.moveToLast(0)); // In case of negative values
}) })
if (session.socket == null || typeof session.socket.jwt !== "string" || typeof session.socket.url !== "string") { // if (session.socket == null || typeof session.socket.jwt !== "string" || typeof session.socket.url !== "string") {
logger.error("No socket info found fpr session", session); // logger.error("No socket info found fpr session", session);
return // return
} // }
// console.log('session', session)
const options = { const options = {
extraHeaders: {Authorization: `Bearer ${session.socket.jwt}`}, // extraHeaders: {Authorization: `Bearer ${session.socket.jwt}`},
reconnectionAttempts: 5, reconnectionAttempts: 5,
//transports: ['websocket'], //transports: ['websocket'],
} }
const socket = this._socket = io(session.socket.url, options); // const socket = this._socket = io(session.socket.url, options);
socket.on("connect", () => { // socket.on("connect", () => {
logger.log("Socket Connected"); // logger.log("Socket Connected");
}); // });
socket.on('disconnect', (reason) => { // socket.on('disconnect', (reason) => {
if (reason === 'io client disconnect') { // if (reason === 'io client disconnect') {
return; // return;
} // }
logger.error("Disconnected. Reason: ", reason) // logger.error("Disconnected. Reason: ", reason)
// if (reason === 'io server disconnect') { // // if (reason === 'io server disconnect') {
// socket.connect(); // // socket.connect();
// } // // }
}); // });
socket.on('connect_error', (e) => { // socket.on('connect_error', (e) => {
this.state.setState(SOCKET_ERROR); // this.state.setState(SOCKET_ERROR);
logger.error(e) // logger.error(e)
}); // });
socket.on('screen', (time, width, height, binary) => { // socket.on('screen', (time, width, height, binary) => {
//logger.log("New Screen!", time, width, height, binary); // //logger.log("New Screen!", time, width, height, binary);
this._screens.insertScreen(time, width, height, binary); // this._screens.insertScreen(time, width, height, binary);
}); // });
socket.on('buffered', (playTime) => { // socket.on('buffered', (playTime) => {
if (playTime === this.state.time) { // if (playTime === this.state.time) {
this.state.setBufferingState(false); // this.state.setBufferingState(false);
} // }
logger.log("Play ack!", playTime); // logger.log("Play ack!", playTime);
}); // });
let startPingInterval; // let startPingInterval;
socket.on('start', () => { // socket.on('start', () => {
logger.log("Started!"); // logger.log("Started!");
clearInterval(startPingInterval) // clearInterval(startPingInterval)
this.state.setBufferingState(true); // this.state.setBufferingState(true);
socket.emit("speed", this.state.speed); // socket.emit("speed", this.state.speed);
this.play(); // this.play();
}); // });
startPingInterval = setInterval(() => socket.emit("start"), 1000); // startPingInterval = setInterval(() => socket.emit("start"), 1000);
socket.emit("start"); // socket.emit("start");
window.addEventListener("resize", this.scale); window.addEventListener("resize", this.scale);
autorun(this.scale); autorun(this.scale);
@ -191,14 +201,22 @@ export default class ImagePlayer {
ts = Math.max(Math.min(ts, this.state.endTime), 0); ts = Math.max(Math.min(ts, this.state.endTime), 0);
this.state.setTime(ts); this.state.setTime(ts);
Object.values(this.lists).forEach(list => list.moveToLast(ts)); Object.values(this.lists).forEach(list => list.moveToLast(ts));
const screen = this._screens.moveToLast(ts);
if (screen != null) { // const screen = this._screens.moveToLast(ts);
const { dataURL, width, height } = screen; // if (screen != null) {
this.state.setSize(width, height); // const { dataURL, width, height } = screen;
//imagePromise.then(() => this._updateFrame({ image, width, height })); // this.state.setSize(width, height);
//this._screen.style.backgroundImage = `url(${screen.dataURL})`; // //imagePromise.then(() => this._updateFrame({ image, width, height }));
screen.loadImage.then(() => this._screen.style.backgroundImage = `url(${screen.dataURL})`); // //this._screen.style.backgroundImage = `url(${screen.dataURL})`;
// screen.loadImage.then(() => this._screen.style.backgroundImage = `url(${screen.dataURL})`);
// }
const lastScreen = this.lists[SCREEN_CHANGE].moveToLast(ts)
if (lastScreen != null) {
const { timestamp, width, height } = lastScreen;
console.log('lastScreen', lastScreen)
} }
const lastClick = this._clicks.moveToLast(ts); const lastClick = this._clicks.moveToLast(ts);
if (lastClick != null && lastClick.time > ts - 600) { if (lastClick != null && lastClick.time > ts - 600) {
this._animateClick(lastClick); this._animateClick(lastClick);
@ -230,6 +248,14 @@ export default class ImagePlayer {
this.scale(); this.scale();
} }
currentUrls(timenow) { // TODO
const max = this.lists[SCREEN_CHANGE].maxTime
const min = this.lists[SCREEN_CHANGE].minTime
const divides = Math.ceil(max / 10000)
this.lists[SCREEN_CHANGE].map
}
get loading() { get loading() {
return this.state.initializing; return this.state.initializing;
@ -296,7 +322,6 @@ export default class ImagePlayer {
if (completed) { if (completed) {
this._setComplete(); this._setComplete();
} else { } else {
// if (live && time > endTime) { // if (live && time > endTime) {
// update({ // update({
// endTime: time, // endTime: time,
@ -307,6 +332,8 @@ export default class ImagePlayer {
} }
}; };
this._animationFrameRequestId = requestAnimationFrame(nextFrame); this._animationFrameRequestId = requestAnimationFrame(nextFrame);
console.log('screens', this.lists[SCREEN_CHANGE])
} }

View file

@ -9,7 +9,8 @@ export const
LOGS = 3, LOGS = 3,
EVENTS = 4, EVENTS = 4,
CUSTOM = 5, CUSTOM = 5,
PERFORMANCE = 6; PERFORMANCE = 6,
SCREEN_CHANGE = 7;
export function createToolPanelState() { export function createToolPanelState() {
return makeAutoObservable({ return makeAutoObservable({