Files
glchat/web/src/api/guilds.ts
T

103 lines
3.6 KiB
TypeScript
Raw Normal View History

import { request } from './client';
import type { Channel, ChannelType, Guild, GuildMember, GuildSummary, Role } from './types';
export interface CreateChannelInput {
name: string;
type: ChannelType;
parent_id?: string;
}
export interface UpdateGuildInput {
name?: string;
description?: string;
}
export const guildQueryKey = (guildId: string) => ['guilds', guildId] as const;
export const guildChannelsQueryKey = (guildId: string) => ['guilds', guildId, 'channels'] as const;
export const guildMembersQueryKey = (guildId: string) => ['guilds', guildId, 'members'] as const;
export const guildRolesQueryKey = (guildId: string) => ['guilds', guildId, 'roles'] as const;
export async function createGuild(name: string): Promise<GuildSummary> {
const payload = await request<{ guild: GuildSummary }>('/guilds', {
method: 'POST',
body: { name },
});
return payload.guild;
}
export async function fetchGuild(guildId: string, signal?: AbortSignal): Promise<Guild> {
const payload = await request<{ guild: Guild }>(
`/guilds/${encodeURIComponent(guildId)}`,
signal === undefined ? {} : { signal },
);
return payload.guild;
}
export async function updateGuild(guildId: string, input: UpdateGuildInput): Promise<Guild> {
const payload = await request<{ guild: Guild }>(`/guilds/${encodeURIComponent(guildId)}`, {
method: 'PATCH',
body: input,
});
return payload.guild;
}
export async function fetchChannels(guildId: string, signal?: AbortSignal): Promise<Channel[]> {
const payload = await request<{ channels: Channel[] }>(
`/guilds/${encodeURIComponent(guildId)}/channels`,
signal === undefined ? {} : { signal },
);
return payload.channels;
}
export async function createChannel(guildId: string, input: CreateChannelInput): Promise<Channel> {
const payload = await request<{ channel: Channel }>(
`/guilds/${encodeURIComponent(guildId)}/channels`,
{ method: 'POST', body: input },
);
return payload.channel;
}
export async function fetchMembers(guildId: string, signal?: AbortSignal): Promise<GuildMember[]> {
const payload = await request<{ members: GuildMember[] }>(
`/guilds/${encodeURIComponent(guildId)}/members`,
signal === undefined ? {} : { signal },
);
return payload.members;
}
export async function fetchRoles(guildId: string, signal?: AbortSignal): Promise<Role[]> {
const payload = await request<{ roles: Role[] }>(
`/guilds/${encodeURIComponent(guildId)}/roles`,
signal === undefined ? {} : { signal },
);
return payload.roles;
}
export function joinGuild(guildId: string): Promise<{ ok: true }> {
return request<{ ok: true }>(`/guilds/${encodeURIComponent(guildId)}/join`, { method: 'POST' });
}
export function leaveGuild(guildId: string): Promise<{ ok: true }> {
return request<{ ok: true }>(`/guilds/${encodeURIComponent(guildId)}/leave`, { method: 'POST' });
}
/**
* Свой никнейм на сервере: сервер разрешает участнику менять его без прав
* (пустая строка сбрасывает ник).
*/
export async function updateGuildMember(
guildId: string,
userId: string,
input: { nickname: string },
): Promise<void> {
await request<{ ok: true }>(
`/guilds/${encodeURIComponent(guildId)}/members/${encodeURIComponent(userId)}`,
{ method: 'PATCH', body: input },
);
}
/** Удаление сервера: доступно владельцу и администратору инстанса. */
export async function deleteGuild(guildId: string): Promise<void> {
await request<{ ok: true }>(`/guilds/${encodeURIComponent(guildId)}`, { method: 'DELETE' });
}