mirror of
https://github.com/makeplane/plane.git
synced 2026-07-14 06:25:58 +02:00
* refactor: move web utils to packages * fix: build and lint errors * chore: update drag handle plugin * chore: update table cell type to fix build errors * fix: build errors * chore: sync few changes * feat: add pi base url to constants * chore: update all util imports in ee folder * chore: refactor web utils imports * chore: update imports * fix: build errors * fix: build errors * fix: update utils import * chore: minor fixes related to duplicate assets imports * chore: update duplicate assets service * [WEB-4316] chore: new endpoints to download an asset (#7207) * chore: new endpoints to download an asset * chore: add exception handling * [WEB-4323] refactor: Analytics refactor (#7213) * chore: updated label for epics * chore: improved export logic * refactor: move csvConfig to export.ts and clean up export logic * refactor: remove unused CSV export logic from WorkItemsInsightTable component * refactor: streamline data handling in InsightTable component for improved rendering * feat: add translation for "No. of {entity}" and update priority chart y-axis label to use new translation * refactor: cleaned up some component and added utilitites * feat: add "at_risk" translation to multiple languages in translations.json files * refactor: update TrendPiece component to use new status variants for analytics * fix: adjust TrendPiece component logic for on-track and off-track status * refactor: use nullish coalescing operator for yAxis.dx in line and scatter charts * feat: add "at_risk" translation to various languages in translations.json files * feat: add "no_of" translation to various languages in translations.json files * feat: update "at_risk" translation in Ukrainian, Vietnamese, and Chinese locales in translations.json files * refactor: rename insightsFields to ANALYTICS_INSIGHTS_FIELDS and update analytics tab import to use getAnalyticsTabs function * feat: update AnalyticsWrapper to use i18n for titles and add new translation for "no_of" in Russian * fix: update yAxis labels and offsets in various charts to use new translation key and improve layout * feat: define AnalyticsTab interface and refactor getAnalyticsTabs function for improved type safety * fix: update AnalyticsTab interface to use TAnalyticsTabsBase for improved type safety * fix: add whitespace-nowrap class to TableHead for improved header layout in DataTable component * [WEB-4311] fix: membership data handling and state reversal on error (#7205) * [WEB-4231] Pie chart tooltip #7192 * fix: build errors * fix: utils imports * chore: fix build errors * yarn lock file update --------- Co-authored-by: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Co-authored-by: JayashTripathy <76092296+JayashTripathy@users.noreply.github.com> Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
265 lines
7.0 KiB
TypeScript
265 lines
7.0 KiB
TypeScript
// services
|
|
import { API_BASE_URL } from "@plane/constants";
|
|
import type {
|
|
TIssue,
|
|
IUser,
|
|
IUserActivityResponse,
|
|
IInstanceAdminStatus,
|
|
IUserProfileData,
|
|
IUserProfileProjectSegregation,
|
|
IUserSettings,
|
|
IUserEmailNotificationSettings,
|
|
TIssuesResponse,
|
|
TUserProfile,
|
|
} from "@plane/types";
|
|
import { APIService } from "@/services/api.service";
|
|
// types
|
|
// helpers
|
|
|
|
export class UserService extends APIService {
|
|
constructor() {
|
|
super(API_BASE_URL);
|
|
}
|
|
|
|
currentUserConfig() {
|
|
return {
|
|
url: `${this.baseURL}/api/users/me/`,
|
|
};
|
|
}
|
|
|
|
async userIssues(
|
|
workspaceSlug: string,
|
|
params: any
|
|
): Promise<
|
|
| {
|
|
[key: string]: TIssue[];
|
|
}
|
|
| TIssue[]
|
|
> {
|
|
return this.get(`/api/workspaces/${workspaceSlug}/my-issues/`, {
|
|
params,
|
|
})
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async currentUser(): Promise<IUser> {
|
|
// Using validateStatus: null to bypass interceptors for unauthorized errors.
|
|
return this.get("/api/users/me/", { validateStatus: null })
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response;
|
|
});
|
|
}
|
|
|
|
async getCurrentUserProfile(): Promise<TUserProfile> {
|
|
return this.get("/api/users/me/profile/")
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response;
|
|
});
|
|
}
|
|
async updateCurrentUserProfile(data: any): Promise<any> {
|
|
return this.patch("/api/users/me/profile/", data)
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response;
|
|
});
|
|
}
|
|
|
|
async getCurrentUserAccounts(): Promise<any> {
|
|
return this.get("/api/users/me/accounts/")
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response;
|
|
});
|
|
}
|
|
|
|
async currentUserInstanceAdminStatus(): Promise<IInstanceAdminStatus> {
|
|
return this.get("/api/users/me/instance-admin/")
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response;
|
|
});
|
|
}
|
|
|
|
async currentUserSettings(): Promise<IUserSettings> {
|
|
return this.get("/api/users/me/settings/")
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response;
|
|
});
|
|
}
|
|
|
|
async currentUserEmailNotificationSettings(): Promise<IUserEmailNotificationSettings> {
|
|
return this.get("/api/users/me/notification-preferences/")
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response;
|
|
});
|
|
}
|
|
|
|
async updateUser(data: Partial<IUser>): Promise<any> {
|
|
return this.patch("/api/users/me/", data)
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async updateUserOnBoard(): Promise<any> {
|
|
return this.patch("/api/users/me/onboard/", {
|
|
is_onboarded: true,
|
|
})
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async updateUserTourCompleted(): Promise<any> {
|
|
return this.patch("/api/users/me/tour-completed/", {
|
|
is_tour_completed: true,
|
|
})
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async updateCurrentUserEmailNotificationSettings(data: Partial<IUserEmailNotificationSettings>): Promise<any> {
|
|
return this.patch("/api/users/me/notification-preferences/", data)
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async getUserActivity(params: { per_page: number; cursor?: string }): Promise<IUserActivityResponse> {
|
|
return this.get("/api/users/me/activities/", { params })
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async changePassword(token: string, data: { old_password?: string; new_password: string }): Promise<any> {
|
|
return this.post(`/auth/change-password/`, data, {
|
|
headers: {
|
|
"X-CSRFTOKEN": token,
|
|
},
|
|
})
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async getUserProfileData(workspaceSlug: string, userId: string): Promise<IUserProfileData> {
|
|
return this.get(`/api/workspaces/${workspaceSlug}/user-stats/${userId}/`)
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async getUserProfileProjectsSegregation(
|
|
workspaceSlug: string,
|
|
userId: string
|
|
): Promise<IUserProfileProjectSegregation> {
|
|
return this.get(`/api/workspaces/${workspaceSlug}/user-profile/${userId}/`)
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async getUserProfileActivity(
|
|
workspaceSlug: string,
|
|
userId: string,
|
|
params: {
|
|
per_page: number;
|
|
cursor?: string;
|
|
}
|
|
): Promise<IUserActivityResponse> {
|
|
return this.get(`/api/workspaces/${workspaceSlug}/user-activity/${userId}/`, {
|
|
params,
|
|
})
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async downloadProfileActivity(
|
|
workspaceSlug: string,
|
|
userId: string,
|
|
data: {
|
|
date: string;
|
|
}
|
|
): Promise<any> {
|
|
return this.post(`/api/workspaces/${workspaceSlug}/user-activity/${userId}/export/`, data)
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async getUserProfileIssues(
|
|
workspaceSlug: string,
|
|
userId: string,
|
|
params: any,
|
|
config = {}
|
|
): Promise<TIssuesResponse> {
|
|
return this.get(
|
|
`/api/workspaces/${workspaceSlug}/user-issues/${userId}/`,
|
|
{
|
|
params,
|
|
},
|
|
config
|
|
)
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async deactivateAccount() {
|
|
return this.delete(`/api/users/me/`)
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async leaveWorkspace(workspaceSlug: string) {
|
|
return this.post(`/api/workspaces/${workspaceSlug}/members/leave/`)
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async joinProject(workspaceSlug: string, project_ids: string[]): Promise<any> {
|
|
return this.post(`/api/users/me/workspaces/${workspaceSlug}/projects/invitations/`, { project_ids })
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
|
|
async leaveProject(workspaceSlug: string, projectId: string) {
|
|
return this.post(`/api/workspaces/${workspaceSlug}/projects/${projectId}/members/leave/`)
|
|
.then((response) => response?.data)
|
|
.catch((error) => {
|
|
throw error?.response?.data;
|
|
});
|
|
}
|
|
}
|
|
|
|
const userService = new UserService();
|
|
|
|
export default userService;
|