You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Hydro/packages/ui-default/components/media/media.page.js

47 lines
2.0 KiB
JavaScript

import $ from 'jquery';
import { AutoloadPage } from 'vj/misc/Page';
import { request } from 'vj/utils';
export default new AutoloadPage('media', async () => {
async function parseMedia($dom = $(document.body)) {
const items = [];
const resolvers = [];
const users = $dom.find('div[data-user]');
const resolve = (ele, item) => {
items.push(item);
resolvers.push((html) => html && $(ele).replaceWith($(html)));
};
users.get().forEach((ele) => resolve(ele, { type: 'user', id: +$(ele).text() }));
$dom.find('.typo').addBack('.typo').get().forEach((el) => {
if (el.className.includes('no-media')) return;
$(el).find('a[href]').get().forEach((ele) => {
if ($(ele).parent().hasClass('user-profile-link')) return;
let target = $(ele).attr('href');
let { domainId } = UiContext;
if (target.startsWith(UiContext.url_prefix)) {
target.replace(UiContext.url_prefix, '');
if (!target.startsWith('/')) target = `/${target}`;
}
if (!target.startsWith('/') || target.startsWith('//')) return;
if (target.startsWith('/d/')) {
const [, , domain, ...extra] = target.split('/');
domainId = domain;
target = `/${extra.join('/')}`;
}
const [, category, data, extra] = target.split('/');
if (!data) return;
if (category === 'user' && Number.isInteger(+data) && !extra) resolve(ele, { type: 'user', id: +data });
if (category === 'p' && !extra) resolve(ele, { type: 'problem', id: data, domainId });
if (category === 'contest' && !extra) resolve(ele, { type: 'contest', id: data, domainId });
if (category === 'homework' && !extra) resolve(ele, { type: 'homework', id: data, domainId });
});
});
if (!items.length) return;
const res = await request.post(`/d/${UiContext.domainId}/media`, { items });
for (let i = 0; i < res.length; i++) resolvers[i](res[i]);
}
await parseMedia();
$(document).on('vjContentNew', (e) => parseMedia($(e.target)));
});