Skip to content

Commit 9d3725e

Browse files
committed
Tests passing again.
1 parent 8874198 commit 9d3725e

File tree

3 files changed

+51
-65
lines changed

3 files changed

+51
-65
lines changed

src/lib/client.ts

Lines changed: 40 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { navigating } from '$app/stores';
77
import { FlashMessage, type FlashMessageType } from './flashMessage.js';
88
import { FlashRouter } from './router.js';
99
import type { FlashOptions } from './options.js';
10+
import { afterNavigate, beforeNavigate } from '$app/navigation';
1011

1112
const cookieName = 'flash';
1213

@@ -17,63 +18,48 @@ function getRouter(page: Readable<Page>, initialData?: FlashMessageType) {
1718
if (!router) {
1819
router = new FlashRouter();
1920
routers.set(page, router);
20-
subscribeToNavigation(page);
2121
router.getFlashMessage(get(page).route.id).message.set(initialData);
22+
subscribeToNavigation(page);
2223
}
2324

24-
/*
25-
else if (routeId && initialData !== undefined) {
26-
const flashMessage = router.getFlashMessage(routeId);
27-
flashMessage.message.set(
28-
initialData ?? parseFlashCookie(flashMessage.options.flashCookieOptions),
29-
{ concatenateArray: !flashMessage.options.clearArray }
30-
);
31-
}
32-
*/
33-
34-
/*
35-
Array.from(router.routes.entries())
36-
.map(([route, flash]) => {
37-
return { route, message: get(flash.message) };
38-
})
39-
.forEach((m) => console.log(m));
40-
*/
41-
4225
return router;
4326
}
4427

