Rewrite polyfill suspense for Composer with preload
Hopefully this works
This commit is contained in:
parent
c11bbbb2b3
commit
64c7b5b4f0
3 changed files with 114 additions and 73 deletions
48
src/components/compose-suspense.jsx
Normal file
48
src/components/compose-suspense.jsx
Normal 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 />;
|
||||||
|
}
|
|
@ -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 && (
|
||||||
|
|
|
@ -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>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue