79 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import './public-path';
 | 
						|
import { createRoot } from 'react-dom/client';
 | 
						|
 | 
						|
import { afterInitialRender } from 'mastodon/../hooks/useRenderSignal';
 | 
						|
 | 
						|
import { start } from '../mastodon/common';
 | 
						|
import { Status } from '../mastodon/features/standalone/status';
 | 
						|
import { loadPolyfills } from '../mastodon/polyfills';
 | 
						|
import ready from '../mastodon/ready';
 | 
						|
 | 
						|
start();
 | 
						|
 | 
						|
function loaded() {
 | 
						|
  const mountNode = document.getElementById('mastodon-status');
 | 
						|
 | 
						|
  if (mountNode) {
 | 
						|
    const attr = mountNode.getAttribute('data-props');
 | 
						|
 | 
						|
    if (!attr) return;
 | 
						|
 | 
						|
    const props = JSON.parse(attr) as { id: string; locale: string };
 | 
						|
    const root = createRoot(mountNode);
 | 
						|
 | 
						|
    root.render(<Status {...props} />);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function main() {
 | 
						|
  ready(loaded).catch((error: unknown) => {
 | 
						|
    console.error(error);
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
loadPolyfills()
 | 
						|
  .then(main)
 | 
						|
  .catch((error: unknown) => {
 | 
						|
    console.error(error);
 | 
						|
  });
 | 
						|
 | 
						|
interface SetHeightMessage {
 | 
						|
  type: 'setHeight';
 | 
						|
  id: string;
 | 
						|
  height: number;
 | 
						|
}
 | 
						|
 | 
						|
function isSetHeightMessage(data: unknown): data is SetHeightMessage {
 | 
						|
  if (
 | 
						|
    data &&
 | 
						|
    typeof data === 'object' &&
 | 
						|
    'type' in data &&
 | 
						|
    data.type === 'setHeight'
 | 
						|
  )
 | 
						|
    return true;
 | 
						|
  else return false;
 | 
						|
}
 | 
						|
 | 
						|
window.addEventListener('message', (e) => {
 | 
						|
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- typings are not correct, it can be null in very rare cases
 | 
						|
  if (!e.data || !isSetHeightMessage(e.data) || !window.parent) return;
 | 
						|
 | 
						|
  const data = e.data;
 | 
						|
 | 
						|
  // Only set overflow to `hidden` once we got the expected `message` so the post can still be scrolled if
 | 
						|
  // embedded without parent Javascript support
 | 
						|
  document.body.style.overflow = 'hidden';
 | 
						|
 | 
						|
  // We use a timeout to allow for the React page to render before calculating the height
 | 
						|
  afterInitialRender(() => {
 | 
						|
    window.parent.postMessage(
 | 
						|
      {
 | 
						|
        type: 'setHeight',
 | 
						|
        id: data.id,
 | 
						|
        height: document.getElementsByTagName('html')[0]?.scrollHeight,
 | 
						|
      },
 | 
						|
      '*',
 | 
						|
    );
 | 
						|
  });
 | 
						|
});
 |