Сегодняшняя фича это новый модуль svelte/reactivity/window
экспортирующий реактивные обёртки баиндингов <svelte:window>
:
<script>
let width = $state();
let height = $state();
</script>
<svelte:window
bind:innerWidth={width}
bind:innerHeight={height}
/>
<p>{width}x{height}</p>
<script>
import { innerWidth, innerHeight } from 'svelte/reactivity/window';
</script>
<p>{innerWidth.current}x{innerHeight.current}</p>
Посмотрите как это реализовано в Realworld:
Логин
https://github.com/sveltejs/realworld/blob/master/src/routes/login/%2Bpage.server.js
Хук ставящий locals
https://github.com/sveltejs/realworld/blob/master/src/hooks.server.js
Locals → data
https://github.com/sveltejs/realworld/blob/master/src/routes/%2Blayout.server.js
Logout
https://github.com/sveltejs/realworld/blob/master/src/routes/settings/%2Bpage.server.js
В общем с таким подходом все получилось и работает
В клиентском +layout.svelte использую примерно такой код:
afterNavigate(() => {
const serversideAuthorized =
Cookies.get('websiteurl.authorized') !== undefined
const clientsideAuthorized = $authorized
if (serversideAuthorized !== clientsideAuthorized) {
syncAuthState()
}
})
const syncAuthState = async () => {
const request = await fetch('/api/me')
if (request.ok) {
const response = (await request.json()) as MeResponse
$user = response.authorizedUser
}
}
Но я не использую fetch нигде, кроме как как раз для синхронизации клиентского состояния с серверным через эту куку
Читать полностью…Когда юзаешь свелтовый fetch, можно отслеживать каждый запрос через handlefetch в hooks.server.ts
Читать полностью…Всё зависит от реализации. В примере выше в куке хранится токен пользователя. Удаляешь токен в экшене формы — лишаешь пользователя доступа
Читать полностью…Корневой layout запускается один раз.
При выходе нужно чистить куку, locals и редиректить если нужно
Ладно, не хочу начинать спорить за авторизацию, за совет как правильно сделать в свелте в любом случае благодарю
Читать полностью…Еще раз озвучу проблему: данные о пользователе передаются из корневного layout.server.ts, корневой layout.server.ts при выходе из аккаунта и редиректе на главную не вызывается, что получается? Получается при редиректе на главную у нас на клиенте после софт навигации в сторе остается юзер
Читать полностью…А мне уже знаком этот подход с двумя куками, одна для сервера, другая для клиента, все ок
Читать полностью…Только через actions и load,у меня задача чтобы все работало без включенного js, progressive enhancement там и так далее
Читать полностью…Я попробовал добавить depends в корневой лейаут и потом при выходе вызывать invalidate() но так не работает, надо чтобы invalidate вызывался с клиента
Читать полностью…Не буду же я в каждый load каждого page добавлять возвращение юзера
Поэтому добавил это в корневой лейаут
Я завожу authStore для состояния пользователя, только главное не расшарить его на сервере
Читать полностью…Ну то есть ставим одну httponly куку с токеном сессии и другую обезличенную куку без httponly
Читать полностью…