mirror of
https://github.com/mastodon/mastodon.git
synced 2025-06-07 05:39:14 +00:00
61 lines
1.7 KiB
TypeScript
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;
|