1
0
Fork 0

Rewrite polyfill suspense for Composer with preload

Hopefully this works
This commit is contained in:
Lim Chee Aun 2024-05-25 20:43:15 +08:00
parent c11bbbb2b3
commit 64c7b5b4f0
3 changed files with 114 additions and 73 deletions

View file

@ -0,0 +1,48 @@
import { shouldPolyfill } from '@formatjs/intl-segmenter/should-polyfill';
import { useEffect, useState } from 'preact/hooks';
import Loader from './loader';
const supportsIntlSegmenter = !shouldPolyfill();
function importIntlSegmenter() {
if (!supportsIntlSegmenter) {
return import('@formatjs/intl-segmenter/polyfill-force').catch(() => {});
}
}
function importCompose() {
return import('./compose');
}
export async function preload() {
try {
await importIntlSegmenter();
importCompose();
} catch (e) {
console.error(e);
}
}
export default function ComposeSuspense(props) {
const [Compose, setCompose] = useState(null);
useEffect(() => {
(async () => {
try {
if (supportsIntlSegmenter) {
const component = await importCompose();
setCompose(component);
} else {
await importIntlSegmenter();
const component = await importCompose();
setCompose(component);
}
} catch (e) {
console.error(e);
}
})();
}, []);
return Compose?.default ? <Compose.default {...props} /> : <Loader />;
}

View file

