mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-14 16:15:55 +08:00
Fix(FE): Pages are refactored (#321)
* feat: signup api is added * fix: instrument and signup page is refactored * fix: Settings page is updated
This commit is contained in:
parent
917ef533a3
commit
d10b9790dc
@ -43,20 +43,17 @@ export const ServicesTablePage = Loadable(
|
|||||||
);
|
);
|
||||||
|
|
||||||
export const SignupPage = Loadable(
|
export const SignupPage = Loadable(
|
||||||
() => import(/* webpackChunkName: "SignupPage" */ 'modules/Auth/Signup'),
|
() => import(/* webpackChunkName: "SignupPage" */ 'pages/SignUp'),
|
||||||
);
|
);
|
||||||
|
|
||||||
export const SettingsPage = Loadable(
|
export const SettingsPage = Loadable(
|
||||||
() =>
|
() => import(/* webpackChunkName: "SettingsPage" */ 'pages/Settings'),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "SettingsPage" */ 'modules/Settings/settingsPage'
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
export const InstrumentationPage = Loadable(
|
export const InstrumentationPage = Loadable(
|
||||||
() =>
|
() =>
|
||||||
import(
|
import(
|
||||||
/* webpackChunkName: "InstrumentationPage" */ 'modules/add-instrumentation/instrumentationPage'
|
/* webpackChunkName: "InstrumentationPage" */ 'pages/AddInstrumentation'
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
26
frontend/src/api/user/signup.ts
Normal file
26
frontend/src/api/user/signup.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import axios from 'api';
|
||||||
|
import { ErrorResponseHandler } from 'api/ErrorResponseHandler';
|
||||||
|
import { AxiosError } from 'axios';
|
||||||
|
import { ErrorResponse, SuccessResponse } from 'types/api';
|
||||||
|
import { Props } from 'types/api/user/signup';
|
||||||
|
|
||||||
|
const signup = async (
|
||||||
|
props: Props,
|
||||||
|
): Promise<SuccessResponse<undefined> | ErrorResponse> => {
|
||||||
|
try {
|
||||||
|
const response = await axios.post('/user?email=', {
|
||||||
|
...props,
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
statusCode: 200,
|
||||||
|
error: null,
|
||||||
|
message: response.data.status,
|
||||||
|
payload: response.data.data,
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
return ErrorResponseHandler(error as AxiosError);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default signup;
|
@ -1,158 +0,0 @@
|
|||||||
import { Button, Input, Row, Space } from 'antd';
|
|
||||||
import api from 'api';
|
|
||||||
import { IS_LOGGED_IN } from 'constants/auth';
|
|
||||||
import ROUTES from 'constants/routes';
|
|
||||||
import React, { useState } from 'react';
|
|
||||||
import { withRouter } from 'react-router';
|
|
||||||
import { RouteComponentProps } from 'react-router-dom';
|
|
||||||
|
|
||||||
type SignUpProps = RouteComponentProps<any>;
|
|
||||||
|
|
||||||
const Signup = (props: SignUpProps): JSX.Element => {
|
|
||||||
const [state, setState] = useState({ submitted: false });
|
|
||||||
const [formState, setFormState] = useState({
|
|
||||||
firstName: { value: '' },
|
|
||||||
companyName: { value: '' },
|
|
||||||
email: { value: '' },
|
|
||||||
password: { value: '', valid: true },
|
|
||||||
emailOptIn: { value: true },
|
|
||||||
});
|
|
||||||
|
|
||||||
const updateForm = (name: any, target: any, valueAttr = 'value') => {
|
|
||||||
/* Validate password (if applicable) */
|
|
||||||
if (name === 'firstName') {
|
|
||||||
setFormState({
|
|
||||||
...formState,
|
|
||||||
firstName: { ...formState.firstName, value: target[valueAttr] },
|
|
||||||
});
|
|
||||||
} else if (name === 'email') {
|
|
||||||
setFormState({
|
|
||||||
...formState,
|
|
||||||
email: { ...formState.email, value: target[valueAttr] },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleSubmit = (e: any) => {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
setState({ ...state, submitted: true });
|
|
||||||
|
|
||||||
const payload = {
|
|
||||||
first_name: formState.firstName,
|
|
||||||
email: formState.email,
|
|
||||||
};
|
|
||||||
|
|
||||||
const texttolog = JSON.stringify(payload);
|
|
||||||
|
|
||||||
api.post('/user?email=' + texttolog).then((res) => {
|
|
||||||
// console.log(res);
|
|
||||||
// console.log(res.data);
|
|
||||||
});
|
|
||||||
|
|
||||||
localStorage.setItem(IS_LOGGED_IN, 'yes');
|
|
||||||
props.history.push(ROUTES.APPLICATION);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="signup-form">
|
|
||||||
<Space
|
|
||||||
direction="vertical"
|
|
||||||
className="space-top"
|
|
||||||
style={{ width: '100%', paddingLeft: 32 }}
|
|
||||||
>
|
|
||||||
<h1
|
|
||||||
className="title"
|
|
||||||
style={{
|
|
||||||
marginBottom: 0,
|
|
||||||
marginTop: 40,
|
|
||||||
display: 'flex',
|
|
||||||
alignItems: 'center',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{/* <img src={"Signoz-white.svg"} alt="" style={{ height: 60 }} /> */}
|
|
||||||
Create your account
|
|
||||||
</h1>
|
|
||||||
<div className="page-caption">
|
|
||||||
Monitor your applications. Find what is causing issues.
|
|
||||||
</div>
|
|
||||||
</Space>
|
|
||||||
<Row style={{ display: 'flex', justifyContent: 'center' }}>
|
|
||||||
<div
|
|
||||||
style={{ display: 'flex', alignItems: 'center', flexDirection: 'column' }}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
src={'signoz.svg'}
|
|
||||||
style={{ maxHeight: '100%', maxWidth: 300, marginTop: 64 }}
|
|
||||||
alt=""
|
|
||||||
className="main-img"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
display: 'flex',
|
|
||||||
justifyContent: 'flex-start',
|
|
||||||
margin: '0 32px',
|
|
||||||
flexDirection: 'column',
|
|
||||||
paddingTop: 32,
|
|
||||||
maxWidth: '32rem',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<form onSubmit={handleSubmit}>
|
|
||||||
<div className="input-set">
|
|
||||||
<label htmlFor="signupEmail">Email</label>
|
|
||||||
<Input
|
|
||||||
placeholder="mike@netflix.com"
|
|
||||||
type="email"
|
|
||||||
value={formState.email.value}
|
|
||||||
onChange={(e) => updateForm('email', e.target)}
|
|
||||||
required
|
|
||||||
// disabled={accountLoading}
|
|
||||||
id="signupEmail"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="input-set">
|
|
||||||
<label htmlFor="signupFirstName">First Name</label>
|
|
||||||
<Input
|
|
||||||
placeholder="Mike"
|
|
||||||
autoFocus
|
|
||||||
value={formState.firstName.value}
|
|
||||||
onChange={(e) => updateForm('firstName', e.target)}
|
|
||||||
required
|
|
||||||
// disabled={accountLoading}
|
|
||||||
id="signupFirstName"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="text-center space-top" style={{ marginTop: 12 }}>
|
|
||||||
<Button
|
|
||||||
type="primary"
|
|
||||||
htmlType="submit"
|
|
||||||
data-attr="signup"
|
|
||||||
disabled={state.submitted && !formState.password}
|
|
||||||
// loading={accountLoading}
|
|
||||||
>
|
|
||||||
Get Started
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* <div style={{ color: '#666666', marginBottom: 60, textAlign: 'center' }} className="space-top">
|
|
||||||
By clicking the button above you agree to our{' '}
|
|
||||||
<a href="https://signoz.io" target="_blank">
|
|
||||||
Terms of Service
|
|
||||||
</a>{' '}
|
|
||||||
and{' '}
|
|
||||||
<a href="https://signoz.io" target="_blank">
|
|
||||||
Privacy Policy
|
|
||||||
</a>
|
|
||||||
.
|
|
||||||
</div> */}
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</Row>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default withRouter(Signup);
|
|
@ -1,61 +0,0 @@
|
|||||||
import { Space } from 'antd';
|
|
||||||
import React from 'react';
|
|
||||||
import { useSelector } from 'react-redux';
|
|
||||||
import { AppState } from 'store/reducers';
|
|
||||||
import styled from 'styled-components';
|
|
||||||
import AppReducer from 'types/reducer/app';
|
|
||||||
|
|
||||||
const InstrumentCard = styled.div<{
|
|
||||||
isDarkMode: boolean;
|
|
||||||
}>`
|
|
||||||
border-radius: 4px;
|
|
||||||
background: ${({ isDarkMode }): string => (isDarkMode ? '#313131' : '#ddd')};
|
|
||||||
padding: 33px 23px;
|
|
||||||
max-width: 800px;
|
|
||||||
margin-top: 40px;
|
|
||||||
`;
|
|
||||||
|
|
||||||
const InstrumentationPage = (): JSX.Element => {
|
|
||||||
const { isDarkMode } = useSelector<AppState, AppReducer>((state) => state.app);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<React.Fragment>
|
|
||||||
<Space style={{ marginLeft: 60, marginTop: 48, display: 'block' }}>
|
|
||||||
<div>
|
|
||||||
<h2>Instrument your application</h2>
|
|
||||||
</div>
|
|
||||||
<InstrumentCard isDarkMode={isDarkMode}>
|
|
||||||
Congrats, you have successfully installed SigNoz!
|
|
||||||
<br />
|
|
||||||
To start seeing YOUR application data here, follow the instructions in the
|
|
||||||
docs -
|
|
||||||
<a
|
|
||||||
href={'https://signoz.io/docs/instrumentation/overview'}
|
|
||||||
target="_blank"
|
|
||||||
rel="noreferrer"
|
|
||||||
>
|
|
||||||
{' '}
|
|
||||||
https://signoz.io/docs/instrumentation/overview
|
|
||||||
</a>
|
|
||||||
<br />
|
|
||||||
If you face any issues, join our{' '}
|
|
||||||
<a
|
|
||||||
href={
|
|
||||||
'https://signoz-community.slack.com/join/shared_invite/zt-lrjknbbp-J_mI13rlw8pGF4EWBnorJA'
|
|
||||||
}
|
|
||||||
target="_blank"
|
|
||||||
rel="noreferrer"
|
|
||||||
>
|
|
||||||
slack community
|
|
||||||
</a>{' '}
|
|
||||||
to ask any questions or mail us at{' '}
|
|
||||||
<a href={'mailto:support@signoz.io'} target="_blank" rel="noreferrer">
|
|
||||||
support@signoz.io
|
|
||||||
</a>
|
|
||||||
</InstrumentCard>
|
|
||||||
</Space>
|
|
||||||
</React.Fragment>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default InstrumentationPage;
|
|
47
frontend/src/pages/AddInstrumentation/index.tsx
Normal file
47
frontend/src/pages/AddInstrumentation/index.tsx
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import { Typography } from 'antd';
|
||||||
|
import React from 'react';
|
||||||
|
import { useSelector } from 'react-redux';
|
||||||
|
import { AppState } from 'store/reducers';
|
||||||
|
import AppReducer from 'types/reducer/app';
|
||||||
|
|
||||||
|
import { Container, Heading } from './styles';
|
||||||
|
|
||||||
|
const InstrumentationPage = (): JSX.Element => {
|
||||||
|
const { isDarkMode } = useSelector<AppState, AppReducer>((state) => state.app);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Heading>Instrument your application</Heading>
|
||||||
|
<Container isDarkMode={isDarkMode}>
|
||||||
|
<Typography>Congrats, you have successfully installed SigNoz!</Typography>{' '}
|
||||||
|
<Typography>
|
||||||
|
To start seeing YOUR application data here, follow the instructions in the
|
||||||
|
docs -
|
||||||
|
</Typography>
|
||||||
|
<a
|
||||||
|
href={'https://signoz.io/docs/instrumentation/overview'}
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
>
|
||||||
|
https://signoz.io/docs/instrumentation/overview
|
||||||
|
</a>
|
||||||
|
If you face any issues, join our
|
||||||
|
<a
|
||||||
|
href={
|
||||||
|
'https://signoz-community.slack.com/join/shared_invite/zt-lrjknbbp-J_mI13rlw8pGF4EWBnorJA'
|
||||||
|
}
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
>
|
||||||
|
slack community
|
||||||
|
</a>
|
||||||
|
to ask any questions or mail us at
|
||||||
|
<a href={'mailto:support@signoz.io'} target="_blank" rel="noreferrer">
|
||||||
|
support@signoz.io
|
||||||
|
</a>
|
||||||
|
</Container>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default InstrumentationPage;
|
20
frontend/src/pages/AddInstrumentation/styles.ts
Normal file
20
frontend/src/pages/AddInstrumentation/styles.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { Card, Typography } from 'antd';
|
||||||
|
import styled from 'styled-components';
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
isDarkMode: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Container = styled(Card)<Props>`
|
||||||
|
border-radius: 4px;
|
||||||
|
background: ${({ isDarkMode }): string => (isDarkMode ? '#313131' : '#ddd')};
|
||||||
|
|
||||||
|
width: 80%;
|
||||||
|
`;
|
||||||
|
|
||||||
|
export const Heading = styled(Typography)`
|
||||||
|
&&& {
|
||||||
|
font-size: 2rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
`;
|
@ -1,29 +1,23 @@
|
|||||||
import { Form, Input, Space } from 'antd';
|
import { Form, Input, Space } from 'antd';
|
||||||
import { Alert } from 'antd';
|
import { Alert } from 'antd';
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect } from 'react';
|
||||||
import { connect } from 'react-redux';
|
|
||||||
import { AppState } from 'store/reducers';
|
|
||||||
|
|
||||||
interface SettingsPageProps {}
|
const SettingsPage = (): JSX.Element => {
|
||||||
|
|
||||||
const layout = {
|
|
||||||
labelCol: { span: 3 },
|
|
||||||
wrapperCol: { span: 6 },
|
|
||||||
};
|
|
||||||
|
|
||||||
const SettingsPage = (props: SettingsPageProps) => {
|
|
||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
form.setFieldsValue({
|
form.setFieldsValue({
|
||||||
retention_period: '3 days',
|
retention_period: '3 days',
|
||||||
});
|
});
|
||||||
});
|
}, [form]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<React.Fragment>
|
<>
|
||||||
<Form
|
<Form
|
||||||
{...layout}
|
labelCol={{
|
||||||
|
span: 3,
|
||||||
|
}}
|
||||||
|
wrapperCol={{ span: 6 }}
|
||||||
name="basic"
|
name="basic"
|
||||||
initialValues={{ remember: true }}
|
initialValues={{ remember: true }}
|
||||||
style={{ marginLeft: 20 }}
|
style={{ marginLeft: 20 }}
|
||||||
@ -44,12 +38,8 @@ const SettingsPage = (props: SettingsPageProps) => {
|
|||||||
type="info"
|
type="info"
|
||||||
/>
|
/>
|
||||||
</Space>
|
</Space>
|
||||||
</React.Fragment>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const mapStateToProps = (state: AppState): {} => {
|
export default SettingsPage;
|
||||||
return {};
|
|
||||||
};
|
|
||||||
|
|
||||||
export default connect(mapStateToProps, {})(SettingsPage);
|
|
116
frontend/src/pages/SignUp/index.tsx
Normal file
116
frontend/src/pages/SignUp/index.tsx
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
import { Button, Input, Typography } from 'antd';
|
||||||
|
import signup from 'api/user/signup';
|
||||||
|
import { IS_LOGGED_IN } from 'constants/auth';
|
||||||
|
import ROUTES from 'constants/routes';
|
||||||
|
import history from 'lib/history';
|
||||||
|
import React, { useState } from 'react';
|
||||||
|
|
||||||
|
import { ButtonContainer, Container, FormWrapper, Title } from './styles';
|
||||||
|
|
||||||
|
const Signup = (): JSX.Element => {
|
||||||
|
const [state, setState] = useState({ submitted: false });
|
||||||
|
const [formState, setFormState] = useState({
|
||||||
|
firstName: { value: '' },
|
||||||
|
companyName: { value: '' },
|
||||||
|
email: { value: '' },
|
||||||
|
password: { value: '', valid: true },
|
||||||
|
emailOptIn: { value: true },
|
||||||
|
});
|
||||||
|
|
||||||
|
const updateForm = (
|
||||||
|
name: string,
|
||||||
|
target: EventTarget & HTMLInputElement,
|
||||||
|
): void => {
|
||||||
|
if (name === 'firstName') {
|
||||||
|
setFormState({
|
||||||
|
...formState,
|
||||||
|
firstName: { ...formState.firstName, value: target.value },
|
||||||
|
});
|
||||||
|
} else if (name === 'email') {
|
||||||
|
setFormState({
|
||||||
|
...formState,
|
||||||
|
email: { ...formState.email, value: target.value },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSubmit = (e: React.FormEvent<HTMLFormElement>): void => {
|
||||||
|
(async (): Promise<void> => {
|
||||||
|
try {
|
||||||
|
e.preventDefault();
|
||||||
|
setState((state) => ({ ...state, submitted: true }));
|
||||||
|
const payload = {
|
||||||
|
first_name: formState.firstName,
|
||||||
|
email: formState.email,
|
||||||
|
};
|
||||||
|
const response = await signup({
|
||||||
|
email: JSON.stringify(payload),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.statusCode === 200) {
|
||||||
|
localStorage.setItem(IS_LOGGED_IN, 'yes');
|
||||||
|
history.push(ROUTES.APPLICATION);
|
||||||
|
} else {
|
||||||
|
// @TODO throw a error notification here
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
// @TODO throw a error notification here
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Container direction="vertical">
|
||||||
|
<Title>Create your account</Title>
|
||||||
|
<Typography>
|
||||||
|
Monitor your applications. Find what is causing issues.
|
||||||
|
</Typography>
|
||||||
|
</Container>
|
||||||
|
|
||||||
|
<FormWrapper>
|
||||||
|
<img src={'signoz.svg'} alt="logo" />
|
||||||
|
|
||||||
|
<form onSubmit={handleSubmit}>
|
||||||
|
<div>
|
||||||
|
<label htmlFor="signupEmail">Email</label>
|
||||||
|
<Input
|
||||||
|
placeholder="mike@netflix.com"
|
||||||
|
type="email"
|
||||||
|
value={formState.email.value}
|
||||||
|
onChange={(e): void => updateForm('email', e.target)}
|
||||||
|
required
|
||||||
|
id="signupEmail"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label htmlFor="signupFirstName">First Name</label>
|
||||||
|
<Input
|
||||||
|
placeholder="Mike"
|
||||||
|
autoFocus
|
||||||
|
value={formState.firstName.value}
|
||||||
|
onChange={(e): void => updateForm('firstName', e.target)}
|
||||||
|
required
|
||||||
|
id="signupFirstName"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ButtonContainer>
|
||||||
|
<Button
|
||||||
|
type="primary"
|
||||||
|
htmlType="submit"
|
||||||
|
data-attr="signup"
|
||||||
|
disabled={state.submitted && !formState.password}
|
||||||
|
>
|
||||||
|
Get Started
|
||||||
|
</Button>
|
||||||
|
</ButtonContainer>
|
||||||
|
</form>
|
||||||
|
</FormWrapper>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Signup;
|
27
frontend/src/pages/SignUp/styles.ts
Normal file
27
frontend/src/pages/SignUp/styles.ts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import { Space, Typography } from 'antd';
|
||||||
|
import styled from 'styled-components';
|
||||||
|
|
||||||
|
export const Container = styled(Space)`
|
||||||
|
&&& {
|
||||||
|
padding-left: 2rem;
|
||||||
|
margin-top: 3rem;
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
export const Title = styled(Typography)`
|
||||||
|
&&& {
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
export const FormWrapper = styled.div`
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
|
margin-top: 2rem;
|
||||||
|
`;
|
||||||
|
|
||||||
|
export const ButtonContainer = styled.div`
|
||||||
|
margin-top: 0.5rem;
|
||||||
|
`;
|
3
frontend/src/types/api/user/signup.ts
Normal file
3
frontend/src/types/api/user/signup.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export interface Props {
|
||||||
|
email: string;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user