check existing song url before navigating
This commit is contained in:
@@ -0,0 +1,30 @@
|
|||||||
|
import { useCallback } from "react";
|
||||||
|
import { useGlobal } from "reactn";
|
||||||
|
import { Routes } from "../navigation";
|
||||||
|
import { navigate } from "../navigation/NavigationService";
|
||||||
|
|
||||||
|
const useNavigateToMusicDetails = () => {
|
||||||
|
const [, setTooltip] = useGlobal("_tooltip");
|
||||||
|
|
||||||
|
return useCallback(
|
||||||
|
({ projectId, songUrl }) => {
|
||||||
|
if (!projectId) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (songUrl != null && songUrl !== "") {
|
||||||
|
navigate(Routes.MusicDetails, { projectId });
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
setTooltip({
|
||||||
|
type: "error",
|
||||||
|
text: "Les paroles pour cette musique n'ont pas été générées",
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
[setTooltip]
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default useNavigateToMusicDetails;
|
||||||
@@ -13,6 +13,7 @@ import { background, icons } from "../../assets";
|
|||||||
import BorderGradientButton from "../../components/BorderGradientButton";
|
import BorderGradientButton from "../../components/BorderGradientButton";
|
||||||
import { projectsRef } from "../../config/firebase";
|
import { projectsRef } from "../../config/firebase";
|
||||||
import useDataFromRef from "../../hooks/useDataFromRef";
|
import useDataFromRef from "../../hooks/useDataFromRef";
|
||||||
|
import useNavigateToMusicDetails from "../../hooks/useNavigateToMusicDetails";
|
||||||
import Page from "../../layouts/Page";
|
import Page from "../../layouts/Page";
|
||||||
import { Routes } from "../../navigation";
|
import { Routes } from "../../navigation";
|
||||||
import { navigate } from "../../navigation/NavigationService";
|
import { navigate } from "../../navigation/NavigationService";
|
||||||
@@ -21,10 +22,9 @@ import { FONT_FAMILY } from "../../styles/Fonts";
|
|||||||
import CreateLyricsHeader from "../Writing/components/CreateLyricsHeader";
|
import CreateLyricsHeader from "../Writing/components/CreateLyricsHeader";
|
||||||
import PlaybacksCard from "./components/PlaybacksCard";
|
import PlaybacksCard from "./components/PlaybacksCard";
|
||||||
import SongCard from "./components/SongCard";
|
import SongCard from "./components/SongCard";
|
||||||
|
|
||||||
const HitParade = () => {
|
const HitParade = () => {
|
||||||
const [selected, setSelected] = useState("Chansons");
|
const [selected, setSelected] = useState("Chansons");
|
||||||
|
const navigateToMusicDetails = useNavigateToMusicDetails();
|
||||||
const { data: topSongs } = useDataFromRef({
|
const { data: topSongs } = useDataFromRef({
|
||||||
ref: projectsRef.where("views", ">", 0).orderBy("views", "desc").limit(10),
|
ref: projectsRef.where("views", ">", 0).orderBy("views", "desc").limit(10),
|
||||||
simpleRef: false,
|
simpleRef: false,
|
||||||
@@ -74,7 +74,12 @@ const HitParade = () => {
|
|||||||
title={item?.title || "Sans titre"}
|
title={item?.title || "Sans titre"}
|
||||||
artist={item?.userName}
|
artist={item?.userName}
|
||||||
coverUrl={item?.coverUrl || null}
|
coverUrl={item?.coverUrl || null}
|
||||||
onPress={() => navigate(Routes.MusicDetails, { projectId: item.id })}
|
onPress={() =>
|
||||||
|
navigateToMusicDetails({
|
||||||
|
projectId: item.id,
|
||||||
|
songUrl: item?.songUrl,
|
||||||
|
})
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
@@ -118,7 +123,10 @@ const HitParade = () => {
|
|||||||
artist={"MusicLand"}
|
artist={"MusicLand"}
|
||||||
coverUrl={item?.coverUrl || null}
|
coverUrl={item?.coverUrl || null}
|
||||||
onPress={() =>
|
onPress={() =>
|
||||||
navigate(Routes.MusicDetails, { projectId: item.id })
|
navigateToMusicDetails({
|
||||||
|
projectId: item.id,
|
||||||
|
songUrl: item?.songUrl,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
@@ -128,18 +136,21 @@ const HitParade = () => {
|
|||||||
{songsCol2.length > 0 && (
|
{songsCol2.length > 0 && (
|
||||||
<View style={{ flex: 1, gap: 10 }}>
|
<View style={{ flex: 1, gap: 10 }}>
|
||||||
{songsCol2.map((item, idx) => (
|
{songsCol2.map((item, idx) => (
|
||||||
<SongCard
|
<SongCard
|
||||||
key={item.id}
|
key={item.id}
|
||||||
rank={5 + idx + 1}
|
rank={5 + idx + 1}
|
||||||
title={item?.title || "Sans titre"}
|
title={item?.title || "Sans titre"}
|
||||||
artist={"MusicLand"}
|
artist={"MusicLand"}
|
||||||
coverUrl={item?.coverUrl || null}
|
coverUrl={item?.coverUrl || null}
|
||||||
onPress={() =>
|
onPress={() =>
|
||||||
navigate(Routes.MusicDetails, { projectId: item.id })
|
navigateToMusicDetails({
|
||||||
}
|
projectId: item.id,
|
||||||
/>
|
songUrl: item?.songUrl,
|
||||||
))}
|
})
|
||||||
</View>
|
}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</View>
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import MoreMenu from "../../components/MoreMenu";
|
|||||||
import Page from "../../layouts/Page";
|
import Page from "../../layouts/Page";
|
||||||
import { Routes } from "../../navigation";
|
import { Routes } from "../../navigation";
|
||||||
import { navigate } from "../../navigation/NavigationService";
|
import { navigate } from "../../navigation/NavigationService";
|
||||||
|
import useNavigateToMusicDetails from "../../hooks/useNavigateToMusicDetails";
|
||||||
import { useUser } from "../../providers/UserDataProvider";
|
import { useUser } from "../../providers/UserDataProvider";
|
||||||
import { gutters } from "../../styles";
|
import { gutters } from "../../styles";
|
||||||
import MusicCard from "./components/MusicCard";
|
import MusicCard from "./components/MusicCard";
|
||||||
@@ -20,6 +21,7 @@ export default function AllMyList() {
|
|||||||
|
|
||||||
const { userProjects, userLikedProjects, userPlaybacks, userLikedPlaybacks } =
|
const { userProjects, userLikedProjects, userPlaybacks, userLikedPlaybacks } =
|
||||||
useUser();
|
useUser();
|
||||||
|
const navigateToMusicDetails = useNavigateToMusicDetails();
|
||||||
|
|
||||||
const items = (() => {
|
const items = (() => {
|
||||||
if (scope === "playback") {
|
if (scope === "playback") {
|
||||||
@@ -45,7 +47,10 @@ export default function AllMyList() {
|
|||||||
if (scope === "playback") {
|
if (scope === "playback") {
|
||||||
navigate(Routes.Playbacks, { projectId: item.id });
|
navigate(Routes.Playbacks, { projectId: item.id });
|
||||||
} else {
|
} else {
|
||||||
navigate(Routes.MusicDetails, { projectId: item.id });
|
navigateToMusicDetails({
|
||||||
|
projectId: item.id,
|
||||||
|
songUrl: item?.songUrl,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -7,9 +7,8 @@ import MoreMenu from "../../components/MoreMenu";
|
|||||||
import { playlistsRef, projectsRef } from "../../config/firebase";
|
import { playlistsRef, projectsRef } from "../../config/firebase";
|
||||||
import useDataFromArrayDocId from "../../hooks/useDataFromArrayId";
|
import useDataFromArrayDocId from "../../hooks/useDataFromArrayId";
|
||||||
import useDataFromRef from "../../hooks/useDataFromRef";
|
import useDataFromRef from "../../hooks/useDataFromRef";
|
||||||
|
import useNavigateToMusicDetails from "../../hooks/useNavigateToMusicDetails";
|
||||||
import Page from "../../layouts/Page";
|
import Page from "../../layouts/Page";
|
||||||
import { Routes } from "../../navigation";
|
|
||||||
import { navigate } from "../../navigation/NavigationService";
|
|
||||||
import { useUser } from "../../providers/UserDataProvider";
|
import { useUser } from "../../providers/UserDataProvider";
|
||||||
import { gutters, Palette, Style } from "../../styles";
|
import { gutters, Palette, Style } from "../../styles";
|
||||||
import { FONT_FAMILY } from "../../styles/Fonts";
|
import { FONT_FAMILY } from "../../styles/Fonts";
|
||||||
@@ -40,6 +39,7 @@ const AllMyPlaylist = ({ route }) => {
|
|||||||
const [menuPosition, setMenuPosition] = useState(null);
|
const [menuPosition, setMenuPosition] = useState(null);
|
||||||
const [showMenu, setShowMenu] = useState(false);
|
const [showMenu, setShowMenu] = useState(false);
|
||||||
const [selectedProjectId, setSelectedProjectId] = useState(null);
|
const [selectedProjectId, setSelectedProjectId] = useState(null);
|
||||||
|
const navigateToMusicDetails = useNavigateToMusicDetails();
|
||||||
console.log("musics are : ", musics);
|
console.log("musics are : ", musics);
|
||||||
return (
|
return (
|
||||||
<Page
|
<Page
|
||||||
@@ -170,7 +170,10 @@ const AllMyPlaylist = ({ route }) => {
|
|||||||
projectId={p?.id}
|
projectId={p?.id}
|
||||||
likedBy={p?.likedBy || []}
|
likedBy={p?.likedBy || []}
|
||||||
onPress={() =>
|
onPress={() =>
|
||||||
navigate(Routes.MusicDetails, { projectId: p.id })
|
navigateToMusicDetails({
|
||||||
|
projectId: p.id,
|
||||||
|
songUrl: p?.songUrl,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
onPressMore={(posTop) => {
|
onPressMore={(posTop) => {
|
||||||
setSelectedProjectId(p.id);
|
setSelectedProjectId(p.id);
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ const Library = () => {
|
|||||||
{hasBackTracks && <BackTracks />}
|
{hasBackTracks && <BackTracks />}
|
||||||
{hasLikedMusic && <LikedMusic />}
|
{hasLikedMusic && <LikedMusic />}
|
||||||
{hasMyClips && <MyClips />}
|
{hasMyClips && <MyClips />}
|
||||||
{hasPlaylists && <MyPlaylist />}
|
<MyPlaylist />
|
||||||
{hasLikedPlayback && <LikedPlayback />}
|
{hasLikedPlayback && <LikedPlayback />}
|
||||||
{hasLikedClips && <LikedClips />}
|
{hasLikedClips && <LikedClips />}
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import { background, icons } from "../../assets";
|
|||||||
import MoreMenu from "../../components/MoreMenu";
|
import MoreMenu from "../../components/MoreMenu";
|
||||||
import { playlistsRef, projectsRef } from "../../config/firebase";
|
import { playlistsRef, projectsRef } from "../../config/firebase";
|
||||||
import Page from "../../layouts/Page";
|
import Page from "../../layouts/Page";
|
||||||
import { Routes } from "../../navigation";
|
import { goBack } from "../../navigation/NavigationService";
|
||||||
import { goBack, navigate } from "../../navigation/NavigationService";
|
import useNavigateToMusicDetails from "../../hooks/useNavigateToMusicDetails";
|
||||||
import { gutters } from "../../styles";
|
import { gutters } from "../../styles";
|
||||||
import MusicCard from "./components/MusicCard";
|
import MusicCard from "./components/MusicCard";
|
||||||
|
|
||||||
@@ -39,6 +39,7 @@ const PlaylistDetails = () => {
|
|||||||
const [menuPosition, setMenuPosition] = useState(null);
|
const [menuPosition, setMenuPosition] = useState(null);
|
||||||
const [showMenu, setShowMenu] = useState(false);
|
const [showMenu, setShowMenu] = useState(false);
|
||||||
const [selectedProjectId, setSelectedProjectId] = useState(null);
|
const [selectedProjectId, setSelectedProjectId] = useState(null);
|
||||||
|
const navigateToMusicDetails = useNavigateToMusicDetails();
|
||||||
|
|
||||||
const confirmDelete = () => {
|
const confirmDelete = () => {
|
||||||
SheetManager.show("Delete", {
|
SheetManager.show("Delete", {
|
||||||
@@ -87,7 +88,12 @@ const PlaylistDetails = () => {
|
|||||||
imageUri={p?.coverUrl || null}
|
imageUri={p?.coverUrl || null}
|
||||||
projectId={p?.id}
|
projectId={p?.id}
|
||||||
likedBy={p?.likedBy || []}
|
likedBy={p?.likedBy || []}
|
||||||
onPress={() => navigate(Routes.MusicDetails, { projectId: p.id })}
|
onPress={() =>
|
||||||
|
navigateToMusicDetails({
|
||||||
|
projectId: p.id,
|
||||||
|
songUrl: p?.songUrl,
|
||||||
|
})
|
||||||
|
}
|
||||||
onPressMore={(posTop) => {
|
onPressMore={(posTop) => {
|
||||||
setSelectedProjectId(p.id);
|
setSelectedProjectId(p.id);
|
||||||
setMenuPosition(posTop);
|
setMenuPosition(posTop);
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import {
|
|||||||
} from "react-native";
|
} from "react-native";
|
||||||
import { img } from "../../../assets";
|
import { img } from "../../../assets";
|
||||||
import useLayoutType from "../../../hooks/useLayoutType";
|
import useLayoutType from "../../../hooks/useLayoutType";
|
||||||
|
import useNavigateToMusicDetails from "../../../hooks/useNavigateToMusicDetails";
|
||||||
import { Routes } from "../../../navigation";
|
import { Routes } from "../../../navigation";
|
||||||
import { navigate } from "../../../navigation/NavigationService";
|
import { navigate } from "../../../navigation/NavigationService";
|
||||||
import { useUser } from "../../../providers/UserDataProvider";
|
import { useUser } from "../../../providers/UserDataProvider";
|
||||||
@@ -26,6 +27,7 @@ const LikedMusic = () => {
|
|||||||
0,
|
0,
|
||||||
Math.floor((containerWidth - gap * (numColumns - 1)) / numColumns)
|
Math.floor((containerWidth - gap * (numColumns - 1)) / numColumns)
|
||||||
);
|
);
|
||||||
|
const navigateToMusicDetails = useNavigateToMusicDetails();
|
||||||
return (
|
return (
|
||||||
<CardContainer
|
<CardContainer
|
||||||
label="Musiques likées"
|
label="Musiques likées"
|
||||||
@@ -50,7 +52,10 @@ const LikedMusic = () => {
|
|||||||
<Pressable
|
<Pressable
|
||||||
style={{ width: itemWidth }}
|
style={{ width: itemWidth }}
|
||||||
onPress={() =>
|
onPress={() =>
|
||||||
navigate(Routes.MusicDetails, { projectId: item.id })
|
navigateToMusicDetails({
|
||||||
|
projectId: item.id,
|
||||||
|
songUrl: item?.songUrl,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
{item?.coverUrl ? (
|
{item?.coverUrl ? (
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { SheetManager } from "react-native-actions-sheet";
|
|||||||
import { useGlobal } from "reactn";
|
import { useGlobal } from "reactn";
|
||||||
import MoreMenu from "../../../components/MoreMenu";
|
import MoreMenu from "../../../components/MoreMenu";
|
||||||
import { projectsRef } from "../../../config/firebase";
|
import { projectsRef } from "../../../config/firebase";
|
||||||
|
import useNavigateToMusicDetails from "../../../hooks/useNavigateToMusicDetails";
|
||||||
import { Routes } from "../../../navigation";
|
import { Routes } from "../../../navigation";
|
||||||
import { navigate } from "../../../navigation/NavigationService";
|
import { navigate } from "../../../navigation/NavigationService";
|
||||||
import { useUser } from "../../../providers/UserDataProvider";
|
import { useUser } from "../../../providers/UserDataProvider";
|
||||||
@@ -17,6 +18,7 @@ const MyMusic = () => {
|
|||||||
const projects = Array.isArray(userProjects) ? userProjects.slice(0, 3) : [];
|
const projects = Array.isArray(userProjects) ? userProjects.slice(0, 3) : [];
|
||||||
|
|
||||||
const [, setTooltip] = useGlobal("_tooltip");
|
const [, setTooltip] = useGlobal("_tooltip");
|
||||||
|
const navigateToMusicDetails = useNavigateToMusicDetails();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<CardContainer
|
<CardContainer
|
||||||
@@ -39,7 +41,12 @@ const MyMusic = () => {
|
|||||||
imageUri={p?.coverUrl || null}
|
imageUri={p?.coverUrl || null}
|
||||||
projectId={p?.id}
|
projectId={p?.id}
|
||||||
likedBy={p?.likedBy || []}
|
likedBy={p?.likedBy || []}
|
||||||
onPress={() => navigate(Routes.MusicDetails, { projectId: p.id })}
|
onPress={() =>
|
||||||
|
navigateToMusicDetails({
|
||||||
|
projectId: p.id,
|
||||||
|
songUrl: p?.songUrl,
|
||||||
|
})
|
||||||
|
}
|
||||||
onPressMore={(posTop) => {
|
onPressMore={(posTop) => {
|
||||||
setSelectedProjectId(p.id);
|
setSelectedProjectId(p.id);
|
||||||
setMenuPosition(posTop);
|
setMenuPosition(posTop);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { Pressable, ScrollView, Text, View } from "react-native";
|
|||||||
import { Image as ExpoImage } from "expo-image";
|
import { Image as ExpoImage } from "expo-image";
|
||||||
import { img } from "../../../assets";
|
import { img } from "../../../assets";
|
||||||
import MoreMenu from "../../../components/MoreMenu";
|
import MoreMenu from "../../../components/MoreMenu";
|
||||||
|
import useNavigateToMusicDetails from "../../../hooks/useNavigateToMusicDetails";
|
||||||
import { Routes } from "../../../navigation";
|
import { Routes } from "../../../navigation";
|
||||||
import { navigate } from "../../../navigation/NavigationService";
|
import { navigate } from "../../../navigation/NavigationService";
|
||||||
import { Palette, Style } from "../../../styles";
|
import { Palette, Style } from "../../../styles";
|
||||||
@@ -42,9 +43,17 @@ const SearchResultsList = ({
|
|||||||
const [showMenu, setShowMenu] = useState(false);
|
const [showMenu, setShowMenu] = useState(false);
|
||||||
const [selectedProjectId, setSelectedProjectId] = useState(null);
|
const [selectedProjectId, setSelectedProjectId] = useState(null);
|
||||||
|
|
||||||
const handleProjectPress = (projectId) => {
|
const navigateToMusicDetails = useNavigateToMusicDetails();
|
||||||
navigate(Routes.MusicDetails, { projectId });
|
|
||||||
onResultSelected?.();
|
const handleProjectPress = (project) => {
|
||||||
|
const didNavigate = navigateToMusicDetails({
|
||||||
|
projectId: project?.id,
|
||||||
|
songUrl: project?.songUrl,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (didNavigate) {
|
||||||
|
onResultSelected?.();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleProfilePress = (userId) => {
|
const handleProfilePress = (userId) => {
|
||||||
@@ -87,7 +96,7 @@ const SearchResultsList = ({
|
|||||||
imageUri={project?.coverUrl || null}
|
imageUri={project?.coverUrl || null}
|
||||||
projectId={project?.id}
|
projectId={project?.id}
|
||||||
likedBy={project?.likedBy || []}
|
likedBy={project?.likedBy || []}
|
||||||
onPress={() => handleProjectPress(project.id)}
|
onPress={() => handleProjectPress(project)}
|
||||||
onPressMore={(positionTop) => {
|
onPressMore={(positionTop) => {
|
||||||
setSelectedProjectId(project.id);
|
setSelectedProjectId(project.id);
|
||||||
setMenuPosition(positionTop);
|
setMenuPosition(positionTop);
|
||||||
@@ -138,7 +147,7 @@ const SearchResultsList = ({
|
|||||||
imageUri={project?.coverUrl || null}
|
imageUri={project?.coverUrl || null}
|
||||||
projectId={project?.id}
|
projectId={project?.id}
|
||||||
likedBy={project?.likedBy || []}
|
likedBy={project?.likedBy || []}
|
||||||
onPress={() => handleProjectPress(project.id)}
|
onPress={() => handleProjectPress(project)}
|
||||||
onPressMore={(positionTop) => {
|
onPressMore={(positionTop) => {
|
||||||
setSelectedProjectId(project.id);
|
setSelectedProjectId(project.id);
|
||||||
setMenuPosition(positionTop);
|
setMenuPosition(positionTop);
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import PressableScale from "../../components/PressableScale";
|
|||||||
import { projectsRef, usersRef } from "../../config/firebase";
|
import { projectsRef, usersRef } from "../../config/firebase";
|
||||||
import useDataFromRef from "../../hooks/useDataFromRef";
|
import useDataFromRef from "../../hooks/useDataFromRef";
|
||||||
import useLayoutType from "../../hooks/useLayoutType";
|
import useLayoutType from "../../hooks/useLayoutType";
|
||||||
|
import useNavigateToMusicDetails from "../../hooks/useNavigateToMusicDetails";
|
||||||
import Page from "../../layouts/Page";
|
import Page from "../../layouts/Page";
|
||||||
import { Routes } from "../../navigation";
|
import { Routes } from "../../navigation";
|
||||||
import { navigate, push } from "../../navigation/NavigationService";
|
import { navigate, push } from "../../navigation/NavigationService";
|
||||||
@@ -53,6 +54,7 @@ const Profile = () => {
|
|||||||
const [menuPosition, setMenuPosition] = useState(null);
|
const [menuPosition, setMenuPosition] = useState(null);
|
||||||
const [showMenu, setShowMenu] = useState(false);
|
const [showMenu, setShowMenu] = useState(false);
|
||||||
const [selectedProjectId, setSelectedProjectId] = useState(null);
|
const [selectedProjectId, setSelectedProjectId] = useState(null);
|
||||||
|
const navigateToMusicDetails = useNavigateToMusicDetails();
|
||||||
const onPressMenu = (item) => {
|
const onPressMenu = (item) => {
|
||||||
setSelected(item);
|
setSelected(item);
|
||||||
};
|
};
|
||||||
@@ -134,7 +136,10 @@ const Profile = () => {
|
|||||||
projectId={item?.id}
|
projectId={item?.id}
|
||||||
likedBy={item?.likedBy || []}
|
likedBy={item?.likedBy || []}
|
||||||
onPress={() =>
|
onPress={() =>
|
||||||
navigate(Routes.MusicDetails, { projectId: item.id })
|
navigateToMusicDetails({
|
||||||
|
projectId: item.id,
|
||||||
|
songUrl: item?.songUrl,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
onPressMore={(posTop) => {
|
onPressMore={(posTop) => {
|
||||||
setSelectedProjectId(item.id);
|
setSelectedProjectId(item.id);
|
||||||
|
|||||||
Reference in New Issue
Block a user