Handling quota limit error (#437)

This commit is contained in:
Montassar Ghanmy
2024-03-26 09:04:36 +01:00
committed by GitHub
parent 389d42fe4f
commit cb5a2ad3b7
14 changed files with 235 additions and 35 deletions
@@ -102,13 +102,23 @@ export class DriveApiClient {
data: { item: Partial<DriveItem>; version?: Partial<DriveItemVersion> },
) {
if (!data.version) data.version = {} as Partial<DriveItemVersion>;
return await Api.post<
{ item: Partial<DriveItem>; version: Partial<DriveItemVersion> },
DriveItem
>(
`/internal/services/documents/v1/companies/${companyId}/item${appendTdriveToken()}`,
data as { item: Partial<DriveItem>; version: Partial<DriveItemVersion> },
);
return new Promise<DriveItem>((resolve, reject) => {
Api.post<
{ item: Partial<DriveItem>; version: Partial<DriveItemVersion> },
DriveItem
>(
`/internal/services/documents/v1/companies/${companyId}/item${appendTdriveToken()}`,
data as { item: Partial<DriveItem>; version: Partial<DriveItemVersion> },
(res) => {
if ((res as any)?.statusCode || (res as any)?.error) {
reject(res);
}
resolve(res);
},
);
});
}
static async createVersion(companyId: string, id: string, version: Partial<DriveItemVersion>) {
@@ -7,7 +7,7 @@ import { DriveItemAtom, DriveItemChildrenAtom } from '../state/store';
import { BrowseFilter, DriveItem, DriveItemVersion } from '../types';
import { SharedWithMeFilterState } from '../state/shared-with-me-filter';
import Languages from 'features/global/services/languages-service';
import { useUserQuota } from "features/users/hooks/use-user-quota";
import { useUserQuota } from 'features/users/hooks/use-user-quota';
/**
* Returns the children of a drive item
@@ -48,17 +48,30 @@ export const useDriveActions = () => {
const create = useCallback(
async (item: Partial<DriveItem>, version: Partial<DriveItemVersion>) => {
if (!item || !version) throw new Error("All ");
let driveFile = null;
if (!item || !version) throw new Error('All ');
if (!item.company_id) item.company_id = companyId;
try {
driveFile = await DriveApiClient.create(companyId, { item, version });
await refresh(driveFile.parent_id!);
const driveFile = await DriveApiClient.create(companyId, { item, version });
await refresh(driveFile.parent_id);
await getQuota();
} catch (e) {
ToasterService.error(Languages.t('hooks.use-drive-actions.unable_create_file'));
return driveFile;
} catch (e: any) {
if (e.statusCode === 403) {
ToasterService.info(
<>
<p>{Languages.t('hooks.use-drive-actions.quota_limit_exceeded_title')}</p>
<p>{Languages.t('hooks.use-drive-actions.quota_limit_exceeded_message')}</p>
<p>{Languages.t('hooks.use-drive-actions.quota_limit_exceeded_plans')}</p>
</>,
);
} else {
ToasterService.error(Languages.t('hooks.use-drive-actions.unable_create_file'));
}
return null;
}
return driveFile;
},
[refresh],
);
@@ -132,8 +145,8 @@ export const useDriveActions = () => {
const updateBody = {
company_id: companyId,
user_id: userId,
level: level
}
level: level,
};
await DriveApiClient.updateLevel(companyId, id, updateBody);
await refresh(id || '');
} catch (e) {
@@ -151,7 +151,7 @@ export default class Api {
requestType?: 'post' | 'get' | 'put' | 'delete';
} = {},
): Promise<Response> {
return new Promise(resolve => {
return new Promise((resolve) => {
Requests.request(
options.requestType ? options.requestType : 'post',
new URL(route, Globals.api_root_url).toString(),
@@ -142,9 +142,9 @@ class UserAPIClientService {
});
}
async getQuota(userId: string): Promise<UserQuota> {
async getQuota(companyId: string, userId: string): Promise<UserQuota> {
return Api.get<UserQuota>(
`/internal/services/users/v1/users/${userId}/quota`,
`/internal/services/users/v1/users/${userId}/quota?companyId=${companyId}`,
undefined,
false
).then(result => {
@@ -4,6 +4,7 @@ import UserAPIClient from '@features/users/api/user-api-client';
import { useCurrentUser } from "features/users/hooks/use-current-user";
import { atom, useRecoilState } from "recoil";
import useRouteState from "app/features/router/hooks/use-route-state";
import useRouterCompany from "app/features/router/hooks/use-router-company";
export const QuotaState = atom<UserQuota>({
key: 'QuotaState',
@@ -22,13 +23,14 @@ export const useUserQuota = () => {
}
const { appName } = useRouteState();
const isPublic = appName === 'drive';
const companyId = useRouterCompany();
const { user } = isPublic ? { user: null } : useCurrentUser();
const [quota, setQuota] = useRecoilState(QuotaState);
const getQuota = useCallback(async () => {
let data: UserQuota = nullQuota;
if (user && user?.id) {
data = await UserAPIClient.getQuota(user.id);
data = await UserAPIClient.getQuota(companyId, user.id);
} else {
data = nullQuota;
}