sforkowany z mirror/soapbox
Use ZOD for group-members
rodzic
08f97a133e
commit
9d1c2df1a2
|
@ -10,11 +10,10 @@ import { HStack, IconButton, Menu, MenuButton, MenuDivider, MenuItem, MenuLink,
|
||||||
import SvgIcon from 'soapbox/components/ui/icon/svg-icon';
|
import SvgIcon from 'soapbox/components/ui/icon/svg-icon';
|
||||||
import { useAccount, useAppDispatch } from 'soapbox/hooks';
|
import { useAccount, useAppDispatch } from 'soapbox/hooks';
|
||||||
import { BaseGroupRoles, useGroupRoles } from 'soapbox/hooks/useGroupRoles';
|
import { BaseGroupRoles, useGroupRoles } from 'soapbox/hooks/useGroupRoles';
|
||||||
import { GroupMember } from 'soapbox/normalizers/group-member';
|
|
||||||
import toast from 'soapbox/toast';
|
import toast from 'soapbox/toast';
|
||||||
|
|
||||||
import type { Menu as IMenu } from 'soapbox/components/dropdown-menu';
|
import type { Menu as IMenu } from 'soapbox/components/dropdown-menu';
|
||||||
import type { Account as AccountEntity, Group } from 'soapbox/types/entities';
|
import type { Account as AccountEntity, Group, GroupMember } from 'soapbox/types/entities';
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
blockConfirm: { id: 'confirmations.block_from_group.confirm', defaultMessage: 'Block' },
|
blockConfirm: { id: 'confirmations.block_from_group.confirm', defaultMessage: 'Block' },
|
||||||
|
|
|
@ -1,28 +1,17 @@
|
||||||
import { Entities } from 'soapbox/entity-store/entities';
|
import { Entities } from 'soapbox/entity-store/entities';
|
||||||
import { useEntities } from 'soapbox/entity-store/hooks';
|
import { useEntities } from 'soapbox/entity-store/hooks';
|
||||||
import { normalizeAccount } from 'soapbox/normalizers';
|
import { GroupMember, groupMemberSchema } from 'soapbox/schemas';
|
||||||
import { Account } from 'soapbox/types/entities';
|
|
||||||
|
|
||||||
import { BaseGroupRoles, TruthSocialGroupRoles } from '../useGroupRoles';
|
const parseGroupMember = (entity: unknown) => {
|
||||||
|
const result = groupMemberSchema.safeParse(entity);
|
||||||
interface GroupMember {
|
if (result.success) {
|
||||||
id: string
|
return result.data;
|
||||||
role: BaseGroupRoles | TruthSocialGroupRoles
|
}
|
||||||
account: Account | any
|
|
||||||
}
|
|
||||||
|
|
||||||
const normalizeGroupMember = (groupMember: GroupMember): GroupMember => {
|
|
||||||
return {
|
|
||||||
...groupMember,
|
|
||||||
account: normalizeAccount(groupMember.account),
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const parseGroupMember = (entity: unknown) => entity ? normalizeGroupMember(entity as GroupMember) : undefined;
|
|
||||||
|
|
||||||
function useGroupMembers(groupId: string, role: string) {
|
function useGroupMembers(groupId: string, role: string) {
|
||||||
const { entities, ...result } = useEntities<GroupMember>(
|
const { entities, ...result } = useEntities<GroupMember>(
|
||||||
[Entities.GROUP_MEMBERSHIPS, `${groupId}:${role}`],
|
[Entities.GROUP_MEMBERSHIPS, groupId, role],
|
||||||
`/api/v1/groups/${groupId}/memberships?role=${role}&limit=1`,
|
`/api/v1/groups/${groupId}/memberships?role=${role}&limit=1`,
|
||||||
{ parser: parseGroupMember },
|
{ parser: parseGroupMember },
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
/**
|
|
||||||
* Group Member normalizer:
|
|
||||||
* Converts API group members into our internal format.
|
|
||||||
*/
|
|
||||||
import { BaseGroupRoles, TruthSocialGroupRoles } from 'soapbox/hooks/useGroupRoles';
|
|
||||||
import { Account } from 'soapbox/types/entities';
|
|
||||||
|
|
||||||
import { normalizeAccount } from './account';
|
|
||||||
|
|
||||||
export interface GroupMember {
|
|
||||||
id: string
|
|
||||||
role: BaseGroupRoles | TruthSocialGroupRoles
|
|
||||||
account: Account | any
|
|
||||||
}
|
|
||||||
|
|
||||||
export const normalizeGroupMember = (groupMember: GroupMember): GroupMember => {
|
|
||||||
return {
|
|
||||||
...groupMember,
|
|
||||||
account: normalizeAccount(groupMember.account),
|
|
||||||
};
|
|
||||||
};
|
|
|
@ -13,7 +13,6 @@ export { FilterRecord, normalizeFilter } from './filter';
|
||||||
export { FilterKeywordRecord, normalizeFilterKeyword } from './filter-keyword';
|
export { FilterKeywordRecord, normalizeFilterKeyword } from './filter-keyword';
|
||||||
export { FilterStatusRecord, normalizeFilterStatus } from './filter-status';
|
export { FilterStatusRecord, normalizeFilterStatus } from './filter-status';
|
||||||
export { normalizeGroup } from './group';
|
export { normalizeGroup } from './group';
|
||||||
// export { GroupMember, normalizeGroupMember } from './group-member';
|
|
||||||
export { GroupRelationshipRecord, normalizeGroupRelationship } from './group-relationship';
|
export { GroupRelationshipRecord, normalizeGroupRelationship } from './group-relationship';
|
||||||
export { HistoryRecord, normalizeHistory } from './history';
|
export { HistoryRecord, normalizeHistory } from './history';
|
||||||
export { InstanceRecord, normalizeInstance } from './instance';
|
export { InstanceRecord, normalizeInstance } from './instance';
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
import z from 'zod';
|
||||||
|
|
||||||
|
enum TruthSocialGroupRoles {
|
||||||
|
ADMIN = 'owner',
|
||||||
|
MODERATOR = 'admin',
|
||||||
|
USER = 'user'
|
||||||
|
}
|
||||||
|
|
||||||
|
enum BaseGroupRoles {
|
||||||
|
ADMIN = 'admin',
|
||||||
|
MODERATOR = 'moderator',
|
||||||
|
USER = 'user'
|
||||||
|
}
|
||||||
|
|
||||||
|
const groupMemberSchema = z.object({
|
||||||
|
id: z.string(),
|
||||||
|
account: z.any(),
|
||||||
|
role: z.union([
|
||||||
|
z.nativeEnum(TruthSocialGroupRoles),
|
||||||
|
z.nativeEnum(BaseGroupRoles),
|
||||||
|
]),
|
||||||
|
});
|
||||||
|
|
||||||
|
type GroupMember = z.infer<typeof groupMemberSchema>;
|
||||||
|
|
||||||
|
export { groupMemberSchema, GroupMember };
|
|
@ -2,5 +2,7 @@ export { customEmojiSchema } from './custom-emoji';
|
||||||
export type { CustomEmoji } from './custom-emoji';
|
export type { CustomEmoji } from './custom-emoji';
|
||||||
export { groupSchema } from './group';
|
export { groupSchema } from './group';
|
||||||
export type { Group } from './group';
|
export type { Group } from './group';
|
||||||
|
export { groupMemberSchema } from './group-member';
|
||||||
|
export type { GroupMember } from './group-member';
|
||||||
export { groupRelationshipSchema } from './group-relationship';
|
export { groupRelationshipSchema } from './group-relationship';
|
||||||
export type { GroupRelationship } from './group-relationship';
|
export type { GroupRelationship } from './group-relationship';
|
||||||
|
|
Ładowanie…
Reference in New Issue