kopia lustrzana https://gitlab.com/soapbox-pub/soapbox
Hide Group context in Compose button if not Group member
rodzic
93c67c863a
commit
90f7c71256
|
@ -3,15 +3,24 @@ import { useEntityLookup } from 'soapbox/entity-store/hooks';
|
||||||
import { useApi } from 'soapbox/hooks/useApi';
|
import { useApi } from 'soapbox/hooks/useApi';
|
||||||
import { groupSchema } from 'soapbox/schemas';
|
import { groupSchema } from 'soapbox/schemas';
|
||||||
|
|
||||||
|
import { useGroupRelationship } from './useGroupRelationship';
|
||||||
|
|
||||||
function useGroupLookup(slug: string) {
|
function useGroupLookup(slug: string) {
|
||||||
const api = useApi();
|
const api = useApi();
|
||||||
|
|
||||||
return useEntityLookup(
|
const { entity: group, ...result } = useEntityLookup(
|
||||||
Entities.GROUPS,
|
Entities.GROUPS,
|
||||||
(group) => group.slug === slug,
|
(group) => group.slug === slug,
|
||||||
() => api.get(`/api/v1/groups/lookup?name=${slug}`),
|
() => api.get(`/api/v1/groups/lookup?name=${slug}`),
|
||||||
{ schema: groupSchema },
|
{ schema: groupSchema },
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const { entity: relationship } = useGroupRelationship(group?.id);
|
||||||
|
|
||||||
|
return {
|
||||||
|
...result,
|
||||||
|
entity: group ? { ...group, relationship: relationship || null } : undefined,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export { useGroupLookup };
|
export { useGroupLookup };
|
|
@ -7,14 +7,17 @@ import { useEntity } from 'soapbox/entity-store/hooks';
|
||||||
import { useApi, useAppDispatch } from 'soapbox/hooks';
|
import { useApi, useAppDispatch } from 'soapbox/hooks';
|
||||||
import { type GroupRelationship, groupRelationshipSchema } from 'soapbox/schemas';
|
import { type GroupRelationship, groupRelationshipSchema } from 'soapbox/schemas';
|
||||||
|
|
||||||
function useGroupRelationship(groupId: string) {
|
function useGroupRelationship(groupId: string | undefined) {
|
||||||
const api = useApi();
|
const api = useApi();
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
|
|
||||||
const { entity: groupRelationship, ...result } = useEntity<GroupRelationship>(
|
const { entity: groupRelationship, ...result } = useEntity<GroupRelationship>(
|
||||||
[Entities.GROUP_RELATIONSHIPS, groupId],
|
[Entities.GROUP_RELATIONSHIPS, groupId as string],
|
||||||
() => api.get(`/api/v1/groups/relationships?id[]=${groupId}`),
|
() => api.get(`/api/v1/groups/relationships?id[]=${groupId}`),
|
||||||
{ schema: z.array(groupRelationshipSchema).transform(arr => arr[0]) },
|
{
|
||||||
|
enabled: !!groupId,
|
||||||
|
schema: z.array(groupRelationshipSchema).transform(arr => arr[0]),
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
|
@ -14,6 +14,8 @@ interface UseEntityOpts<TEntity extends Entity> {
|
||||||
schema?: EntitySchema<TEntity>
|
schema?: EntitySchema<TEntity>
|
||||||
/** Whether to refetch this entity every time the hook mounts, even if it's already in the store. */
|
/** Whether to refetch this entity every time the hook mounts, even if it's already in the store. */
|
||||||
refetch?: boolean
|
refetch?: boolean
|
||||||
|
/** A flag to potentially disable sending requests to the API. */
|
||||||
|
enabled?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
function useEntity<TEntity extends Entity>(
|
function useEntity<TEntity extends Entity>(
|
||||||
|
@ -31,6 +33,7 @@ function useEntity<TEntity extends Entity>(
|
||||||
|
|
||||||
const entity = useAppSelector(state => state.entities[entityType]?.store[entityId] as TEntity | undefined);
|
const entity = useAppSelector(state => state.entities[entityType]?.store[entityId] as TEntity | undefined);
|
||||||
|
|
||||||
|
const isEnabled = opts.enabled ?? true;
|
||||||
const isLoading = isFetching && !entity;
|
const isLoading = isFetching && !entity;
|
||||||
|
|
||||||
const fetchEntity = async () => {
|
const fetchEntity = async () => {
|
||||||
|
@ -44,10 +47,11 @@ function useEntity<TEntity extends Entity>(
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
if (!isEnabled) return;
|
||||||
if (!entity || opts.refetch) {
|
if (!entity || opts.refetch) {
|
||||||
fetchEntity();
|
fetchEntity();
|
||||||
}
|
}
|
||||||
}, []);
|
}, [isEnabled]);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
entity,
|
entity,
|
||||||
|
|
|
@ -10,8 +10,12 @@ import { useAppDispatch } from 'soapbox/hooks';
|
||||||
|
|
||||||
const ComposeButton = () => {
|
const ComposeButton = () => {
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
|
const isOnGroupPage = location.pathname.startsWith('/group/');
|
||||||
|
const match = useRouteMatch<{ groupSlug: string }>('/group/:groupSlug');
|
||||||
|
const { entity: group } = useGroupLookup(match?.params.groupSlug || '');
|
||||||
|
const isGroupMember = !!group?.relationship?.member;
|
||||||
|
|
||||||
if (location.pathname.startsWith('/group/')) {
|
if (isOnGroupPage && isGroupMember) {
|
||||||
return <GroupComposeButton />;
|
return <GroupComposeButton />;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue