Skip to content

Commit

Permalink
refactor: move diffTimestamps into utils/
Browse files Browse the repository at this point in the history
  • Loading branch information
carlinmack committed Jun 6, 2024
1 parent b72d6f3 commit 1b990de
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,12 @@ import { NotificationContext } from "@js/invenio_administration";
import { i18next } from "@translations/invenio_app_rdm/i18next";
import PropTypes from "prop-types";
import React, { Component } from "react";
import {
UserListItemCompact,
diffTimestamps,
toRelativeTime,
} from "react-invenio-forms";
import { UserListItemCompact } from "react-invenio-forms";
import { withState } from "react-searchkit";
import { Table } from "semantic-ui-react";
import { StatusFormatter } from "./StatusFormatter";
import { StopButton } from "./StopButton";
import { diffTimestamps } from "./utils/diffTimestamps";

class SearchResultItemComponent extends Component {
constructor(props) {
Expand Down Expand Up @@ -66,7 +63,11 @@ class SearchResultItemComponent extends Component {
? `${i18next.t("Waiting")}...`
: [
result.finished_at === null
? toRelativeTime(result.started_at, i18next.language)
? `${diffTimestamps(
new Date().toISOString(),
result.started_at,
i18next.language
)}...`
: diffTimestamps(
result.finished_at,
result.started_at,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// This file is part of React-Invenio-Forms
// Copyright (C) 2024 CERN.
//
// React-Invenio-Forms is free software; you can redistribute it and/or modify it
// under the terms of the MIT License; see LICENSE file for more details.

import { DateTime } from "luxon";

/**
* Create duration string for two given timestamps
*
* @param firstTimestamp string ISO timestamp
* @param secondTimestamp string ISO timestamp
* @returns {string} string representation of duration, i.e. 3 days
*/
export const diffTimestamps = (
firstTimestamp,
secondTimestamp,
language = "en"
) => {
const first = DateTime.fromISO(firstTimestamp);
const second = DateTime.fromISO(secondTimestamp);
const duration = first.diff(second).reconfigure({ locale: language });
// If we used a newer version of luxon we could just do this:
// return duration.toHuman();

// instead return the largest unit and value (ignore everything smaller)
const rescale = duration.shiftTo(
"years",
"months",
"weeks",
"days",
"hours",
"minutes",
"seconds",
"milliseconds"
); // in new luxon this is just duration.rescale()
const units = [
"years",
"months",
"weeks",
"days",
"hours",
"minutes",
"seconds",
"milliseconds",
];

for (const unit of units) {
if (rescale[unit] && rescale[unit] > 0) {
if (rescale[unit] === 1) {
return rescale[unit] + " " + unit.slice(0, -1); // remove s
} else {
return rescale[unit] + " " + unit;
}
}
}
return "-"; // in case all components are zero
};

0 comments on commit 1b990de

Please sign in to comment.