4528
function subscribeToNavigation(page: Readable<Page>) {
4629
if (!browser) return;
4730

4831
page.subscribe(($page) => {
49-
const flash = getRouter(page).getFlashMessage($page.route.id);
50-
const cookieData = parseFlashCookie(flash.options.flashCookieOptions);
32+
const cookieData = parseFlashCookie();
5133

5234
if (cookieData !== undefined) {
35+
console.log('🚀 ~ page.subscribe:', cookieData, $page.route.id);
36+
const flash = getRouter(page).getFlashMessage($page.route.id);
5337
flash.message.set(cookieData, { concatenateArray: !flash.options.clearArray });
38+
clearFlashCookie(flash.options.flashCookieOptions);
5439
}
5540
});
5641

57-
navigating.subscribe((nav) => {
58-
if (!nav) {
59-
const flash = getRouter(page).getFlashMessage(get(page).route.id);
60-
const cookieData = parseFlashCookie(flash.options.flashCookieOptions);
61-
62-
if (cookieData !== undefined) {
63-
flash.message.set(cookieData, { concatenateArray: !flash.options.clearArray });
64-
}
65-
return;
66-
} else {
67-
const navTo = nav?.to?.route.id;
68-
if (navTo) {
69-
const flash = getRouter(page).getFlashMessage(navTo);
70-
71-
if (flash.options.clearOnNavigate && nav.from?.route.id != navTo) {
72-
flash.message.set(undefined);
73-
}
42+
beforeNavigate((nav) => {
43+
const navTo = nav?.to?.route.id;
44+
if (navTo) {
45+
const flash = getRouter(page).getFlashMessage(navTo);
46+
if (flash.options.clearOnNavigate && nav.from?.route.id != navTo) {
47+
console.log('🚀 ~ beforeNavigate ~ clear message on nav to:', navTo);
48+
flash.message.set(undefined);
7449
}
7550
}
7651
});
52+
53+
afterNavigate(() => {
54+
const cookieData = parseFlashCookie();
55+
56+
if (cookieData !== undefined) {
57+
console.log('🚀 ~ afterNavigate:', cookieData, get(page).route.id);
58+
const flash = getRouter(page).getFlashMessage(get(page).route.id);
59+
flash.message.set(cookieData, { concatenateArray: !flash.options.clearArray });
60+
clearFlashCookie(flash.options.flashCookieOptions);
61+
}
62+
});
7763
}
7864

7965
export function initFlash(
@@ -154,28 +140,34 @@ export function getFlash(
154140
* @returns {Promise<boolean>} `true` if a flash message existed, `false` if not.
155141
*/
156142
export async function updateFlash(page: Readable<Page>, update?: () => Promise<void>) {
157-
const flashMessage = getRouter(page).getFlashMessage(get(page).route.id);
158-
159143
// Update before setting the new message, so navigation events can pass through first.
160144
if (update) await update();
161-
if (browser) await tick();
162145

163-
const cookieData = parseFlashCookie(flashMessage.options.flashCookieOptions) as
164-
| App.PageData['flash']
165-
| undefined;
146+
const cookieData = parseFlashCookie() as App.PageData['flash'] | undefined;
166147

167148
if (cookieData !== undefined) {
168-
flashMessage.message.set(cookieData, { concatenateArray: !flashMessage.options.clearArray });
149+
if (browser) await tick();
150+
const flash = getRouter(page).getFlashMessage(get(page).route.id);
151+
flash.message.set(cookieData, { concatenateArray: !flash.options.clearArray });
152+
clearFlashCookie(flash.options.flashCookieOptions);
169153
}
170154

171155
return !!cookieData;
172156
}
173157

174158
///////////////////////////////////////////////////////////
175159

176-
function parseFlashCookie(
177-
clearOptions?: CookieSerializeOptions
178-
): App.PageData['flash'] | undefined {
160+
function clearFlashCookie(options: CookieSerializeOptions) {
161+
// Clear parsed cookie
162+
if (browser) {
163+
document.cookie = serialize(cookieName, '', {
164+
...options,
165+
maxAge: 0
166+
});
167+
}
168+
}
169+
170+
function parseFlashCookie(): App.PageData['flash'] | undefined {
179171
const cookieString = document.cookie;
180172
if (!cookieString || !cookieString.includes(cookieName + '=')) return undefined;
181173

@@ -192,18 +184,7 @@ function parseFlashCookie(
192184
}, output);
193185
}
194186

195-
function clearFlashCookie(options: CookieSerializeOptions) {
196-
// Clear parsed cookie
197-
if (browser) {
198-
document.cookie = serialize(cookieName, '', {
199-
...options,
200-
maxAge: 0
201-
});
202-
}
203-
}
204-
205187
const cookies = parseCookieString(cookieString);
206-
if (clearOptions) clearFlashCookie(clearOptions);
207188

208189
if (cookies[cookieName]) {
209190
try {

src/lib/options.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,15 @@ export const defaultOptions = {
1919
}
2020
} satisfies FlashOptions;
2121

22-
export function mergeOptions(options: Partial<FlashOptions> | undefined): FlashOptions {
22+
export function mergeOptions(
23+
parentOptions: FlashOptions,
24+
options: Partial<FlashOptions> | undefined
25+
): FlashOptions {
2326
return {
24-
...defaultOptions,
27+
...parentOptions,
2528
...options,
2629
flashCookieOptions: {
27-
...defaultOptions.flashCookieOptions,
30+
...parentOptions.flashCookieOptions,
2831
...options?.flashCookieOptions
2932
}
3033
};

src/lib/router.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ export class FlashRouter {
1010

1111
constructor() {
1212
this.messageStore = writable<FlashMessageType>();
13-
this.createRoute('', undefined);
13+
this.routes.set('', new FlashMessage(this.messageStore));
1414

1515
onDestroy(() => {
16-
console.log('onDestroy, clear timeouts');
1716
for (const route of this.routes.values()) {
1817
clearTimeout(route.flashTimeout);
1918
}
@@ -51,7 +50,10 @@ export class FlashRouter {
5150

5251
createRoute(routeId: string, data: FlashMessageType, options?: Partial<FlashOptions>) {
5352
console.log('createRoute', routeId, options);
54-
const newRoute = new FlashMessage(this.messageStore, mergeOptions(options));
53+
const closest = this.getClosestRoute(routeId);
54+
const newRoute = new FlashMessage(this.messageStore, mergeOptions(closest.options, options));
55+
56+
// Update flash data
5557
newRoute.message.set(data);
5658

5759
this.routes.set(routeId, newRoute);

0 commit comments

Comments
 (0)