Stuff stuff stuff #44
@ -1,14 +1,14 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import moment from "moment";
|
|
||||||
import PropTypes from "prop-types";
|
import PropTypes from "prop-types";
|
||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
|
import { format } from "timeago.js";
|
||||||
|
|
||||||
import { UserEdit } from "./userEdit";
|
import { UserEdit } from "./userEdit";
|
||||||
|
|
||||||
export const User = ({ id }) => {
|
export const User = ({ id }) => {
|
||||||
const user = useSelector((state) => state.admin.users.get(id));
|
const user = useSelector((state) => state.admin.users.get(id));
|
||||||
const polochon = user.polochon;
|
const polochon = user.polochon;
|
||||||
const lastSeen = moment(user.last_seen, "YYYY-MM-DDTHH:mm:ss.SZ");
|
const lastSeen = new Date(user.last_seen);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<tr>
|
<tr>
|
||||||
@ -33,7 +33,7 @@ export const User = ({ id }) => {
|
|||||||
}
|
}
|
||||||
></span>
|
></span>
|
||||||
</td>
|
</td>
|
||||||
<td>{lastSeen.isValid() ? lastSeen.fromNow() : "-"}</td>
|
<td>{isNaN(lastSeen) ? "-" : format(lastSeen)}</td>
|
||||||
<td>
|
<td>
|
||||||
<UserEdit id={id} />
|
<UserEdit id={id} />
|
||||||
</td>
|
</td>
|
||||||
|
@ -1,21 +1,26 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import PropTypes from "prop-types";
|
import PropTypes from "prop-types";
|
||||||
import moment from "moment";
|
import { format } from "timeago.js";
|
||||||
|
|
||||||
const prettyDate = (input) => {
|
const prettyDate = (input) => {
|
||||||
if (typeof input !== "string" || input === "") {
|
if (typeof input !== "string" || input === "") {
|
||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
const date = moment(input, "YYYY-MM-DD HH:mm:ss Z");
|
const date = new Date(input);
|
||||||
if (!date.isValid()) {
|
if (isNaN(date)) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
let output = date.format("DD/MM/YYYY");
|
const dd = date.getDay().toString().padStart(2, "0");
|
||||||
|
const mm = date.getMonth().toString().padStart(2, "0");
|
||||||
|
const yyyy = date.getFullYear();
|
||||||
|
let output = `${dd}/${mm}/${yyyy}`;
|
||||||
|
|
||||||
if (date > moment().subtract(1, "month") && date < moment().add(1, "month")) {
|
const now = new Date();
|
||||||
output += " (" + date.fromNow() + ")";
|
const days = Math.abs((now - date) / (24 * 60 * 60 * 1000));
|
||||||
|
if (days < 31) {
|
||||||
|
output += ` (${format(date)})`;
|
||||||
}
|
}
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
|
@ -2,7 +2,7 @@ import React, { useEffect } from "react";
|
|||||||
import PropTypes from "prop-types";
|
import PropTypes from "prop-types";
|
||||||
import { useDispatch, useSelector } from "react-redux";
|
import { useDispatch, useSelector } from "react-redux";
|
||||||
import { UAParser } from "ua-parser-js";
|
import { UAParser } from "ua-parser-js";
|
||||||
import moment from "moment";
|
import { format } from "timeago.js";
|
||||||
|
|
||||||
import { getUserTokens, deleteUserToken } from "../../actions/users";
|
import { getUserTokens, deleteUserToken } from "../../actions/users";
|
||||||
|
|
||||||
@ -27,6 +27,9 @@ export const UserTokens = () => {
|
|||||||
|
|
||||||
const Token = ({ token }) => {
|
const Token = ({ token }) => {
|
||||||
const ua = UAParser(token.user_agent);
|
const ua = UAParser(token.user_agent);
|
||||||
|
const lastUsed = new Date(token.last_used);
|
||||||
|
const createdAt = new Date(token.created_at);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="card mt-3">
|
<div className="card mt-3">
|
||||||
<div className="card-header">
|
<div className="card-header">
|
||||||
@ -39,8 +42,8 @@ const Token = ({ token }) => {
|
|||||||
<div className="card-body row">
|
<div className="card-body row">
|
||||||
<div className="col-12 col-md-6">
|
<div className="col-12 col-md-6">
|
||||||
<p>Last IP: {token.ip}</p>
|
<p>Last IP: {token.ip}</p>
|
||||||
<p>Last used: {moment(token.last_used).fromNow()}</p>
|
<p>Last used: {isNaN(lastUsed) ? "-" : format(lastUsed)}</p>
|
||||||
<p>Created: {moment(token.created_at).fromNow()}</p>
|
<p>Created: {isNaN(createdAt) ? "-" : format(createdAt)}</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-12 col-md-6">
|
<div className="col-12 col-md-6">
|
||||||
<p>
|
<p>
|
||||||
|
27
frontend/package-lock.json
generated
27
frontend/package-lock.json
generated
@ -14,7 +14,6 @@
|
|||||||
"immer": "^9.0.5",
|
"immer": "^9.0.5",
|
||||||
"jquery": "^3.6.0",
|
"jquery": "^3.6.0",
|
||||||
"jwt-decode": "^3.1.2",
|
"jwt-decode": "^3.1.2",
|
||||||
"moment": "^2.29.1",
|
|
||||||
"popper.js": "^1.15.0",
|
"popper.js": "^1.15.0",
|
||||||
"prop-types": "^15.7.2",
|
"prop-types": "^15.7.2",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
@ -54,6 +53,7 @@
|
|||||||
"sass": "^1.37.5",
|
"sass": "^1.37.5",
|
||||||
"sass-loader": "^12.1.0",
|
"sass-loader": "^12.1.0",
|
||||||
"style-loader": "^3.2.1",
|
"style-loader": "^3.2.1",
|
||||||
|
"timeago.js": "^4.0.2",
|
||||||
"universal-cookie": "^4.0.4",
|
"universal-cookie": "^4.0.4",
|
||||||
"webpack": "^5.50.0",
|
"webpack": "^5.50.0",
|
||||||
"webpack-cli": "^4.7.2",
|
"webpack-cli": "^4.7.2",
|
||||||
@ -6138,14 +6138,6 @@
|
|||||||
"mkdirp": "bin/cmd.js"
|
"mkdirp": "bin/cmd.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/moment": {
|
|
||||||
"version": "2.29.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
|
|
||||||
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
|
|
||||||
"engines": {
|
|
||||||
"node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/ms": {
|
"node_modules/ms": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||||
@ -8270,6 +8262,12 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/timeago.js": {
|
||||||
|
"version": "4.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/timeago.js/-/timeago.js-4.0.2.tgz",
|
||||||
|
"integrity": "sha512-a7wPxPdVlQL7lqvitHGGRsofhdwtkoSXPGATFuSOA2i1ZNQEPLrGnj68vOp2sOJTCFAQVXPeNMX/GctBaO9L2w==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/timm": {
|
"node_modules/timm": {
|
||||||
"version": "1.7.1",
|
"version": "1.7.1",
|
||||||
"resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz",
|
"resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz",
|
||||||
@ -13691,11 +13689,6 @@
|
|||||||
"minimist": "^1.2.5"
|
"minimist": "^1.2.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"moment": {
|
|
||||||
"version": "2.29.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
|
|
||||||
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
|
|
||||||
},
|
|
||||||
"ms": {
|
"ms": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||||
@ -15306,6 +15299,12 @@
|
|||||||
"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz",
|
||||||
"integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ=="
|
"integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ=="
|
||||||
},
|
},
|
||||||
|
"timeago.js": {
|
||||||
|
"version": "4.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/timeago.js/-/timeago.js-4.0.2.tgz",
|
||||||
|
"integrity": "sha512-a7wPxPdVlQL7lqvitHGGRsofhdwtkoSXPGATFuSOA2i1ZNQEPLrGnj68vOp2sOJTCFAQVXPeNMX/GctBaO9L2w==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"timm": {
|
"timm": {
|
||||||
"version": "1.7.1",
|
"version": "1.7.1",
|
||||||
"resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz",
|
"resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz",
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
"immer": "^9.0.5",
|
"immer": "^9.0.5",
|
||||||
"jquery": "^3.6.0",
|
"jquery": "^3.6.0",
|
||||||
"jwt-decode": "^3.1.2",
|
"jwt-decode": "^3.1.2",
|
||||||
"moment": "^2.29.1",
|
|
||||||
"popper.js": "^1.15.0",
|
"popper.js": "^1.15.0",
|
||||||
"prop-types": "^15.7.2",
|
"prop-types": "^15.7.2",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
@ -54,6 +53,7 @@
|
|||||||
"sass": "^1.37.5",
|
"sass": "^1.37.5",
|
||||||
"sass-loader": "^12.1.0",
|
"sass-loader": "^12.1.0",
|
||||||
"style-loader": "^3.2.1",
|
"style-loader": "^3.2.1",
|
||||||
|
"timeago.js": "^4.0.2",
|
||||||
"universal-cookie": "^4.0.4",
|
"universal-cookie": "^4.0.4",
|
||||||
"webpack": "^5.50.0",
|
"webpack": "^5.50.0",
|
||||||
"webpack-cli": "^4.7.2",
|
"webpack-cli": "^4.7.2",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user