UNPKG

@codedoc/core

Version:

Create beautiful modern documentation websites.

94 lines 3.58 kB
import { ref } from '@connectv/html'; import { interval, of, merge } from 'rxjs'; import { ajax } from 'rxjs/ajax'; import { webSocket } from 'rxjs/webSocket'; import { switchMap, catchError, map } from 'rxjs/operators'; import { funcTransport } from '@connectv/sdh/transport'; import { default as AnsiUp } from 'ansi_up'; import { StatusCheckURL, StatusBuildingResponse, StatusReadyResponse, StatusErrorResponse } from './config'; import { getRenderer } from '../transport/renderer'; import { Loading } from '../components/util/loading'; import { Overlay } from '../components/util/overlay'; export function Toast(_, renderer) { const holder = ref(); this.track({ bind() { setTimeout(() => holder.$.style.transform = '', 10); } }); return renderer.create("div", { _ref: holder, style: ` position: fixed; bottom: 32px; right: 32px; z-index: 10000; background: rgba(64, 64, 64, .65); color: white; padding: 24px; border-radius: 8px; transform: translateY(200px); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); transition: transform .3s; ` }, renderer.create(Loading, null), " \u2002Rebuilding documents ..."); } export function reloadOnChange() { let building = false; let error = false; let errorMsg; const renderer = getRenderer(); let toast; let overlay; const ansiUp = new AnsiUp(); const buildingMode = () => { if (!building) { building = true; error = false; errorMsg = ''; if (toast) toast.remove(); if (overlay) overlay.remove(); toast = renderer.render(renderer.create(Toast, null)).on(document.body); } }; const showError = (err) => { console.log(error); if (!error || errorMsg !== err) { error = true; errorMsg = err; building = false; if (toast) toast.remove(); if (overlay) overlay.remove(); const html = ansiUp.ansi_to_html(errorMsg) .replace(/(https:\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/igm, '<a href="$1" target="_blank" style="color: #40a8c4 !important">$1</a>'); overlay = renderer.render(renderer.create(Overlay, { sticky: true }, renderer.create("pre", { style: "text-align: left; font-size: 14px; background: rgba(0, 0, 0, .35); padding: 8px; border-radius: 8px;", _innerHTML: html }))).on(document.body); } }; merge(webSocket({ url: (window.location.protocol === 'https') ? 'wss://' : 'ws://' + window.location.host + StatusCheckURL, closeObserver: { next: () => buildingMode() } }).pipe(catchError(() => of())), interval(500).pipe(switchMap(() => ajax({ url: StatusCheckURL, responseType: 'json', timeout: 200, }) .pipe(catchError(() => of(buildingMode())))), map(result => result ? result.response : undefined))).subscribe(state => { if (state) { if (state.status === StatusBuildingResponse) buildingMode(); else if (state.status === StatusErrorResponse) showError(state.error); else if (state.status === StatusReadyResponse && building) { location.reload(); } } }); } export const reloadOnChange$ = /*#__PURE__*/ funcTransport(reloadOnChange); //# sourceMappingURL=reload.js.map