|
@@ -71,9 +71,9 @@ async function attemptRefresh(): Promise<boolean> {
|
|
|
if (!res.ok) return false;
|
|
if (!res.ok) return false;
|
|
|
const data = (await res.json()) as {
|
|
const data = (await res.json()) as {
|
|
|
access_token: string;
|
|
access_token: string;
|
|
|
- refresh_token: string;
|
|
|
|
|
};
|
|
};
|
|
|
- setTokens(data.access_token, data.refresh_token);
|
|
|
|
|
|
|
+ // Keep existing refresh token — backend only returns a new access token
|
|
|
|
|
+ setTokens(data.access_token, rt);
|
|
|
return true;
|
|
return true;
|
|
|
} catch {
|
|
} catch {
|
|
|
return false;
|
|
return false;
|
|
@@ -163,8 +163,9 @@ export const authApi = {
|
|
|
body: JSON.stringify(data),
|
|
body: JSON.stringify(data),
|
|
|
});
|
|
});
|
|
|
},
|
|
},
|
|
|
- me() {
|
|
|
|
|
- return request<User>("/auth/me");
|
|
|
|
|
|
|
+ async me() {
|
|
|
|
|
+ const res = await request<{ user: User }>("/auth/me");
|
|
|
|
|
+ return res.user;
|
|
|
},
|
|
},
|
|
|
refresh(refreshToken: string) {
|
|
refresh(refreshToken: string) {
|
|
|
return request<{ access_token: string; refresh_token: string }>(
|
|
return request<{ access_token: string; refresh_token: string }>(
|
|
@@ -180,23 +181,27 @@ export const authApi = {
|
|
|
// ── Workspace API ────────────────────────────────────────────────────────────
|
|
// ── Workspace API ────────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
export const workspaceApi = {
|
|
export const workspaceApi = {
|
|
|
- list() {
|
|
|
|
|
- return request<Workspace[]>("/workspaces");
|
|
|
|
|
|
|
+ async list() {
|
|
|
|
|
+ const res = await request<{ workspaces: Workspace[] }>("/workspaces");
|
|
|
|
|
+ return res.workspaces;
|
|
|
},
|
|
},
|
|
|
- get(id: string) {
|
|
|
|
|
- return request<Workspace>(`/workspaces/${id}`);
|
|
|
|
|
|
|
+ async get(id: string) {
|
|
|
|
|
+ const res = await request<{ workspace: Workspace }>(`/workspaces/${id}`);
|
|
|
|
|
+ return res.workspace;
|
|
|
},
|
|
},
|
|
|
- create(data: Partial<Workspace>) {
|
|
|
|
|
- return request<Workspace>("/workspaces", {
|
|
|
|
|
|
|
+ async create(data: Partial<Workspace>) {
|
|
|
|
|
+ const res = await request<{ workspace: Workspace }>("/workspaces", {
|
|
|
method: "POST",
|
|
method: "POST",
|
|
|
body: JSON.stringify(data),
|
|
body: JSON.stringify(data),
|
|
|
});
|
|
});
|
|
|
|
|
+ return res.workspace;
|
|
|
},
|
|
},
|
|
|
- update(id: string, data: Partial<Workspace>) {
|
|
|
|
|
- return request<Workspace>(`/workspaces/${id}`, {
|
|
|
|
|
|
|
+ async update(id: string, data: Partial<Workspace>) {
|
|
|
|
|
+ const res = await request<{ workspace: Workspace }>(`/workspaces/${id}`, {
|
|
|
method: "PUT",
|
|
method: "PUT",
|
|
|
body: JSON.stringify(data),
|
|
body: JSON.stringify(data),
|
|
|
});
|
|
});
|
|
|
|
|
+ return res.workspace;
|
|
|
},
|
|
},
|
|
|
delete(id: string) {
|
|
delete(id: string) {
|
|
|
return request<void>(`/workspaces/${id}`, { method: "DELETE" });
|
|
return request<void>(`/workspaces/${id}`, { method: "DELETE" });
|
|
@@ -206,10 +211,11 @@ export const workspaceApi = {
|
|
|
// ── Member API ───────────────────────────────────────────────────────────────
|
|
// ── Member API ───────────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
export const memberApi = {
|
|
export const memberApi = {
|
|
|
- list(workspaceId: string) {
|
|
|
|
|
- return request<WorkspaceMember[]>(
|
|
|
|
|
|
|
+ async list(workspaceId: string) {
|
|
|
|
|
+ const res = await request<{ members: WorkspaceMember[] }>(
|
|
|
`/workspaces/${workspaceId}/members`,
|
|
`/workspaces/${workspaceId}/members`,
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.members;
|
|
|
},
|
|
},
|
|
|
updateRole(
|
|
updateRole(
|
|
|
workspaceId: string,
|
|
workspaceId: string,
|
|
@@ -235,22 +241,24 @@ export const memberApi = {
|
|
|
// ── Invitation API ───────────────────────────────────────────────────────────
|
|
// ── Invitation API ───────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
export const invitationApi = {
|
|
export const invitationApi = {
|
|
|
- list(workspaceId: string) {
|
|
|
|
|
- return request<Invitation[]>(
|
|
|
|
|
|
|
+ async list(workspaceId: string) {
|
|
|
|
|
+ const res = await request<{ invitations: Invitation[] }>(
|
|
|
`/workspaces/${workspaceId}/invitations`,
|
|
`/workspaces/${workspaceId}/invitations`,
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.invitations;
|
|
|
},
|
|
},
|
|
|
- create(
|
|
|
|
|
|
|
+ async create(
|
|
|
workspaceId: string,
|
|
workspaceId: string,
|
|
|
data: { email: string; role: string },
|
|
data: { email: string; role: string },
|
|
|
) {
|
|
) {
|
|
|
- return request<Invitation>(
|
|
|
|
|
|
|
+ const res = await request<{ invitation: Invitation }>(
|
|
|
`/workspaces/${workspaceId}/invitations`,
|
|
`/workspaces/${workspaceId}/invitations`,
|
|
|
{
|
|
{
|
|
|
method: "POST",
|
|
method: "POST",
|
|
|
body: JSON.stringify(data),
|
|
body: JSON.stringify(data),
|
|
|
},
|
|
},
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.invitation;
|
|
|
},
|
|
},
|
|
|
revoke(workspaceId: string, invitationId: string) {
|
|
revoke(workspaceId: string, invitationId: string) {
|
|
|
return request<void>(
|
|
return request<void>(
|
|
@@ -258,8 +266,9 @@ export const invitationApi = {
|
|
|
{ method: "DELETE" },
|
|
{ method: "DELETE" },
|
|
|
);
|
|
);
|
|
|
},
|
|
},
|
|
|
- pending() {
|
|
|
|
|
- return request<Invitation[]>("/invitations/pending");
|
|
|
|
|
|
|
+ async pending() {
|
|
|
|
|
+ const res = await request<{ invitations: Invitation[] }>("/invitations/pending");
|
|
|
|
|
+ return res.invitations;
|
|
|
},
|
|
},
|
|
|
accept(invitationId: string) {
|
|
accept(invitationId: string) {
|
|
|
return request<void>(`/invitations/${invitationId}/accept`, {
|
|
return request<void>(`/invitations/${invitationId}/accept`, {
|
|
@@ -276,40 +285,44 @@ export const invitationApi = {
|
|
|
// ── Assistant API ────────────────────────────────────────────────────────────
|
|
// ── Assistant API ────────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
export const assistantApi = {
|
|
export const assistantApi = {
|
|
|
- list(workspaceId: string) {
|
|
|
|
|
- return request<Assistant[]>(
|
|
|
|
|
|
|
+ async list(workspaceId: string) {
|
|
|
|
|
+ const res = await request<{ assistants: Assistant[] }>(
|
|
|
`/workspaces/${workspaceId}/assistants`,
|
|
`/workspaces/${workspaceId}/assistants`,
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.assistants;
|
|
|
},
|
|
},
|
|
|
- get(workspaceId: string, assistantId: string) {
|
|
|
|
|
- return request<Assistant>(
|
|
|
|
|
|
|
+ async get(workspaceId: string, assistantId: string) {
|
|
|
|
|
+ const res = await request<{ assistant: Assistant }>(
|
|
|
`/workspaces/${workspaceId}/assistants/${assistantId}`,
|
|
`/workspaces/${workspaceId}/assistants/${assistantId}`,
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.assistant;
|
|
|
},
|
|
},
|
|
|
- create(
|
|
|
|
|
|
|
+ async create(
|
|
|
workspaceId: string,
|
|
workspaceId: string,
|
|
|
data: { name: string; phone_number_id: string },
|
|
data: { name: string; phone_number_id: string },
|
|
|
) {
|
|
) {
|
|
|
- return request<Assistant>(
|
|
|
|
|
|
|
+ const res = await request<{ assistant: Assistant }>(
|
|
|
`/workspaces/${workspaceId}/assistants`,
|
|
`/workspaces/${workspaceId}/assistants`,
|
|
|
{
|
|
{
|
|
|
method: "POST",
|
|
method: "POST",
|
|
|
body: JSON.stringify(data),
|
|
body: JSON.stringify(data),
|
|
|
},
|
|
},
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.assistant;
|
|
|
},
|
|
},
|
|
|
- update(
|
|
|
|
|
|
|
+ async update(
|
|
|
workspaceId: string,
|
|
workspaceId: string,
|
|
|
assistantId: string,
|
|
assistantId: string,
|
|
|
data: Partial<Assistant>,
|
|
data: Partial<Assistant>,
|
|
|
) {
|
|
) {
|
|
|
- return request<Assistant>(
|
|
|
|
|
|
|
+ const res = await request<{ assistant: Assistant }>(
|
|
|
`/workspaces/${workspaceId}/assistants/${assistantId}`,
|
|
`/workspaces/${workspaceId}/assistants/${assistantId}`,
|
|
|
{
|
|
{
|
|
|
method: "PUT",
|
|
method: "PUT",
|
|
|
body: JSON.stringify(data),
|
|
body: JSON.stringify(data),
|
|
|
},
|
|
},
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.assistant;
|
|
|
},
|
|
},
|
|
|
delete(workspaceId: string, assistantId: string) {
|
|
delete(workspaceId: string, assistantId: string) {
|
|
|
return request<void>(
|
|
return request<void>(
|
|
@@ -322,48 +335,54 @@ export const assistantApi = {
|
|
|
// ── CallerAI API (phone numbers / voices) ────────────────────────────────────
|
|
// ── CallerAI API (phone numbers / voices) ────────────────────────────────────
|
|
|
|
|
|
|
|
export const calleraiApi = {
|
|
export const calleraiApi = {
|
|
|
- phoneNumbers() {
|
|
|
|
|
- return request<PhoneNumber[]>("/callerai/phone-numbers");
|
|
|
|
|
|
|
+ async phoneNumbers() {
|
|
|
|
|
+ const res = await request<{ phone_numbers: PhoneNumber[] }>("/callerai/phone-numbers");
|
|
|
|
|
+ return res.phone_numbers;
|
|
|
},
|
|
},
|
|
|
- voiceProviders() {
|
|
|
|
|
- return request<ProviderConfig[]>("/callerai/voice-providers");
|
|
|
|
|
|
|
+ async voiceProviders() {
|
|
|
|
|
+ const res = await request<{ provider_configs: ProviderConfig[] }>("/callerai/provider-configs");
|
|
|
|
|
+ return res.provider_configs;
|
|
|
},
|
|
},
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// ── Calendar API ─────────────────────────────────────────────────────────────
|
|
// ── Calendar API ─────────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
export const calendarApi = {
|
|
export const calendarApi = {
|
|
|
- list(workspaceId: string) {
|
|
|
|
|
- return request<Calendar[]>(
|
|
|
|
|
|
|
+ async list(workspaceId: string) {
|
|
|
|
|
+ const res = await request<{ calendars: Calendar[] }>(
|
|
|
`/workspaces/${workspaceId}/calendars`,
|
|
`/workspaces/${workspaceId}/calendars`,
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.calendars;
|
|
|
},
|
|
},
|
|
|
- get(workspaceId: string, calendarId: string) {
|
|
|
|
|
- return request<Calendar>(
|
|
|
|
|
|
|
+ async get(workspaceId: string, calendarId: string) {
|
|
|
|
|
+ const res = await request<{ calendar: Calendar }>(
|
|
|
`/workspaces/${workspaceId}/calendars/${calendarId}`,
|
|
`/workspaces/${workspaceId}/calendars/${calendarId}`,
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.calendar;
|
|
|
},
|
|
},
|
|
|
- create(workspaceId: string, data: Partial<Calendar>) {
|
|
|
|
|
- return request<Calendar>(
|
|
|
|
|
|
|
+ async create(workspaceId: string, data: Partial<Calendar>) {
|
|
|
|
|
+ const res = await request<{ calendar: Calendar }>(
|
|
|
`/workspaces/${workspaceId}/calendars`,
|
|
`/workspaces/${workspaceId}/calendars`,
|
|
|
{
|
|
{
|
|
|
method: "POST",
|
|
method: "POST",
|
|
|
body: JSON.stringify(data),
|
|
body: JSON.stringify(data),
|
|
|
},
|
|
},
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.calendar;
|
|
|
},
|
|
},
|
|
|
- update(
|
|
|
|
|
|
|
+ async update(
|
|
|
workspaceId: string,
|
|
workspaceId: string,
|
|
|
calendarId: string,
|
|
calendarId: string,
|
|
|
data: Partial<Calendar>,
|
|
data: Partial<Calendar>,
|
|
|
) {
|
|
) {
|
|
|
- return request<Calendar>(
|
|
|
|
|
|
|
+ const res = await request<{ calendar: Calendar }>(
|
|
|
`/workspaces/${workspaceId}/calendars/${calendarId}`,
|
|
`/workspaces/${workspaceId}/calendars/${calendarId}`,
|
|
|
{
|
|
{
|
|
|
method: "PUT",
|
|
method: "PUT",
|
|
|
body: JSON.stringify(data),
|
|
body: JSON.stringify(data),
|
|
|
},
|
|
},
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.calendar;
|
|
|
},
|
|
},
|
|
|
delete(workspaceId: string, calendarId: string) {
|
|
delete(workspaceId: string, calendarId: string) {
|
|
|
return request<void>(
|
|
return request<void>(
|
|
@@ -376,37 +395,40 @@ export const calendarApi = {
|
|
|
// ── TimeSlot API ─────────────────────────────────────────────────────────────
|
|
// ── TimeSlot API ─────────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
export const timeSlotApi = {
|
|
export const timeSlotApi = {
|
|
|
- list(workspaceId: string, calendarId: string) {
|
|
|
|
|
- return request<TimeSlot[]>(
|
|
|
|
|
|
|
+ async list(workspaceId: string, calendarId: string) {
|
|
|
|
|
+ const res = await request<{ time_slots: TimeSlot[] }>(
|
|
|
`/workspaces/${workspaceId}/calendars/${calendarId}/time-slots`,
|
|
`/workspaces/${workspaceId}/calendars/${calendarId}/time-slots`,
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.time_slots;
|
|
|
},
|
|
},
|
|
|
- create(
|
|
|
|
|
|
|
+ async create(
|
|
|
workspaceId: string,
|
|
workspaceId: string,
|
|
|
calendarId: string,
|
|
calendarId: string,
|
|
|
data: Partial<TimeSlot>,
|
|
data: Partial<TimeSlot>,
|
|
|
) {
|
|
) {
|
|
|
- return request<TimeSlot>(
|
|
|
|
|
|
|
+ const res = await request<{ time_slot: TimeSlot }>(
|
|
|
`/workspaces/${workspaceId}/calendars/${calendarId}/time-slots`,
|
|
`/workspaces/${workspaceId}/calendars/${calendarId}/time-slots`,
|
|
|
{
|
|
{
|
|
|
method: "POST",
|
|
method: "POST",
|
|
|
body: JSON.stringify(data),
|
|
body: JSON.stringify(data),
|
|
|
},
|
|
},
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.time_slot;
|
|
|
},
|
|
},
|
|
|
- update(
|
|
|
|
|
|
|
+ async update(
|
|
|
workspaceId: string,
|
|
workspaceId: string,
|
|
|
calendarId: string,
|
|
calendarId: string,
|
|
|
slotId: string,
|
|
slotId: string,
|
|
|
data: Partial<TimeSlot>,
|
|
data: Partial<TimeSlot>,
|
|
|
) {
|
|
) {
|
|
|
- return request<TimeSlot>(
|
|
|
|
|
|
|
+ const res = await request<{ time_slot: TimeSlot }>(
|
|
|
`/workspaces/${workspaceId}/calendars/${calendarId}/time-slots/${slotId}`,
|
|
`/workspaces/${workspaceId}/calendars/${calendarId}/time-slots/${slotId}`,
|
|
|
{
|
|
{
|
|
|
method: "PUT",
|
|
method: "PUT",
|
|
|
body: JSON.stringify(data),
|
|
body: JSON.stringify(data),
|
|
|
},
|
|
},
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.time_slot;
|
|
|
},
|
|
},
|
|
|
delete(
|
|
delete(
|
|
|
workspaceId: string,
|
|
workspaceId: string,
|
|
@@ -423,7 +445,7 @@ export const timeSlotApi = {
|
|
|
// ── Appointment API ──────────────────────────────────────────────────────────
|
|
// ── Appointment API ──────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
export const appointmentApi = {
|
|
export const appointmentApi = {
|
|
|
- list(
|
|
|
|
|
|
|
+ async list(
|
|
|
workspaceId: string,
|
|
workspaceId: string,
|
|
|
params?: { from?: string; to?: string; status?: string },
|
|
params?: { from?: string; to?: string; status?: string },
|
|
|
) {
|
|
) {
|
|
@@ -432,45 +454,50 @@ export const appointmentApi = {
|
|
|
if (params?.to) qs.set("to", params.to);
|
|
if (params?.to) qs.set("to", params.to);
|
|
|
if (params?.status) qs.set("status", params.status);
|
|
if (params?.status) qs.set("status", params.status);
|
|
|
const query = qs.toString() ? `?${qs.toString()}` : "";
|
|
const query = qs.toString() ? `?${qs.toString()}` : "";
|
|
|
- return request<Appointment[]>(
|
|
|
|
|
|
|
+ const res = await request<{ appointments: Appointment[] }>(
|
|
|
`/workspaces/${workspaceId}/appointments${query}`,
|
|
`/workspaces/${workspaceId}/appointments${query}`,
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.appointments;
|
|
|
},
|
|
},
|
|
|
- cancel(workspaceId: string, appointmentId: string) {
|
|
|
|
|
- return request<Appointment>(
|
|
|
|
|
|
|
+ async cancel(workspaceId: string, appointmentId: string) {
|
|
|
|
|
+ const res = await request<{ appointment: Appointment }>(
|
|
|
`/workspaces/${workspaceId}/appointments/${appointmentId}/cancel`,
|
|
`/workspaces/${workspaceId}/appointments/${appointmentId}/cancel`,
|
|
|
{ method: "POST" },
|
|
{ method: "POST" },
|
|
|
);
|
|
);
|
|
|
|
|
+ return res.appointment;
|
|
|
},
|
|
},
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// ── Settings API ─────────────────────────────────────────────────────────────
|
|
// ── Settings API ─────────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
export const settingsApi = {
|
|
export const settingsApi = {
|
|
|
- get() {
|
|
|
|
|
- return request<GlobalSettings>("/settings");
|
|
|
|
|
|
|
+ async get() {
|
|
|
|
|
+ const res = await request<{ settings: GlobalSettings }>("/settings");
|
|
|
|
|
+ return res.settings;
|
|
|
},
|
|
},
|
|
|
- updateSmtp(data: SmtpSettings) {
|
|
|
|
|
- return request<SmtpSettings>("/settings/smtp", {
|
|
|
|
|
|
|
+ async updateSmtp(data: SmtpSettings) {
|
|
|
|
|
+ const res = await request<{ settings: GlobalSettings }>("/settings", {
|
|
|
method: "PUT",
|
|
method: "PUT",
|
|
|
body: JSON.stringify(data),
|
|
body: JSON.stringify(data),
|
|
|
});
|
|
});
|
|
|
|
|
+ return res.settings;
|
|
|
},
|
|
},
|
|
|
testSmtp() {
|
|
testSmtp() {
|
|
|
- return request<{ success: boolean; message: string }>(
|
|
|
|
|
- "/settings/smtp/test",
|
|
|
|
|
|
|
+ return request<{ message: string }>(
|
|
|
|
|
+ "/settings/test-smtp",
|
|
|
{ method: "POST" },
|
|
{ method: "POST" },
|
|
|
);
|
|
);
|
|
|
},
|
|
},
|
|
|
- updateCallerAi(data: CallerAiSettings) {
|
|
|
|
|
- return request<CallerAiSettings>("/settings/callerai", {
|
|
|
|
|
|
|
+ async updateCallerAi(data: CallerAiSettings) {
|
|
|
|
|
+ const res = await request<{ settings: GlobalSettings }>("/settings", {
|
|
|
method: "PUT",
|
|
method: "PUT",
|
|
|
body: JSON.stringify(data),
|
|
body: JSON.stringify(data),
|
|
|
});
|
|
});
|
|
|
|
|
+ return res.settings;
|
|
|
},
|
|
},
|
|
|
testCallerAi() {
|
|
testCallerAi() {
|
|
|
- return request<{ success: boolean; message: string }>(
|
|
|
|
|
- "/settings/callerai/test",
|
|
|
|
|
|
|
+ return request<{ message: string }>(
|
|
|
|
|
+ "/settings/test-callerai",
|
|
|
{ method: "POST" },
|
|
{ method: "POST" },
|
|
|
);
|
|
);
|
|
|
},
|
|
},
|