diff --git a/frontend/routes/@[scope]/(_islands)/ScopeInviteForm.tsx b/frontend/routes/@[scope]/(_islands)/ScopeInviteForm.tsx index ed5c07c5..1fb2d689 100644 --- a/frontend/routes/@[scope]/(_islands)/ScopeInviteForm.tsx +++ b/frontend/routes/@[scope]/(_islands)/ScopeInviteForm.tsx @@ -4,6 +4,7 @@ import { useCallback, useRef } from "preact/hooks"; import { JSX } from "preact/jsx-runtime"; import { ScopeInvite } from "../../../utils/api_types.ts"; import { api, path } from "../../../utils/api.ts"; +import TbUsersPlus from "@preact-icons/tb/TbUsersPlus"; interface ScopeInviteFormProps { scope: string; @@ -53,7 +54,7 @@ export function ScopeInviteForm(props: ScopeInviteFormProps) { class="contents" onSubmit={onSubmit} > -
{error}
} diff --git a/frontend/routes/@[scope]/(_islands)/ScopeMemberLeave.tsx b/frontend/routes/@[scope]/(_islands)/ScopeMemberLeave.tsx new file mode 100644 index 00000000..4bcaf963 --- /dev/null +++ b/frontend/routes/@[scope]/(_islands)/ScopeMemberLeave.tsx @@ -0,0 +1,85 @@ +// Copyright 2024 the JSR authors. All rights reserved. MIT license. +import TbArrowRightFromArc from "@preact-icons/tb/TbArrowRightFromArc"; +import { useSignal } from "@preact/signals"; +import { useEffect } from "preact/hooks"; + +export function ScopeMemberLeave({ + userId, + isAdmin, + isLastAdmin, + scopeName = "", +}: { + userId: string; + isAdmin: boolean; + isLastAdmin: boolean; + scopeName?: string; +}) { + const scopeInput = useSignal(""); + const isEmptyInput = useSignal(false); + const isInvalidInput = useSignal(false); + + useEffect(() => { + const handler = setTimeout(() => { + validate(); + }, 300); + + return () => clearTimeout(handler); + }, [scopeInput.value]); + + const validate = () => { + isEmptyInput.value = scopeInput.value.length === 0; + isInvalidInput.value = scopeInput.value !== scopeName && + scopeInput.value.length > 0; + }; + + return ( + + ); +} diff --git a/frontend/routes/@[scope]/~/members.tsx b/frontend/routes/@[scope]/~/members.tsx index 32f860b8..a9f235be 100644 --- a/frontend/routes/@[scope]/~/members.tsx +++ b/frontend/routes/@[scope]/~/members.tsx @@ -18,6 +18,7 @@ import { scopeData } from "../../../utils/data.ts"; import TbTrash from "@preact-icons/tb/TbTrash"; import { scopeIAM } from "../../../utils/iam.ts"; import { ScopeIAM } from "../../../utils/iam.ts"; +import { ScopeMemberLeave } from "../(_islands)/ScopeMemberLeave.tsx"; export default define.page