diff --git a/frontend/packages/app/package.json b/frontend/packages/app/package.json index f3451760de..68e316f420 100644 --- a/frontend/packages/app/package.json +++ b/frontend/packages/app/package.json @@ -8,7 +8,6 @@ "@material-ui/icons": "^4.9.1", "@spotify-backstage/core": "1.0.0", "@spotify-backstage/plugin-home-page": "0.0.0", - "@spotify-backstage/plugin-login": "0.0.0", "@react-workspaces/react-scripts": "^3.3.0-alpha-08", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.3.2", diff --git a/frontend/packages/app/src/App.tsx b/frontend/packages/app/src/App.tsx index c699916c4c..3806f1ac96 100644 --- a/frontend/packages/app/src/App.tsx +++ b/frontend/packages/app/src/App.tsx @@ -1,14 +1,10 @@ -import { BackstageTheme, createApp, InfoCard } from '@spotify-backstage/core'; -//import PageHeader from './components/PageHeader'; -import { LoginComponent } from '@spotify-backstage/plugin-login'; +import { BackstageTheme, createApp } from '@spotify-backstage/core'; import { CssBaseline, makeStyles, ThemeProvider } from '@material-ui/core'; import React, { FC } from 'react'; import { BrowserRouter as Router } from 'react-router-dom'; import * as plugins from './plugins'; import SideBar from './components/SideBar'; import entities from './entities'; -import { LoginBarrier } from './login/LoginBarrier'; -import { MockCurrentUser } from './login/MockCurrentUser'; const useStyles = makeStyles(theme => ({ '@global': { @@ -36,16 +32,6 @@ const useStyles = makeStyles(theme => ({ }, })); -const currentUser = new MockCurrentUser(); - -const Login: FC<{}> = () => { - return ( - - currentUser.login(username)} /> - - ); -}; - const AppShell: FC<{}> = ({ children }) => { const classes = useStyles(); @@ -69,11 +55,9 @@ const App: FC<{}> = () => { - - - - - + + + diff --git a/frontend/packages/app/src/login/LoginBarrier.test.tsx b/frontend/packages/app/src/login/LoginBarrier.test.tsx deleted file mode 100644 index 14389cea43..0000000000 --- a/frontend/packages/app/src/login/LoginBarrier.test.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { render, wait, act } from '@testing-library/react'; -import React from 'react'; -import Observable from 'zen-observable'; -import { LoginBarrier } from './LoginBarrier'; -import { LoginState } from './types'; - -describe('LoginBarrier', () => { - it('passes through when logged in', async () => { - const state$ = Observable.of({ - type: 'LOGGED_IN', - user: 'apa', - }); - const rendered = render( -
{state.type}
} - > - Logged in! -
, - ); - await wait(() => rendered.getByText('Logged in!')); - }); - - it('goes to fallback when not logged in', async () => { - const state$ = Observable.of({ type: 'LOGGED_OUT' }); - const rendered = render( -
{state.type}
} - > - Logged in! -
, - ); - await wait(() => rendered.getByText('LOGGED_OUT')); - }); - - it('transitions between states', async () => { - let subscriber: ZenObservable.SubscriptionObserver | undefined; - const state$ = new Observable(s => { - subscriber = s; - }); - - const rendered = render( -
{state.type}
} - > - Logged in! -
, - ); - - await wait(() => rendered.getByText('LOGGED_OUT')); - // @ts-ignore: Object is possibly 'undefined' - act(() => subscriber.next({ type: 'LOGGED_IN', user: 'apa' })); - await wait(() => rendered.getByText('Logged in!')); - }); -}); diff --git a/frontend/packages/app/src/login/LoginBarrier.tsx b/frontend/packages/app/src/login/LoginBarrier.tsx deleted file mode 100644 index 56caf04bb8..0000000000 --- a/frontend/packages/app/src/login/LoginBarrier.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React, { FC } from 'react'; -import Observable from 'zen-observable'; -import { useObservable } from 'react-use'; -import { LoginState } from './types'; - -type LoginBarrierProps = { - fallback: React.ComponentType<{ state: LoginState }>; - state$: Observable; -}; - -export const LoginBarrier: FC = ({ - fallback: Fallback, - state$, - children, -}) => { - const state = useObservable(state$, { type: 'LOGGED_OUT' }); - if (state.type === 'LOGGED_IN') { - return <>{children}; - } else { - return ; - } -}; diff --git a/frontend/packages/app/src/login/MockCurrentUser.test.ts b/frontend/packages/app/src/login/MockCurrentUser.test.ts deleted file mode 100644 index 598c5e53ba..0000000000 --- a/frontend/packages/app/src/login/MockCurrentUser.test.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { MockCurrentUser } from './MockCurrentUser'; -import { wait } from '@testing-library/react'; - -describe('MockCurrentUser', () => { - it('notifies immediately on subscribe', async () => { - const next = jest.fn(); - const current = new MockCurrentUser(); - current.state.subscribe(next); - await wait(); - expect(next).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ type: 'LOGGED_OUT' }), - ); - }); - - it('logs in and out', async () => { - const next = jest.fn(); - const current = new MockCurrentUser(); - current.state.subscribe(next); - await wait(); - expect(next).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ type: 'LOGGED_OUT' }), - ); - current.login('apa'); - await wait(); - expect(next).toHaveBeenNthCalledWith( - 2, - expect.objectContaining({ type: 'LOGGED_IN', user: 'apa' }), - ); - current.logout(); - await wait(); - expect(next).toHaveBeenNthCalledWith( - 3, - expect.objectContaining({ type: 'LOGGED_OUT' }), - ); - }); -}); diff --git a/frontend/packages/app/src/login/MockCurrentUser.ts b/frontend/packages/app/src/login/MockCurrentUser.ts deleted file mode 100644 index 0b90e25fab..0000000000 --- a/frontend/packages/app/src/login/MockCurrentUser.ts +++ /dev/null @@ -1,67 +0,0 @@ -import Observable from 'zen-observable'; -import { LoginState } from './types'; - -const LOCAL_STORAGE_KEY = 'mock_current_user'; - -export class MockCurrentUser { - private listeners: ZenObservable.SubscriptionObserver[]; - private currentUser: string | undefined; - - constructor() { - this.listeners = []; - this.currentUser = undefined; - this.loadPrevious(); - } - - login(user: string) { - this.currentUser = user; - this.saveCurrent(); - this.notify(); - } - - logout() { - this.currentUser = undefined; - this.saveCurrent(); - this.notify(); - } - - get state(): Observable { - return new Observable(subscriber => { - this.listeners.push(subscriber); - subscriber.next(this.getState()); - return () => { - this.listeners = this.listeners.filter(x => x !== subscriber); - }; - }); - } - - private loadPrevious() { - const user = localStorage.getItem(LOCAL_STORAGE_KEY); - if (user) { - try { - this.currentUser = JSON.parse(user); - } catch (e) { - localStorage.removeItem(LOCAL_STORAGE_KEY); - } - } - } - - private saveCurrent() { - if (!this.currentUser) { - localStorage.removeItem(LOCAL_STORAGE_KEY); - } else { - localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(this.currentUser)); - } - } - - private notify() { - const state = this.getState(); - this.listeners.forEach(listener => listener.next(state)); - } - - private getState(): LoginState { - return this.currentUser - ? { type: 'LOGGED_IN', user: this.currentUser } - : { type: 'LOGGED_OUT' }; - } -} diff --git a/frontend/packages/app/src/login/types.ts b/frontend/packages/app/src/login/types.ts deleted file mode 100644 index 9a341917ad..0000000000 --- a/frontend/packages/app/src/login/types.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type LoggedOutState = { type: 'LOGGED_OUT' }; -export type LoggingInState = { type: 'LOGGING_IN' }; -export type LoggedInState = { type: 'LOGGED_IN'; user: string }; -export type LoggingOutState = { type: 'LOGGING_OUT' }; -export type LoginFailedState = { type: 'LOGIN_FAILED'; error: Error }; -export type LoginState = - | LoggedOutState - | LoggingInState - | LoggedInState - | LoggingOutState - | LoginFailedState; diff --git a/frontend/packages/plugins/login/README.md b/frontend/packages/plugins/login/README.md deleted file mode 100644 index 9308111c21..0000000000 --- a/frontend/packages/plugins/login/README.md +++ /dev/null @@ -1 +0,0 @@ -Welcome to your login-page plugin! diff --git a/frontend/packages/plugins/login/jest.config.js b/frontend/packages/plugins/login/jest.config.js deleted file mode 100644 index 6b28dacb3d..0000000000 --- a/frontend/packages/plugins/login/jest.config.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - ...require('@spotify/web-scripts/config/jest.config.js'), - setupFilesAfterEnv: ['../jest.setup.ts'], -}; diff --git a/frontend/packages/plugins/login/jest.setup.ts b/frontend/packages/plugins/login/jest.setup.ts deleted file mode 100644 index 666127af39..0000000000 --- a/frontend/packages/plugins/login/jest.setup.ts +++ /dev/null @@ -1 +0,0 @@ -import '@testing-library/jest-dom/extend-expect'; diff --git a/frontend/packages/plugins/login/package.json b/frontend/packages/plugins/login/package.json deleted file mode 100644 index 4237de820a..0000000000 --- a/frontend/packages/plugins/login/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "@spotify-backstage/plugin-login", - "version": "0.0.0", - "main": "dist/cjs", - "devDependencies": { - "@spotify-backstage/cli": "^1.2.0", - "@spotify-backstage/core": "1.0.0", - "@spotify/web-scripts": "^6.0.0", - "@testing-library/jest-dom": "^4.2.4", - "@testing-library/react": "^9.3.2", - "@testing-library/user-event": "^7.1.2", - "@types/jest": "^24.0.0", - "@types/node": "^12.0.0", - "@types/react": "^16.9.0", - "@types/react-dom": "^16.9.0", - "react": "^16.12.0", - "react-dom": "^16.12.0", - "@material-ui/core": "^4.9.1", - "@material-ui/icons": "^4.9.1" - }, - "scripts": { - "build": "tsc --outDir dist/cjs --noEmit false --module CommonJS", - "lint": "web-scripts lint", - "test": "web-scripts test" - }, - "license": "Apache-2.0" -} diff --git a/frontend/packages/plugins/login/src/components/LoginComponent/LoginComponent.test.tsx b/frontend/packages/plugins/login/src/components/LoginComponent/LoginComponent.test.tsx deleted file mode 100644 index 52e3341d6c..0000000000 --- a/frontend/packages/plugins/login/src/components/LoginComponent/LoginComponent.test.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; -import { render } from '@testing-library/react'; -import LoginComponent from './LoginComponent'; - -describe('LoginComponent', () => { - it('should render', () => { - const onLogin = jest.fn(); - const rendered = render(); - expect(rendered.getByText('Login')).toBeInTheDocument(); - }); -}); diff --git a/frontend/packages/plugins/login/src/components/LoginComponent/LoginComponent.tsx b/frontend/packages/plugins/login/src/components/LoginComponent/LoginComponent.tsx deleted file mode 100644 index bc84e8a2f0..0000000000 --- a/frontend/packages/plugins/login/src/components/LoginComponent/LoginComponent.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import React, { FC, useState } from 'react'; -import Button from '@material-ui/core/Button'; -import TextField from '@material-ui/core/TextField'; -import Grid from '@material-ui/core/Grid'; -import { Typography } from '@material-ui/core'; - -type Props = { - onLogin: (username: string) => Promise | void; -}; - -const LoginComponent: FC = ({ onLogin }) => { - const [error, setError] = useState(''); - const [username, setUsername] = useState(''); - - const onUsernameChanged = async (e: React.ChangeEvent) => { - setUsername(e.target.value); - }; - - const onSubmit = async () => { - if (!username) { - setError('You have to supply a username'); - } - - setError(''); - try { - await onLogin(username); - } catch (e) { - setError(`Login failed: ${e.message}`); - } - }; - - return ( -
- - - - - - - - - {error || 'Use your github username'} -
- ); -}; - -export default LoginComponent; diff --git a/frontend/packages/plugins/login/src/components/LoginComponent/index.ts b/frontend/packages/plugins/login/src/components/LoginComponent/index.ts deleted file mode 100644 index e20ece5b56..0000000000 --- a/frontend/packages/plugins/login/src/components/LoginComponent/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './LoginComponent'; diff --git a/frontend/packages/plugins/login/src/index.ts b/frontend/packages/plugins/login/src/index.ts deleted file mode 100644 index e7201a30d2..0000000000 --- a/frontend/packages/plugins/login/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default } from './plugin'; -export { default as LoginComponent } from './components/LoginComponent'; diff --git a/frontend/packages/plugins/login/src/plugin.test.ts b/frontend/packages/plugins/login/src/plugin.test.ts deleted file mode 100644 index eea19442ce..0000000000 --- a/frontend/packages/plugins/login/src/plugin.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import plugin from './plugin'; - -describe('login', () => { - it('should export plugin', () => { - expect(plugin).toBeDefined(); - }); -}); diff --git a/frontend/packages/plugins/login/src/plugin.ts b/frontend/packages/plugins/login/src/plugin.ts deleted file mode 100644 index 5edeb2779d..0000000000 --- a/frontend/packages/plugins/login/src/plugin.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createPlugin } from '@spotify-backstage/core'; - -export default createPlugin({ - id: 'login', -}); diff --git a/frontend/packages/plugins/login/tsconfig.json b/frontend/packages/plugins/login/tsconfig.json deleted file mode 100644 index 9b376c2b1d..0000000000 --- a/frontend/packages/plugins/login/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "include": ["src"] -} diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 7ffa0e7b7d..f34beec44c 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2308,17 +2308,6 @@ dependencies: "@babel/runtime" "^7.4.4" -"@material-ui/lab@4.0.0-alpha.45": - version "4.0.0-alpha.45" - resolved "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.45.tgz#6e1abbdd6e44b9ef7b3eff8ef892a3da5dc52f10" - integrity sha512-zT6kUU87SHsPukiu3tlWg8V6o0tGS38c1b/xst/kPqX6eLbfqrROyxhHn1A8ZtHmqga1AKQdv/1llQoG80Afww== - dependencies: - "@babel/runtime" "^7.4.4" - "@material-ui/utils" "^4.7.1" - clsx "^1.0.4" - prop-types "^15.7.2" - react-is "^16.8.0" - "@material-ui/styles@^4.9.0": version "4.9.0" resolved "https://registry.npmjs.org/@material-ui/styles/-/styles-4.9.0.tgz#10c31859f6868cfa9d3adf6b6c3e32c9d676bc76" @@ -5068,7 +5057,7 @@ clone@^1.0.2: resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -clsx@^1.0.2, clsx@^1.0.4: +clsx@^1.0.2: version "1.1.0" resolved "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz#62937c6adfea771247c34b54d320fb99624f5702" integrity sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==