mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-13 21:05:19 +00:00
fix(component): lit portal not re-rendering in inline links case (#9321)
* uses `portal.key` in templates * updates `portal.id` for use in queries
This commit is contained in:
@@ -2,4 +2,4 @@ export {
|
||||
type ElementOrFactory,
|
||||
useLitPortal,
|
||||
useLitPortalFactory,
|
||||
} from './lite-portal';
|
||||
} from './lit-portal';
|
||||
|
||||
@@ -13,10 +13,9 @@ type PortalEvent = {
|
||||
type PortalListener = (event: PortalEvent) => void;
|
||||
|
||||
export function createLitPortalAnchor(callback: (event: PortalEvent) => void) {
|
||||
const id = nanoid();
|
||||
return html`<lit-react-portal
|
||||
.notify=${callback}
|
||||
portalId=${id}
|
||||
portalId=${nanoid()}
|
||||
></lit-react-portal>`;
|
||||
}
|
||||
|
||||
@@ -119,24 +118,27 @@ export const useLitPortalFactory = () => {
|
||||
}
|
||||
|
||||
const prevId = event.previousPortalId;
|
||||
// Ignore first `willUpdate`
|
||||
if (!prevId) {
|
||||
return;
|
||||
}
|
||||
|
||||
// No re-rendering allowed
|
||||
// Used in `pdf embed view` scenario
|
||||
if (!rerendering) {
|
||||
// Ignores first `willUpdate`
|
||||
if (!prevId) {
|
||||
return;
|
||||
}
|
||||
|
||||
setPortals(portals => {
|
||||
const portal = portals.find(p => p.id === prevId);
|
||||
if (!portal) return portals;
|
||||
if (!portal) return [...portals];
|
||||
|
||||
// Updates `ID`
|
||||
// Used for portal queries in `disconnectedCallback`
|
||||
portal.id = id;
|
||||
portal.portal.key = id;
|
||||
portal.portal.children = element;
|
||||
|
||||
// Re-rendering
|
||||
// true: `inline link`
|
||||
// false: `pdf embed view`
|
||||
if (rerendering) {
|
||||
portal.portal = ReactDOM.createPortal(element, target, id);
|
||||
}
|
||||
|
||||
return [...portals];
|
||||
});
|
||||
});
|
||||
@@ -219,6 +219,7 @@ export function PDFViewerEmbeddedInner({ model }: PDFViewerProps) {
|
||||
icon={<ArrowUpSmallIcon />}
|
||||
className={embeddedStyles.pdfControlButton}
|
||||
onDoubleClick={stopPropagation}
|
||||
aria-label="Prev"
|
||||
{...navigator.prev}
|
||||
/>
|
||||
<IconButton
|
||||
@@ -226,6 +227,7 @@ export function PDFViewerEmbeddedInner({ model }: PDFViewerProps) {
|
||||
icon={<ArrowDownSmallIcon />}
|
||||
className={embeddedStyles.pdfControlButton}
|
||||
onDoubleClick={stopPropagation}
|
||||
aria-label="Next"
|
||||
{...navigator.next}
|
||||
/>
|
||||
<IconButton
|
||||
@@ -250,8 +252,13 @@ export function PDFViewerEmbeddedInner({ model }: PDFViewerProps) {
|
||||
embeddedStyles.pdfPageCount,
|
||||
])}
|
||||
>
|
||||
<span>{meta.pageCount > 0 ? cursor + 1 : '-'}</span>/
|
||||
<span>{meta.pageCount > 0 ? meta.pageCount : '-'}</span>
|
||||
<span className="page-cursor">
|
||||
{meta.pageCount > 0 ? cursor + 1 : '-'}
|
||||
</span>
|
||||
/
|
||||
<span className="page-count">
|
||||
{meta.pageCount > 0 ? meta.pageCount : '-'}
|
||||
</span>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
@@ -357,7 +357,7 @@ export const BiDirectionalLinkPanel = () => {
|
||||
{
|
||||
<>
|
||||
{portals.map(p => (
|
||||
<Fragment key={p.id}>{p.portal}</Fragment>
|
||||
<Fragment key={p.portal.key}>{p.portal}</Fragment>
|
||||
))}
|
||||
</>
|
||||
}
|
||||
|
||||
@@ -194,7 +194,7 @@ const usePatchSpecs = (shared: boolean, mode: DocMode) => {
|
||||
() => (
|
||||
<>
|
||||
{portals.map(p => (
|
||||
<Fragment key={p.id}>{p.portal}</Fragment>
|
||||
<Fragment key={p.portal.key}>{p.portal}</Fragment>
|
||||
))}
|
||||
</>
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user