Add eslint rule and fix as many issues as possible

This commit is contained in:
Khoa Le
2023-06-19 23:42:04 -04:00
parent e9eacc445d
commit 9d33e4756b
689 changed files with 9446 additions and 21821 deletions
+42 -42
View File
@@ -1,16 +1,16 @@
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import Head from 'next/head';
import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import Head from "next/head";
import Plan from '@app/components/billing/Plan';
import NavHeader from '@app/components/navigation/NavHeader';
import { plans as plansConstant } from '@app/const';
import Plan from "@app/components/billing/Plan";
import NavHeader from "@app/components/navigation/NavHeader";
import { plans as plansConstant } from "@app/const";
import getOrganizationSubscriptions from '../../api/organization/GetOrgSubscription';
import getOrganizationUsers from '../../api/organization/GetOrgUsers';
import getOrganizationSubscriptions from "../../api/organization/GetOrgSubscription";
import getOrganizationUsers from "../../api/organization/GetOrgUsers";
export default function SettingsBilling() {
const [currentPlan, setCurrentPlan] = useState('');
const [currentPlan, setCurrentPlan] = useState("");
const [numUsers, setNumUsers] = useState(0);
const { t } = useTranslation();
@@ -18,50 +18,50 @@ export default function SettingsBilling() {
const plans = [
{
key: 1,
name: t('billing.starter.name')!,
price: t('billing.free')!,
priceExplanation: t('billing.starter.price-explanation')!,
text: t('billing.starter.text')!,
subtext: t('billing.starter.subtext')!,
buttonTextMain: t('billing.downgrade')!,
buttonTextSecondary: t('billing.learn-more')!,
name: t("billing.starter.name")!,
price: t("billing.free")!,
priceExplanation: t("billing.starter.price-explanation")!,
text: t("billing.starter.text")!,
subtext: t("billing.starter.subtext")!,
buttonTextMain: t("billing.downgrade")!,
buttonTextSecondary: t("billing.learn-more")!,
current: currentPlan === plansConstant.starter
},
{
key: 2,
name: 'Team',
price: '$8',
priceExplanation: t('billing.professional.price-explanation')!,
text: 'Unlimited members, up to 10 projects. Additional developer experience features.',
buttonTextMain: t('billing.upgrade')!,
buttonTextSecondary: t('billing.learn-more')!,
name: "Team",
price: "$8",
priceExplanation: t("billing.professional.price-explanation")!,
text: "Unlimited members, up to 10 projects. Additional developer experience features.",
buttonTextMain: t("billing.upgrade")!,
buttonTextSecondary: t("billing.learn-more")!,
current: currentPlan === plansConstant.team
},
{
key: 3,
name: t('billing.professional.name')!,
price: '$18',
priceExplanation: t('billing.professional.price-explanation')!,
text: t('billing.enterprise.text')!,
subtext: t('billing.professional.subtext')!,
buttonTextMain: t('billing.upgrade')!,
buttonTextSecondary: t('billing.learn-more')!,
name: t("billing.professional.name")!,
price: "$18",
priceExplanation: t("billing.professional.price-explanation")!,
text: t("billing.enterprise.text")!,
subtext: t("billing.professional.subtext")!,
buttonTextMain: t("billing.upgrade")!,
buttonTextSecondary: t("billing.learn-more")!,
current: currentPlan === plansConstant.professional
},
{
key: 4,
name: t('billing.enterprise.name')!,
price: t('billing.custom-pricing')!,
text: 'Boost the security and efficiency of your engineering teams.',
buttonTextMain: t('billing.schedule-demo')!,
buttonTextSecondary: t('billing.learn-more')!,
name: t("billing.enterprise.name")!,
price: t("billing.custom-pricing")!,
text: "Boost the security and efficiency of your engineering teams.",
buttonTextMain: t("billing.schedule-demo")!,
buttonTextSecondary: t("billing.learn-more")!,
current: false
}
];
useEffect(() => {
(async () => {
const orgId = localStorage.getItem('orgData.id') as string;
const orgId = localStorage.getItem("orgData.id") as string;
const subscriptions = await getOrganizationSubscriptions({
orgId
});
@@ -78,31 +78,31 @@ export default function SettingsBilling() {
return (
<div className="flex flex-col justify-between bg-bunker-800 pb-4 text-white">
<Head>
<title>{t('common.head-title', { title: t('billing.title') })}</title>
<title>{t("common.head-title", { title: t("billing.title") })}</title>
<link rel="icon" href="/infisical.ico" />
</Head>
<div className="flex flex-row">
<div className="w-full pb-2">
<NavHeader pageName={t('billing.title')} />
<NavHeader pageName={t("billing.title")} />
<div className="my-8 ml-6 flex max-w-5xl flex-row items-center justify-between text-xl">
<div className="flex flex-col items-start justify-start text-3xl">
<p className="mr-4 font-semibold text-gray-200">{t('billing.title')}</p>
<p className="mr-4 text-base font-normal text-gray-400">{t('billing.description')}</p>
<p className="mr-4 font-semibold text-gray-200">{t("billing.title")}</p>
<p className="mr-4 text-base font-normal text-gray-400">{t("billing.description")}</p>
</div>
</div>
<div className="ml-6 flex w-max flex-col text-mineshaft-50">
<p className="text-xl font-semibold">{t('billing.subscription')}</p>
<p className="text-xl font-semibold">{t("billing.subscription")}</p>
<div className="mt-4 grid grid-cols-2 grid-rows-2 gap-y-6 gap-x-3 overflow-x-auto">
{plans.map((plan) => (
<Plan key={plan.name} plan={plan} />
))}
</div>
<p className="mt-12 text-xl font-bold">{t('billing.current-usage')}</p>
<p className="mt-12 text-xl font-bold">{t("billing.current-usage")}</p>
<div className="flex flex-row">
<div className="mr-4 mt-8 flex w-60 flex-col items-center justify-center rounded-md bg-white/5 pt-6 pb-10 text-gray-300">
<p className="text-6xl font-bold">{numUsers}</p>
<p className="text-gray-300">
{numUsers > 1 ? 'Organization members' : 'Organization member'}
{numUsers > 1 ? "Organization members" : "Organization member"}
</p>
</div>
{/* <div className="mr-4 mt-8 text-gray-300 w-60 pt-6 pb-10 rounded-md bg-white/5 flex justify-center items-center flex flex-col">
@@ -1,8 +1,8 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import { useTranslation } from 'react-i18next';
import Head from 'next/head';
import { useTranslation } from "react-i18next";
import Head from "next/head";
import { OrgSettingsPage } from '@app/views/Settings/OrgSettingsPage';
import { OrgSettingsPage } from "@app/views/Settings/OrgSettingsPage";
export default function SettingsOrg() {
const { t } = useTranslation();
@@ -10,7 +10,7 @@ export default function SettingsOrg() {
return (
<>
<Head>
<title>{t('common.head-title', { title: t('settings.org.title') })}</title>
<title>{t("common.head-title", { title: t("settings.org.title") })}</title>
<link rel="icon" href="/infisical.ico" />
</Head>
<OrgSettingsPage />
@@ -1,7 +1,7 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
import Head from 'next/head';
import Head from "next/head";
import { CreateServiceAccountPage } from '@app/views/Settings/CreateServiceAccountPage';
import { CreateServiceAccountPage } from "@app/views/Settings/CreateServiceAccountPage";
export default function ServiceAccountPage() {
return (
+55 -55
View File
@@ -1,26 +1,26 @@
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import Head from 'next/head';
import { useRouter } from 'next/router';
import { faBan,faCheck, faPlus, faXmark } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import Head from "next/head";
import { useRouter } from "next/router";
import { faBan,faCheck, faPlus, faXmark } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import Button from '@app/components/basic/buttons/Button';
import InputField from '@app/components/basic/InputField';
import ListBox from '@app/components/basic/Listbox';
import ApiKeyTable from '@app/components/basic/table/ApiKeyTable';
import NavHeader from '@app/components/navigation/NavHeader';
import checkPassword from '@app/components/utilities/checks/checkPassword';
import changePassword from '@app/components/utilities/cryptography/changePassword';
import issueBackupKey from '@app/components/utilities/cryptography/issueBackupKey';
import Button from "@app/components/basic/buttons/Button";
import InputField from "@app/components/basic/InputField";
import ListBox from "@app/components/basic/Listbox";
import ApiKeyTable from "@app/components/basic/table/ApiKeyTable";
import NavHeader from "@app/components/navigation/NavHeader";
import checkPassword from "@app/components/utilities/checks/checkPassword";
import changePassword from "@app/components/utilities/cryptography/changePassword";
import issueBackupKey from "@app/components/utilities/cryptography/issueBackupKey";
import {
useGetCommonPasswords,
useRevokeAllSessions} from '@app/hooks/api';
import { SecuritySection } from '@app/views/Settings/PersonalSettingsPage/SecuritySection/SecuritySection';
useRevokeAllSessions} from "@app/hooks/api";
import { SecuritySection } from "@app/views/Settings/PersonalSettingsPage/SecuritySection/SecuritySection";
import AddApiKeyDialog from '../../../components/basic/dialog/AddApiKeyDialog';
import getAPIKeys from '../../api/apiKey/getAPIKeys';
import getUser from '../../api/user/getUser';
import AddApiKeyDialog from "../../../components/basic/dialog/AddApiKeyDialog";
import getAPIKeys from "../../api/apiKey/getAPIKeys";
import getUser from "../../api/user/getUser";
type Errors = {
length?: string,
@@ -33,12 +33,12 @@ type Errors = {
export default function PersonalSettings() {
const { data: commonPasswords } = useGetCommonPasswords();
const [personalEmail, setPersonalEmail] = useState('');
const [personalName, setPersonalName] = useState('');
const [personalEmail, setPersonalEmail] = useState("");
const [personalName, setPersonalName] = useState("");
const [currentPasswordError, setCurrentPasswordError] = useState(false);
const [currentPassword, setCurrentPassword] = useState('');
const [newPassword, setNewPassword] = useState('');
const [backupPassword, setBackupPassword] = useState('');
const [currentPassword, setCurrentPassword] = useState("");
const [newPassword, setNewPassword] = useState("");
const [backupPassword, setBackupPassword] = useState("");
const [passwordChanged, setPasswordChanged] = useState(false);
const [backupKeyIssued, setBackupKeyIssued] = useState(false);
const [backupKeyError, setBackupKeyError] = useState(false);
@@ -50,11 +50,11 @@ export default function PersonalSettings() {
const { t, i18n } = useTranslation();
const router = useRouter();
const lang = router.locale ?? 'en';
const lang = router.locale ?? "en";
const setLanguage = async (to: string) => {
router.push(router.asPath, router.asPath, { locale: to });
localStorage.setItem('lang', to);
localStorage.setItem("lang", to);
i18n.changeLanguage(to);
};
@@ -80,7 +80,7 @@ export default function PersonalSettings() {
return (
<div className="flex max-h-screen flex-col justify-between bg-bunker-800 text-white">
<Head>
<title>{t('common.head-title', { title: t('settings.personal.title') })}</title>
<title>{t("common.head-title", { title: t("settings.personal.title") })}</title>
<link rel="icon" href="/infisical.ico" />
</Head>
<AddApiKeyDialog
@@ -91,26 +91,26 @@ export default function PersonalSettings() {
/>
<div className="flex flex-row">
<div className="max-h-screen w-full pb-2">
<NavHeader pageName={t('settings.personal.title')} isProjectRelated={false} />
<NavHeader pageName={t("settings.personal.title")} isProjectRelated={false} />
<div className="ml-6 mt-8 mb-6 flex max-w-5xl flex-row items-center justify-between text-xl">
<div className="flex flex-col items-start justify-start text-3xl">
<p className="mr-4 font-semibold text-gray-200">{t('settings.personal.title')}</p>
<p className="mr-4 font-semibold text-gray-200">{t("settings.personal.title")}</p>
<p className="mr-4 text-base font-normal text-gray-400">
{t('settings.personal.description')}
{t("settings.personal.description")}
</p>
</div>
</div>
<div className="ml-6 mr-6 flex max-w-5xl flex-col text-mineshaft-50">
<div className="mb-6 mt-4 flex w-full flex-col items-start rounded-md bg-white/5 px-6 pt-6 pb-6">
<p className="self-start text-xl font-semibold">
{t('settings.personal.change-language')}
{t("settings.personal.change-language")}
</p>
<div className="w-ful mt-4 max-h-28">
<ListBox
isSelected={lang}
onChange={setLanguage}
data={['en', 'ko', 'fr', 'es']}
text={`${t('common.language')}: `}
data={["en", "ko", "fr", "es"]}
text={`${t("common.language")}: `}
/>
</div>
</div>
@@ -119,15 +119,15 @@ export default function PersonalSettings() {
<div className="flex w-full flex-row justify-between">
<div className="flex w-full flex-col">
<p className="mb-3 text-xl font-semibold">
{t('settings.personal.api-keys.title')}
{t("settings.personal.api-keys.title")}
</p>
<p className="text-sm text-gray-400">
{t('settings.personal.api-keys.description')}
{t("settings.personal.api-keys.description")}
</p>
</div>
<div className="mt-2 w-40">
<Button
text={String(t('settings.personal.api-keys.add-new'))}
text={String(t("settings.personal.api-keys.add-new"))}
onButtonPressed={() => {
setIsAddApiKeyDialogOpen(true);
}}
@@ -144,13 +144,13 @@ export default function PersonalSettings() {
<div className="flex w-full max-w-5xl flex-row items-center justify-between">
<div className="flex w-full max-w-3xl flex-col justify-between">
<p className="mb-3 min-w-max text-xl font-semibold">
{t('section.password.change')}
{t("section.password.change")}
</p>
</div>
</div>
<div className="w-full max-w-xl">
<InputField
label={t('section.password.current') as string}
label={t("section.password.current") as string}
onChangeHandler={(password) => {
setCurrentPassword(password);
}}
@@ -158,13 +158,13 @@ export default function PersonalSettings() {
value={currentPassword}
isRequired
error={currentPasswordError}
errorText={t('section.password.current-wrong') as string}
errorText={t("section.password.current-wrong") as string}
autoComplete="current-password"
id="current-password"
/>
<div className="py-2" />
<InputField
label={t('section.password.new') as string}
label={t("section.password.new") as string}
onChangeHandler={(password) => {
setNewPassword(password);
checkPassword({
@@ -183,7 +183,7 @@ export default function PersonalSettings() {
</div>
{Object.keys(errors).length > 0 && (
<div className="mt-4 flex w-full flex-col items-start rounded-md bg-white/5 px-2 py-2">
<div className="mb-2 text-sm text-gray-400">{t('section.password.validate-base')}</div>
<div className="mb-2 text-sm text-gray-400">{t("section.password.validate-base")}</div>
{Object.keys(errors).map((key) => {
if (errors[key as keyof Errors]) {
return (
@@ -207,7 +207,7 @@ export default function PersonalSettings() {
)}
<div className="mt-3 flex w-52 flex-row items-center pr-3">
<Button
text={t('section.password.change') as string}
text={t("section.password.change") as string}
onButtonPressed={() => {
const errorCheck = checkPassword({
password: newPassword,
@@ -226,15 +226,15 @@ export default function PersonalSettings() {
);
}
}}
active={Object.keys(errors).length === 0 && currentPassword !== ''}
active={Object.keys(errors).length === 0 && currentPassword !== ""}
color="mineshaft"
size="md"
textDisabled={t('section.password.change') as string}
textDisabled={t("section.password.change") as string}
/>
<FontAwesomeIcon
icon={faCheck}
className={`ml-4 text-3xl text-primary ${
passwordChanged ? 'opacity-100' : 'opacity-0'
passwordChanged ? "opacity-100" : "opacity-0"
} duration-300`}
/>
</div>
@@ -249,7 +249,7 @@ export default function PersonalSettings() {
text="Revoke all"
onButtonPressed={async () => {
await revokeAllSessions.mutateAsync();
router.push('/login');
router.push("/login");
}}
color="mineshaft"
icon={faBan}
@@ -266,32 +266,32 @@ export default function PersonalSettings() {
<div className="flex w-full max-w-5xl flex-row items-center justify-between">
<div className="flex w-full max-w-3xl flex-col justify-between">
<p className="mb-3 min-w-max text-xl font-semibold">
{t('settings.personal.emergency.name')}
{t("settings.personal.emergency.name")}
</p>
<p className="min-w-max text-sm text-mineshaft-300">
{t('settings.personal.emergency.text1')}
{t("settings.personal.emergency.text1")}
</p>
<p className="mb-5 min-w-max text-sm text-mineshaft-300">
{t('settings.personal.emergency.text2')}
{t("settings.personal.emergency.text2")}
</p>
</div>
</div>
<div className="mb-4 w-full max-w-xl">
<InputField
label={t('section.password.current') as string}
label={t("section.password.current") as string}
onChangeHandler={setBackupPassword}
type="password"
value={backupPassword}
isRequired
error={backupKeyError}
errorText={t('section.password.current-wrong') as string}
errorText={t("section.password.current-wrong") as string}
autoComplete="current-password"
id="current-password"
/>
</div>
<div className="mt-3 flex w-60 flex-row items-center">
<Button
text={t('settings.personal.emergency.download') as string}
text={t("settings.personal.emergency.download") as string}
onButtonPressed={() => {
issueBackupKey({
email: personalEmail,
@@ -303,13 +303,13 @@ export default function PersonalSettings() {
}}
color="mineshaft"
size="md"
active={backupPassword !== ''}
textDisabled={t('settings.personal.emergency.download') as string}
active={backupPassword !== ""}
textDisabled={t("settings.personal.emergency.download") as string}
/>
<FontAwesomeIcon
icon={faCheck}
className={`ml-4 text-3xl text-primary ${
backupKeyIssued ? 'opacity-100' : 'opacity-0'
backupKeyIssued ? "opacity-100" : "opacity-0"
} duration-300`}
/>
</div>
+4 -4
View File
@@ -1,7 +1,7 @@
import { useTranslation } from 'react-i18next';
import Head from 'next/head';
import { useTranslation } from "react-i18next";
import Head from "next/head";
import { ProjectSettingsPage } from '@app/views/Settings/ProjectSettingsPage';
import { ProjectSettingsPage } from "@app/views/Settings/ProjectSettingsPage";
const ProjectSettings = () => {
const { t } = useTranslation();
@@ -9,7 +9,7 @@ const ProjectSettings = () => {
return (
<>
<Head>
<title>{t('common.head-title', { title: t('settings.project.title') })}</title>
<title>{t("common.head-title", { title: t("settings.project.title") })}</title>
<link rel="icon" href="/infisical.ico" />
</Head>
<ProjectSettingsPage />