Browse Source

Fixed bug that caused all videos to show when starting Q-Tube on subscriptions tab

SubscriptionData type moved from persistSlice.ts to SubscribeButton.tsx

Added check when subscribing to make sure both userName AND subscriberName are not already in subscribeList before subscribing. This ensures that a subscription from another username doesn't prevent a subscription from the current name.
pull/20/head
Qortal Dev 7 months ago
parent
commit
cbfbe15de0
  1. 16
      src/App.tsx
  2. 18
      src/components/common/SubscribeButton.tsx
  3. 4
      src/hooks/useFetchVideos.tsx
  4. 4
      src/pages/Home/Home.tsx
  5. 17
      src/state/features/persistSlice.ts
  6. 6
      src/state/features/videoSlice.ts

16
src/App.tsx

@ -15,7 +15,7 @@ import { PlaylistContent } from "./pages/PlaylistContent/PlaylistContent";
import { PersistGate } from "redux-persist/integration/react"; import { PersistGate } from "redux-persist/integration/react";
import { persistStore } from "redux-persist"; import { persistStore } from "redux-persist";
import { setFilteredSubscriptions } from "./state/features/videoSlice.ts"; import { setFilteredSubscriptions } from "./state/features/videoSlice.ts";
import { SubscriptionObject } from "./state/features/persistSlice.ts"; import { SubscriptionData } from "./components/common/SubscribeButton.tsx";
export const getUserName = async () => { export const getUserName = async () => {
const account = await qortalRequest({ const account = await qortalRequest({
@ -31,7 +31,7 @@ export const getUserName = async () => {
}; };
export const filterVideosByName = ( export const filterVideosByName = (
subscriptionList: SubscriptionObject[], subscriptionList: SubscriptionData[],
userName: string userName: string
) => { ) => {
return subscriptionList.filter(item => { return subscriptionList.filter(item => {
@ -39,7 +39,15 @@ export const filterVideosByName = (
}); });
}; };
export const subscriptionListFilter = async () => { export const subscriptionListFilter = async (reset = true) => {
const filteredSubscriptionList =
store.getState().video.filteredSubscriptionList;
const isFilteredSubscriptionListEmpty = filteredSubscriptionList.length === 0;
if (!reset && !isFilteredSubscriptionListEmpty) {
return filteredSubscriptionList;
}
const subscriptionList = store.getState().persist.subscriptionList; const subscriptionList = store.getState().persist.subscriptionList;
const filterByUserName = const filterByUserName =
store.getState().persist.subscriptionListFilter === "currentNameOnly"; store.getState().persist.subscriptionListFilter === "currentNameOnly";
@ -58,7 +66,7 @@ function App() {
useEffect(() => { useEffect(() => {
const subscriptionList = store.getState().persist.subscriptionList; const subscriptionList = store.getState().persist.subscriptionList;
subscriptionListFilter().then(filteredList => { subscriptionListFilter(false).then(filteredList => {
store.dispatch(setFilteredSubscriptions(filteredList)); store.dispatch(setFilteredSubscriptions(filteredList));
}); });
}, []); }, []);

18
src/components/common/SubscribeButton.tsx

@ -2,11 +2,7 @@ import { Button, ButtonProps } from "@mui/material";
import { MouseEvent, useEffect, useState } from "react"; import { MouseEvent, useEffect, useState } from "react";
import { useDispatch, useSelector } from "react-redux"; import { useDispatch, useSelector } from "react-redux";
import { RootState } from "../../state/store.ts"; import { RootState } from "../../state/store.ts";
import { import { subscribe, unSubscribe } from "../../state/features/persistSlice.ts";
subscribe,
SubscriptionObject,
unSubscribe,
} from "../../state/features/persistSlice.ts";
import { setFilteredSubscriptions } from "../../state/features/videoSlice.ts"; import { setFilteredSubscriptions } from "../../state/features/videoSlice.ts";
import { subscriptionListFilter } from "../../App.tsx"; import { subscriptionListFilter } from "../../App.tsx";
@ -14,14 +10,16 @@ interface SubscribeButtonProps extends ButtonProps {
subscriberName: string; subscriberName: string;
} }
export type SubscriptionData = {
userName: string;
subscriberName: string;
};
export const SubscribeButton = ({ export const SubscribeButton = ({
subscriberName, subscriberName,
...props ...props
}: SubscribeButtonProps) => { }: SubscribeButtonProps) => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const subscriptionList = useSelector((state: RootState) => {
return state.persist.subscriptionList;
});
const filteredSubscriptionList = useSelector((state: RootState) => { const filteredSubscriptionList = useSelector((state: RootState) => {
return state.video.filteredSubscriptionList; return state.video.filteredSubscriptionList;
@ -30,7 +28,7 @@ export const SubscribeButton = ({
const userName = useSelector((state: RootState) => state.auth.user?.name); const userName = useSelector((state: RootState) => state.auth.user?.name);
const [isSubscribed, setIsSubscribed] = useState<boolean>(false); const [isSubscribed, setIsSubscribed] = useState<boolean>(false);
const isSubscribedToName = (subscriptionList: SubscriptionObject[]) => { const isSubscribedToName = (subscriptionList: SubscriptionData[]) => {
return ( return (
subscriptionList.find(item => { subscriptionList.find(item => {
return item.subscriberName === subscriberName; return item.subscriberName === subscriberName;
@ -49,7 +47,7 @@ export const SubscribeButton = ({
} }
}, []); }, []);
const subscriptionData = { const subscriptionData: SubscriptionData = {
userName: userName, userName: userName,
subscriberName: subscriberName, subscriberName: subscriberName,
}; };

4
src/hooks/useFetchVideos.tsx

@ -26,6 +26,7 @@ import {
} from "../constants/Identifiers.ts"; } from "../constants/Identifiers.ts";
import { allTabValue, subscriptionTabValue } from "../constants/Misc.ts"; import { allTabValue, subscriptionTabValue } from "../constants/Misc.ts";
import { persistReducer } from "redux-persist"; import { persistReducer } from "redux-persist";
import { subscriptionListFilter } from "../App.tsx";
export const useFetchVideos = () => { export const useFetchVideos = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
@ -231,8 +232,9 @@ export const useFetchVideos = () => {
if (name) { if (name) {
defaultUrl = defaultUrl + `&name=${name}`; defaultUrl = defaultUrl + `&name=${name}`;
} }
if (listType === subscriptionTabValue) { if (listType === subscriptionTabValue) {
const filteredSubscribeList = videoReducer.filteredSubscriptionList; const filteredSubscribeList = await subscriptionListFilter(false);
filteredSubscribeList.map(sub => { filteredSubscribeList.map(sub => {
defaultUrl += `&name=${sub.subscriberName}`; defaultUrl += `&name=${sub.subscriberName}`;
}); });

4
src/pages/Home/Home.tsx

@ -137,6 +137,7 @@ export const Home = ({ mode }: HomeProps) => {
if (!firstFetch.current || !afterFetch.current) return; if (!firstFetch.current || !afterFetch.current) return;
if (isFetching.current) return; if (isFetching.current) return;
isFetching.current = true; isFetching.current = true;
console.log("in getvideoshandler");
await getVideos( await getVideos(
{ {
name: filterName, name: filterName,
@ -170,6 +171,7 @@ export const Home = ({ mode }: HomeProps) => {
getVideosCount(); getVideosCount();
if (isFiltering && filterValue !== prevVal?.current) { if (isFiltering && filterValue !== prevVal?.current) {
prevVal.current = filterValue; prevVal.current = filterValue;
getVideosHandler(); getVideosHandler();
} }
}, [filterValue, isFiltering, filteredVideos, getVideosCount]); }, [filterValue, isFiltering, filteredVideos, getVideosCount]);
@ -178,7 +180,6 @@ export const Home = ({ mode }: HomeProps) => {
if (firstFetch.current) return; if (firstFetch.current) return;
firstFetch.current = true; firstFetch.current = true;
setIsLoading(true); setIsLoading(true);
await getVideos( await getVideos(
{ {
name: "", name: "",
@ -283,6 +284,7 @@ export const Home = ({ mode }: HomeProps) => {
}; };
useEffect(() => { useEffect(() => {
console.log("useeffect 5");
getVideosHandler(true); getVideosHandler(true);
}, [tabValue]); }, [tabValue]);

17
src/state/features/persistSlice.ts

@ -1,19 +1,15 @@
import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { allTabValue, subscriptionTabValue } from "../../constants/Misc.ts"; import { allTabValue, subscriptionTabValue } from "../../constants/Misc.ts";
import { SubscriptionData } from "../../components/common/SubscribeButton.tsx";
type StretchVideoType = "contain" | "fill" | "cover" | "none" | "scale-down"; type StretchVideoType = "contain" | "fill" | "cover" | "none" | "scale-down";
type SubscriptionListFilterType = "ALL" | "currentNameOnly"; type SubscriptionListFilterType = "ALL" | "currentNameOnly";
export type SubscriptionObject = {
userName: string;
subscriberName: string;
};
interface settingsState { interface settingsState {
selectedTab: string; selectedTab: string;
stretchVideoSetting: StretchVideoType; stretchVideoSetting: StretchVideoType;
filterType: string; filterType: string;
subscriptionList: SubscriptionObject[]; subscriptionList: SubscriptionData[];
playbackRate: number; playbackRate: number;
subscriptionListFilter: SubscriptionListFilterType; subscriptionListFilter: SubscriptionListFilterType;
showStats: boolean; showStats: boolean;
@ -42,18 +38,21 @@ export const persistSlice = createSlice({
setShowStats: (state, action) => { setShowStats: (state, action) => {
state.showStats = action.payload; state.showStats = action.payload;
}, },
subscribe: (state, action: PayloadAction<SubscriptionObject>) => { subscribe: (state, action: PayloadAction<SubscriptionData>) => {
const currentSubscriptions = state.subscriptionList; const currentSubscriptions = state.subscriptionList;
const notSubscribedToName = const notSubscribedToName =
currentSubscriptions.find(item => { currentSubscriptions.find(item => {
return item.subscriberName === action.payload.subscriberName; return (
item.subscriberName === action.payload.subscriberName &&
item.userName === action.payload.userName
);
}) === undefined; }) === undefined;
if (notSubscribedToName) { if (notSubscribedToName) {
state.subscriptionList = [...currentSubscriptions, action.payload]; state.subscriptionList = [...currentSubscriptions, action.payload];
} }
console.log("subscribeList after subscribe: ", state.subscriptionList); console.log("subscribeList after subscribe: ", state.subscriptionList);
}, },
unSubscribe: (state, action: PayloadAction<SubscriptionObject>) => { unSubscribe: (state, action: PayloadAction<SubscriptionData>) => {
state.subscriptionList = state.subscriptionList.filter( state.subscriptionList = state.subscriptionList.filter(
item => item.subscriberName !== action.payload.subscriberName item => item.subscriberName !== action.payload.subscriberName
); );

6
src/state/features/videoSlice.ts

@ -1,5 +1,5 @@
import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { SubscriptionObject } from "./persistSlice.ts"; import { SubscriptionData } from "../../components/common/SubscribeButton";
interface GlobalState { interface GlobalState {
videos: Video[]; videos: Video[];
@ -15,7 +15,7 @@ interface GlobalState {
selectedSubCategoryVideos: any; selectedSubCategoryVideos: any;
editVideoProperties: any; editVideoProperties: any;
editPlaylistProperties: any; editPlaylistProperties: any;
filteredSubscriptionList: SubscriptionObject[]; filteredSubscriptionList: SubscriptionData[];
} }
const initialState: GlobalState = { const initialState: GlobalState = {
@ -174,7 +174,7 @@ export const videoSlice = createSlice({
setFilteredSubscriptions: ( setFilteredSubscriptions: (
state, state,
action: PayloadAction<SubscriptionObject[]> action: PayloadAction<SubscriptionData[]>
) => { ) => {
state.filteredSubscriptionList = action.payload; state.filteredSubscriptionList = action.payload;
}, },

Loading…
Cancel
Save