GithubHelp home page GithubHelp logo

dalerasrorov / componofy Goto Github PK

View Code? Open in Web Editor NEW
18.0 5.0 1.0 6.08 MB

A web app that allows Spotify users combine personal and public playlists together to either create a new one or merge selected playlist songs with an existing playlist. Also, you can reorder your personal playlist tracks with drag and drop and update playlist cover images..

Home Page: https://componofy.herokuapp.com/

License: Apache License 2.0

HTML 1.80% CSS 0.95% JavaScript 95.87% Dockerfile 0.10% Makefile 0.18% SCSS 1.10%
react spotify spotify-playlist nodejs spotify-api javascript redux hapijs

componofy's Introduction

Hi there ๐Ÿ‘‹

  • ๐Ÿ”ญ Iโ€™m currently working on NGC
  • ๐ŸŒฑ Iโ€™m currently learning Next.js
  • ๐Ÿค” Iโ€™m looking for help with data vis and javascript

DalerAsrorov

componofy's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

Forkers

fahd-chaudhry

componofy's Issues

Organize actions

Organize their actions into their own files just like reducers.

Set "load more" button to loading state on playlists fetch

To make sure that the user doesn't click "Load more" multiple times and causes multiple requests, we would need to set the status of the button to disabled when the redux store property of public playlists reducer is set to true.

isFetching == true ? disableLoadMore : enableLoadMore

Create shareable Form component

Create a shareable Form component that can be used for merging playlists with an existing playlist or merging playlists into a new one.

Fix proptype bug

PropType bug:
bundle.js:141887 Warning: Failed prop type: The prop `myPlaylists.playlists[15].images[0].height` is marked as required in `MyPlaylists`, but its value is `null`. in MyPlaylists (created by withStyles(MyPlaylists)) in withStyles(MyPlaylists) (created by Route) in Route (created by withRouter(withStyles(MyPlaylists))) in withRouter(withStyles(MyPlaylists)) (created by Connect(withRouter(withStyles(MyPlaylists)))) in Connect(withRouter(withStyles(MyPlaylists))) (created by Route) in Route (at index.js:37) in div (created by Grid) in Grid (created by GridWrapper) in GridWrapper (created by withStyles(GridWrapper)) in withStyles(GridWrapper) (at index.js:36) in div (created by Grid) in Grid (created by GridWrapper) in GridWrapper (created by withStyles(GridWrapper)) in withStyles(GridWrapper) (at index.js:27) in Main (created by withStyles(Main)) in withStyles(Main) (at PrivateRoute.js:25) in Route (at PrivateRoute.js:22) in PrivateRoute (created by Route) in Route (created by withRouter(PrivateRoute)) in withRouter(PrivateRoute) (created by Connect(withRouter(PrivateRoute))) in Connect(withRouter(PrivateRoute)) (at App.js:27) in Switch (at App.js:25) in MuiThemeProvider (created by MuiThemeProviderWrapper) in MuiThemeProviderWrapper (at App.js:24) in App (at index.js:40) in Router (created by ConnectedRouter) in ConnectedRouter (at index.js:39) in Provider (at index.js:38)

Create a common prop called Playlist

Create a common prop called Playlist with shape of the formatted playlist. The passed object should have a formatted shape which will be done by the util function.

Implement Track component

When a user clicks on a playlist, it should show the list of tracks that belongs to that playlist.

Track component:

  • Contains a check mark on the left
    • If checkmark is checked, the track should be added to the final list
    • If checkmark is unchecked, the track should be removed from the final list
  • Contains a ButtonContainer component to the right that
    • Contains preview button if preview_url passed from the API has a value
    • Contains view page button that points to the track's page
  • Contains an Info component on the left that shows:
    • Image (track/album/artist cover)
    • Track name
    • Artist name
    • Album name

Separate different types of reducers into their own files

Currently all reducers (2 so far) are in src/reducers/index.js file. What we need to do is to create one file for each reducer (such as user.js for the user state or myplaylists.js for user playlists state) in src/reducers directory, import them in reducers/index.js file and export it from that index file. This change should not impact the way reducers are imported from files that need any of the reducers included.

Created a redux state for application errors

  • Redux state that will contain a set of errors
  • The set of errors will be passed from the redux state to the application UI as Snackbar components.
  • Position: bottom left.
  • If there are multiple errors, follow queue data structure.

Add number of remaining playlists within in the list

In the load more button, add a small number tag (surrounded by the circle or something, maybe fab button from Material UI) that displays the number of playlists from the list of playlists has not been shown yet.

Upgrade dependencies dev and etc

The Material-UI library is currently out of date, so are other important packages. Should be upgraded and new badge that indicates that the libraries are up-to-date should be added to README.

Create Playlist component

Create Playlist component

  • Accordion-like component that contains list of Track components
  • Should have a check mark to the left.
    • If this check mark is selected, then mark all the Track components inside of it. That means that all tracks should be included in the final merged list of tracks.
  • Track component contains control such as add/remove/preview/etc.

Add ability to merge playlists into another playlist

Allow the user to choose between:

  • creating a new playlist out of the merged set of selected playlists
  • add to the existing playlist the merged playlists set of songs

The option should be given when user clicks on Componofy. Make the Componofy button accept the CustomMenu component.

Create getTrack() endpoint

Create an endpoint for a specific track for more information about it /api/track/:id. In the future, the plan is to have set of requests placed in the redux store.

Create authentication actions for Redux store

  • Create new state called isAuthenticated (type: Boolean, defaultValue: False)
  • Create new action for that state SET_AS_AUTHENTICATED that will be used in MyPlaylists component's componentDidMount lifecycle method. In this method, make an api call to /auth route in the server that returns back a status whether the user is authenticated.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.