1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-08-27 13:49:10 +02:00

refactor: port some things to TS (#833)

* refactor: remove unused securityLogger

* refactor: port commonStyles to TS

* refactor: port testIds to TS

* refactor: move app.css into themes

* refactor: use absolute import paths

* refactor: port LayoutPicker to TS

* refactor: port routes to TS

* refactor: port ScrollTop to TS

* refactor: update unused/missing ScrollTop exceptions

* refactor: remove unused route flags field

* refactor: change constants ext to TS

* refactor: remove unused testData file

* refactor: port styles to TS

* refactor: wait before typing in auth spec
This commit is contained in:
olav 2022-04-01 10:28:15 +02:00 committed by GitHub
parent 391f1818f1
commit f309553a5f
90 changed files with 227 additions and 260 deletions

View File

@ -22,6 +22,7 @@ describe('auth', () => {
expect(req.body.password).to.equal('unleash4all');
}).as('passwordLogin');
cy.wait(1000);
cy.get('[data-test="LOGIN_EMAIL_ID"]').type('admin');
cy.get('[data-test="LOGIN_PASSWORD_ID"]').type('unleash4all');
cy.get("[data-test='LOGIN_BUTTON']").click();

View File

@ -1,6 +1,6 @@
import ConditionallyRender from 'component/common/ConditionallyRender';
import { FeedbackNPS } from 'component/feedback/FeedbackNPS/FeedbackNPS';
import LayoutPicker from 'component/layout/LayoutPicker/LayoutPicker';
import { LayoutPicker } from 'component/layout/LayoutPicker/LayoutPicker';
import Loader from 'component/common/Loader/Loader';
import NotFound from 'component/common/NotFound/NotFound';
import ProtectedRoute from 'component/common/ProtectedRoute/ProtectedRoute';

View File

@ -1,67 +0,0 @@
export const testProjects = [
{ id: 'default', inital: true, name: 'Default' },
{ id: 'myProject', inital: false, name: 'MyProject' },
];
export const testFeatures = [
{
name: 'one',
description: '1234',
type: 'permission',
project: 'default',
enabled: false,
stale: false,
strategies: [],
variants: [],
createdAt: '2021-02-01T04:12:36.878Z',
lastSeenAt: '2021-02-21T19:34:21.830Z',
},
{
name: 'two',
description: '',
type: 'release',
project: 'default',
enabled: false,
stale: false,
strategies: [],
variants: [],
createdAt: '2021-02-22T16:05:39.717Z',
lastSeenAt: '2021-02-22T19:37:58.189Z',
},
{
name: 'three',
description: 'asdasds',
type: 'experiment',
project: 'default',
enabled: true,
stale: false,
strategies: [],
variants: [],
createdAt: '2021-02-06T18:38:18.133Z',
lastSeenAt: '2021-02-21T19:34:21.830Z',
},
{
name: 'four',
description: '',
type: 'experiment',
project: 'myProject',
enabled: true,
stale: false,
strategies: [],
variants: [],
createdAt: '2021-02-14T02:42:34.515Z',
lastSeenAt: '2021-02-21T19:34:21.830Z',
},
{
name: 'five',
description: '',
type: 'release',
project: 'myProject',
enabled: true,
stale: false,
strategies: [],
variants: [],
createdAt: '2021-02-16T15:26:11.474Z',
lastSeenAt: '2021-02-21T19:34:21.830Z',
},
];

View File

@ -10,7 +10,7 @@ import PageContent from 'component/common/PageContent/PageContent';
import { useHistory } from 'react-router-dom';
import useAddonsApi from 'hooks/api/actions/useAddonsApi/useAddonsApi';
import useToast from 'hooks/useToast';
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
const useStyles = makeStyles(theme => ({
nameInput: {

View File

@ -27,7 +27,7 @@ import { useStyles } from './ApiTokenList.styles';
import Secret from './secret';
import { Delete, FileCopy } from '@material-ui/icons';
import Dialogue from 'component/common/Dialogue';
import { CREATE_API_TOKEN_BUTTON } from 'testIds';
import { CREATE_API_TOKEN_BUTTON } from 'utils/testIds';
import { Alert } from '@material-ui/lab';
import copy from 'copy-to-clipboard';
import { useLocationSettings } from 'hooks/useLocationSettings';

View File

@ -1,5 +1,5 @@
import { Typography } from '@material-ui/core';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import Dialogue from 'component/common/Dialogue';
import { UserToken } from './UserToken/UserToken';

View File

@ -1,6 +1,6 @@
import { Typography } from '@material-ui/core';
import { Alert } from '@material-ui/lab';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import Dialogue from 'component/common/Dialogue';
import UserInviteLink from './UserInviteLink/UserInviteLink';

View File

@ -5,7 +5,7 @@ import { trim } from 'component/common/util';
import { modalStyles } from 'component/admin/users/util';
import Dialogue from 'component/common/Dialogue/Dialogue';
import PasswordChecker from 'component/user/common/ResetPasswordForm/PasswordChecker/PasswordChecker';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import PasswordMatcher from 'component/user/common/ResetPasswordForm/PasswordMatcher/PasswordMatcher';
import ConditionallyRender from 'component/common/ConditionallyRender';
import { Alert } from '@material-ui/lab';

View File

@ -5,7 +5,7 @@ import { REMOVE_USER_ERROR } from 'hooks/api/actions/useAdminUsersApi/useAdminUs
import { Alert } from '@material-ui/lab';
import useLoading from 'hooks/useLoading';
import { Avatar, Typography } from '@material-ui/core';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import { IUser } from 'interfaces/user';
interface IDeleteUserProps {

View File

@ -1,6 +1,6 @@
import { ChangeEvent, useState } from 'react';
import { Grid, TextField } from '@material-ui/core';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import icons from 'component/application/iconNames';
import GeneralSelect from 'component/common/GeneralSelect/GeneralSelect';
import useApplicationsApi from 'hooks/api/actions/useApplicationsApi/useApplicationsApi';

View File

@ -1,10 +1,18 @@
import { ReactNode } from 'react';
interface IConditionallyRenderProps {
condition: boolean;
show: TargetElement;
elseShow?: TargetElement;
}
type TargetElement = JSX.Element | JSX.Element[] | RenderFunc | null;
type TargetElement =
| JSX.Element
| JSX.Element[]
| RenderFunc
| ReactNode
| null;
type RenderFunc = () => JSX.Element;
const ConditionallyRender = ({

View File

@ -1,5 +1,5 @@
import { Checkbox, FormControlLabel } from '@material-ui/core';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import ConditionallyRender from 'component/common/ConditionallyRender';
import { useEffect, useState } from 'react';
import { ConstraintValueSearch } from 'component/common/ConstraintAccordion/ConstraintValueSearch/ConstraintValueSearch';

View File

@ -9,7 +9,7 @@ import {
} from '@material-ui/core';
import { ConstraintValueSearch } from 'component/common/ConstraintAccordion/ConstraintValueSearch/ConstraintValueSearch';
import ConditionallyRender from 'component/common/ConditionallyRender';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
// Parent component

View File

@ -9,7 +9,7 @@ import {
import ConditionallyRender from '../ConditionallyRender/ConditionallyRender';
import { useStyles } from './Dialogue.styles';
import { DIALOGUE_CONFIRM_ID } from 'testIds';
import { DIALOGUE_CONFIRM_ID } from 'utils/testIds';
interface IDialogue {
primaryButtonText?: string;

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
container: {
@ -10,6 +10,7 @@ export const useStyles = makeStyles(theme => ({
wing: {
width: '80px',
height: '3px',
// @ts-expect-error
backgroundColor: theme.palette.division.main,
borderRadius: theme.borders.radius.main,
},

View File

@ -1,5 +1,5 @@
import { Typography } from '@material-ui/core';
import { useStyles } from './DividerText.styles';
import { useStyles } from 'component/common/DividerText/DividerText.styles';
interface IDividerTextProps {
text: string;

View File

@ -10,7 +10,7 @@ import useToast from 'hooks/useToast';
import React, { useState } from 'react';
import classNames from 'classnames';
import { ReactComponent as MobileGuidanceBG } from 'assets/img/mobileGuidanceBg.svg';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
interface ICreateProps {
title: string;

View File

@ -1,6 +1,6 @@
import React from 'react';
import { FormControl, InputLabel, MenuItem, Select } from '@material-ui/core';
import { SELECT_ITEM_ID } from 'testIds';
import { SELECT_ITEM_ID } from 'utils/testIds';
import { KeyboardArrowDownOutlined } from '@material-ui/icons';
export interface ISelectOption {

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
headerTitleContainer: {

View File

@ -1,5 +1,5 @@
import { InputLabelProps, InputProps, TextField } from '@material-ui/core';
import { INPUT_ERROR_TEXT } from 'testIds';
import { INPUT_ERROR_TEXT } from 'utils/testIds';
import { useStyles } from './Input.styles';
import React from 'react';

View File

@ -1,7 +1,8 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
emptyStateListItem: {
// @ts-expect-error
border: `2px dashed ${theme.palette.borders.main}`,
padding: '0.8rem',
textAlign: 'center',

View File

@ -1,7 +1,7 @@
import { ListItem } from '@material-ui/core';
import { Link } from 'react-router-dom';
import ConditionallyRender from '../ConditionallyRender';
import { useStyles } from './ListPlaceholder.styles';
import { useStyles } from 'component/common/ListPlaceholder/ListPlaceholder.styles';
interface IListPlaceholderProps {
text: string;

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
headerContainer: {

View File

@ -0,0 +1,21 @@
import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
export const ScrollTop = (): null => {
const { pathname } = useLocation();
useEffect(() => {
if (!noScrollPaths.some(noScroll => pathname.includes(noScroll))) {
window.scrollTo(0, 0);
}
}, [pathname]);
return null;
};
const noScrollPaths = [
'/admin/api',
'/admin/users',
'/admin/auth',
'/admin/roles',
];

View File

@ -3,7 +3,7 @@ import classnames from 'classnames';
import { debounce } from 'debounce';
import { InputBase, Chip } from '@material-ui/core';
import SearchIcon from '@material-ui/icons/Search';
import { useStyles } from './styles';
import { useStyles } from 'component/common/SearchField/styles';
import ConditionallyRender from 'component/common/ConditionallyRender';
interface ISearchFieldProps {

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
container: {
@ -10,6 +10,7 @@ export const useStyles = makeStyles(theme => ({
search: {
display: 'flex',
alignItems: 'center',
// @ts-expect-error
backgroundColor: theme.palette.searchField.main,
borderRadius: '25px',
padding: '0.25rem 0.5rem',

View File

@ -2,7 +2,7 @@ import { ReactNode } from 'react';
import { Modal, Backdrop } from '@material-ui/core';
import Fade from '@material-ui/core/Fade';
import { useStyles } from 'component/common/SidebarModal/SidebarModal.styles';
import { SIDEBAR_MODAL_ID } from 'testIds';
import { SIDEBAR_MODAL_ID } from 'utils/testIds';
interface ISidebarModalProps {
open: boolean;

View File

@ -1,7 +1,8 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
tabNav: {
// @ts-expect-error
backgroundColor: theme.palette.tabs.main,
},
}));

View File

@ -1,6 +1,6 @@
import { Portal } from '@material-ui/core';
import { useContext, useEffect } from 'react';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import UIContext from 'contexts/UIContext';
import { useStyles } from './ToastRenderer.styles';
import AnimateOnMount from '../AnimateOnMount/AnimateOnMount';

View File

@ -1,6 +1,6 @@
import React from 'react';
import { FormControl, InputLabel, MenuItem, Select } from '@material-ui/core';
import { SELECT_ITEM_ID } from 'testIds';
import { SELECT_ITEM_ID } from 'utils/testIds';
export interface ISelectOption {
key: string;

View File

@ -1,9 +1,9 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles({
listItem: {
padding: 0,
['& a']: {
'& a': {
textDecoration: 'none',
color: 'inherit',
},

View File

@ -9,7 +9,7 @@ import { CREATE_FEATURE } from 'component/providers/AccessProvider/permissions';
import { useContext } from 'react';
import { CreateButton } from 'component/common/CreateButton/CreateButton';
import UIContext from 'contexts/UIContext';
import { CF_CREATE_BTN_ID } from 'testIds';
import { CF_CREATE_BTN_ID } from 'utils/testIds';
import { formatUnknownError } from 'utils/formatUnknownError';
const CreateFeature = () => {

View File

@ -7,7 +7,7 @@ import {
} from '@material-ui/core';
import { useStyles } from './FeatureForm.styles';
import FeatureTypeSelect from '../FeatureView/FeatureSettings/FeatureSettingsMetadata/FeatureTypeSelect/FeatureTypeSelect';
import { CF_DESC_ID, CF_NAME_ID, CF_TYPE_ID } from 'testIds';
import { CF_DESC_ID, CF_NAME_ID, CF_TYPE_ID } from 'utils/testIds';
import useFeatureTypes from 'hooks/api/getters/useFeatureTypes/useFeatureTypes';
import { KeyboardArrowDownOutlined } from '@material-ui/icons';
import { projectFilterGenerator } from 'utils/projectFilterGenerator';

View File

@ -14,7 +14,7 @@ import { formatFeaturePath } from '../FeatureStrategyEdit/FeatureStrategyEdit';
import { useHistory } from 'react-router-dom';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import ConditionallyRender from 'component/common/ConditionallyRender';
import { STRATEGY_FORM_SUBMIT_ID } from 'testIds';
import { STRATEGY_FORM_SUBMIT_ID } from 'utils/testIds';
import { useConstraintsValidation } from 'hooks/api/getters/useConstraintsValidation/useConstraintsValidation';
import AccessContext from 'contexts/AccessContext';
import PermissionButton from 'component/common/PermissionButton/PermissionButton';

View File

@ -9,7 +9,7 @@ import { Alert } from '@material-ui/lab';
import PermissionButton from 'component/common/PermissionButton/PermissionButton';
import { DELETE_FEATURE_STRATEGY } from 'component/providers/AccessProvider/permissions';
import { useFeature } from 'hooks/api/getters/useFeature/useFeature';
import { STRATEGY_FORM_REMOVE_ID } from 'testIds';
import { STRATEGY_FORM_REMOVE_ID } from 'utils/testIds';
import ConditionallyRender from 'component/common/ConditionallyRender';
import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton';
import { Delete } from '@material-ui/icons';

View File

@ -17,7 +17,7 @@ import AccessContext from 'contexts/AccessContext';
import { useStyles } from './styles';
import ListPlaceholder from 'component/common/ListPlaceholder/ListPlaceholder';
import { getCreateTogglePath } from 'utils/routePathHelpers';
import { NAVIGATE_TO_CREATE_FEATURE } from 'testIds';
import { NAVIGATE_TO_CREATE_FEATURE } from 'utils/testIds';
import { resolveFilteredProjectId } from 'hooks/useFeaturesFilter';
const FeatureToggleList = ({

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles({
actions: {

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
listItem: {
@ -11,15 +11,16 @@ export const useStyles = makeStyles(theme => ({
listItemMetric: {
width: '40px',
marginRight: '0.25rem',
flexShrink: '0',
flexShrink: 0,
},
listItemType: {
width: '40px',
textAlign: 'center',
marginRight: '0',
flexShrink: '0',
flexShrink: 0,
},
listItemSvg: {
// @ts-expect-error
fill: theme.palette.icons.lightGrey,
},
listItemLink: {

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
actionsContainer: {
@ -25,6 +25,7 @@ export const useStyles = makeStyles(theme => ({
},
},
emptyStateListItem: {
// @ts-expect-error
border: `2px dashed ${theme.palette.borders.main}`,
padding: '0.8rem',
textAlign: 'center',

View File

@ -25,7 +25,7 @@ import FeatureOverviewEnvironmentBody from './FeatureOverviewEnvironmentBody/Fea
import FeatureOverviewEnvironmentFooter from './FeatureOverviewEnvironmentFooter/FeatureOverviewEnvironmentFooter';
import FeatureOverviewEnvironmentMetrics from './FeatureOverviewEnvironmentMetrics/FeatureOverviewEnvironmentMetrics';
import { FeatureStrategyMenu } from 'component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenu';
import { FEATURE_ENVIRONMENT_ACCORDION } from 'testIds';
import { FEATURE_ENVIRONMENT_ACCORDION } from 'utils/testIds';
interface IStrategyIconObject {
count: number;

View File

@ -11,7 +11,7 @@ import { Info } from '@material-ui/icons';
import { weightTypes } from './enums';
import { OverrideConfig } from './OverrideConfig/OverrideConfig';
import ConditionallyRender from 'component/common/ConditionallyRender';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import Dialogue from 'component/common/Dialogue';
import { modalStyles, trim } from 'component/common/util';
import PermissionSwitch from 'component/common/PermissionSwitch/PermissionSwitch';

View File

@ -2,10 +2,10 @@ import classnames from 'classnames';
import PropTypes from 'prop-types';
import { Grid, IconButton, TextField } from '@material-ui/core';
import { Delete } from '@material-ui/icons';
import { useStyles } from './OverrideConfig.styles.js';
import { useStyles } from './OverrideConfig.styles';
import { Autocomplete } from '@material-ui/lab';
import GeneralSelect from 'component/common/GeneralSelect/GeneralSelect';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import ConditionallyRender from 'component/common/ConditionallyRender';
import InputListField from 'component/common/InputListField.jsx';
import useUnleashContext from 'hooks/api/getters/useUnleashContext/useUnleashContext';

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
contextFieldSelect: {

View File

@ -6,9 +6,9 @@ import { Delete } from '@material-ui/icons';
import InputListField from 'component/common/InputListField';
import ConditionallyRender from 'component/common/ConditionallyRender/ConditionallyRender';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import { useStyles } from './StrategyConstraintInputField.styles';
import { CONSTRAINT_AUTOCOMPLETE_ID } from 'testIds';
import { CONSTRAINT_AUTOCOMPLETE_ID } from 'utils/testIds';
import GeneralSelect from 'component/common/GeneralSelect/GeneralSelect';
const constraintOperators = [

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles({
contextField: {

View File

@ -1,7 +1,7 @@
import { Button, Tooltip, Typography } from '@material-ui/core';
import { Info } from '@material-ui/icons';
import { IConstraint } from 'interfaces/strategy';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { C } from 'component/common/flags';
import useUnleashContext from 'hooks/api/getters/useUnleashContext/useUnleashContext';

View File

@ -9,7 +9,7 @@ import Input from 'component/common/Input/Input';
import {
FLEXIBLE_STRATEGY_GROUP_ID,
FLEXIBLE_STRATEGY_STICKINESS_ID,
} from 'testIds';
} from 'utils/testIds';
const builtInStickinessOptions = [
{ key: 'default', label: 'default' },

View File

@ -1,6 +1,6 @@
import { makeStyles, withStyles } from '@material-ui/core/styles';
import { Slider, Typography } from '@material-ui/core';
import { ROLLOUT_SLIDER_ID } from 'testIds';
import { ROLLOUT_SLIDER_ID } from 'utils/testIds';
import React from 'react';
const StyledSlider = withStyles({

View File

@ -2,7 +2,7 @@ import React, { ChangeEvent, useState } from 'react';
import { Button, Chip, TextField, Typography } from '@material-ui/core';
import { Add } from '@material-ui/icons';
import ConditionallyRender from 'component/common/ConditionallyRender';
import { ADD_TO_STRATEGY_INPUT_LIST, STRATEGY_INPUT_LIST } from 'testIds';
import { ADD_TO_STRATEGY_INPUT_LIST, STRATEGY_INPUT_LIST } from 'utils/testIds';
interface IStrategyInputList {
name: string;

View File

@ -3,10 +3,10 @@ import { Button, IconButton } from '@material-ui/core';
import classnames from 'classnames';
import CloseIcon from '@material-ui/icons/Close';
import { ReactComponent as Logo } from 'assets/icons/logoPlain.svg';
import { useCommonStyles } from 'common.styles';
import { useStyles } from 'component/feedback/FeedbackNPS/FeedbackNPS.styles';
import AnimateOnMount from 'component/common/AnimateOnMount/AnimateOnMount';
import ConditionallyRender from 'component/common/ConditionallyRender';
import { useCommonStyles } from 'themes/commonStyles';
import UIContext from 'contexts/UIContext';
import {
PNPS_FEEDBACK_ID,

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles({
eventLogHeader: {

View File

@ -1,13 +1,16 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
blue: {
// @ts-expect-error
color: theme.palette.code.edited,
},
negative: {
// @ts-expect-error
color: theme.palette.code.diffSub,
},
positive: {
// @ts-expect-error
color: theme.palette.code.diffAdd,
},
}));

View File

@ -1,9 +1,10 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
historyItem: {
padding: '5px',
'&:nth-child(odd)': {
// @ts-expect-error
backgroundColor: theme.palette.code.background,
},
},

View File

@ -4,7 +4,7 @@ import EventJson from './EventJson/EventJson';
import PageContent from 'component/common/PageContent/PageContent';
import HeaderTitle from 'component/common/HeaderTitle';
import EventCard from './EventCard/EventCard';
import { useStyles } from './EventLog.styles.js';
import { useStyles } from './EventLog.styles';
import { formatDateYMDHMS } from 'utils/formatDate';
const EventLog = ({

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
eventEntry: {
@ -13,15 +13,19 @@ export const useStyles = makeStyles(theme => ({
whiteSpace: 'pre',
fontFamily: 'monospace',
lineHeight: '100%',
// @ts-expect-error
color: theme.palette.code.main,
},
'& code > .diff-N': {
// @ts-expect-error
color: theme.palette.code.diffAdd,
},
'& code > .diff-D': {
// @ts-expect-error
color: theme.palette.code.diffSub,
},
'& code > .diff-A, .diff-E': {
// @ts-expect-error
color: theme.palette.code.diffNeutral,
},
'& dl': {

View File

@ -1,49 +0,0 @@
import ConditionallyRender from 'component/common/ConditionallyRender';
import { matchPath } from 'react-router';
import { useLocation } from 'react-router-dom';
import { MainLayout } from '../MainLayout/MainLayout';
const LayoutPicker = ({ children }) => {
const location = useLocation();
const standalonePages = () => {
const { pathname } = location;
const isLoginPage = matchPath(pathname, { path: '/login' });
const isNewUserPage = matchPath(pathname, {
path: '/new-user',
});
const isChangePasswordPage = matchPath(pathname, {
path: '/reset-password',
});
const isResetPasswordSuccessPage = matchPath(pathname, {
path: '/reset-password-success',
});
const isForgottenPasswordPage = matchPath(pathname, {
path: '/forgotten-password',
});
const isSplashPage = matchPath(pathname, {
path: '/splash/:id',
});
const is404 = matchPath(pathname, { path: '/404' });
return (
isLoginPage ||
isNewUserPage ||
isChangePasswordPage ||
isResetPasswordSuccessPage ||
isForgottenPasswordPage ||
isSplashPage ||
is404
);
};
return (
<ConditionallyRender
condition={standalonePages()}
show={children}
elseShow={<MainLayout location={location}>{children}</MainLayout>}
/>
);
};
export default LayoutPicker;

View File

@ -0,0 +1,61 @@
import ConditionallyRender from 'component/common/ConditionallyRender';
import { matchPath } from 'react-router';
import { useLocation } from 'react-router-dom';
import { MainLayout } from '../MainLayout/MainLayout';
import { ReactNode } from 'react';
interface ILayoutPickerProps {
children: ReactNode;
}
export const LayoutPicker = ({ children }: ILayoutPickerProps) => {
const { pathname } = useLocation();
return (
<ConditionallyRender
condition={isStandalonePage(pathname)}
show={children}
elseShow={<MainLayout>{children}</MainLayout>}
/>
);
};
const isStandalonePage = (pathname: string): boolean => {
const isLoginPage = matchPath(pathname, {
path: '/login',
});
const isNewUserPage = matchPath(pathname, {
path: '/new-user',
});
const isChangePasswordPage = matchPath(pathname, {
path: '/reset-password',
});
const isResetPasswordSuccessPage = matchPath(pathname, {
path: '/reset-password-success',
});
const isForgottenPasswordPage = matchPath(pathname, {
path: '/forgotten-password',
});
const isSplashPage = matchPath(pathname, {
path: '/splash/:id',
});
const is404 = matchPath(pathname, {
path: '/404',
});
return Boolean(
isLoginPage ||
isNewUserPage ||
isChangePasswordPage ||
isResetPasswordSuccessPage ||
isForgottenPasswordPage ||
isSplashPage ||
is404
);
};

View File

@ -1,7 +1,8 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
footer: {
// @ts-expect-error
background: theme.palette.footer.background,
padding: '2rem 4rem',
width: '100%',
@ -17,6 +18,7 @@ export const useStyles = makeStyles(theme => ({
margin: 0,
'& a': {
textDecoration: 'none',
// @ts-expect-error
color: theme.palette.footer.main,
},
},

View File

@ -13,11 +13,11 @@ import { ReactComponent as UnleashLogo } from 'assets/img/logoDarkWithText.svg';
import { useStyles } from './Header.styles';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import { ADMIN } from 'component/providers/AccessProvider/permissions';
import { IPermission } from 'interfaces/user';
import NavigationMenu from './NavigationMenu/NavigationMenu';
import { getRoutes } from '../routes';
import { getRoutes } from 'component/menu/routes';
import { KeyboardArrowDown } from '@material-ui/icons';
import { filterByFlags } from 'component/common/util';
import { useAuthPermissions } from 'hooks/api/getters/useAuth/useAuthPermissions';

View File

@ -51,7 +51,6 @@ Array [
},
Object {
"component": [Function],
"flags": "E",
"menu": Object {},
"parent": "/projects",
"path": "/projects/:projectId/features/:featureId",

View File

@ -10,7 +10,7 @@ import AdminInvoice from 'component/admin/invoice/InvoiceAdminPage';
import AdminUsers from 'component/admin/users/UsersAdmin';
import { AuthSettings } from 'component/admin/auth/AuthSettings';
import Login from 'component/user/Login/Login';
import { C, E, EEA, P, RE, SE } from 'component/common/flags';
import { C, EEA, P, RE, SE } from 'component/common/flags';
import { NewUser } from 'component/user/NewUser/NewUser';
import ResetPassword from 'component/user/ResetPassword/ResetPassword';
import ForgottenPassword from 'component/user/ForgottenPassword/ForgottenPassword';
@ -50,8 +50,26 @@ import { CreateUnleashContextPage } from 'component/context/CreateUnleashContext
import { CreateSegment } from 'component/segments/CreateSegment/CreateSegment';
import { EditSegment } from 'component/segments/EditSegment/EditSegment';
import { SegmentsList } from 'component/segments/SegmentList/SegmentList';
import { FunctionComponent } from 'react';
export const routes = [
interface Route {
path: string;
title: string;
type: string;
layout?: string;
parent?: string;
flag?: string;
hidden?: Boolean;
component: FunctionComponent;
menu: {
mobile?: boolean;
advanced?: boolean;
adminSettings?: boolean;
};
}
export const routes: Route[] = [
// Splash
{
path: '/splash/:splashId',
@ -108,7 +126,6 @@ export const routes = [
title: 'FeatureView',
component: FeatureView,
type: 'protected',
flags: E,
menu: {},
},
{
@ -516,7 +533,8 @@ export const routes = [
},
];
export const getRoute = path => routes.find(route => route.path === path);
export const getRoute = (path: string) =>
routes.find(route => route.path === path);
export const baseRoutes = routes.filter(route => !route.hidden);

View File

@ -4,7 +4,7 @@ import ArrowForwardIcon from '@material-ui/icons/ArrowForward';
import classnames from 'classnames';
import { Edit, ExpandMore } from '@material-ui/icons';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
import PercentageCircle from 'component/common/PercentageCircle/PercentageCircle';
import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton';

View File

@ -21,7 +21,7 @@ import PermissionSwitch from 'component/common/PermissionSwitch/PermissionSwitch
import { IProjectEnvironment } from 'interfaces/environments';
import { getEnabledEnvs } from './helpers';
import StringTruncator from 'component/common/StringTruncator/StringTruncator';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
interface ProjectEnvironmentListProps {
projectId: string;

View File

@ -1,33 +0,0 @@
import { Component } from 'react';
import { withRouter } from 'react-router-dom';
import PropTypes from 'prop-types';
class ScrollToTop extends Component {
static propTypes = {
location: PropTypes.object.isRequired,
};
componentDidUpdate(prevProps) {
if (this.props.location.pathname !== prevProps.location.pathname) {
if (
this.props.location.pathname.includes('/features/metrics') ||
this.props.location.pathname.includes('/features/variants') ||
this.props.location.pathname.includes('/features/strategies') ||
this.props.location.pathname.includes('/logs') ||
this.props.location.pathname.includes('/admin/api') ||
this.props.location.pathname.includes('/admin/users') ||
this.props.location.pathname.includes('/admin/auth')
) {
return;
}
window.scrollTo(0, 0);
}
}
render() {
return this.props.children;
}
}
export default withRouter(ScrollToTop);

View File

@ -7,7 +7,7 @@ import {
FiberManualRecordOutlined,
} from '@material-ui/icons';
import ConditionallyRender from 'component/common/ConditionallyRender';
import { CLOSE_SPLASH } from 'testIds';
import { CLOSE_SPLASH } from 'utils/testIds';
interface ISplashPageEnvironmentsContentProps {
components: React.ReactNode[];

View File

@ -28,7 +28,7 @@ import HeaderTitle from 'component/common/HeaderTitle';
import { useStyles } from './StrategiesList.styles';
import AccessContext from 'contexts/AccessContext';
import Dialogue from 'component/common/Dialogue';
import { ADD_NEW_STRATEGY_ID } from 'testIds';
import { ADD_NEW_STRATEGY_ID } from 'utils/testIds';
import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton';
import PermissionButton from 'component/common/PermissionButton/PermissionButton';
import { formatStrategyName } from 'utils/strategyNames';

View File

@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import { Button, TextField } from '@material-ui/core';
import styles from './DemoAuth.module.scss';
import { ReactComponent as Logo } from 'assets/img/logo.svg';
import { LOGIN_BUTTON, LOGIN_EMAIL_ID } from 'testIds';
import { LOGIN_BUTTON, LOGIN_EMAIL_ID } from 'utils/testIds';
import { useHistory } from 'react-router-dom';
import { useAuthApi } from 'hooks/api/actions/useAuthApi/useAuthApi';
import { useAuthUser } from 'hooks/api/getters/useAuth/useAuthUser';

View File

@ -3,9 +3,9 @@ import { AlertTitle, Alert } from '@material-ui/lab';
import classnames from 'classnames';
import { SyntheticEvent, useState } from 'react';
import { Link } from 'react-router-dom';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import useLoading from 'hooks/useLoading';
import { FORGOTTEN_PASSWORD_FIELD } from 'testIds';
import { FORGOTTEN_PASSWORD_FIELD } from 'utils/testIds';
import { formatApiPath } from 'utils/formatPath';
import ConditionallyRender from 'component/common/ConditionallyRender';
import DividerText from 'component/common/DividerText/DividerText';

View File

@ -3,7 +3,7 @@ import classnames from 'classnames';
import PropTypes from 'prop-types';
import { Button, Grid, TextField, Typography } from '@material-ui/core';
import { useHistory } from 'react-router';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import { useStyles } from './HostedAuth.styles';
import useQueryParams from 'hooks/useQueryParams';
import AuthOptions from '../common/AuthOptions/AuthOptions';
@ -12,7 +12,7 @@ import ConditionallyRender from 'component/common/ConditionallyRender';
import PasswordField from 'component/common/PasswordField/PasswordField';
import { useAuthApi } from 'hooks/api/actions/useAuthApi/useAuthApi';
import { useAuthUser } from 'hooks/api/getters/useAuth/useAuthUser';
import { LOGIN_BUTTON, LOGIN_EMAIL_ID, LOGIN_PASSWORD_ID } from 'testIds';
import { LOGIN_BUTTON, LOGIN_EMAIL_ID, LOGIN_PASSWORD_ID } from 'utils/testIds';
const HostedAuth = ({ authDetails, redirect }) => {
const commonStyles = useCommonStyles();

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
loginContainer: {

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
login: {
@ -27,7 +27,9 @@ export const useStyles = makeStyles(theme => ({
},
},
gradient: {
// @ts-expect-error
background: `linear-gradient(${theme.palette.login.gradient.top}, ${theme.palette.login.gradient.bottom})`,
// @ts-expect-error
color: theme.palette.login.main,
},
title: {

View File

@ -1,5 +1,5 @@
import ConditionallyRender from 'component/common/ConditionallyRender';
import { useStyles } from './Login.styles';
import { useStyles } from 'component/user/Login/Login.styles';
import useQueryParams from 'hooks/useQueryParams';
import ResetPasswordSuccess from '../common/ResetPasswordSuccess/ResetPasswordSuccess';
import StandaloneLayout from '../common/StandaloneLayout/StandaloneLayout';

View File

@ -4,13 +4,13 @@ import PropTypes from 'prop-types';
import { Button, TextField } from '@material-ui/core';
import ConditionallyRender from 'component/common/ConditionallyRender';
import { useHistory } from 'react-router';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import { useStyles } from './PasswordAuth.styles';
import useQueryParams from 'hooks/useQueryParams';
import AuthOptions from '../common/AuthOptions/AuthOptions';
import DividerText from 'component/common/DividerText/DividerText';
import { Alert } from '@material-ui/lab';
import { LOGIN_BUTTON, LOGIN_EMAIL_ID, LOGIN_PASSWORD_ID } from 'testIds';
import { LOGIN_BUTTON, LOGIN_EMAIL_ID, LOGIN_PASSWORD_ID } from 'utils/testIds';
import PasswordField from 'component/common/PasswordField/PasswordField';
import { useAuthApi } from 'hooks/api/actions/useAuthApi/useAuthApi';
import { useAuthUser } from 'hooks/api/getters/useAuth/useAuthUser';

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
loginContainer: {

View File

@ -5,7 +5,7 @@ import styles from './SimpleAuth.module.scss';
import { useHistory } from 'react-router-dom';
import { useAuthApi } from 'hooks/api/actions/useAuthApi/useAuthApi';
import { useAuthUser } from 'hooks/api/getters/useAuth/useAuthUser';
import { LOGIN_BUTTON, LOGIN_EMAIL_ID } from 'testIds';
import { LOGIN_BUTTON, LOGIN_EMAIL_ID } from 'utils/testIds';
import useToast from 'hooks/useToast';
import { formatUnknownError } from 'utils/formatUnknownError';

View File

@ -2,7 +2,7 @@ import React, { SyntheticEvent, useState } from 'react';
import { Button, Typography } from '@material-ui/core';
import classnames from 'classnames';
import { useStyles } from './EditProfile.styles';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import PasswordChecker from 'component/user/common/ResetPasswordForm/PasswordChecker/PasswordChecker';
import PasswordMatcher from 'component/user/common/ResetPasswordForm/PasswordMatcher/PasswordMatcher';
import { Alert } from '@material-ui/lab';

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles({
userProfileMenu: {

View File

@ -2,12 +2,12 @@ import React, { useEffect, useState } from 'react';
import classnames from 'classnames';
import { Avatar, Button, ClickAwayListener } from '@material-ui/core';
import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';
import { useStyles } from './UserProfile.styles';
import { useCommonStyles } from 'common.styles';
import { useStyles } from 'component/user/UserProfile/UserProfile.styles';
import { useCommonStyles } from 'themes/commonStyles';
import UserProfileContent from './UserProfileContent/UserProfileContent';
import { IUser } from 'interfaces/user';
import { ILocationSettings } from 'hooks/useLocationSettings';
import { HEADER_USER_AVATAR } from 'testIds';
import { HEADER_USER_AVATAR } from 'utils/testIds';
interface IUserProfileProps {
profile: IUser;

View File

@ -1,4 +1,4 @@
import { makeStyles } from '@material-ui/styles';
import { makeStyles } from '@material-ui/core/styles';
export const useStyles = makeStyles(theme => ({
profile: {

View File

@ -10,8 +10,8 @@ import {
Typography,
} from '@material-ui/core';
import classnames from 'classnames';
import { useStyles } from './UserProfileContent.styles';
import { useCommonStyles } from 'common.styles';
import { useStyles } from 'component/user/UserProfile/UserProfileContent/UserProfileContent.styles';
import { useCommonStyles } from 'themes/commonStyles';
import { Alert } from '@material-ui/lab';
import EditProfile from '../EditProfile/EditProfile';
import legacyStyles from '../../user.module.scss';

View File

@ -1,11 +1,11 @@
import { Button } from '@material-ui/core';
import classnames from 'classnames';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import { ReactComponent as GoogleSvg } from 'assets/icons/google.svg';
import LockRounded from '@material-ui/icons/LockRounded';
import ConditionallyRender from 'component/common/ConditionallyRender';
import { IAuthOptions } from 'hooks/api/getters/useAuth/useAuthEndpoint';
import { SSO_LOGIN_BUTTON } from 'testIds';
import { SSO_LOGIN_BUTTON } from 'utils/testIds';
interface IAuthOptionProps {
options?: IAuthOptions[];

View File

@ -1,7 +1,7 @@
import { Button, Typography } from '@material-ui/core';
import { Link } from 'react-router-dom';
import { INVALID_TOKEN_BUTTON } from 'testIds';
import { useCommonStyles } from 'common.styles';
import { INVALID_TOKEN_BUTTON } from 'utils/testIds';
import { useCommonStyles } from 'themes/commonStyles';
import classnames from 'classnames';
const InvalidToken = () => {

View File

@ -9,7 +9,7 @@ import React, {
useState,
} from 'react';
import { useHistory } from 'react-router';
import { useCommonStyles } from 'common.styles';
import { useCommonStyles } from 'themes/commonStyles';
import { OK } from 'constants/statusCodes';
import ConditionallyRender from 'component/common/ConditionallyRender';
import ResetPasswordError from '../ResetPasswordError/ResetPasswordError';

View File

@ -1,5 +1,5 @@
import 'whatwg-fetch';
import './app.css';
import 'themes/app.css';
import ReactDOM from 'react-dom';
import { Route, BrowserRouter as Router } from 'react-router-dom';
@ -8,12 +8,12 @@ import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend';
import { StylesProvider } from '@material-ui/core/styles';
import mainTheme from 'themes/mainTheme';
import { App } from './component/App';
import ScrollToTop from 'component/scrollToTop';
import AccessProvider from './component/providers/AccessProvider/AccessProvider';
import { App } from 'component/App';
import { ScrollTop } from 'component/common/ScrollTop/ScrollTop';
import AccessProvider from 'component/providers/AccessProvider/AccessProvider';
import { getBasePath } from 'utils/formatPath';
import UIProvider from './component/providers/UIProvider/UIProvider';
import { FeedbackCESProvider } from 'component/feedback/FeedbackCESContext/FeedbackCESProvider';
import UIProvider from 'component/providers/UIProvider/UIProvider';
ReactDOM.render(
<DndProvider backend={HTML5Backend}>
@ -24,9 +24,8 @@ ReactDOM.render(
<StylesProvider injectFirst>
<FeedbackCESProvider>
<CssBaseline />
<ScrollToTop>
<Route path="/" component={App} />
</ScrollToTop>
<ScrollTop />
<Route path="/" component={App} />
</FeedbackCESProvider>
</StylesProvider>
</ThemeProvider>

View File

@ -1,9 +0,0 @@
export const writeWarning = () => {
// eslint-disable-next-line no-console
console.log(
`%cThis is a warning!
Please do not use any JavaScript using copy/paste
from elsewhere on the web or any person.`,
'color:white;font-size: 1.8em;background:red'
);
};