diff --git a/src/lib/utils/user-utils.ts b/src/lib/utils/user-utils.ts index 4e9de5ce..4411660b 100644 --- a/src/lib/utils/user-utils.ts +++ b/src/lib/utils/user-utils.ts @@ -1,6 +1,6 @@ import { Role, Subplebbit, Comment } from '@plebbit/plebbit-react-hooks'; -export type RolesCollection = Record; +export type RolesCollection = { [address: string]: Role }; export const findSubplebbitCreator = (roles: RolesCollection | undefined): string => { if (!roles) { diff --git a/src/views/subplebbit/subplebbit-settings/subplebbit-settings.tsx b/src/views/subplebbit/subplebbit-settings/subplebbit-settings.tsx index b4a21f74..0d8cb23a 100644 --- a/src/views/subplebbit/subplebbit-settings/subplebbit-settings.tsx +++ b/src/views/subplebbit/subplebbit-settings/subplebbit-settings.tsx @@ -1,6 +1,6 @@ import { useEffect, useRef, useState } from 'react'; import { useParams } from 'react-router-dom'; -import { PublishSubplebbitEditOptions, useAccount, useSubplebbit, usePublishSubplebbitEdit } from '@plebbit/plebbit-react-hooks'; +import { PublishSubplebbitEditOptions, useAccount, useSubplebbit, usePublishSubplebbitEdit, Role } from '@plebbit/plebbit-react-hooks'; import { RolesCollection } from '../../../lib/utils/user-utils'; import { useTranslation } from 'react-i18next'; import { create } from 'zustand'; @@ -205,38 +205,82 @@ const Rules = () => { const Moderators = () => { const { t } = useTranslation(); - const { roles } = useSubplebbitSettingsStore(); + const { roles, setSubmitStore } = useSubplebbitSettingsStore(); + const lastModeratorRef = useRef(null); - const rolesList = roles ? Object.entries(roles).map(([address, { role }]) => ({ address, role })) : []; + const handleAddModerator = () => { + if (roles) { + const newRoles: RolesCollection = { ...roles, '': { role: 'moderator' } }; + setSubmitStore({ roles: newRoles }); + + setTimeout(() => { + if (lastModeratorRef.current) { + (lastModeratorRef.current as any).focus(); + } + }, 0); + } + }; + + const handleRoleChange = (address: string, newRole: Role) => { + if (roles) { + const updatedRoles: RolesCollection = { ...roles, [address]: newRole }; + setSubmitStore({ roles: updatedRoles }); + } + }; + + const handleDeleteModerator = (address: string) => { + if (roles) { + const { [address]: _, ...remainingRoles } = roles; + setSubmitStore({ roles: remainingRoles }); + } + }; + + const handleAddressChange = (oldAddress: string, newAddress: string) => { + if (roles) { + const { [oldAddress]: roleData, ...remainingRoles } = roles; + if (roleData) { + const updatedRoles: RolesCollection = { ...remainingRoles, [newAddress]: roleData }; + setSubmitStore({ roles: updatedRoles }); + } + } + }; return (
{t('moderators')}
let other users moderate and post without challenges
- - {rolesList?.map(({ address, role }, index) => ( -
- Moderator #{index + 1} - -
- - User address: + + {roles && + Object.entries(roles).map(([address, role], index) => ( +
+ Moderator #{index + 1} + handleDeleteModerator(address)} />
- -
-
- - Moderator role: -
- -
-
- ))} + + User address: +
+ handleAddressChange(address, e.target.value)} + /> +
+
+ + Moderator role: +
+ +
+
+ ))}
);