Skip to content

Commit a303212

Browse files
committed
fix(core): qresume event + fix no-resume
1 parent dd12f2f commit a303212

File tree

10 files changed

+48
-11
lines changed

10 files changed

+48
-11
lines changed

packages/qwik/src/core/client/dom-container.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import {
3232
getQFuncs,
3333
} from '../shared/utils/markers';
3434
import { isSlotProp } from '../shared/utils/prop';
35-
import { qDev } from '../shared/utils/qdev';
35+
import { qDev, qTest } from '../shared/utils/qdev';
3636
import {
3737
convertScopedStyleIdsToArray,
3838
convertStyleIdsToString,
@@ -148,7 +148,9 @@ export class DomContainer extends _SharedContainer implements IClientContainer {
148148
this.$setServerData$();
149149
element.setAttribute(QContainerAttr, QContainerValue.RESUMED);
150150
element.qContainer = this;
151-
151+
if (!qTest && element.isConnected) {
152+
element.dispatchEvent(new CustomEvent('qresume', { bubbles: true }));
153+
}
152154
const qwikStates = element.querySelectorAll('script[type="qwik/state"]');
153155
if (qwikStates.length !== 0) {
154156
const lastState = qwikStates[qwikStates.length - 1];

packages/qwik/src/core/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ export type {
201201
KnownEventNames,
202202
QwikIdleEvent,
203203
QwikInitEvent,
204+
QwikResumeEvent,
204205
QwikSymbolEvent,
205206
QwikTransitionEvent,
206207
QwikViewTransitionEvent,

packages/qwik/src/core/shared/jsx/types/jsx-qwik-attributes.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { JSXNode } from './jsx-node';
44
import type {
55
QwikIdleEvent,
66
QwikInitEvent,
7+
QwikResumeEvent,
78
QwikSymbolEvent,
89
QwikViewTransitionEvent,
910
QwikVisibleEvent,
@@ -66,6 +67,7 @@ type PascalCaseNames =
6667
| 'PointerUp'
6768
| 'QIdle'
6869
| 'QInit'
70+
| 'QResume'
6971
| 'QSymbol'
7072
| 'QVisible'
7173
| 'QViewTransition'
@@ -120,6 +122,7 @@ type QwikDocumentEventMap = Omit<DocumentEventMap, keyof QwikHTMLElementEventMap
120122
qidle: QwikIdleEvent;
121123
qinit: QwikInitEvent;
122124
qsymbol: QwikSymbolEvent;
125+
qresume: QwikResumeEvent;
123126
qviewtransition: QwikViewTransitionEvent;
124127
};
125128
type QwikWindowEventMap = Omit<WindowEventHandlersEventMap, keyof QwikDocumentEventMap> &

packages/qwik/src/core/shared/jsx/types/jsx-qwik-events.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ export type QwikSymbolEvent = CustomEvent<{
1919
export type QwikInitEvent = CustomEvent<{}>;
2020
/** Emitted by qwik-loader on document when the document first becomes idle @public */
2121
export type QwikIdleEvent = CustomEvent<{}>;
22+
/**
23+
* Emitted by qwik-core on the container element when it resumes from a paused state. You cannot put
24+
* a Qwik event handler on the container so you must listen on the document instead. @public
25+
*/
26+
export type QwikResumeEvent = CustomEvent<{}>;
2227
/** Emitted by qwik-core on document when the a view transition start @public */
2328
export type QwikViewTransitionEvent = CustomEvent<ViewTransition>;
2429
/** Emitted by qwik-loader on document when there was an error loading a module @public */

packages/qwik/src/core/shared/jsx/types/jsx-types.unit.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type {
1010
QRLEventHandlerMulti,
1111
QwikHTMLElements,
1212
QwikIntrinsicElements,
13+
QwikResumeEvent,
1314
QwikSVGElements,
1415
QwikViewTransitionEvent,
1516
QwikVisibleEvent,
@@ -216,6 +217,10 @@ describe('types', () => {
216217
expectTypeOf(ev).not.toBeAny();
217218
assertType<QwikViewTransitionEvent>(ev);
218219
}}
220+
document:onQResume$={(ev) => {
221+
expectTypeOf(ev).not.toBeAny();
222+
assertType<QwikResumeEvent>(ev);
223+
}}
219224
/>
220225
</>;
221226
});

packages/qwik/src/core/ssr/ssr-render-jsx.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ function setEvent(
405405
*
406406
* For internal qrls (starting with `_`) we assume that they do the right thing.
407407
*/
408-
if (!qrl.$symbol$.startsWith('_') && (qrl.$captureRef$ || qrl.$capture$)) {
408+
if (!qrl.$symbol$.startsWith('_') && qrl.$captureRef$?.length) {
409409
qrl = createQRL(null, '_run', _run, null, null, [qrl]);
410410
}
411411
return qrlToString(serializationCtx, qrl);

packages/qwik/src/core/tests/error-handling.spec.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,13 @@ describe.each([
104104

105105
it('should handle error in event handler', async () => {
106106
const Cmp = component$(() => {
107+
const counter = useSignal(0);
107108
return (
108109
<>
109110
<button
110111
onClick$={() => {
112+
// Make sure we use scope to resume container
113+
counter.value++;
111114
throw new Error('error');
112115
}}
113116
>

packages/qwik/src/core/tests/use-on.spec.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,9 +399,12 @@ describe.each([
399399
return <></>;
400400
});
401401
const ReceiveChild = component$(() => {
402+
const toggle = useSignal(true);
402403
useOnDocument(
403404
'child',
404405
$(() => {
406+
// grab some scope to go via scheduler
407+
toggle.value = false;
405408
(globalThis as any).receivedLog.push('child event');
406409
})
407410
);
Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
1-
import { component$ } from "@qwik.dev/core";
1+
import { component$, useSignal } from "@qwik.dev/core";
22

33
export const NoResume = component$(() => {
4+
const sig = useSignal(0);
45
return (
5-
<button
6-
onClick$={() => {
7-
document.body.style.background = "black";
8-
}}
9-
>
10-
Click me
11-
</button>
6+
<>
7+
<div>This turns red on resume</div>
8+
<button
9+
document:onQResume$={() => {
10+
document.body.style.color = "red";
11+
}}
12+
onClick$={() => {
13+
document.body.style.background = "black";
14+
}}
15+
onDblClick$={() => {
16+
sig.value++;
17+
}}
18+
>
19+
Click me {sig.value}
20+
</button>
21+
</>
1222
);
1323
});

starters/e2e/noresume.e2e.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,10 @@ test.describe("no resume", () => {
1717

1818
const body = page.locator("body");
1919
await expect(body).toHaveCSS("background-color", "rgb(0, 0, 0)");
20+
// Ensure that the click did not cause resume
21+
await expect(body).not.toHaveCSS("background-color", "rgb(255, 0, 0)");
22+
await button.dblclick();
23+
// Ensure that the double click did cause resume
24+
await expect(body).toHaveCSS("color", "rgb(255, 0, 0)");
2025
});
2126
});

0 commit comments

Comments
 (0)