fix: update subscription

This commit is contained in:
Stephen Zhou 2025-07-28 23:57:58 +08:00
parent 7dd80f0a13
commit 913ea3bc0d
No known key found for this signature in database
8 changed files with 56 additions and 91 deletions

View File

@ -1,14 +1,11 @@
import { Kbd } from "@follow/components/ui/kbd/Kbd.js"
import { subscriptionSyncService } from "@follow/store/subscription/store"
import type { SubscriptionModel } from "@follow/store/subscription/types"
import { unreadActions } from "@follow/store/unread/store"
import { useMutation } from "@tanstack/react-query"
import { useHotkeys } from "react-hotkeys-hook"
import { Trans, useTranslation } from "react-i18next"
import { toast } from "sonner"
import { apiClient } from "~/lib/api-fetch"
import { navigateEntry } from "./useNavigateEntry"
import { getRouteParams } from "./useRouteParams"
@ -39,19 +36,16 @@ export const useDeleteSubscription = ({ onSuccess }: { onSuccess?: () => void }
if (!subscription) return
if (!feed) return
const undo = async () => {
// TODO store action
const { unread } = await apiClient.subscriptions.$post({
json: {
url: feed.type === "feed" ? feed.url : undefined,
listId: feed.type === "list" ? feed.id : undefined,
view: subscription.view,
category: subscription.category,
isPrivate: subscription.isPrivate,
},
await subscriptionSyncService.subscribe({
url: feed.type === "feed" ? feed.url : undefined,
listId: feed.type === "list" ? feed.id : undefined,
view: subscription.view,
category: subscription.category,
isPrivate: subscription.isPrivate,
feedId: feed.id,
title: feed.title,
hideFromTimeline: subscription.hideFromTimeline,
})
unreadActions.upsertMany(unread)
subscriptionSyncService.fetch()
toast.dismiss(toastId)
}

View File

@ -15,11 +15,10 @@ import { ScrollArea } from "@follow/components/ui/scroll-area/index.js"
import { Switch } from "@follow/components/ui/switch/index.jsx"
import { FeedViewType } from "@follow/constants"
import type { EntryModelSimple, FeedAnalyticsModel, FeedModel } from "@follow/models/types"
import { invalidateEntriesQuery } from "@follow/store/entry/hooks"
import { useFeedByIdOrUrl } from "@follow/store/feed/hooks"
import { useCategories, useSubscriptionByFeedId } from "@follow/store/subscription/hooks"
import { subscriptionSyncService } from "@follow/store/subscription/store"
import { unreadActions } from "@follow/store/unread/store"
import { whoami } from "@follow/store/user/getters"
import { tracker } from "@follow/tracker"
import { cn } from "@follow/utils/utils"
import { zodResolver } from "@hookform/resolvers/zod"
@ -30,12 +29,10 @@ import { useTranslation } from "react-i18next"
import { toast } from "sonner"
import { z } from "zod"
import { getGeneralSettings } from "~/atoms/settings/general"
import { Autocomplete } from "~/components/ui/auto-completion"
import { useCurrentModal, useIsInModal } from "~/components/ui/modal/stacked/hooks"
import { getRouteParams } from "~/hooks/biz/useRouteParams"
import { useI18n } from "~/hooks/common"
import { apiClient } from "~/lib/api-fetch"
import { toastFetchError } from "~/lib/error-parser"
import { feed as feedQuery, useFeedQuery } from "~/queries/feed"
@ -239,34 +236,27 @@ const FeedInnerForm = ({
const followMutation = useMutation({
mutationFn: async (values: z.infer<typeof formSchema>) => {
const userId = whoami()?.id || ""
const body = {
url: feed.url,
view: Number.parseInt(values.view),
category: values.category,
isPrivate: values.isPrivate,
isPrivate: values.isPrivate || false,
hideFromTimeline: values.hideFromTimeline,
title: values.title,
feedId: feed.id,
}
const $method = isSubscribed ? apiClient.subscriptions.$patch : apiClient.subscriptions.$post
userId,
type: "feed",
listId: undefined,
} as const
return $method({
json: body,
}) as unknown as Promise<
| ReturnType<typeof apiClient.subscriptions.$post>
| ReturnType<typeof apiClient.subscriptions.$patch>
>
if (isSubscribed) {
return subscriptionSyncService.edit(body)
} else {
return subscriptionSyncService.subscribe(body)
}
},
onSuccess: (data, variables) => {
if (getGeneralSettings().hidePrivateSubscriptionsInTimeline) {
invalidateEntriesQuery({ views: [Number(variables.view)] })
}
if ("unread" in data) {
unreadActions.upsertMany(data.unread)
}
subscriptionSyncService.fetch()
onSuccess: () => {
const feedId = feed.id
if (feedId) {
feedQuery.byId({ id: feedId }).invalidate()
@ -275,10 +265,6 @@ const FeedInnerForm = ({
duration: 1000,
})
if (!isSubscribed) {
tracker.subscribe({ feedId: feed.id, view: Number.parseInt(variables.view) })
}
onSuccess?.()
},
onError(err) {

View File

@ -13,12 +13,11 @@ import { LoadingCircle } from "@follow/components/ui/loading/index.jsx"
import { Switch } from "@follow/components/ui/switch/index.jsx"
import { FeedViewType } from "@follow/constants"
import type { ListAnalyticsModel } from "@follow/models/types"
import { invalidateEntriesQuery } from "@follow/store/entry/hooks"
import { useListById, usePrefetchListById } from "@follow/store/list/hooks"
import type { ListModel } from "@follow/store/list/types"
import { useSubscriptionByFeedId } from "@follow/store/subscription/hooks"
import { subscriptionSyncService } from "@follow/store/subscription/store"
import { unreadActions } from "@follow/store/unread/store"
import { whoami } from "@follow/store/user/getters"
import { tracker } from "@follow/tracker"
import { cn } from "@follow/utils/utils"
import { zodResolver } from "@hookform/resolvers/zod"
@ -29,10 +28,8 @@ import { useTranslation } from "react-i18next"
import { toast } from "sonner"
import { z } from "zod"
import { getGeneralSettings } from "~/atoms/settings/general"
import { useCurrentModal } from "~/components/ui/modal/stacked/hooks"
import { useI18n } from "~/hooks/common"
import { apiClient } from "~/lib/api-fetch"
import { getFetchErrorMessage, toastFetchError } from "~/lib/error-parser"
import { getNewIssueUrl } from "~/lib/issues"
@ -213,47 +210,32 @@ const ListInnerForm = ({
const followMutation = useMutation({
mutationFn: async (values: z.infer<typeof formSchema> & { TOTPCode?: string }) => {
const userId = whoami()?.id || ""
const body = {
listId: list.id,
view: Number.parseInt(values.view),
category: values.category,
isPrivate: values.isPrivate,
isPrivate: values.isPrivate || false,
hideFromTimeline: values.hideFromTimeline,
title: values.title,
TOTPCode: values.TOTPCode,
}
const $method = isSubscribed ? apiClient.subscriptions.$patch : apiClient.subscriptions.$post
userId,
type: "list",
url: undefined,
feedId: undefined,
} as const
return $method({
json: body,
}) as unknown as Promise<
| ReturnType<typeof apiClient.subscriptions.$post>
| ReturnType<typeof apiClient.subscriptions.$patch>
>
if (isSubscribed) {
return subscriptionSyncService.edit(body)
} else {
return subscriptionSyncService.subscribe(body)
}
},
onSuccess: (data, variables) => {
if (getGeneralSettings().hidePrivateSubscriptionsInTimeline) {
invalidateEntriesQuery({ views: [Number(variables.view)] })
}
if ("unread" in data) {
const { unread } = data
unreadActions.upsertMany(unread)
}
subscriptionSyncService.fetch()
const listId = list.id
if (listId) {
// listsQuery.byId({ id: listId }).invalidate()
}
onSuccess: () => {
toast(isSubscribed ? t("feed_form.updated") : t("feed_form.followed"), {
duration: 1000,
})
if (!isSubscribed) {
tracker.subscribe({ listId: list.id, view: Number.parseInt(variables.view) })
}
onSuccess?.()
},
async onError(err) {

View File

@ -182,6 +182,7 @@ const useLocalEntries = (): UseEntriesReturn => {
entryIdsByInboxId,
entryIdsByListId,
entryIdsByView,
isCollection,
showEntriesByView,
unreadOnly,
],

View File

@ -172,7 +172,7 @@ export const useEntryIdsByView = (view: FeedViewType, excludePrivate: boolean |
return Array.from(ids)
.filter((id) => {
const subscription = getSubscriptionByEntryId(id)
if (excludePrivate && subscription?.isPrivate) {
if ((excludePrivate && subscription?.isPrivate) || subscription?.hideFromTimeline) {
return false
}
return true

View File

@ -243,12 +243,9 @@ class SubscriptionSyncService {
})
tx.request(async () => {
await api().subscriptions.update({
view: subscription.view,
...subscription,
feedId: subscription.feedId ?? undefined,
isPrivate: subscription.isPrivate ?? undefined,
listId: subscription.listId ?? undefined,
category: subscription.category ?? undefined,
title: subscription.title ?? undefined,
})
})
@ -257,6 +254,8 @@ class SubscriptionSyncService {
})
await tx.run()
invalidateEntriesQuery({ views: [subscription.view] })
}
async subscribe(subscription: SubscriptionForm) {
@ -283,8 +282,9 @@ class SubscriptionSyncService {
if (data.unread) {
unreadActions.upsertMany(data.unread)
}
// Insert to subscription
subscriptionActions.upsertMany([
await subscriptionActions.upsertMany([
{
...subscription,
title: subscription.title ?? null,
@ -298,6 +298,8 @@ class SubscriptionSyncService {
userId: whoami()?.id ?? "",
},
])
invalidateEntriesQuery({ views: [subscription.view] })
}
async unsubscribe(id: string | undefined | null | (string | undefined | null)[]) {

View File

@ -7,8 +7,8 @@ settings:
catalogs:
default:
'@follow-app/client-sdk':
specifier: 0.3.24
version: 0.3.24
specifier: 0.3.25
version: 0.3.25
typescript:
specifier: 5.8.3
version: 5.8.3
@ -461,7 +461,7 @@ importers:
version: 3.0.2(electron@37.2.0)
'@follow-app/client-sdk':
specifier: 'catalog:'
version: 0.3.24(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(expo-sqlite@15.2.12(expo@53.0.12(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0)))(bufferutil@4.0.9)(graphql@16.8.1)(react-native-webview@13.15.0(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(kysely@0.28.2)(pg@8.16.3)
version: 0.3.25(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(expo-sqlite@15.2.12(expo@53.0.12(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0)))(bufferutil@4.0.9)(graphql@16.8.1)(react-native-webview@13.15.0(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(kysely@0.28.2)(pg@8.16.3)
'@follow/database':
specifier: workspace:*
version: link:../../../../packages/internal/database
@ -1627,7 +1627,7 @@ importers:
dependencies:
'@follow-app/client-sdk':
specifier: 'catalog:'
version: 0.3.24(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(expo-sqlite@15.2.12(expo@53.0.12(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0)))(bufferutil@4.0.9)(graphql@16.8.1)(react-native-webview@13.15.0(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(kysely@0.28.2)(pg@8.16.3)
version: 0.3.25(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(expo-sqlite@15.2.12(expo@53.0.12(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0)))(bufferutil@4.0.9)(graphql@16.8.1)(react-native-webview@13.15.0(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(kysely@0.28.2)(pg@8.16.3)
'@follow/configs':
specifier: workspace:*
version: link:../../configs
@ -1639,7 +1639,7 @@ importers:
dependencies:
'@follow-app/client-sdk':
specifier: 'catalog:'
version: 0.3.24(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(expo-sqlite@15.2.12(expo@53.0.12(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0)))(bufferutil@4.0.9)(graphql@16.8.1)(react-native-webview@13.15.0(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(kysely@0.28.2)(pg@8.16.3)
version: 0.3.25(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(expo-sqlite@15.2.12(expo@53.0.12(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0)))(bufferutil@4.0.9)(graphql@16.8.1)(react-native-webview@13.15.0(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(kysely@0.28.2)(pg@8.16.3)
'@follow/constants':
specifier: workspace:*
version: link:../constants
@ -1717,7 +1717,7 @@ importers:
dependencies:
'@follow-app/client-sdk':
specifier: 'catalog:'
version: 0.3.24(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(expo-sqlite@15.2.12(expo@53.0.12(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0)))(bufferutil@4.0.9)(graphql@16.8.1)(react-native-webview@13.15.0(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(kysely@0.28.2)(pg@8.16.3)
version: 0.3.25(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(expo-sqlite@15.2.12(expo@53.0.12(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0)))(bufferutil@4.0.9)(graphql@16.8.1)(react-native-webview@13.15.0(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(kysely@0.28.2)(pg@8.16.3)
'@follow/constants':
specifier: workspace:*
version: link:../constants
@ -1781,7 +1781,7 @@ importers:
dependencies:
'@follow-app/client-sdk':
specifier: 'catalog:'
version: 0.3.24(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(expo-sqlite@15.2.12(expo@53.0.12(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0)))(bufferutil@4.0.9)(graphql@16.8.1)(react-native-webview@13.15.0(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(kysely@0.28.2)(pg@8.16.3)
version: 0.3.25(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(expo-sqlite@15.2.12(expo@53.0.12(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0)))(bufferutil@4.0.9)(graphql@16.8.1)(react-native-webview@13.15.0(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(kysely@0.28.2)(pg@8.16.3)
'@follow/configs':
specifier: workspace:*
version: link:../../configs
@ -4039,8 +4039,8 @@ packages:
'@floating-ui/utils@0.2.9':
resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
'@follow-app/client-sdk@0.3.24':
resolution: {integrity: sha512-lR22RZrhXrHoHRz+C8/9ccU8vl9kaMq83NaeSNQq6TfJU645TiA/GQu2pHE0H8N9KRUPzE/P82bAnye59dyBUA==}
'@follow-app/client-sdk@0.3.25':
resolution: {integrity: sha512-+x9x3bvcCedkqH2ypw1ae2zYySzT70FniC9LH8/TdqpYKIUzQZaMSZxGNIA9KaAQT1EtvL9e7lO07/zpQiEPSw==}
'@folo-services/ai-tools@0.2.14':
resolution: {integrity: sha512-3DG/FqGqNvpCUtq1WMwzMYW6XuhQQfRfIGyZbokJ+XgbyR4YO3Jtz9T5fluINy+Q9iQSRyZSLyhMxe4Evsj5Hg==}
@ -19175,7 +19175,7 @@ snapshots:
'@floating-ui/utils@0.2.9': {}
'@follow-app/client-sdk@0.3.24(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(expo-sqlite@15.2.12(expo@53.0.12(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0)))(bufferutil@4.0.9)(graphql@16.8.1)(react-native-webview@13.15.0(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(kysely@0.28.2)(pg@8.16.3)':
'@follow-app/client-sdk@0.3.25(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(expo-sqlite@15.2.12(expo@53.0.12(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0)))(bufferutil@4.0.9)(graphql@16.8.1)(react-native-webview@13.15.0(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(kysely@0.28.2)(pg@8.16.3)':
dependencies:
'@folo-services/constants': 0.1.15
'@folo-services/drizzle': 0.1.10(@opentelemetry/api@1.9.0)(@types/pg@8.6.1)(expo-sqlite@15.2.12(expo@53.0.12(@babel/core@7.28.0)(@expo/metro-runtime@5.0.4(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0)))(bufferutil@4.0.9)(graphql@16.8.1)(react-native-webview@13.15.0(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(react-native@0.79.1(@babel/core@7.28.0)(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.0.0))(react@19.0.0))(kysely@0.28.2)

View File

@ -53,4 +53,4 @@ overrides:
catalog:
typescript: "5.8.3"
"@follow-app/client-sdk": "0.3.24"
"@follow-app/client-sdk": "0.3.25"