(core) DocLimits: display days remaining instead of days of grace period

Summary:
Before this change we would always say there are 14 days remaining,
regardless of how many actually are remaining. Let's pass around a
different `dataLimitsInfo` object that also reports the number of days
remaining.

Test Plan: Ensure the test suite passes.

Reviewers: georgegevoian

Reviewed By: georgegevoian

Differential Revision: https://phab.getgrist.com/D4332
This commit is contained in:
Jordi Gutiérrez Hermoso
2024-08-27 21:27:59 -04:00
parent 8da89b0a3d
commit 80f8168cab
7 changed files with 40 additions and 30 deletions

View File

@@ -1,5 +1,6 @@
import {ApiError} from 'app/common/ApiError';
import {APPROACHING_LIMIT_RATIO, DataLimitStatus, DocumentUsage, getUsageRatio} from 'app/common/DocUsage';
import {APPROACHING_LIMIT_RATIO, DataLimitInfo, DataLimitStatus,
DocumentUsage, getUsageRatio} from 'app/common/DocUsage';
import {Features} from 'app/common/Features';
import moment from 'moment-timezone';
@@ -22,22 +23,24 @@ export interface GetDataLimitStatusParams {
* Given a set of params that includes document usage, current product features, and
* a grace-period start (if any), returns the data limit status of a document.
*/
export function getDataLimitStatus(params: GetDataLimitStatusParams): DataLimitStatus {
export function getDataLimitInfo(params: GetDataLimitStatusParams): DataLimitInfo {
const {docUsage, productFeatures, gracePeriodStart} = params;
const ratio = getDataLimitRatio(docUsage, productFeatures);
if (ratio > 1) {
const start = gracePeriodStart;
const days = productFeatures?.gracePeriodDays;
if (start && days && moment().diff(moment(start), 'days') >= days) {
return 'deleteOnly';
// In case we forgot to define a grace period, we'll default to two weeks.
const days = productFeatures?.gracePeriodDays ?? 14;
const daysRemaining = start && days ? days - moment().diff(moment(start), 'days') : NaN;
if (daysRemaining > 0) {
return {status: 'gracePeriod', daysRemaining};
} else {
return 'gracePeriod';
return {status: 'deleteOnly'};
}
} else if (ratio > APPROACHING_LIMIT_RATIO) {
return 'approachingLimit';
} else {
return null;
return {status: 'approachingLimit'};
}
return {status: null};
}
/**

View File

@@ -10,13 +10,17 @@ export interface RowCounts {
}
export type DataLimitStatus = 'approachingLimit' | 'gracePeriod' | 'deleteOnly' | null;
export interface DataLimitInfo {
status: DataLimitStatus;
daysRemaining?: number;
}
type DocUsageOrPending = {
[Metric in keyof Required<DocumentUsage>]: Required<DocumentUsage>[Metric] | 'pending'
}
export interface DocUsageSummary extends DocUsageOrPending {
dataLimitStatus: DataLimitStatus;
dataLimitInfo: DataLimitInfo;
}
// Count of non-removed documents in an org, grouped by data limit status.
@@ -27,7 +31,7 @@ type FilteredDocUsage = {
}
export interface FilteredDocUsageSummary extends FilteredDocUsage {
dataLimitStatus: DataLimitStatus;
dataLimitInfo: DataLimitInfo;
}
// Ratio of usage at which we start telling users that they're approaching limits.