diff --git a/package-lock.json b/package-lock.json index 719066a..19b69f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "jotai": "^2.12.4", "localforage": "^1.10.0", "mediainfo.js": "^0.3.6", - "qapp-core": "^1.0.76", + "qapp-core": "^1.0.79", "quill-image-resize-module-react": "^3.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -5177,9 +5177,9 @@ } }, "node_modules/qapp-core": { - "version": "1.0.76", - "resolved": "https://registry.npmjs.org/qapp-core/-/qapp-core-1.0.76.tgz", - "integrity": "sha512-Jt7f+ma3jM7NorrS6DRrbO9eP24UdEybqL9K4reXfEm02g1DDfIQotbYKxHiLEYojdsqgAOFt3MX0K/S8ZyMQg==", + "version": "1.0.79", + "resolved": "https://registry.npmjs.org/qapp-core/-/qapp-core-1.0.79.tgz", + "integrity": "sha512-UJi4xAmHB6z63mKtydggZbm7XV9HoWKUWBZ/QSt75clcvJRWsODvMtlq1kHuL19es+t6y5AzaMjOju/lXJpj2g==", "license": "MIT", "dependencies": { "@tanstack/react-virtual": "^3.13.2", diff --git a/package.json b/package.json index 3029de4..d8cabab 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "jotai": "^2.12.4", "localforage": "^1.10.0", "mediainfo.js": "^0.3.6", - "qapp-core": "^1.0.76", + "qapp-core": "^1.0.79", "quill-image-resize-module-react": "^3.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/src/components/Feed.tsx b/src/components/Feed.tsx index cb69e9e..d96ce5b 100644 --- a/src/components/Feed.tsx +++ b/src/components/Feed.tsx @@ -15,6 +15,7 @@ import { ENTITY_REPLY, ENTITY_REPOST, ENTITY_ROOT, + DISABLE_SUBSCRIPTIONS, GROUP_PRIVATE, LIST_POSTS_FEED, LIST_POSTS_FEED_FOLLOWING_SUB, @@ -317,7 +318,6 @@ export function Feed({ null ); const [followingNames, setFollowingNames] = useState(null); - // Access group owner primary names on the fly without dependency const groupOwnerNames = useAtomValue(groupOwnerPrimaryNamesAtom); const [primaryNamesGroup, setPrimaryNamesGroup] = useState( @@ -340,11 +340,10 @@ export function Feed({ if (isLoadingGroupOwnerNames) return; const buildPrefix = async () => { if (!identifierOperations) return; - if (memberGroups === null) return; + if (!DISABLE_SUBSCRIPTIONS && memberGroups === null) return; try { const followedNames = await fetchFollowedNames(); - setFollowingNames(followedNames); const prefix = await identifierOperations.buildSearchPrefix( ENTITY_POST, @@ -362,17 +361,24 @@ export function Feed({ ENTITY_REPOST, '' ); + setRepostSearchPrefix(repostPrefix); + if (DISABLE_SUBSCRIPTIONS) { + setGroupSearchPrefix(null); + setPrimaryNamesGroup([]); + setGroupSearchPrefixes([]); + return; + } + const groupPrefix = await identifierOperations.buildSearchPrefix( null, '', GROUP_PRIVATE ); - setRepostSearchPrefix(repostPrefix); setGroupSearchPrefix(groupPrefix); setPrimaryNamesGroup(groupOwnerNames); - const groupIds = Array.from(memberGroups.keys()); + const groupIds = Array.from(memberGroups?.keys() || []); if (groupIds.length > 0) { const groupSearchPrefixesResponses = await Promise.all( groupIds.map(async (groupId) => { @@ -391,7 +397,13 @@ export function Feed({ }; buildPrefix(); - }, [identifierOperations, isLoadingGroupOwnerNames, memberGroups]); + }, [ + fetchFollowedNames, + groupOwnerNames, + identifierOperations, + isLoadingGroupOwnerNames, + memberGroups, + ]); const loaderItem = useCallback(() => { return ; @@ -474,8 +486,7 @@ export function Feed({ !followingNames || !replySearchPrefix || !repostSearchPrefix || - !primaryNamesGroup || - !groupSearchPrefix + (!DISABLE_SUBSCRIPTIONS && (!primaryNamesGroup || !groupSearchPrefix)) ) return undefined; @@ -571,7 +582,7 @@ export function Feed({ !intervalSearch || !searchPrefix || !replySearchPrefix || - !groupSearchPrefix || + (!DISABLE_SUBSCRIPTIONS && !groupSearchPrefix) || !repostSearchPrefix ) { return ( @@ -698,7 +709,7 @@ export function Feed({ disabled={!isAuthenticated} > - Following & Subs + {DISABLE_SUBSCRIPTIONS ? 'Following' : 'Following & Subs'} @@ -743,6 +754,7 @@ export function Feed({ searchNewData={undefined} onNewData={onNewData} ref={helperListMethodsRef} + isLoading={isLoadingChangeFeedType} /> ) : ( @@ -778,6 +790,7 @@ export function Feed({ } onNewData={onNewData} ref={helperListMethodsRef} + isLoading={isLoadingChangeFeedType} /> )} diff --git a/src/components/MobileNavigation.tsx b/src/components/MobileNavigation.tsx index 2d0cc87..a3d4ba2 100644 --- a/src/components/MobileNavigation.tsx +++ b/src/components/MobileNavigation.tsx @@ -13,6 +13,7 @@ import { useState } from 'react'; import { useAtomValue } from 'jotai'; import { hasUnreadNotificationsAtom } from '../state/global/notifications'; import { isPublicNodeAtom } from '../state/global/system'; +import { DISABLE_SUBSCRIPTIONS } from '../constants/qdn'; import { useGlobal } from 'qapp-core'; import { NameSwitcher } from './NameSwitcher'; @@ -174,7 +175,7 @@ export function MobileNavigation({ page === 'profile' || page === 'notifications' || page === 'blocked' || - page === 'groups' + (!DISABLE_SUBSCRIPTIONS && page === 'groups') ) { if (!auth?.name) return; } @@ -195,7 +196,7 @@ export function MobileNavigation({ page === 'profile' || page === 'notifications' || page === 'blocked' || - page === 'groups' + (!DISABLE_SUBSCRIPTIONS && page === 'groups') ) { if (!auth?.name) return; } @@ -312,17 +313,18 @@ export function MobileNavigation({ )} - handleMenuItemClick('groups')} - disabled={!auth?.name} - > - - Subscriptions - + {!DISABLE_SUBSCRIPTIONS && ( + handleMenuItemClick('groups')} + disabled={!auth?.name} + > + + Subscriptions + + )} ); } - diff --git a/src/components/NewPostInput.tsx b/src/components/NewPostInput.tsx index cd5a080..a55ff71 100644 --- a/src/components/NewPostInput.tsx +++ b/src/components/NewPostInput.tsx @@ -32,6 +32,7 @@ import { showError } from 'qapp-core'; import { useAtomValue } from 'jotai'; import { attachedGroupsAtom, ownedGroupsAtom } from '../state/global/profile'; import { AttachedGroup } from '../utils/profileQdn'; +import { DISABLE_SUBSCRIPTIONS } from '../constants/qdn'; // Declare qortalRequest as a global function (provided by Qortal runtime) @@ -444,11 +445,17 @@ export function NewPostInput({ const [showEmojiPicker, setShowEmojiPicker] = useState(false); // Set initial visibility based on replyingToGroupId (for encrypted replies) or editingPostGroupId (for editing) const [visibility, setVisibility] = useState( - replyingToGroupId?.toString() || editingPostGroupId?.toString() || 'public' + DISABLE_SUBSCRIPTIONS + ? 'public' + : replyingToGroupId?.toString() || + editingPostGroupId?.toString() || + 'public' ); // Enrich attached groups with groupName from ownedGroups if missing const enrichedAttachedGroups = useMemo(() => { + if (DISABLE_SUBSCRIPTIONS) return []; + const groups = attachedGroups .filter((item) => !!ownedGroups.find((g) => g.groupId === item)) .map((attachedGroup) => { @@ -526,7 +533,9 @@ export function NewPostInput({ setText(initialText); setMedia(initialMedia); // Set visibility based on editingPostGroupId - if (editingPostGroupId) { + if (DISABLE_SUBSCRIPTIONS) { + setVisibility('public'); + } else if (editingPostGroupId) { setVisibility(editingPostGroupId.toString()); } else { setVisibility('public'); @@ -668,7 +677,9 @@ export function NewPostInput({ try { // Get groupId from visibility if it's not 'public' const selectedGroupId = - visibility !== 'public' ? parseInt(visibility) : undefined; + !DISABLE_SUBSCRIPTIONS && visibility !== 'public' + ? parseInt(visibility) + : undefined; await onPost({ text, @@ -1444,7 +1455,7 @@ export function NewPostInput({ {/* Only show visibility selector when creating a new post (not editing or replying) */} - {!isEditing && !isReplying && ( + {!DISABLE_SUBSCRIPTIONS && !isEditing && !isReplying && (