UPDATE: Enhance stream start time;
PATCH: Remove placeholder video; FIX: Correct focused-input behaviour; PATCH: Remove debounce function from searchbar;
This commit is contained in:
Binary file not shown.
@@ -27,7 +27,7 @@ const Input: React.FC<InputProps> = ({
|
|||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
onKeyDown={onKeyDown}
|
onKeyDown={onKeyDown}
|
||||||
{...props}
|
{...props}
|
||||||
className={`${extraClasses} relative p-2 rounded-[1rem] w-[20vw] focus:w-[21vw] bg-black/40 border border-gray-300 focus:border-purple-500 focus:outline-purple-500 text-center text-white text-xl transition-all`}
|
className={`${extraClasses} relative p-2 rounded-[1rem] w-[20vw] focus:w-[22vw] bg-black/40 border border-gray-300 focus:border-purple-500 focus:outline-purple-500 text-center text-white text-xl transition-all`}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -8,18 +8,6 @@ const SearchBar: React.FC = () => {
|
|||||||
//const [debouncedQuery, setDebouncedQuery] = useState(searchQuery);
|
//const [debouncedQuery, setDebouncedQuery] = useState(searchQuery);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
// Debounce the search query
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
useEffect(() => {
|
|
||||||
const timer = setTimeout(() => {
|
|
||||||
setDebouncedQuery(searchQuery);
|
|
||||||
}, 500); // Wait 500ms after user stops typing
|
|
||||||
|
|
||||||
return () => clearTimeout(timer);
|
|
||||||
}, [searchQuery]); */
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleSearch = async () => {
|
const handleSearch = async () => {
|
||||||
if (!searchQuery.trim()) return;
|
if (!searchQuery.trim()) return;
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ const VideoPage: React.FC<VideoPageProps> = ({ streamerId }) => {
|
|||||||
const showReturn = window.location.search.includes("session_id");
|
const showReturn = window.location.search.includes("session_id");
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const [isSubscribed, setIsSubscribed] = useState(false);
|
const [isSubscribed, setIsSubscribed] = useState(false);
|
||||||
|
const [timeStarted, setTimeStarted] = useState("");
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// Prevent scrolling when checkout is open
|
// Prevent scrolling when checkout is open
|
||||||
@@ -60,7 +61,6 @@ const VideoPage: React.FC<VideoPageProps> = ({ streamerId }) => {
|
|||||||
res
|
res
|
||||||
.json()
|
.json()
|
||||||
.then((data) => {
|
.then((data) => {
|
||||||
// Transform snake_case to camelCase
|
|
||||||
const transformedData: StreamDataProps = {
|
const transformedData: StreamDataProps = {
|
||||||
streamerName: data.username,
|
streamerName: data.username,
|
||||||
streamTitle: data.title,
|
streamTitle: data.title,
|
||||||
@@ -69,6 +69,20 @@ const VideoPage: React.FC<VideoPageProps> = ({ streamerId }) => {
|
|||||||
};
|
};
|
||||||
setStreamData(transformedData);
|
setStreamData(transformedData);
|
||||||
|
|
||||||
|
const time = Math.floor(
|
||||||
|
(Date.now() - new Date(data.start_time).getTime()) / 60000 // Convert to minutes
|
||||||
|
);
|
||||||
|
|
||||||
|
if (time < 60) setTimeStarted(`${time}m ago`);
|
||||||
|
else if (time < 1440)
|
||||||
|
setTimeStarted(`${Math.floor(time / 60)}h ${time % 60}m ago`);
|
||||||
|
else
|
||||||
|
setTimeStarted(
|
||||||
|
`${Math.floor(time / 1440)}d ${Math.floor((time % 1440) / 60)}h ${
|
||||||
|
time % 60
|
||||||
|
}m ago`
|
||||||
|
);
|
||||||
|
|
||||||
// Check if the logged-in user is following this streamer
|
// Check if the logged-in user is following this streamer
|
||||||
if (isLoggedIn) checkFollowStatus(data.username);
|
if (isLoggedIn) checkFollowStatus(data.username);
|
||||||
})
|
})
|
||||||
@@ -100,14 +114,14 @@ const VideoPage: React.FC<VideoPageProps> = ({ streamerId }) => {
|
|||||||
// Checks if user is subscribed
|
// Checks if user is subscribed
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetch(`/api/user/subscription/${streamerName}/expiration`)
|
fetch(`/api/user/subscription/${streamerName}/expiration`)
|
||||||
.then(response => response.json())
|
.then((response) => response.json())
|
||||||
.then(data => {
|
.then((data) => {
|
||||||
console.log(data.remaining_time);
|
console.log(streamData?.streamerName, data.remaining_time);
|
||||||
if (data.remaining_time > 0) {
|
if (data.remaining_time > 0) {
|
||||||
setIsSubscribed(true);
|
setIsSubscribed(true);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(error => console.error("Error fetching subscription:", error));
|
.catch((error) => console.error("Error fetching subscription:", error));
|
||||||
}, [streamerName]);
|
}, [streamerName]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -214,12 +228,7 @@ const VideoPage: React.FC<VideoPageProps> = ({ streamerId }) => {
|
|||||||
<div className="flex flex-col items-center">
|
<div className="flex flex-col items-center">
|
||||||
<span className="text-gray-400 text-[0.75em]">Started</span>
|
<span className="text-gray-400 text-[0.75em]">Started</span>
|
||||||
<span className="text-[0.75em]">
|
<span className="text-[0.75em]">
|
||||||
{streamData
|
{streamData ? timeStarted : "Loading..."}
|
||||||
? `${Math.floor(
|
|
||||||
(Date.now() - new Date(streamData.startTime).getTime()) /
|
|
||||||
3600000
|
|
||||||
)} hours ago`
|
|
||||||
: "Loading..."}
|
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user