Files
suwayomi-material-you-webui/src/features/reader/stores/ReaderPagesStore.ts

127 lines
3.9 KiB
TypeScript
Raw Normal View History

/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { ReaderStatePages, ReaderTransitionPageMode } from '@/features/reader/Reader.types.ts';
2025-09-22 00:50:34 +02:00
import { SliceCreator } from '@/lib/zustand/Zustand.types.ts';
import { requestManager } from '@/lib/requests/RequestManager.ts';
export interface ReaderPagesStoreSlice {
pages: ReaderStatePages & {
reset: () => ReaderPagesStoreSlice;
};
}
export const READER_DEFAULT_PAGES_STATE: Omit<
ReaderStatePages,
| 'setCurrentPageIndex'
| 'setPageToScrollToIndex'
| 'setTotalPages'
| 'setPageUrls'
| 'setPageLoadStates'
| 'setPages'
| 'setTransitionPageMode'
| 'setRetryFailedPagesKeyPrefix'
| 'reset'
> = {
totalPages: 0,
currentPageIndex: 0,
pageToScrollToIndex: null,
pageUrls: [],
pageLoadStates: [{ url: '', loaded: false }],
pages: [
{
name: '1',
primary: {
index: 0,
alt: `Page #1`,
url: `${requestManager.getBaseUrl()}`,
},
},
],
transitionPageMode: ReaderTransitionPageMode.NONE,
retryFailedPagesKeyPrefix: '',
};
export const createReaderPagesStoreSlice = <T extends ReaderPagesStoreSlice>(
2025-09-22 00:50:34 +02:00
...[createActionName, set, get]: Parameters<SliceCreator<T>>
): ReaderPagesStoreSlice => ({
pages: {
...READER_DEFAULT_PAGES_STATE,
reset: () => ({ pages: { ...get().pages, ...READER_DEFAULT_PAGES_STATE } }),
setCurrentPageIndex: (index) =>
2025-09-22 00:50:34 +02:00
set(
(draft) => {
draft.pages.currentPageIndex = index;
},
undefined,
createActionName('setCurrentPageIndex'),
),
setPageToScrollToIndex: (index) =>
2025-09-22 00:50:34 +02:00
set(
(draft) => {
draft.pages.pageToScrollToIndex = index;
},
undefined,
createActionName('setPageToScrollToIndex'),
),
setTotalPages: (total) =>
2025-09-22 00:50:34 +02:00
set(
(draft) => {
draft.pages.totalPages = total;
},
undefined,
createActionName('setTotalPages'),
),
setPageUrls: (urls) =>
2025-09-22 00:50:34 +02:00
set(
(draft) => {
draft.pages.pageUrls = urls;
},
undefined,
createActionName('setPageUrls'),
),
setPageLoadStates: (loadStates) =>
2025-09-22 00:50:34 +02:00
set(
(draft) => {
if (typeof loadStates === 'function') {
draft.pages.pageLoadStates = loadStates(get().pages.pageLoadStates);
return;
}
2025-09-22 00:50:34 +02:00
draft.pages.pageLoadStates = loadStates;
},
undefined,
createActionName('setPageLoadStates'),
),
setPages: (pages) =>
2025-09-22 00:50:34 +02:00
set(
(draft) => {
draft.pages.pages = pages;
},
undefined,
createActionName('setPages'),
),
setTransitionPageMode: (mode) =>
2025-09-22 00:50:34 +02:00
set(
(draft) => {
draft.pages.transitionPageMode = mode;
},
undefined,
createActionName('setTransitionPageMode'),
),
setRetryFailedPagesKeyPrefix: (prefix) =>
2025-09-22 00:50:34 +02:00
set(
(draft) => {
draft.pages.retryFailedPagesKeyPrefix = prefix;
},
undefined,
createActionName('setRetryFailedPagesKeyPrefix'),
),
},
});