= ({
+ externalAuthDevice,
+ deviceExchangeError,
+}) => {
let status = (
diff --git a/site/src/pages/GroupsPage/GroupPage.tsx b/site/src/pages/GroupsPage/GroupPage.tsx
index 5f00d3ec63..8d919dba44 100644
--- a/site/src/pages/GroupsPage/GroupPage.tsx
+++ b/site/src/pages/GroupsPage/GroupPage.tsx
@@ -211,10 +211,12 @@ export const GroupPage: FC = () => {
);
};
-const AddGroupMember: React.FC<{
+interface AddGroupMemberProps {
isLoading: boolean;
onSubmit: (user: User, reset: () => void) => void;
-}> = ({ isLoading, onSubmit }) => {
+}
+
+const AddGroupMember: FC = ({ isLoading, onSubmit }) => {
const [selectedUser, setSelectedUser] = useState(null);
const resetValues = () => {
@@ -254,12 +256,17 @@ const AddGroupMember: React.FC<{
);
};
-const GroupMemberRow = (props: {
+interface GroupMemberRowProps {
member: User;
group: Group;
canUpdate: boolean;
+}
+
+const GroupMemberRow: FC = ({
+ member,
+ group,
+ canUpdate,
}) => {
- const { member, group, canUpdate } = props;
const queryClient = useQueryClient();
const removeMemberMutation = useMutation(removeMember(queryClient));
diff --git a/site/src/pages/GroupsPage/SettingsGroupPageView.tsx b/site/src/pages/GroupsPage/SettingsGroupPageView.tsx
index f7e7282bb5..b28a5bfba4 100644
--- a/site/src/pages/GroupsPage/SettingsGroupPageView.tsx
+++ b/site/src/pages/GroupsPage/SettingsGroupPageView.tsx
@@ -28,13 +28,21 @@ const validationSchema = Yup.object({
quota_allowance: Yup.number().required().min(0).integer(),
});
-const UpdateGroupForm: FC<{
+interface UpdateGroupFormProps {
group: Group;
errors: unknown;
onSubmit: (data: FormData) => void;
onCancel: () => void;
isLoading: boolean;
-}> = ({ group, errors, onSubmit, onCancel, isLoading }) => {
+}
+
+const UpdateGroupForm: FC = ({
+ group,
+ errors,
+ onSubmit,
+ onCancel,
+ isLoading,
+}) => {
const form = useFormik({
initialValues: {
name: group.name,
diff --git a/site/src/pages/SetupPage/SetupPageView.tsx b/site/src/pages/SetupPage/SetupPageView.tsx
index bed1a49e43..1059fb34e1 100644
--- a/site/src/pages/SetupPage/SetupPageView.tsx
+++ b/site/src/pages/SetupPage/SetupPageView.tsx
@@ -1,19 +1,20 @@
import Checkbox from "@mui/material/Checkbox";
+import Link from "@mui/material/Link";
import TextField from "@mui/material/TextField";
-import { SignInLayout } from "components/SignInLayout/SignInLayout";
+import LoadingButton from "@mui/lab/LoadingButton";
import { type FormikContextType, useFormik } from "formik";
+import { type FC } from "react";
+import * as Yup from "yup";
+import type * as TypesGen from "api/typesGenerated";
import {
getFormHelpers,
nameValidator,
onChangeTrimmed,
} from "utils/formUtils";
-import * as Yup from "yup";
-import type * as TypesGen from "api/typesGenerated";
-import LoadingButton from "@mui/lab/LoadingButton";
+import { docs } from "utils/docs";
+import { SignInLayout } from "components/SignInLayout/SignInLayout";
import { FormFields, VerticalForm } from "components/Form/Form";
import { CoderIcon } from "components/Icons/CoderIcon";
-import Link from "@mui/material/Link";
-import { docs } from "utils/docs";
export const Language = {
emailLabel: "Email",
@@ -41,7 +42,7 @@ export interface SetupPageViewProps {
isLoading?: boolean;
}
-export const SetupPageView: React.FC = ({
+export const SetupPageView: FC = ({
onSubmit,
error,
isLoading,
diff --git a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.tsx b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.tsx
index 14593a3dc8..d88aaa48b5 100644
--- a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.tsx
+++ b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPage.tsx
@@ -16,7 +16,7 @@ import {
TemplateParametersSectionProps,
} from "components/TemplateParameters/TemplateParameters";
import { useClipboard } from "hooks/useClipboard";
-import { FC, useEffect, useState } from "react";
+import { type FC, useEffect, useState } from "react";
import { Helmet } from "react-helmet-async";
import { pageTitle } from "utils/page";
import { getInitialRichParameterValues } from "utils/richParameters";
@@ -24,7 +24,7 @@ import { paramsUsedToCreateWorkspace } from "utils/workspace";
type ButtonValues = Record;
-const TemplateEmbedPage = () => {
+const TemplateEmbedPage: FC = () => {
const { template } = useTemplateLayoutContext();
const { data: templateParameters } = useQuery({
queryKey: ["template", template.id, "embed"],
@@ -46,10 +46,15 @@ const TemplateEmbedPage = () => {
);
};
-export const TemplateEmbedPageView: FC<{
+interface TemplateEmbedPageViewProps {
template: Template;
templateParameters?: TemplateVersionParameter[];
-}> = ({ template, templateParameters }) => {
+}
+
+export const TemplateEmbedPageView: FC = ({
+ template,
+ templateParameters,
+}) => {
const [buttonValues, setButtonValues] = useState(
undefined,
);
diff --git a/site/src/pages/TemplatePage/TemplateLayout.tsx b/site/src/pages/TemplatePage/TemplateLayout.tsx
index d24fea7452..a54da49401 100644
--- a/site/src/pages/TemplatePage/TemplateLayout.tsx
+++ b/site/src/pages/TemplatePage/TemplateLayout.tsx
@@ -1,4 +1,10 @@
-import { createContext, type FC, Suspense, useContext } from "react";
+import {
+ createContext,
+ type FC,
+ type PropsWithChildren,
+ Suspense,
+ useContext,
+} from "react";
import { useQuery } from "react-query";
import { Outlet, useNavigate, useParams } from "react-router-dom";
import type { AuthorizationRequest } from "api/typesGenerated";
@@ -64,7 +70,7 @@ export const useTemplateLayoutContext = (): TemplateLayoutContextValue => {
return context;
};
-export const TemplateLayout: FC<{ children?: JSX.Element }> = ({
+export const TemplateLayout: FC = ({
children = ,
}) => {
const navigate = useNavigate();
diff --git a/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPageView.tsx b/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPageView.tsx
index 49911eedf3..2c75b473bc 100644
--- a/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPageView.tsx
+++ b/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPageView.tsx
@@ -7,7 +7,9 @@ import TableContainer from "@mui/material/TableContainer";
import TableHead from "@mui/material/TableHead";
import TableRow from "@mui/material/TableRow";
import PersonAdd from "@mui/icons-material/PersonAdd";
+import LoadingButton from "@mui/lab/LoadingButton";
import { type Interpolation, type Theme } from "@emotion/react";
+import { type FC, useState } from "react";
import type {
Group,
TemplateACL,
@@ -15,6 +17,16 @@ import type {
TemplateRole,
TemplateUser,
} from "api/typesGenerated";
+import { getGroupSubtitle } from "utils/groups";
+import { GroupAvatar } from "components/GroupAvatar/GroupAvatar";
+import { PageHeader, PageHeaderTitle } from "components/PageHeader/PageHeader";
+import {
+ MoreMenu,
+ MoreMenuContent,
+ MoreMenuItem,
+ MoreMenuTrigger,
+ ThreeDotsButton,
+} from "components/MoreMenu/MoreMenu";
import { AvatarData } from "components/AvatarData/AvatarData";
import { ChooseOne, Cond } from "components/Conditionals/ChooseOne";
import { EmptyState } from "components/EmptyState/EmptyState";
@@ -24,18 +36,6 @@ import {
UserOrGroupAutocomplete,
UserOrGroupAutocompleteValue,
} from "./UserOrGroupAutocomplete";
-import { type FC, useState } from "react";
-import { GroupAvatar } from "components/GroupAvatar/GroupAvatar";
-import { getGroupSubtitle } from "utils/groups";
-import { PageHeader, PageHeaderTitle } from "components/PageHeader/PageHeader";
-import LoadingButton from "@mui/lab/LoadingButton";
-import {
- MoreMenu,
- MoreMenuContent,
- MoreMenuItem,
- MoreMenuTrigger,
- ThreeDotsButton,
-} from "components/MoreMenu/MoreMenu";
type AddTemplateUserOrGroupProps = {
organizationId: string;
@@ -49,7 +49,7 @@ type AddTemplateUserOrGroupProps = {
) => void;
};
-const AddTemplateUserOrGroup: React.FC = ({
+const AddTemplateUserOrGroup: FC = ({
isLoading,
onSubmit,
templateID,
diff --git a/site/src/pages/TemplateVersionEditorPage/FileDialog.tsx b/site/src/pages/TemplateVersionEditorPage/FileDialog.tsx
index 5e1d8e257e..64936397e6 100644
--- a/site/src/pages/TemplateVersionEditorPage/FileDialog.tsx
+++ b/site/src/pages/TemplateVersionEditorPage/FileDialog.tsx
@@ -1,17 +1,25 @@
import TextField from "@mui/material/TextField";
import { ConfirmDialog } from "components/Dialogs/ConfirmDialog/ConfirmDialog";
import { Stack } from "components/Stack/Stack";
-import { ChangeEvent, FC, useState } from "react";
+import { type ChangeEvent, type FC, useState } from "react";
import { allowedExtensions, isAllowedFile } from "utils/templateVersion";
-import { FileTree, isFolder, validatePath } from "utils/filetree";
+import { type FileTree, isFolder, validatePath } from "utils/filetree";
-export const CreateFileDialog: FC<{
+interface CreateFileDialogProps {
onClose: () => void;
checkExists: (path: string) => boolean;
onConfirm: (path: string) => void;
open: boolean;
fileTree: FileTree;
-}> = ({ checkExists, onClose, onConfirm, open, fileTree }) => {
+}
+
+export const CreateFileDialog: FC = ({
+ checkExists,
+ onClose,
+ onConfirm,
+ open,
+ fileTree,
+}) => {
const [pathValue, setPathValue] = useState("");
const [error, setError] = useState();
const handleChange = (event: ChangeEvent) => {
@@ -86,12 +94,19 @@ export const CreateFileDialog: FC<{
);
};
-export const DeleteFileDialog: FC<{
+interface DeleteFileDialogProps {
onClose: () => void;
onConfirm: () => void;
open: boolean;
filename: string;
-}> = ({ onClose, onConfirm, open, filename }) => {
+}
+
+export const DeleteFileDialog: FC = ({
+ onClose,
+ onConfirm,
+ open,
+ filename,
+}) => {
return (
void;
onConfirm: (filename: string) => void;
checkExists: (path: string) => boolean;
open: boolean;
filename: string;
fileTree: FileTree;
-}> = ({ checkExists, onClose, onConfirm, open, filename, fileTree }) => {
+}
+
+export const RenameFileDialog: FC = ({
+ checkExists,
+ onClose,
+ onConfirm,
+ open,
+ filename,
+ fileTree,
+}) => {
const [pathValue, setPathValue] = useState(filename);
const [error, setError] = useState();
const handleChange = (event: ChangeEvent) => {
diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionStatusBadge.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionStatusBadge.tsx
index e9e470b09a..a3e7068e6b 100644
--- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionStatusBadge.tsx
+++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionStatusBadge.tsx
@@ -5,9 +5,13 @@ import ErrorIcon from "@mui/icons-material/ErrorOutline";
import CheckIcon from "@mui/icons-material/CheckOutlined";
import { Pill, type PillType } from "components/Pill/Pill";
-export const TemplateVersionStatusBadge: FC<{
+interface TemplateVersionStatusBadgeProps {
version: TemplateVersion;
-}> = ({ version }) => {
+}
+
+export const TemplateVersionStatusBadge: FC<
+ TemplateVersionStatusBadgeProps
+> = ({ version }) => {
const { text, icon, type } = getStatus(version);
return (
diff --git a/site/src/pages/TemplatesPage/EmptyTemplates.tsx b/site/src/pages/TemplatesPage/EmptyTemplates.tsx
index 5dd5f56481..cea7969c7e 100644
--- a/site/src/pages/TemplatesPage/EmptyTemplates.tsx
+++ b/site/src/pages/TemplatesPage/EmptyTemplates.tsx
@@ -35,10 +35,15 @@ const findFeaturedExamples = (examples: TemplateExample[]) => {
return featuredExamples;
};
-export const EmptyTemplates: FC<{
+interface EmptyTemplatesProps {
canCreateTemplates: boolean;
examples: TemplateExample[];
-}> = ({ canCreateTemplates, examples }) => {
+}
+
+export const EmptyTemplates: FC = ({
+ canCreateTemplates,
+ examples,
+}) => {
const featuredExamples = findFeaturedExamples(examples);
if (canCreateTemplates) {
diff --git a/site/src/pages/UsersPage/UsersPage.tsx b/site/src/pages/UsersPage/UsersPage.tsx
index 1768223c9c..a7db041bd6 100644
--- a/site/src/pages/UsersPage/UsersPage.tsx
+++ b/site/src/pages/UsersPage/UsersPage.tsx
@@ -1,4 +1,4 @@
-import { type FC, type ReactNode, useState } from "react";
+import { type FC, type PropsWithChildren, useState } from "react";
import { type User } from "api/typesGenerated";
import { roles } from "api/queries/roles";
@@ -35,7 +35,7 @@ import { UsersPageView } from "./UsersPageView";
import { displayError, displaySuccess } from "components/GlobalSnackbar/utils";
import { usePaginatedQuery } from "hooks/usePaginatedQuery";
-export const UsersPage: FC<{ children?: ReactNode }> = () => {
+export const UsersPage: FC = () => {
const queryClient = useQueryClient();
const navigate = useNavigate();
diff --git a/site/src/pages/WorkspacePage/BuildRow.tsx b/site/src/pages/WorkspacePage/BuildRow.tsx
index 41071787ab..1a23baff7b 100644
--- a/site/src/pages/WorkspacePage/BuildRow.tsx
+++ b/site/src/pages/WorkspacePage/BuildRow.tsx
@@ -1,5 +1,6 @@
import TableCell from "@mui/material/TableCell";
import { type CSSObject, type Interpolation, type Theme } from "@emotion/react";
+import { type FC } from "react";
import { useNavigate } from "react-router-dom";
import type { WorkspaceBuild } from "api/typesGenerated";
import { BuildAvatar } from "components/BuildAvatar/BuildAvatar";
@@ -21,7 +22,7 @@ const transitionMessages = {
delete: "deleted",
};
-export const BuildRow: React.FC = ({ build }) => {
+export const BuildRow: FC = ({ build }) => {
const initiatedBy = getDisplayWorkspaceBuildInitiatedBy(build);
const navigate = useNavigate();
const clickableProps = useClickable(() =>
diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx
index 1820e1b795..132e54aaeb 100644
--- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx
+++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx
@@ -27,12 +27,19 @@ export type WorkspaceSettingsFormValues = {
automatic_updates: AutomaticUpdates;
};
-export const WorkspaceSettingsForm: FC<{
+interface WorkspaceSettingsFormProps {
workspace: Workspace;
error: unknown;
onCancel: () => void;
onSubmit: (values: WorkspaceSettingsFormValues) => Promise;
-}> = ({ onCancel, onSubmit, workspace, error }) => {
+}
+
+export const WorkspaceSettingsForm: FC = ({
+ onCancel,
+ onSubmit,
+ workspace,
+ error,
+}) => {
const formEnabled =
!workspace.template_require_active_version || workspace.allow_renames;