This repository has been archived by the owner on Apr 5, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
13 changed files
with
199 additions
and
80 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
# Contributing to forte-music/web | ||
|
||
Thanks for taking the time to contribute to forte. Here are some guidelines to follow when contributing. | ||
|
||
Some of the code in this project hasn't been refactored to follow these guidelines yet. | ||
|
||
## CSS | ||
|
||
For the most part, CSS is written using [styled-components]. Currently, they are scattered near the presentational components they are used in, in `src/components/styled` and in `src/components`. Going forward, mixins should be placed in `src/styled-mixins`, shared styled components in `src/components/styled`, and unshared styled components, near where they are used. | ||
|
||
Avoid using theming unless needed. It adds un-needed complexity for most use cases. If you are using the same component with slightly different styles in two different places, then use themeing. | ||
|
||
## Redux | ||
The [render-props] pattern is used to decouple data providing components with components consuming data. We use a wrapper around `connect` (a Higher Order Component from `react-redux`) to use the render props pattern with redux. This wrapper is called `createReduxComponent` and can be found in `src/redux/render.tsx`. | ||
|
||
## Component Folder Structure | ||
There are a few different types of components. | ||
|
||
* Presentational Components | ||
|
||
Stateless components which are primarily concerned with how things look. State and actions are passed as props and prop callbacks respectively. These are usually functional components. Usually placed in `src/components/`. | ||
|
||
* Enhancer Components | ||
|
||
Often handle data fetching and state storage concerns. Usually stored next to the container component they are used in (for example `src/components/AlbumsContainer/enhancers/redux.ts`). | ||
|
||
* Container Components | ||
|
||
Made up by composing many enhancers and on or more presentational components. Found in folders ending with `Container` (for example `src/components/AlbumsContainer/index.tsx`). | ||
|
||
[Here is some more information about the presentational and container component pattern.][container-component] | ||
|
||
## Code Style | ||
|
||
[Prettier] is used to keep our code formatted consistently. Run `yarn fix-style` to reformat code to follow adhere to Prettier's style. Run `yarn check-style` to see which files don't adhere to Prettier's style. | ||
|
||
## Storybook | ||
|
||
[Storybook] is used for testing react components outside of the complete application. Run `yarn storybook` to start it with mock data. Files ending with `.stories.tsx` are picked up storybook. A test ensures that all stories render without crashing. | ||
|
||
## Tests | ||
|
||
Tests are run using [Jest]. Run `yarn test` to start jest. Tests should placed in files ending with `.test.ts` or `.test.tsx`. | ||
|
||
## Lints | ||
|
||
[TSLint] is used for linting code. Run `yarn tslint` to run tslint on this project. | ||
|
||
## CircleCI Build | ||
|
||
CircleCI does a number of [tasks] after your code is pushed. Make sure your code passes before submitting a PR. Many of the same tests run in CircleCI can be run with `yarn check-all`. | ||
|
||
## Contributor Agreement | ||
|
||
By contributing code to our project in any form, including sending a pull request via Github, a code fragment or patch via private email or public discussion groups, you agree to release your code under the terms of the license that you can find in the LICENSE.md file included in the forte-music/web source distribution. | ||
|
||
[jest]: https://jestjs.io/ | ||
[prettier]: https://prettier.io/ | ||
[storybook]: https://storybook.js.org/ | ||
[tslint]: https://palantir.github.io/tslint/ | ||
[tasks]: ./.circleci/config.yml | ||
[styled-components]: https://www.styled-components.com/ | ||
[render-props]: https://reactjs.org/docs/render-props.html | ||
[container-component]: https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,22 +4,44 @@ | |
|
||
[Check out the demo site!][demo-site] | ||
|
||
Forte Music's web client. It's built using React and TypeScript. | ||
## Quickstart | ||
|
||
# Development | ||
yarn query-codegen && yarn start-mock | ||
|
||
git clone [email protected]:forte-music/web.git | ||
yarn | ||
yarn start-mock | ||
## Build Configuration | ||
|
||
This will run the web interface against an embedded mock graphql source. | ||
This project was bootstrapped with [create-react-app]. We've since ejected, but still use many of its features. | ||
|
||
## Generated Files | ||
|
||
[GraphQL] is used to talk to the backend. Given a schema and a graphql request string, we can compute the response type and provide it to typescript so typechecking code around API calls works. | ||
|
||
To generate typing information for responses which typescript understands, use `yarn query-codegen`. Re-run this command every time a query or the schema changes and after pulling new versions from the remote. These files are stored in a sibling folder named `__generated__` to the file the query is defined in. The files in `__generated__` are ignored by git. | ||
|
||
The `query-codegen` script is run before the `build` and `check-all` scripts. | ||
|
||
## Mock Backend | ||
|
||
A few things change when the application is run in an environment with the `REACT_APP_MOCK_RESOLVER` variable set to a truthy value. | ||
|
||
First, a mock [GraphQL] resolver is used instead of a resolver which queries a remote endpoint. The graphql resolver is provided by the [`@forte-music/mock`][forte-music/mock] npm package with data from the [`@forte-music/schema`][forte-music/schema] npm package. [The mock data can be found in the toml files here.][mock] | ||
|
||
Second, instead of fetching audio files from the remote server, a fixed set of audio files is used instead. Each song in the mock data maps to an audio file based on the identifier of the mock song's identifier. Multiple songs may share the same underlying audio file. | ||
|
||
These features allow developing the frontend independently of the backend. | ||
|
||
The `start-mock` and `storybook` scripts enable mock behavior for their corresponding actions. | ||
|
||
## External Server | ||
|
||
To use an external graphql resolver, run `yarn start` instead of `yarn start-mock` and configure the | ||
[Create React App Proxy][proxy-guide] to proxy requests to your server. | ||
To use an external graphql resolver, run `yarn start` instead of `yarn start-mock` and configure the [Create React App Proxy][proxy-guide] to proxy requests to your server. | ||
|
||
[graphql]: https://graphql.org/ | ||
[demo-site]: https://forte.surge.sh/ | ||
[proxy-guide]: https://github.com/facebook/create-react-app/blob/cb1608b3e02e0eef5fd350f6e4cf5ce32bdfc215/packages/react-scripts/template/README.md#proxying-api-requests-in-development | ||
[build-status-image]: https://img.shields.io/circleci/project/github/forte-music/web/master.svg | ||
[build-status]: https://circleci.com/gh/forte-music/web | ||
[forte-music/mock]: https://github.com/forte-music/schema/tree/master/packages/mock | ||
[forte-music/schema]: https://github.com/forte-music/schema/tree/master/packages/schema | ||
[mock]: https://github.com/forte-music/schema/tree/master/packages/schema/fixtures | ||
[create-react-app]: https://github.com/facebook/create-react-app |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
import React from 'react'; | ||
|
||
import { | ||
Album as AlbumInfoAlbum, | ||
AlbumInfo, | ||
} from './AlbumsContainer/components/AlbumInfo'; | ||
|
||
interface Props { | ||
albums: AlbumInfoAlbum[]; | ||
} | ||
|
||
export const AlbumGrid = (props: Props) => ( | ||
<React.Fragment> | ||
{props.albums.map(album => <AlbumInfo key={album.id} album={album} />)} | ||
</React.Fragment> | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
import React from 'react'; | ||
import Observer from 'react-intersection-observer'; | ||
|
||
interface Props { | ||
// Called when the component comes into view. | ||
onView: () => void; | ||
} | ||
|
||
// Calls a method on props when enters view. Often used to implement | ||
// infinite scrolling. | ||
export const OnEnterView = (props: Props) => ( | ||
<Observer | ||
onChange={inView => { | ||
if (!inView) { | ||
return; | ||
} | ||
|
||
props.onView(); | ||
}} | ||
> | ||
<div /> | ||
</Observer> | ||
); |
7 changes: 2 additions & 5 deletions
7
src/components/styled/ArtworkGridContents.ts → src/components/styled/artworkGrid.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,12 +1,9 @@ | ||
import { StyledComponentClass } from 'styled-components'; | ||
import { Theme } from '../../theme'; | ||
import { Contents } from './Contents'; | ||
import styled from '../../styled-components'; | ||
import { artworkGrid } from '../../styled-mixins/artworkGrid'; | ||
|
||
// @ts-ignore | ||
export const ArtworkGridContents: StyledComponentClass< | ||
{}, | ||
Theme | ||
> = Contents.extend` | ||
export const ArtworkGrid: StyledComponentClass<{}, Theme> = styled.div` | ||
${artworkGrid}; | ||
`; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters