2025-09-20 17:56:43 +02:00
|
|
|
/*
|
|
|
|
|
* 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';
|
2025-09-20 17:56:43 +02:00
|
|
|
import { requestManager } from '@/lib/requests/RequestManager.ts';
|
|
|
|
|
|
|
|
|
|
export interface ReaderPagesStoreSlice {
|
|
|
|
|
pages: ReaderStatePages & {
|
2025-09-22 00:07:57 +02:00
|
|
|
reset: () => ReaderPagesStoreSlice;
|
2025-09-20 17:56:43 +02:00
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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>>
|
2025-09-20 17:56:43 +02:00
|
|
|
): ReaderPagesStoreSlice => ({
|
|
|
|
|
pages: {
|
|
|
|
|
...READER_DEFAULT_PAGES_STATE,
|
2025-09-22 00:07:57 +02:00
|
|
|
reset: () => ({ pages: { ...get().pages, ...READER_DEFAULT_PAGES_STATE } }),
|
2025-09-20 17:56:43 +02:00
|
|
|
setCurrentPageIndex: (index) =>
|
2025-09-22 00:50:34 +02:00
|
|
|
set(
|
|
|
|
|
(draft) => {
|
|
|
|
|
draft.pages.currentPageIndex = index;
|
|
|
|
|
},
|
|
|
|
|
undefined,
|
|
|
|
|
createActionName('setCurrentPageIndex'),
|
|
|
|
|
),
|
2025-09-20 17:56:43 +02:00
|
|
|
setPageToScrollToIndex: (index) =>
|
2025-09-22 00:50:34 +02:00
|
|
|
set(
|
|
|
|
|
(draft) => {
|
|
|
|
|
draft.pages.pageToScrollToIndex = index;
|
|
|
|
|
},
|
|
|
|
|
undefined,
|
|
|
|
|
createActionName('setPageToScrollToIndex'),
|
|
|
|
|
),
|
2025-09-20 17:56:43 +02:00
|
|
|
setTotalPages: (total) =>
|
2025-09-22 00:50:34 +02:00
|
|
|
set(
|
|
|
|
|
(draft) => {
|
|
|
|
|
draft.pages.totalPages = total;
|
|
|
|
|
},
|
|
|
|
|
undefined,
|
|
|
|
|
createActionName('setTotalPages'),
|
|
|
|
|
),
|
2025-09-20 17:56:43 +02:00
|
|
|
setPageUrls: (urls) =>
|
2025-09-22 00:50:34 +02:00
|
|
|
set(
|
|
|
|
|
(draft) => {
|
|
|
|
|
draft.pages.pageUrls = urls;
|
|
|
|
|
},
|
|
|
|
|
undefined,
|
|
|
|
|
createActionName('setPageUrls'),
|
|
|
|
|
),
|
2025-09-20 17:56:43 +02:00
|
|
|
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-20 17:56:43 +02:00
|
|
|
|
2025-09-22 00:50:34 +02:00
|
|
|
draft.pages.pageLoadStates = loadStates;
|
|
|
|
|
},
|
|
|
|
|
undefined,
|
|
|
|
|
createActionName('setPageLoadStates'),
|
|
|
|
|
),
|
2025-09-20 17:56:43 +02:00
|
|
|
setPages: (pages) =>
|
2025-09-22 00:50:34 +02:00
|
|
|
set(
|
|
|
|
|
(draft) => {
|
|
|
|
|
draft.pages.pages = pages;
|
|
|
|
|
},
|
|
|
|
|
undefined,
|
|
|
|
|
createActionName('setPages'),
|
|
|
|
|
),
|
2025-09-20 17:56:43 +02:00
|
|
|
setTransitionPageMode: (mode) =>
|
2025-09-22 00:50:34 +02:00
|
|
|
set(
|
|
|
|
|
(draft) => {
|
|
|
|
|
draft.pages.transitionPageMode = mode;
|
|
|
|
|
},
|
|
|
|
|
undefined,
|
|
|
|
|
createActionName('setTransitionPageMode'),
|
|
|
|
|
),
|
2025-09-20 17:56:43 +02:00
|
|
|
setRetryFailedPagesKeyPrefix: (prefix) =>
|
2025-09-22 00:50:34 +02:00
|
|
|
set(
|
|
|
|
|
(draft) => {
|
|
|
|
|
draft.pages.retryFailedPagesKeyPrefix = prefix;
|
|
|
|
|
},
|
|
|
|
|
undefined,
|
|
|
|
|
createActionName('setRetryFailedPagesKeyPrefix'),
|
|
|
|
|
),
|
2025-09-20 17:56:43 +02:00
|
|
|
},
|
|
|
|
|
});
|