Something went wrong. Try again.
Mirror of https://github.com/improsocial/improAn extensible Bluesky client for web
Something went wrong. Try again.
JavaScript
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889import { render } from "/js/lib/lit-html.js";import { scrollLocks } from "/js/scrollLocks.js";import { enableDragToDismiss } from "/js/utils.js";
export class Modal { static async open(...args) { const instance = new this(...args); return instance._mount(); }
constructor(options = {}) { this.options = options; }
get className() { return "bottom-sheet text-modal"; }
get attributes() { return {}; }
get dragToDismiss() { return true; }
canDismiss() { return true; }
ignoreTouchTarget(element) { return element.closest("button") !== null; }
render() { throw new Error(`${this.constructor.name} must implement render()`); }
_mount() { return new Promise((resolve) => { const dialog = document.createElement("dialog"); dialog.className = this.className; for (const [key, value] of Object.entries(this.attributes)) { dialog.setAttribute(key, value); }
let scrollLock = null; let resolved = false; const dismiss = (value) => { if (resolved) return; resolved = true; scrollLock?.release(); dialog.close(); dialog.remove(); resolve(value); }; const dismissIfAllowed = () => { if (this.canDismiss()) dismiss(); }; const update = () => { render(this.render({ dismiss, update, props: this.options }), dialog); };
update();
dialog.addEventListener("click", (event) => { if (event.target.tagName === "DIALOG") dismissIfAllowed(); }); dialog.addEventListener("cancel", (event) => { event.preventDefault(); dismissIfAllowed(); });
document.body.appendChild(dialog); scrollLock = scrollLocks.acquire({ target: dialog }); dialog.showModal();
if (this.dragToDismiss) { enableDragToDismiss(dialog, { onClose: () => dismiss(), confirmDismiss: () => this.canDismiss(), ignoreTouchTarget: (element) => this.ignoreTouchTarget(element), disableWhenKeyboardOpen: true, }); } }); }}