Skip to content

Commit

Permalink
Merge pull request #165 from mbret/develop
Browse files Browse the repository at this point in the history
release
  • Loading branch information
mbret authored Jul 28, 2024
2 parents 301af45 + be8a912 commit 8da2b53
Show file tree
Hide file tree
Showing 31 changed files with 498 additions and 353 deletions.
1 change: 1 addition & 0 deletions packages/api/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export const METADATA_EXTRACTOR_SUPPORTED_EXTENSIONS = [
"application/x-cbz",
"application/epub+zip",
"application/zip",
"application/x-zip-compressed",
"application/x-rar"
]
export const COVER_ALLOWED_EXT = [".jpg", ".jpeg", ".png"]
Expand Down
84 changes: 28 additions & 56 deletions packages/web/src/books/states.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,21 @@ import { useProtectedTagIds, useTagsByIds } from "../tags/helpers"
import { getLinkState, useLink, useLinks } from "../links/states"
import {
getBookDownloadsState,
booksDownloadStateSignal,
DownloadState
booksDownloadStateSignal
} from "../download/states"
import { useCollections } from "../collections/useCollections"
import { from, map, switchMap } from "rxjs"
import { map, switchMap } from "rxjs"
import { plugin as localPlugin } from "../plugins/local"
import { latestDatabase$ } from "../rxdb/useCreateDatabase"
import { isDefined, useForeverQuery, useQuery, useSignalValue } from "reactjrx"
import { useForeverQuery, useSignalValue } from "reactjrx"
import { keyBy } from "lodash"
import { Database } from "../rxdb"
import { BookDocType, CollectionDocType } from "@oboku/shared"
import { DeepReadonlyObject, MangoQuery } from "rxdb"
import { useVisibleBooks } from "./useVisibleBooks"
import { DeepReadonlyArray, RxDocument } from "rxdb/dist/types/types"
import { DeepReadonlyArray } from "rxdb/dist/types/types"
import { useMemo } from "react"
import { getBooksQueryObj } from "./dbHelpers"
import { CollectionDocMethods } from "../rxdb/collections/collection"
import { observeBooks } from "./dbHelpers"
import { libraryStateSignal } from "../library/states"

