diff --git a/studio/components/to-be-cleaned/ModalsDeprecated/InviteMemberModal.tsx b/studio/components/to-be-cleaned/ModalsDeprecated/InviteMemberModal.tsx index 7cd7d3329ec..561215fe7be 100644 --- a/studio/components/to-be-cleaned/ModalsDeprecated/InviteMemberModal.tsx +++ b/studio/components/to-be-cleaned/ModalsDeprecated/InviteMemberModal.tsx @@ -8,8 +8,7 @@ import { Modal } from '@supabase/ui' import { API_URL } from 'lib/constants' import { useOrganizationDetail, useStore } from 'hooks' import { toJS } from 'mobx' - - +import { Member } from 'types' /** * Endpoints (delete when finished) @@ -28,7 +27,6 @@ import { toJS } from 'mobx' * */ - /** * Modal to invite member to Organization * @@ -40,16 +38,17 @@ import { toJS } from 'mobx' const PageContext = createContext(null) function InviteMemberModal({ organization, members = [], user }: any) { - const PageState = useLocalObservable(() => ({ - members: [], + members: [], addMemberLoading: false, emailAddress: '', emailIsValid() { return String(this.emailAddress) .toLowerCase() - .match(/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/); - } + .match( + /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + ) + }, })) const { ui } = useStore() const { mutateOrgMembers } = useOrganizationDetail(ui.selectedOrganization?.slug || '') @@ -74,7 +73,7 @@ function InviteMemberModal({ organization, members = [], user }: any) { const response = await post(`${API_URL}/organizations/${orgSlug}/members/invite`, { invited_email: PageState.emailAddress, - owner_id: toJS(user.id) + owner_id: toJS(user.id), }) if (isNil(response)) { ui.setNotification({ category: 'error', message: 'Failed to add member' }) @@ -85,14 +84,25 @@ function InviteMemberModal({ organization, members = [], user }: any) { }) PageState.addMemberLoading = false } else { - const newMember = response + const newMember: Member = { + // [Joshen] Setting a random id for now to fit the Member interface + id: 0, + invited_at: response.invited_at, + is_owner: false, + profile: { + id: 0, + primary_email: response.invited_email, + username: response.invited_email[0], + }, + } mutateOrgMembers([...PageState.members, newMember]) + ui.setNotification({ category: 'success', message: 'Successfully added new member.' }) toggle() } } - function onEmailInputChange(e) { + function onEmailInputChange(e: any) { PageState.emailAddress = e.target.value } @@ -110,7 +120,7 @@ function InviteMemberModal({ organization, members = [], user }: any) { layout="vertical" hideFooter > -
+
+ />
@@ -142,4 +152,4 @@ function InviteMemberModal({ organization, members = [], user }: any) { ) } -export default observer(InviteMemberModal) \ No newline at end of file +export default observer(InviteMemberModal) diff --git a/studio/pages/org/[slug]/settings.tsx b/studio/pages/org/[slug]/settings.tsx index d9e24eed4a4..59a064cd3f6 100644 --- a/studio/pages/org/[slug]/settings.tsx +++ b/studio/pages/org/[slug]/settings.tsx @@ -42,11 +42,11 @@ const PageContext = createContext(null) // Invite is expired if older than 24hrs function inviteExpired(timestamp: Date) { - const inviteDate = new Date(timestamp); - const now = new Date(); + const inviteDate = new Date(timestamp) + const now = new Date() var timeBetween = now.valueOf() - inviteDate.valueOf() - if(timeBetween / 1000 / 60 / 60 < 24) { - return true; + if (timeBetween / 1000 / 60 / 60 < 24) { + return true } } @@ -69,11 +69,11 @@ const OrgSettingsLayout = withAuth( get filteredMembers() { const temp = this.members.filter((x: any) => { let profile = x.profile - if(profile) { + if (profile) { return ( profile.username.includes(this.membersFilterString) || profile.primary_email.includes(this.membersFilterString) - ) + ) } if (x.invited_email) { return x.invited_email.includes(this.membersFilterString) @@ -237,7 +237,7 @@ const GeneralSettings = observer(() => { } return ( -
+
{ onCancel={toggle} header={
-
Delete organisation
- Are you sure? +
Delete organisation
+ Are you sure?
} size="small" @@ -361,9 +361,9 @@ const OrgDeleteModal = observer(() => { }} > {({ isSubmitting }: { isSubmitting: boolean }) => ( -
+
-

+

This action cannot be undone. This will permanently delete the {orgName}{' '} organization and remove all of its projects. @@ -436,7 +436,7 @@ const TeamSettings = observer(() => { return ( <> -

+
{PageState.isOrgOwner ? ( @@ -456,7 +456,7 @@ const TeamSettings = observer(() => { )}
-
+
@@ -502,24 +502,28 @@ const MembersView = observer(() => {
- {x.invited_id ? - ( ) - : ( - )} - + {x.invited_id ? ( + + + + ) : ( + + )}
- {x.profile?.username && !x.invited_id && ( - <> - {x.profile?.username} -
- - ) } - {x.profile ? x.profile.primary_email : ''} + {x.profile?.username && !x.invited_id && ( + <> + {x.profile?.username} +
+ + )} + + {x.profile ? x.profile.primary_email : ''} +
@@ -527,7 +531,7 @@ const MembersView = observer(() => { {x.invited_id && ( - {inviteExpired(x.invited_at) ? 'Invited' : 'Expired'} + {inviteExpired(x.invited_at) ? 'Invited' : 'Expired'} )} @@ -635,7 +639,10 @@ const OwnerDropdown = observer(({ members, member }: any) => { async function handleResendInvite(id: number) { setLoading(true) - const response = await post(`${API_URL}/organizations/${orgSlug}/members/invite?invited_id=${id}`, {}) + const response = await post( + `${API_URL}/organizations/${orgSlug}/members/invite?invited_id=${id}`, + {} + ) if (response.error) { ui.setNotification({ @@ -653,7 +660,10 @@ const OwnerDropdown = observer(({ members, member }: any) => { async function handleRevokeInvitation(id: number) { setLoading(true) - const response = await delete_(`${API_URL}/organizations/${orgSlug}/members/invite?invited_id=${id}`, {}) + const response = await delete_( + `${API_URL}/organizations/${orgSlug}/members/invite?invited_id=${id}`, + {} + ) if (response.error) { ui.setNotification({ diff --git a/studio/types/base.ts b/studio/types/base.ts index f89b9da7edf..a99454c52ee 100644 --- a/studio/types/base.ts +++ b/studio/types/base.ts @@ -55,6 +55,8 @@ export interface Member { primary_email: string username: string } + invited_id?: number + invited_at?: string } export interface ResponseError {