mastodon/app/javascript/mastodon/main.tsx
Echo 91174e7e1b
Webpack to Vite: Utilize Ruby Vite (#34469)
Co-authored-by: Renaud Chaput <renchap@gmail.com>
2025-05-09 10:47:15 +02:00

61 lines
1.7 KiB
TypeScript

import { createRoot } from 'react-dom/client';
import { setupBrowserNotifications } from 'mastodon/actions/notifications';
import Mastodon from 'mastodon/containers/mastodon';
import { me } from 'mastodon/initial_state';
import * as perf from 'mastodon/performance';
import ready from 'mastodon/ready';
import { store } from 'mastodon/store';
import { isProduction, isDevelopment } from './utils/environment';
function main() {
perf.start('main()');
return ready(async () => {
const mountNode = document.getElementById('mastodon');
if (!mountNode) {
throw new Error('Mount node not found');
}
const props = JSON.parse(
mountNode.getAttribute('data-props') ?? '{}',
) as Record<string, unknown>;
const root = createRoot(mountNode);
root.render(<Mastodon {...props} />);
store.dispatch(setupBrowserNotifications());
if (isProduction() && me && 'serviceWorker' in navigator) {
const { Workbox } = await import('workbox-window');
const wb = new Workbox(
isDevelopment() ? '/packs-dev/dev-sw.js?dev-sw' : '/sw.js',
{ type: 'module', scope: '/' },
);
let registration;
try {
registration = await wb.register();
} catch (err) {
console.error(err);
}
if (
registration &&
'Notification' in window &&
Notification.permission === 'granted'
) {
const registerPushNotifications = await import(
'mastodon/actions/push_notifications'
);
store.dispatch(registerPushNotifications.register());
}
}
perf.stop('main()');
});
}
// eslint-disable-next-line import/no-default-export
export default main;