From 92471bf44a15df2d60e01db8bc254bdfb6890c7b Mon Sep 17 00:00:00 2001 From: Adam Setch Date: Tue, 21 May 2024 09:36:58 -1000 Subject: [PATCH] refactor(auth): update ux and terminology (#1122) --- src/app.tsx | 11 +- src/components/fields/Button.tsx | 19 +- .../fields/__snapshots__/Button.test.tsx.snap | 8 +- src/routes/Login.test.tsx | 21 +- src/routes/Login.tsx | 55 ++-- ...se.test.tsx => LoginWithOAuthApp.test.tsx} | 20 +- ...inEnterprise.tsx => LoginWithOAuthApp.tsx} | 74 +++-- ... => LoginWithPersonalAccessToken.test.tsx} | 23 +- ...n.tsx => LoginWithPersonalAccessToken.tsx} | 69 +++-- src/routes/Settings.test.tsx | 6 +- src/routes/Settings.tsx | 13 +- src/routes/__snapshots__/Login.test.tsx.snap | 63 ++++- .../LoginEnterprise.test.tsx.snap | 243 ----------------- .../LoginWithOAuthApp.test.tsx.snap | 254 ++++++++++++++++++ ...oginWithPersonalAccessToken.test.tsx.snap} | 165 ++++++------ .../__snapshots__/Settings.test.tsx.snap | 4 +- 16 files changed, 565 insertions(+), 483 deletions(-) rename src/routes/{LoginEnterprise.test.tsx => LoginWithOAuthApp.test.tsx} (92%) rename src/routes/{LoginEnterprise.tsx => LoginWithOAuthApp.tsx} (70%) rename src/routes/{LoginWithToken.test.tsx => LoginWithPersonalAccessToken.test.tsx} (90%) rename src/routes/{LoginWithToken.tsx => LoginWithPersonalAccessToken.tsx} (76%) delete mode 100644 src/routes/__snapshots__/LoginEnterprise.test.tsx.snap create mode 100644 src/routes/__snapshots__/LoginWithOAuthApp.test.tsx.snap rename src/routes/__snapshots__/{LoginWithToken.test.tsx.snap => LoginWithPersonalAccessToken.test.tsx.snap} (53%) diff --git a/src/app.tsx b/src/app.tsx index 9ae971b14..2980aa530 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -11,8 +11,8 @@ import { Loading } from './components/Loading'; import { Sidebar } from './components/Sidebar'; import { AppContext, AppProvider } from './context/App'; import { LoginRoute } from './routes/Login'; -import { LoginEnterpriseRoute } from './routes/LoginEnterprise'; -import { LoginWithToken } from './routes/LoginWithToken'; +import { LoginWithOAuthApp } from './routes/LoginWithOAuthApp'; +import { LoginWithPersonalAccessToken } from './routes/LoginWithPersonalAccessToken'; import { NotificationsRoute } from './routes/Notifications'; import { SettingsRoute } from './routes/Settings'; @@ -51,12 +51,13 @@ export const App = () => { } /> + } /> } + path="/login-personal-access-token" + element={} /> - } /> + } /> diff --git a/src/components/fields/Button.tsx b/src/components/fields/Button.tsx index eb669725e..4b54cafb8 100644 --- a/src/components/fields/Button.tsx +++ b/src/components/fields/Button.tsx @@ -5,17 +5,18 @@ import { openExternalLink } from '../../utils/comms'; export interface IButton { name: string; label: string; + class?: string; icon?: Icon; - url?: string; size?: number; - class?: string; + url?: string; + onClick?: () => void; disabled?: boolean; type?: 'button' | 'submit'; } export const Button: FC = (props: IButton) => { const baseClass = - 'rounded bg-gray-300 font-semibold rounded text-sm text-center hover:bg-gray-500 hover:text-white dark:text-black focus:outline-none cursor-pointer'; + 'rounded bg-gray-300 font-semibold text-xs text-center hover:bg-gray-500 hover:text-white dark:text-black focus:outline-none cursor-pointer px-2 py-1'; return ( ); diff --git a/src/components/fields/__snapshots__/Button.test.tsx.snap b/src/components/fields/__snapshots__/Button.test.tsx.snap index b85c1edc7..42d15e21c 100644 --- a/src/components/fields/__snapshots__/Button.test.tsx.snap +++ b/src/components/fields/__snapshots__/Button.test.tsx.snap @@ -3,7 +3,7 @@ exports[`components/fields/Button.tsx should render with icon 1`] = ` */ + /> + */ } - - - + -

Login with GitHub Enterprise

+

+ + Login with OAuth App +

diff --git a/src/routes/LoginWithToken.test.tsx b/src/routes/LoginWithPersonalAccessToken.test.tsx similarity index 90% rename from src/routes/LoginWithToken.test.tsx rename to src/routes/LoginWithPersonalAccessToken.test.tsx index eb969083f..6c0a4eae5 100644 --- a/src/routes/LoginWithToken.test.tsx +++ b/src/routes/LoginWithPersonalAccessToken.test.tsx @@ -11,7 +11,10 @@ import { MemoryRouter } from 'react-router-dom'; import TestRenderer from 'react-test-renderer'; import { AppContext } from '../context/App'; -import { LoginWithToken, validate } from './LoginWithToken'; +import { + LoginWithPersonalAccessToken, + validate, +} from './LoginWithPersonalAccessToken'; const mockNavigate = jest.fn(); jest.mock('react-router-dom', () => ({ @@ -19,7 +22,7 @@ jest.mock('react-router-dom', () => ({ useNavigate: () => mockNavigate, })); -describe('routes/LoginWithToken.tsx', () => { +describe('routes/LoginWithPersonalAccessToken.tsx', () => { const openExternalMock = jest.spyOn(shell, 'openExternal'); const mockValidateToken = jest.fn(); @@ -33,7 +36,7 @@ describe('routes/LoginWithToken.tsx', () => { it('renders correctly', () => { const tree = TestRenderer.create( - + , ); @@ -43,7 +46,7 @@ describe('routes/LoginWithToken.tsx', () => { it('let us go back', () => { render( - + , ); @@ -77,7 +80,7 @@ describe('routes/LoginWithToken.tsx', () => { render( - + , ); @@ -95,7 +98,7 @@ describe('routes/LoginWithToken.tsx', () => { render( - + , ); @@ -112,7 +115,7 @@ describe('routes/LoginWithToken.tsx', () => { render( - + , ); @@ -138,7 +141,7 @@ describe('routes/LoginWithToken.tsx', () => { render( - + , ); @@ -162,7 +165,7 @@ describe('routes/LoginWithToken.tsx', () => { it('should render the form with errors', () => { render( - + , ); @@ -183,7 +186,7 @@ describe('routes/LoginWithToken.tsx', () => { render( - + , ); diff --git a/src/routes/LoginWithToken.tsx b/src/routes/LoginWithPersonalAccessToken.tsx similarity index 76% rename from src/routes/LoginWithToken.tsx rename to src/routes/LoginWithPersonalAccessToken.tsx index 919706d54..5fc1b6ac9 100644 --- a/src/routes/LoginWithToken.tsx +++ b/src/routes/LoginWithPersonalAccessToken.tsx @@ -29,11 +29,6 @@ interface IFormErrors { export const validate = (values: IValues): IFormErrors => { const errors: IFormErrors = {}; - if (!values.token) { - errors.token = 'Required'; - } else if (!/^[A-Z0-9_]{40}$/i.test(values.token)) { - errors.token = 'Invalid token.'; - } if (!values.hostname) { errors.hostname = 'Required'; @@ -45,10 +40,16 @@ export const validate = (values: IValues): IFormErrors => { errors.hostname = 'Invalid hostname.'; } + if (!values.token) { + errors.token = 'Required'; + } else if (!/^[A-Z0-9_]{40}$/i.test(values.token)) { + errors.token = 'Invalid token.'; + } + return errors; }; -export const LoginWithToken: FC = () => { +export const LoginWithPersonalAccessToken: FC = () => { const { validateToken } = useContext(AppContext); const navigate = useNavigate(); const [isValidToken, setIsValidToken] = useState(true); @@ -63,10 +64,8 @@ export const LoginWithToken: FC = () => { label="Hostname" placeholder="github.company.com" helpText={ -
-
- Change only if you are using GitHub Enterprise Server. -
+
+ Change only if you are using GitHub Enterprise Server.
} /> @@ -81,7 +80,6 @@ export const LoginWithToken: FC = () => {
)} -
-
-
-
-
+
+
); }; - const submit = useCallback(async (data: IValues) => { + const login = useCallback(async (data: IValues) => { setIsValidToken(true); try { await validateToken(data as AuthTokenOptions); @@ -155,7 +149,8 @@ export const LoginWithToken: FC = () => { /> -

+

+ Login with Personal Access Token

@@ -163,10 +158,10 @@ export const LoginWithToken: FC = () => {
{renderForm} diff --git a/src/routes/Settings.test.tsx b/src/routes/Settings.test.tsx index 1539de752..9f2566057 100644 --- a/src/routes/Settings.test.tsx +++ b/src/routes/Settings.test.tsx @@ -447,7 +447,7 @@ describe('routes/Settings.tsx', () => { ); }); - it('should go to the enterprise login route', async () => { + it('should go to the login with oauth app route', async () => { await act(async () => { render( { ); }); - fireEvent.click(screen.getByTitle('Login with GitHub Enterprise')); - expect(mockNavigate).toHaveBeenNthCalledWith(1, '/login-enterprise', { + fireEvent.click(screen.getByTitle('Login with OAuth App')); + expect(mockNavigate).toHaveBeenNthCalledWith(1, '/login-oauth-app', { replace: true, }); }); diff --git a/src/routes/Settings.tsx b/src/routes/Settings.tsx index c39ddfa53..910569b0b 100644 --- a/src/routes/Settings.tsx +++ b/src/routes/Settings.tsx @@ -81,8 +81,8 @@ export const SettingsRoute: FC = () => { ipcRenderer.send('app-quit'); }, []); - const goToEnterprise = useCallback(() => { - return navigate('/login-enterprise', { replace: true }); + const loginWithOAuthApp = useCallback(() => { + return navigate('/login-oauth-app', { replace: true }); }, []); const footerButtonClass = @@ -293,13 +293,10 @@ export const SettingsRoute: FC = () => {
+
+ Login with +
`; diff --git a/src/routes/__snapshots__/LoginEnterprise.test.tsx.snap b/src/routes/__snapshots__/LoginEnterprise.test.tsx.snap deleted file mode 100644 index b5a7bc654..000000000 --- a/src/routes/__snapshots__/LoginEnterprise.test.tsx.snap +++ /dev/null @@ -1,243 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`routes/LoginEnterprise.tsx renders correctly 1`] = ` -
-
- -

- Login with GitHub Enterprise -

-
-
- -
- - -
-
-
- - - then - - - generate a new client secret - - . -
-
-
-
-
- - -
-
- - -
-
-
- -
-
- -
-
- -
-
-`; diff --git a/src/routes/__snapshots__/LoginWithOAuthApp.test.tsx.snap b/src/routes/__snapshots__/LoginWithOAuthApp.test.tsx.snap new file mode 100644 index 000000000..dc9f6d4dd --- /dev/null +++ b/src/routes/__snapshots__/LoginWithOAuthApp.test.tsx.snap @@ -0,0 +1,254 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`routes/LoginWithOAuthApp.tsx renders correctly 1`] = ` +
+
+ +

+ + Login with OAuth App +

+
+
+
+
+ + +
+
+ + + on GitHub then paste your + + + client id and client secret + + below. +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+`; diff --git a/src/routes/__snapshots__/LoginWithToken.test.tsx.snap b/src/routes/__snapshots__/LoginWithPersonalAccessToken.test.tsx.snap similarity index 53% rename from src/routes/__snapshots__/LoginWithToken.test.tsx.snap rename to src/routes/__snapshots__/LoginWithPersonalAccessToken.test.tsx.snap index d92a91a2b..64ac93269 100644 --- a/src/routes/__snapshots__/LoginWithToken.test.tsx.snap +++ b/src/routes/__snapshots__/LoginWithPersonalAccessToken.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`routes/LoginWithToken.tsx renders correctly 1`] = ` +exports[`routes/LoginWithPersonalAccessToken.tsx renders correctly 1`] = `
@@ -37,8 +37,29 @@ exports[`routes/LoginWithToken.tsx renders correctly 1`] = `

+ Login with Personal Access Token

@@ -72,12 +93,10 @@ exports[`routes/LoginWithToken.tsx renders correctly 1`] = `
-
-
- Change only if you are using GitHub Enterprise Server. -
+
+ Change only if you are using GitHub Enterprise Server.
@@ -109,7 +128,7 @@ exports[`routes/LoginWithToken.tsx renders correctly 1`] = `
-
- -
-
- + -
+ } + viewBox="0 0 16 16" + width={16} + > + + + Login +
diff --git a/src/routes/__snapshots__/Settings.test.tsx.snap b/src/routes/__snapshots__/Settings.test.tsx.snap index 232a45311..ad0209460 100644 --- a/src/routes/__snapshots__/Settings.test.tsx.snap +++ b/src/routes/__snapshots__/Settings.test.tsx.snap @@ -514,11 +514,11 @@ exports[`routes/Settings.tsx General should render itself & its children 1`] = `