fix: мобильные кнопки Settings/Logout в header + дедупликация api.ts
This commit is contained in:
parent
1b93bd60c0
commit
8df4179dd7
@ -115,14 +115,6 @@ export interface Task {
|
|||||||
steps: Step[];
|
steps: Step[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ProjectMember {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
slug: string;
|
|
||||||
type: "human" | "agent";
|
|
||||||
role: "owner" | "member";
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Attachment {
|
export interface Attachment {
|
||||||
id: string;
|
id: string;
|
||||||
filename: string;
|
filename: string;
|
||||||
@ -312,19 +304,6 @@ export async function getProjectMembers(slug: string): Promise<ProjectMember[]>
|
|||||||
return request(`/api/v1/projects/${slug}/members`);
|
return request(`/api/v1/projects/${slug}/members`);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function addProjectMember(slug: string, memberSlug: string): Promise<void> {
|
|
||||||
await request(`/api/v1/projects/${slug}/members`, {
|
|
||||||
method: "POST",
|
|
||||||
body: JSON.stringify({ slug: memberSlug }),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- Project Members ---
|
|
||||||
|
|
||||||
export async function getProjectMembers(slug: string): Promise<ProjectMember[]> {
|
|
||||||
return request(`/api/v1/projects/${slug}/members`);
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function addProjectMember(slug: string, memberSlug: string): Promise<{ ok: boolean }> {
|
export async function addProjectMember(slug: string, memberSlug: string): Promise<{ ok: boolean }> {
|
||||||
return request(`/api/v1/projects/${slug}/members`, {
|
return request(`/api/v1/projects/${slug}/members`, {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { useParams, useSearchParams } from "react-router-dom";
|
import { useParams, useSearchParams, Link } from "react-router-dom";
|
||||||
import { getProjects, type Project } from "@/lib/api";
|
import { getProjects, type Project } from "@/lib/api";
|
||||||
|
import { logout } from "@/lib/auth-client";
|
||||||
import Sidebar from "@/components/Sidebar";
|
import Sidebar from "@/components/Sidebar";
|
||||||
import KanbanBoard from "@/components/KanbanBoard";
|
import KanbanBoard from "@/components/KanbanBoard";
|
||||||
import ChatPanel from "@/components/ChatPanel";
|
import ChatPanel from "@/components/ChatPanel";
|
||||||
@ -61,6 +62,22 @@ export default function ProjectPage() {
|
|||||||
<p className="text-sm text-[var(--muted)]">{project.description}</p>
|
<p className="text-sm text-[var(--muted)]">{project.description}</p>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
<div className="flex items-center gap-2 md:hidden">
|
||||||
|
<Link
|
||||||
|
to="/settings"
|
||||||
|
className="text-[var(--muted)] hover:text-[var(--fg)] transition-colors"
|
||||||
|
title="Настройки"
|
||||||
|
>
|
||||||
|
⚙️
|
||||||
|
</Link>
|
||||||
|
<button
|
||||||
|
onClick={logout}
|
||||||
|
className="text-[var(--muted)] hover:text-[var(--fg)] transition-colors cursor-pointer"
|
||||||
|
title="Выйти"
|
||||||
|
>
|
||||||
|
🚪
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex gap-1">
|
<div className="flex gap-1">
|
||||||
{TABS.map((tab) => (
|
{TABS.map((tab) => (
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user