refactor(members): consolidate Platform Admin + Org members into shared useMembers

- useMembers.ts gains a scope param ('organisation' | 'platform') on list,
  invite, update-role, and remove; endpoints branch accordingly.
- Platform Admin's [id].vue now consumes useMembers via scope='platform';
  deleted the duplicated useInviteOrganisationMember / useRemoveOrganisationMember
  / useUpdateOrganisationMemberRole helpers from useAdmin.ts.
- Deduplicated InviteMemberPayload / UpdateMemberRolePayload / AdminOrganisationMember
  from types/admin.ts; Member is now the canonical type.
- SettingsMembers.vue and EditMemberRoleDialog.vue removed (no remaining imports).
- InviteMemberDialog accepts an optional scope prop and is restricted to the
  two organisation-level roles matching the /members UX.
This commit is contained in:
2026-04-16 22:30:42 +02:00
parent 7695011f4b
commit 0ca7c0f20f
10 changed files with 92 additions and 747 deletions

View File

@@ -3,13 +3,16 @@ import {
useAdminOrganisation,
useUpdateAdminOrganisation,
useDeleteAdminOrganisation,
useInviteOrganisationMember,
useRemoveOrganisationMember,
useUpdateOrganisationMemberRole,
} from '@/composables/api/useAdmin'
import {
useInviteMember,
useRemoveMember,
useUpdateMemberRole,
} from '@/composables/api/useMembers'
import { useAuthStore } from '@/stores/useAuthStore'
import { useOrganisationStore } from '@/stores/useOrganisationStore'
import type { BillingStatus, InviteMemberPayload, UpdateAdminOrganisationPayload } from '@/types/admin'
import type { BillingStatus, UpdateAdminOrganisationPayload } from '@/types/admin'
import type { InviteMemberPayload, OrganisationRole } from '@/types/member'
definePage({
meta: {
@@ -166,7 +169,7 @@ function openAsOrganiser() {
const isInviteDialogOpen = ref(false)
const inviteForm = ref<InviteMemberPayload>({ email: '', role: 'org_member' })
const inviteError = ref('')
const { mutate: inviteMember, isPending: isInviting } = useInviteOrganisationMember()
const { mutate: inviteMember, isPending: isInviting } = useInviteMember('platform', orgId)
function openInviteDialog() {
inviteForm.value = { email: '', role: 'org_member' }
@@ -177,11 +180,11 @@ function openInviteDialog() {
function submitInvite() {
inviteError.value = ''
inviteMember(
{ organisationId: orgId.value, payload: inviteForm.value },
inviteForm.value,
{
onSuccess: (data) => {
onSuccess: () => {
isInviteDialogOpen.value = false
showSnackbar(data.message ?? 'Uitnodiging verstuurd', 'success')
showSnackbar('Uitnodiging verstuurd', 'success')
},
onError: (err: unknown) => {
const error = err as { response?: { data?: { message?: string } } }
@@ -194,7 +197,7 @@ function submitInvite() {
// ─── Remove Member ─────────────────────────────────────────
const isRemoveDialogOpen = ref(false)
const memberToRemove = ref<{ id: string; full_name: string } | null>(null)
const { mutate: removeMember, isPending: isRemoving } = useRemoveOrganisationMember()
const { mutate: removeMember, isPending: isRemoving } = useRemoveMember('platform', orgId)
function openRemoveDialog(member: { id: string; full_name: string }) {
memberToRemove.value = member
@@ -203,24 +206,21 @@ function openRemoveDialog(member: { id: string; full_name: string }) {
function confirmRemove() {
if (!memberToRemove.value) return
removeMember(
{ organisationId: orgId.value, userId: memberToRemove.value.id },
{
onSuccess: () => {
isRemoveDialogOpen.value = false
memberToRemove.value = null
showSnackbar('Lid verwijderd', 'success')
},
removeMember(memberToRemove.value.id, {
onSuccess: () => {
isRemoveDialogOpen.value = false
memberToRemove.value = null
showSnackbar('Lid verwijderd', 'success')
},
)
})
}
// ─── Update Member Role ────────────────────────────────────
const { mutate: updateMemberRole } = useUpdateOrganisationMemberRole()
const { mutate: updateMemberRole } = useUpdateMemberRole('platform', orgId)
function onRoleChange(userId: string, newRole: string) {
updateMemberRole(
{ organisationId: orgId.value, userId, payload: { role: newRole } },
{ userId, role: newRole as OrganisationRole },
{
onSuccess: () => {
showSnackbar('Rol bijgewerkt', 'success')