export const getBooksByIds = async (database: Database) => {
const result = await database.collections.book.find({}).exec()
Expand All @@ -33,31 +31,40 @@ export const getBooksByIds = async (database: Database) => {
export const useBooks = ({
queryObj = {},
isNotInterested,
ids
ids,
includeProtected: _includeProtected
}: {
queryObj?: MangoQuery<BookDocType>
isNotInterested?: "none" | "with" | "only"
ids?: DeepReadonlyArray<string>
includeProtected?: boolean
} = {}) => {
const serializedIds = JSON.stringify(ids)
const { isLibraryUnlocked } = useSignalValue(libraryStateSignal)
const includeProtected = _includeProtected || isLibraryUnlocked

return useForeverQuery({
queryKey: [
"rxdb",
"get",
"many",
"books",
{ isNotInterested, serializedIds },
{ isNotInterested, serializedIds, includeProtected },
queryObj
],
queryFn: () => {
const finalQueryObj = getBooksQueryObj({ queryObj, isNotInterested, ids })

return latestDatabase$.pipe(
switchMap((db) => db.collections.book.find(finalQueryObj).$),
queryFn: () =>
latestDatabase$.pipe(
switchMap((db) =>
observeBooks({
db,
includeProtected,
ids,
isNotInterested,
queryObj
})
),
map((items) => items.map((item) => item.toJSON()))
)
}
})
}

Expand Down Expand Up @@ -268,23 +275,6 @@ export const useEnrichedBookState = ({
)
}

/**
* @deprecated
*/
export const useDownloadedBookWithUnsafeProtectedIdsState = () => {
const downloadState = useSignalValue(booksDownloadStateSignal)
const { data: books } = useBooks()

return useMemo(
() =>
books?.filter(
(book) =>
downloadState[book._id]?.downloadState === DownloadState.Downloaded
),
[downloadState, books]
)
}

/**
* @deprecated
*/
Expand All @@ -296,7 +286,11 @@ export const useBooksAsArrayState = ({
>
}) => {
const { data: books = {}, isPending } = useBooksDic()
const visibleBookIds = useVisibleBookIds() ?? []
const { data: visibleBooks } = useBooks()
const visibleBookIds = useMemo(
() => visibleBooks?.map((item) => item._id) ?? [],
[visibleBooks]
)

const bookResult: (BookQueryResult & {
downloadState: ReturnType<typeof getBookDownloadsState>
Expand Down Expand Up @@ -325,27 +319,6 @@ export const useBooksAsArrayState = ({
}
}

export const useVisibleBookIds = (
params: Parameters<typeof useVisibleBooks>[0] = {}
) => {
return useVisibleBooks(params).data?.map((book) => book._id)
}

/**
* @deprecated
*/
export const useBookTagsState = ({
bookId,
tags = {}
}: {
bookId: string
tags: ReturnType<typeof useTagsByIds>["data"]
}) => {
const { data: book } = useBook({ id: bookId })

return book?.tags?.map((id) => tags[id]).filter(isDefined)
}

/**
* @deprecated
*/
Expand All @@ -365,4 +338,3 @@ export const useBookLinksState = ({
export const books$ = latestDatabase$.pipe(
switchMap((database) => database?.book.find({}).$)
)

27 changes: 0 additions & 27 deletions packages/web/src/books/useVisibleBooks.ts

This file was deleted.

12 changes: 9 additions & 3 deletions packages/web/src/collections/CollectionDetailsScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { useNavigate, useParams } from "react-router-dom"
import EmptyLibraryAsset from "../assets/empty-library.svg"
import CollectionBgSvg from "../assets/series-bg.svg"
import { BookListWithControls } from "../books/bookList/BookListWithControls"
import { useVisibleBookIds } from "../books/states"
import { signal, useSignalValue } from "reactjrx"
import {
ListActionSorting,
Expand All @@ -13,6 +12,8 @@ import {
import { useCollectionActionsDrawer } from "./CollectionActionsDrawer/useCollectionActionsDrawer"
import { useCollection } from "./useCollection"
import { COLLECTION_EMPTY_ID } from "../constants.shared"
import { useMemo } from "react"
import { useBooks } from "../books/states"

type ScreenParams = {
id: string
Expand Down Expand Up @@ -40,10 +41,15 @@ export const CollectionDetailsScreen = () => {
id
})

const visibleBooks = useVisibleBookIds({
const { data: visibleBooks } = useBooks({
ids: collection?.books ?? []
})

const visibleBookIds = useMemo(
() => visibleBooks?.map((item) => item._id) ?? [],
[visibleBooks]
)

const { open: openActionDrawer } = useCollectionActionsDrawer(
id,
(changes) => {
Expand Down Expand Up @@ -110,7 +116,7 @@ export const CollectionDetailsScreen = () => {
</div>
</Box>
<BookListWithControls
data={visibleBooks ?? []}
data={visibleBookIds}
sorting={sorting}
viewMode={viewMode}
onViewModeChange={(value) => {
Expand Down
16 changes: 9 additions & 7 deletions packages/web/src/collections/useCollections.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { CollectionDocType, directives, ReadingStateState } from "@oboku/shared"
import { useLocalSettings } from "../settings/states"
import { useForeverQuery, useSignalValue } from "reactjrx"
import { latestDatabase$ } from "../rxdb/useCreateDatabase"
import { map, switchMap } from "rxjs"
import { map, switchMap, tap } from "rxjs"
import { MangoQuery } from "rxdb"
import { getMetadataFromCollection } from "./getMetadataFromCollection"
import { DeepReadonlyArray } from "rxdb/dist/types/types"
Expand All @@ -18,6 +18,7 @@ export const useCollections = ({
ids,
isNotInterested,
readingState = "any",
includeProtected: _includeProtected,
...options
}: {
queryObj?: MangoQuery<CollectionDocType>
Expand All @@ -31,12 +32,14 @@ export const useCollections = ({
isNotInterested?: "with" | "none" | "only" | undefined
readingState?: "ongoing" | "finished" | "any"
ids?: DeepReadonlyArray<string>
includeProtected?: boolean
} = {}) => {
const { hideDirectivesFromCollectionName } = useLocalSettings()
const serializedBookIds = JSON.stringify(bookIds)
const serializedIds = JSON.stringify(ids)
const { isLibraryUnlocked } = useSignalValue(libraryStateSignal)
const { showCollectionWithProtectedContent } = useLocalSettings()
const includeProtected = _includeProtected || isLibraryUnlocked

return useForeverQuery({
queryKey: [
Expand All @@ -47,7 +50,7 @@ export const useCollections = ({
serializedBookIds,
serializedIds,
showCollectionWithProtectedContent,
isLibraryUnlocked,
includeProtected,
hideDirectivesFromCollectionName,
isNotInterested
},
Expand All @@ -64,11 +67,10 @@ export const useCollections = ({
*/
observeBooks({
db,
includeProtected: isLibraryUnlocked
// isNotInterested
includeProtected
}).pipe(
switchMap((books) => {
const protectedBookIds = books.map(({ _id }) => _id)
const visibleBooks = books.map(({ _id }) => _id)
const notInterestedBookIds = books
.filter(({ isNotInterested }) => !!isNotInterested)
.map(({ _id }) => _id)
Expand Down Expand Up @@ -99,7 +101,7 @@ export const useCollections = ({
map((collections) =>
collections.filter((collection) => {
if (
isLibraryUnlocked ||
includeProtected ||
collection.books.length === 0 ||
showCollectionWithProtectedContent === "hasNormalContent"
)
Expand All @@ -111,7 +113,7 @@ export const useCollections = ({
*/
const extraBooksFromCollection = difference(
collection.books,
protectedBookIds
visibleBooks
)

const hasSuspiciousExtraBook =
Expand Down
18 changes: 18 additions & 0 deletions packages/web/src/download/useDownloadedBooks.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { useMemo } from "react"
import { useSignalValue } from "reactjrx"
import { useBooks } from "../books/states"
import { booksDownloadStateSignal, DownloadState } from "./states"

export const useDownloadedBooks = () => {
const downloadState = useSignalValue(booksDownloadStateSignal)
const { data: books } = useBooks()

return useMemo(
() =>
books?.filter(
(book) =>
downloadState[book._id]?.downloadState === DownloadState.Downloaded
),
[downloadState, books]
)
}
6 changes: 3 additions & 3 deletions packages/web/src/home/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ import { useMemo } from "react"
import { ReadingStateState } from "@oboku/shared"
import { useBooksSortedBy } from "../books/helpers"
import { useProtectedTagIds } from "../tags/helpers"
import { useVisibleBooks } from "../books/useVisibleBooks"
import { useBooks } from "../books/states"

export const useContinueReadingBooks = () => {
const { isPending } = useProtectedTagIds()

const { data: booksAsArray, isLoading: isBooksPending } = useVisibleBooks({
const { data: booksAsArray, isLoading: isBooksPending } = useBooks({
isNotInterested: "none"
})
const booksSortedByDate = useBooksSortedBy(booksAsArray, "activity")
Expand All @@ -28,7 +28,7 @@ export const useContinueReadingBooks = () => {
}

export const useRecentlyAddedBooks = () => {
const { data: booksAsArray } = useVisibleBooks({
const { data: booksAsArray } = useBooks({
isNotInterested: "none"
})

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { useMeasureElement } from "../../common/utils"
import { CollectionList } from "../../collections/list/CollectionList"
import { useDebouncedCallback } from "use-debounce"
import { signal, useSignalValue } from "reactjrx"
import { useShelve } from "./useShelve"
import { useShelves } from "./useShelves"
import { FilterBar } from "./FilterBar"
import { useCreateCollection } from "../../collections/useCreateCollection"
import { collectionsListSignal } from "./state"
Expand Down Expand Up @@ -48,7 +48,7 @@ export const LibraryCollectionScreen = () => {
collectionsListSignal,
({ viewMode }) => ({ viewMode })
)
const { data: collections = [] } = useShelve()
const { data: collections = [] } = useShelves()

const onScroll = useDebouncedCallback((value: Scroll) => {
libraryCollectionScreenPreviousScrollState.setValue(value)
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { collectionsListSignal } from "./state"
import { useCollection } from "../../collections/useCollection"
import { COLLECTION_EMPTY_ID } from "../../constants.shared"

export const useShelve = () => {
export const useShelves = () => {
const { showNotInterestedCollections } = useSignalValue(
libraryStateSignal,
({ showNotInterestedCollections }) => ({ showNotInterestedCollections })
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/navigation/AppNavigator.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import { StatisticsScreen } from "../settings/StatisticsScreen"
import { BackToReadingDialog } from "../reading/BackToReadingDialog"
import { ProblemsScreen } from "../problems/ProblemsScreen"
import { LibraryBooksScreen } from "../library/LibraryBooksScreen"
import { LibraryCollectionScreen } from "../library/collections/LibraryCollectionScreen"
import { LibraryCollectionScreen } from "../library/shelves/LibraryCollectionScreen"
import { LibraryTagsScreen } from "../library/LibraryTagsScreen"
import { memo, useEffect, useRef } from "react"
import { UnlockLibraryDialog } from "../auth/UnlockLibraryDialog"
Expand Down
Loading

0 comments on commit 8da2b53

Please sign in to comment.