CS4610-FinalProject / FinalProject / src / pages / Profile.tsx
Profile.tsx
Raw
import { useState, useContext, useEffect } from "react";
import { useNavigate, useParams } from "react-router-dom";
import { ApiContext } from "../contexts/api";
import { useApi } from "../hooks/useApi";
import { Header } from '../components/Header';
import { getAuth, onAuthStateChanged } from "firebase/auth";


type Post = {
    uid: string;
    spotifyData: any;
    created: string;
    location: string;
    username: string;
}

let dataRetrieved = false;

export const Profile = () => {
    const navigate = useNavigate();
    const api = useApi();
    const signInLink = api.getSpotifyLoginLink();
    const [feedItems, setFeedItems] = useState<Post[]>([]);
    const [spotifyToken, setSpotifyToken] = useState<string | null>(null);
    const [reloadFeedItems, setReloadFeedItems] = useState(false);

    const getFeed = async () => {
        const feed = await api.getOwnPosts();
        setFeedItems([...feed]);
    };

    useEffect(() => {
        setReloadFeedItems(true);
    }, []);

    useEffect(() => {
        if (reloadFeedItems) {
            getFeed();
            setReloadFeedItems(false);
        }
    }, [reloadFeedItems]);

    useEffect(() => {
        const token = api.getCurrentSpotifyToken();
        setSpotifyToken(token);
    }, [api])

    const handleSignOut = () => {
        api.signOut();
        navigate("/login");
    };

    const handleSpotifySignOut = () => {
        api.spotifyLogout();
        setSpotifyToken(null);
    }

    return (
        <div>
            <div style={{ position: "relative" }}>
                <Header title="YourJams." />
            </div>
            {spotifyToken ? (
                <div>
                    <button onClick={handleSpotifySignOut}>Disconnect Spotify</button>
                </div>
            ) : (
                <a href={signInLink}>
                    <button className="spotify-button">Sign in to Spotify</button>
                </a>
            )}

            <div style={{ marginTop: "10px" }}>
                <button onClick={handleSignOut}>Sign Out</button>
                <button onClick={() => {setReloadFeedItems(true)}}>Refresh Posts</button>
            </div>
            <div className="feed" style={{ padding: "10px" }}>
                <h2>Own Posts:</h2>
                {feedItems.map((feed) => (
                    <div key={feed.uid} className="song-item">
                        <div className="song-info">
                            <p className="feed-name">{feed.username}</p>
                            <p className="feed-location">Posted at: {feed.location}</p>
                            <div className="song-details">
                                <div className="song-image">
                                    <img src={feed.spotifyData.image} alt="" />
                                    <a className="spotify-button" href={feed.spotifyData.url}>Listen on Spotify</a>
                                </div>
                                <div className="song-data">
                                    <p className="song-title">{feed.spotifyData.name}</p>
                                    <p className="song-album">{feed.spotifyData.album}</p>
                                    <p className="song-artist">{feed.spotifyData.artist}</p>
                                    {/*<p className="song-date">{toDateTime(feed.created.seconds)}</p>*/}
                                </div>
                            </div>
                        </div>
                    </div>
                ))}
            </div>
        </div>
    );
};