Compare commits
1 commit
main
...
dev-ios-te
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8143d8cf1b |
7 changed files with 109 additions and 59 deletions
|
|
@ -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)
|
||||||
|
|
@ -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} />
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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({
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue