matrix-public-archive/server/hydrogen-vm-render-script.js

139 lines
3.6 KiB
JavaScript
Raw Normal View History

2022-02-07 18:55:11 -07:00
const assert = require('assert');
const {
2022-02-01 20:39:23 -07:00
Platform,
2022-02-01 22:45:09 -07:00
MediaRepository,
2022-02-01 20:39:23 -07:00
TilesCollection,
2022-02-01 20:39:23 -07:00
FragmentIdComparer,
tilesCreator: makeTilesCreator,
2022-02-01 20:39:23 -07:00
EventEntry,
encodeKey,
encodeEventIdKey,
Timeline,
TimelineView,
} = require('hydrogen-view-sdk');
2022-02-01 20:39:23 -07:00
const events = global.INPUT_EVENTS;
assert(events);
const stateEventMap = global.INPUT_STATE_EVENT_MAP;
assert(stateEventMap);
const config = global.INPUT_CONFIG;
assert(config);
assert(config.matrixServerUrl);
let eventIndexCounter = 0;
2022-02-01 20:39:23 -07:00
const fragmentIdComparer = new FragmentIdComparer([]);
2022-02-07 18:55:11 -07:00
function makeEventEntryFromEventJson(eventJson, memberEvent) {
assert(eventJson);
assert(memberEvent);
const eventIndex = eventIndexCounter;
const eventEntry = new EventEntry(
{
fragmentId: 0,
eventIndex: eventIndex, // TODO: What should this be?
roomId: roomId,
event: eventJson,
2022-02-07 18:55:11 -07:00
displayName: memberEvent.content && memberEvent.content.displayname,
avatarUrl: memberEvent.content && memberEvent.content.avatar_url,
key: encodeKey(roomId, 0, eventIndex),
eventIdKey: encodeEventIdKey(roomId, eventJson.event_id),
},
fragmentIdComparer
);
2022-02-01 20:39:23 -07:00
eventIndexCounter++;
2022-02-01 20:39:23 -07:00
return eventEntry;
}
2022-02-04 00:54:12 -07:00
async function mountHydrogen() {
const app = document.querySelector('#app');
const platformConfig = {};
2022-02-01 20:39:23 -07:00
const assetPaths = {};
const platform = new Platform(app, assetPaths, platformConfig, { development: true });
2022-02-01 20:39:23 -07:00
// We use the timeline to setup the relations between entries
const timeline = new Timeline({
roomId: roomId,
//storage: this._storage,
fragmentIdComparer: fragmentIdComparer,
clock: platform.clock,
logger: platform.logger,
//hsApi: this._hsApi
});
2022-02-01 20:39:23 -07:00
const tilesCreator = makeTilesCreator({
platform,
roomVM: {
room: {
2022-02-01 22:45:09 -07:00
mediaRepository: new MediaRepository({
homeserver: config.matrixServerUrl,
}),
},
2022-02-01 20:39:23 -07:00
},
timeline,
2022-02-01 20:39:23 -07:00
urlCreator: {
urlUntilSegment: () => {
return 'todo';
2022-02-01 22:45:09 -07:00
},
urlForSegments: () => {
return 'todo';
},
},
navigation: {
segment: () => {
return 'todo';
},
},
2022-02-01 20:39:23 -07:00
});
// Something we can modify with new state updates as we see them
const workingStateEventMap = {
...stateEventMap,
};
2022-02-07 18:55:11 -07:00
const eventEntries = events.map((event) => {
if (event.type === 'm.room.member') {
workingStateEventMap[event.state_key] = event;
}
const memberEvent = workingStateEventMap[event.user_id];
2022-02-07 18:55:11 -07:00
return makeEventEntryFromEventJson(event, memberEvent);
2022-02-01 20:39:23 -07:00
});
//console.log('eventEntries', eventEntries);
2022-02-01 21:32:59 -07:00
// We have to use `timeline._setupEntries([])` because it sets
// `this._allEntries` in `Timeline` and we don't want to use `timeline.load()`
// to request remote things.
timeline._setupEntries([]);
// Make it safe to iterate a derived observable collection
timeline.entries.subscribe({ onAdd: () => null, onUpdate: () => null });
// We use the timeline to setup the relations between entries
timeline.addEntries(eventEntries);
//console.log('timeline.entries', timeline.entries.length, timeline.entries);
const tiles = new TilesCollection(timeline.entries, tilesCreator);
// Trigger onSubscribeFirst -> tiles._populateTiles();
tiles.subscribe({ onAdd: () => null, onUpdate: () => null });
2022-02-01 21:32:59 -07:00
2022-02-01 22:45:09 -07:00
// Make the lazy-load images appear
for (const tile of tiles) {
2022-02-01 22:45:09 -07:00
tile.notifyVisible();
}
2022-02-01 20:39:23 -07:00
const timelineViewModel = {
showJumpDown: false,
setVisibleTileRange: () => {},
tiles: tiles,
};
const view = new TimelineView(timelineViewModel);
//console.log('view.mount()', view.mount());
2022-02-01 20:39:23 -07:00
app.appendChild(view.mount());
}
2022-02-04 00:54:12 -07:00
mountHydrogen();