@ -1,4 +1,4 @@
import { lazy } from 'preact/compat'; import { useEffect } from 'preact/hooks';
import { useLocation, useNavigate } from 'react-router-dom'; import { useLocation, useNavigate } from 'react-router-dom';
import { subscribe, useSnapshot } from 'valtio'; import { subscribe, useSnapshot } from 'valtio';
@ -9,19 +9,16 @@ import showToast from '../utils/show-toast';
import states from '../utils/states'; import states from '../utils/states';
import AccountSheet from './account-sheet'; import AccountSheet from './account-sheet';
// import Compose from './compose'; import ComposeSuspense, { preload } from './compose-suspense';
import Drafts from './drafts'; import Drafts from './drafts';
import EmbedModal from './embed-modal'; import EmbedModal from './embed-modal';
import GenericAccounts from './generic-accounts'; import GenericAccounts from './generic-accounts';
import IntlSegmenterSuspense from './intl-segmenter-suspense';
import MediaAltModal from './media-alt-modal'; import MediaAltModal from './media-alt-modal';
import MediaModal from './media-modal'; import MediaModal from './media-modal';
import Modal from './modal'; import Modal from './modal';
import ReportModal from './report-modal'; import ReportModal from './report-modal';
import ShortcutsSettings from './shortcuts-settings'; import ShortcutsSettings from './shortcuts-settings';
const Compose = lazy(() => import('./compose'));
subscribe(states, (changes) => { subscribe(states, (changes) => {
for (const [action, path, value, prevValue] of changes) { for (const [action, path, value, prevValue] of changes) {
// When closing modal, focus on deck // When closing modal, focus on deck
@ -36,6 +33,10 @@ export default function Modals() {
const navigate = useNavigate(); const navigate = useNavigate();
const location = useLocation(); const location = useLocation();
useEffect(() => {
queueMicrotask(preload);
}, []);
return ( return (
<> <>
{!!snapStates.showCompose && ( {!!snapStates.showCompose && (
@ -43,51 +44,49 @@ export default function Modals() {
class={`solid ${snapStates.composerState.minimized ? 'min' : ''}`} class={`solid ${snapStates.composerState.minimized ? 'min' : ''}`}
minimized={!!snapStates.composerState.minimized} minimized={!!snapStates.composerState.minimized}
> >
<IntlSegmenterSuspense> <ComposeSuspense
<Compose replyToStatus={
replyToStatus={ typeof snapStates.showCompose !== 'boolean'
typeof snapStates.showCompose !== 'boolean' ? snapStates.showCompose.replyToStatus
? snapStates.showCompose.replyToStatus : window.__COMPOSE__?.replyToStatus || null
: window.__COMPOSE__?.replyToStatus || null }
editStatus={
states.showCompose?.editStatus ||
window.__COMPOSE__?.editStatus ||
null
}
draftStatus={
states.showCompose?.draftStatus ||
window.__COMPOSE__?.draftStatus ||
null
}
onClose={(results) => {
const { newStatus, instance, type } = results || {};
states.showCompose = false;
window.__COMPOSE__ = null;
if (newStatus) {
states.reloadStatusPage++;
showToast({
text: {
post: 'Post published. Check it out.',
reply: 'Reply posted. Check it out.',
edit: 'Post updated. Check it out.',
}[type || 'post'],
delay: 1000,
duration: 10_000, // 10 seconds
onClick: (toast) => {
toast.hideToast();
states.prevLocation = location;
navigate(
instance
? `/${instance}/s/${newStatus.id}`
: `/s/${newStatus.id}`,
);
},
});
} }
editStatus={ }}
states.showCompose?.editStatus || />
window.__COMPOSE__?.editStatus ||
null
}
draftStatus={
states.showCompose?.draftStatus ||
window.__COMPOSE__?.draftStatus ||
null
}
onClose={(results) => {
const { newStatus, instance, type } = results || {};
states.showCompose = false;
window.__COMPOSE__ = null;
if (newStatus) {
states.reloadStatusPage++;
showToast({
text: {
post: 'Post published. Check it out.',
reply: 'Reply posted. Check it out.',
edit: 'Post updated. Check it out.',
}[type || 'post'],
delay: 1000,
duration: 10_000, // 10 seconds
onClick: (toast) => {
toast.hideToast();
states.prevLocation = location;
navigate(
instance
? `/${instance}/s/${newStatus.id}`
: `/s/${newStatus.id}`,
);
},
});
}
}}
/>
</IntlSegmenterSuspense>
</Modal> </Modal>
)} )}
{!!snapStates.showSettings && ( {!!snapStates.showSettings && (

View file

@ -3,16 +3,12 @@ import './index.css';
import './app.css'; import './app.css';
import { render } from 'preact'; import { render } from 'preact';
import { lazy } from 'preact/compat';
import { useEffect, useState } from 'preact/hooks'; import { useEffect, useState } from 'preact/hooks';
import IntlSegmenterSuspense from './components/intl-segmenter-suspense'; import ComposeSuspense from './components/compose-suspense';
import { initStates } from './utils/states'; import { initStates } from './utils/states';
// import Compose from './components/compose';
import useTitle from './utils/useTitle'; import useTitle from './utils/useTitle';
const Compose = lazy(() => import('./components/compose'));
if (window.opener) { if (window.opener) {
console = window.opener.console; console = window.opener.console;
} }
@ -66,25 +62,23 @@ function App() {
console.debug('OPEN COMPOSE'); console.debug('OPEN COMPOSE');
return ( return (
<IntlSegmenterSuspense> <ComposeSuspense
<Compose editStatus={editStatus}
editStatus={editStatus} replyToStatus={replyToStatus}
replyToStatus={replyToStatus} draftStatus={draftStatus}
draftStatus={draftStatus} standalone
standalone hasOpener={window.opener}
hasOpener={window.opener} onClose={(results) => {
onClose={(results) => { const { newStatus, fn = () => {} } = results || {};
const { newStatus, fn = () => {} } = results || {}; try {
try { if (newStatus) {
if (newStatus) { window.opener.__STATES__.reloadStatusPage++;
window.opener.__STATES__.reloadStatusPage++; }
} fn();
fn(); setUIState('closed');
setUIState('closed'); } catch (e) {}
} catch (e) {} }}
}} />
/>
</IntlSegmenterSuspense>
); );
} }