mirror of https://github.com/casbin/casnode.git
365 lines
8.9 KiB
JavaScript
365 lines
8.9 KiB
JavaScript
// Copyright 2020 The casbin Authors. All Rights Reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
import React from "react";
|
|
import {Link} from "react-router-dom";
|
|
import {message} from "antd";
|
|
import moment from "moment";
|
|
import {animateScroll as scroll} from "react-scroll";
|
|
import md5 from "js-md5";
|
|
import * as Conf from "./Conf";
|
|
import * as MemberBackend from "./backend/MemberBackend";
|
|
import i18next from "i18next";
|
|
import Zmage from "react-zmage";
|
|
import Identicon from "identicon.js";
|
|
import Sdk from "casdoor-js-sdk";
|
|
import * as ConfBackend from "./backend/ConfBackend";
|
|
import {FrontConfig} from "./Conf";
|
|
|
|
const pangu = require("pangu");
|
|
|
|
export let ServerUrl = "";
|
|
export let ClientUrl = "";
|
|
export let CasdoorSdk;
|
|
|
|
export const StaticBaseUrl = "https://cdn.casbin.org";
|
|
|
|
export function initServerUrl() {
|
|
const hostname = window.location.hostname;
|
|
if (hostname === "localhost") {
|
|
ServerUrl = `http://${hostname}:7000`;
|
|
}
|
|
}
|
|
|
|
export function initFullClientUrl() {
|
|
const hostname = window.location.hostname;
|
|
if (hostname === "localhost") {
|
|
ClientUrl = `http://${hostname}:3000`;
|
|
} else {
|
|
ClientUrl = `https://${hostname}`;
|
|
}
|
|
}
|
|
|
|
export function initCasdoorSdk(config) {
|
|
CasdoorSdk = new Sdk(config);
|
|
}
|
|
|
|
export function getSignupUrl() {
|
|
return CasdoorSdk.getSignupUrl();
|
|
}
|
|
|
|
export function getSigninUrl() {
|
|
return CasdoorSdk.getSigninUrl();
|
|
}
|
|
|
|
export function getUserProfileUrl(userName, account) {
|
|
return CasdoorSdk.getUserProfileUrl(userName, account);
|
|
}
|
|
|
|
export function getMyProfileUrl(account) {
|
|
return CasdoorSdk.getMyProfileUrl(account);
|
|
}
|
|
|
|
export function getMyResourcesUrl(account) {
|
|
return CasdoorSdk.getMyProfileUrl(account).replace("/account?", "/resources?");
|
|
}
|
|
|
|
export function signin() {
|
|
return CasdoorSdk.signin(ServerUrl).then((res) => {
|
|
if (res.status === "ok") {
|
|
if (window !== window.parent) {
|
|
const message = {tag: "Casdoor", type: "SilentSignin", data: "success"};
|
|
window.parent.postMessage(message, "*");
|
|
}
|
|
showMessage("success", i18next.t("login:Logged in successfully"));
|
|
}
|
|
|
|
return res;
|
|
});
|
|
}
|
|
|
|
export function scrollToTop() {
|
|
scroll.scrollToTop();
|
|
}
|
|
|
|
export function scrollToBottom() {
|
|
scroll.scrollToBottom();
|
|
}
|
|
|
|
export function refresh() {
|
|
window.location.reload();
|
|
}
|
|
|
|
export function goToLink(link) {
|
|
window.location.href = link;
|
|
}
|
|
|
|
export function openLink(link) {
|
|
const w = window.open("about:blank");
|
|
w.location.href = link;
|
|
}
|
|
|
|
export function getLink(link) {
|
|
return (
|
|
<a target="_blank" href={link} rel="noopener noreferrer">
|
|
{link}
|
|
</a>
|
|
);
|
|
}
|
|
|
|
export function showMessage(type, text) {
|
|
if (type === "success") {
|
|
message.success(text);
|
|
} else if (type === "error") {
|
|
message.error(text);
|
|
}
|
|
}
|
|
|
|
export function addRow(array, row) {
|
|
return [...array, row];
|
|
}
|
|
|
|
export function deleteRow(array, i) {
|
|
return [...array.slice(0, i), ...array.slice(i + 1)];
|
|
}
|
|
|
|
export function getFormattedDate(date) {
|
|
date = date?.replace("T", " ");
|
|
date = date?.replace("+08:00", " +08:00");
|
|
return date;
|
|
}
|
|
|
|
export function getPrettyDate(date) {
|
|
date = moment(date).fromNow();
|
|
return date;
|
|
}
|
|
|
|
export function getDiffDays(date) {
|
|
date = moment().diff(moment(date), "days");
|
|
return date;
|
|
}
|
|
|
|
export function getStatic(path) {
|
|
return `https://cdn.casbin.org${path}`;
|
|
}
|
|
|
|
export function getUserAvatar(username, isLarge = false) {
|
|
if (username === undefined) {
|
|
return null;
|
|
}
|
|
|
|
let identicon = new Identicon(md5(username), 420);
|
|
return "data:image/png;base64," + identicon;
|
|
}
|
|
|
|
export function getForumName() {
|
|
return Conf.FrontConfig.forumName;
|
|
}
|
|
|
|
export function getHomeLink(text) {
|
|
return <Link to={"/"}>{text === undefined ? getForumName() : text}</Link>;
|
|
}
|
|
|
|
export function changeEditorType(editorType) {
|
|
localStorage.setItem("editorType", editorType);
|
|
MemberBackend.updateMemberEditorType(editorType).then(() => goToLink("/"));
|
|
}
|
|
|
|
export function setLanguage(language) {
|
|
localStorage.setItem("language", language);
|
|
changeMomentLanguage(language);
|
|
i18next.changeLanguage(language);
|
|
}
|
|
|
|
export function changeLanguage(language, previous) {
|
|
MemberBackend.updateMemberLanguage(language).then(() => {
|
|
localStorage.setItem("language", language);
|
|
changeMomentLanguage(language);
|
|
i18next.changeLanguage(language);
|
|
goToLink(previous);
|
|
});
|
|
}
|
|
|
|
export function changeMomentLanguage(language) {
|
|
if (language.startsWith("zh")) {
|
|
moment.locale("zh", {
|
|
relativeTime: {
|
|
future: "%s内",
|
|
past: "%s前",
|
|
s: "几秒",
|
|
ss: "%d秒",
|
|
m: "1分钟",
|
|
mm: "%d分钟",
|
|
h: "1小时",
|
|
hh: "%d小时",
|
|
d: "1天",
|
|
dd: "%d天",
|
|
M: "1个月",
|
|
MM: "%d个月",
|
|
y: "1年",
|
|
yy: "%d年",
|
|
},
|
|
});
|
|
}
|
|
}
|
|
|
|
export function getFormattedContent(content, spacing) {
|
|
let formattedContent = content.replace(/@(.*?)[ \n\t]|@([^ \n\t]*?)[^ \n\t]$/g, function(w) {
|
|
if (w[w.length - 1] !== " ") {
|
|
return `@[${w.substring(1, w.length)}](${ClientUrl}/member/${w.substring(1)})`;
|
|
}
|
|
return `@[${w.substring(1, w.length - 1)}](${ClientUrl}/member/${w.substring(1)}) `;
|
|
});
|
|
if (spacing) {
|
|
return pangu
|
|
.spacing(formattedContent)
|
|
.replace(/\[(.*?)]\((.*?)\)/g, function(w) {
|
|
return w.replace(/ /g, "");
|
|
})
|
|
.replace(/% /g, "%")
|
|
.replace(/< /g, "<")
|
|
.replace(/ >/g, ">");
|
|
}
|
|
return formattedContent;
|
|
}
|
|
|
|
export function getBoolConvertedText(status) {
|
|
if (status) {
|
|
return i18next.t("general:true");
|
|
}
|
|
return i18next.t("general:false");
|
|
}
|
|
|
|
const stdImageExt = ["png", "jpg", "gif", "jpeg"];
|
|
|
|
export function getFileType(fileName) {
|
|
let fileType = "image";
|
|
let fileIndex = fileName.lastIndexOf(".");
|
|
let ext = fileName.substr(fileIndex + 1);
|
|
let lowerCase = ext.toLowerCase();
|
|
let index = stdImageExt.indexOf(lowerCase);
|
|
if (index < 0) {
|
|
fileType = "file";
|
|
}
|
|
return {fileType: fileType, ext: ext};
|
|
}
|
|
|
|
const unitSuffix = ["Bytes", "KB", "MB"];
|
|
|
|
export function getFormattedSize(fileSize) {
|
|
if (fileSize === null) {
|
|
return "0 Bytes";
|
|
}
|
|
let index = Math.floor(Math.log(fileSize) / Math.log(1024));
|
|
let size = (fileSize / Math.pow(1024, index)).toPrecision(3);
|
|
|
|
return size + " " + unitSuffix[index];
|
|
}
|
|
|
|
export let PcBrowser = true;
|
|
|
|
export function initBrowserType() {
|
|
if (!checkPc()) {
|
|
PcBrowser = false;
|
|
}
|
|
}
|
|
|
|
// checkPc return a boolean value means "mobile" or "pc"
|
|
export function checkPc() {
|
|
return !/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent);
|
|
}
|
|
|
|
// check if the link contains this page's anchor.
|
|
export function checkPageLink(url) {
|
|
if (url.indexOf("#") === 0) {
|
|
return true;
|
|
}
|
|
if (url.search(ClientUrl) === -1) {
|
|
return false;
|
|
}
|
|
|
|
let current, target;
|
|
if (window.location.href.indexOf("#") !== -1) {
|
|
current = window.location.href.slice(0, window.location.href.indexOf("#"));
|
|
} else {
|
|
current = window.location.href;
|
|
}
|
|
if (url.indexOf("#") !== -1) {
|
|
target = url.slice(0, url.indexOf("#"));
|
|
} else {
|
|
target = url;
|
|
}
|
|
return current === target;
|
|
}
|
|
|
|
export function renderImage({alt, src}) {
|
|
return <Zmage src={src} alt={alt} style={{maxWidth: "100%"}} />;
|
|
}
|
|
|
|
export function renderLink(props) {
|
|
return <a {...props} target="_blank" rel="nofollow noopener noreferrer" />;
|
|
}
|
|
|
|
export function getFrontConf(field) {
|
|
let storage = window.localStorage;
|
|
for (let conf in FrontConfig) {
|
|
if (storage[conf] !== undefined) {
|
|
FrontConfig[conf] = storage[conf];
|
|
}
|
|
}
|
|
|
|
ConfBackend.getFrontConfsByField(field).then((res) => {
|
|
for (let key in res.data) {
|
|
if (res.data[key].Value !== "") {
|
|
FrontConfig[res.data[key].id] = res.data[key].value;
|
|
}
|
|
storage[res.data[key].id] = FrontConfig[res.data[key].id];
|
|
}
|
|
});
|
|
}
|
|
|
|
export function getProviderLogoLink(provider) {
|
|
const idp = provider.type.toLowerCase();
|
|
return `${StaticBaseUrl}/img/social_${idp}.png`;
|
|
}
|
|
|
|
export function toggleThemeMode() {
|
|
let themeMode = localStorage.getItem("themeMode");
|
|
if (themeMode === null) {
|
|
themeMode = "light";
|
|
}
|
|
|
|
if (themeMode === "light") {
|
|
themeMode = "dark";
|
|
} else {
|
|
themeMode = "light";
|
|
}
|
|
localStorage.setItem("themeMode", themeMode);
|
|
|
|
window.location.reload();
|
|
}
|
|
|
|
export function getThemeBtnUrl() {
|
|
let themeMode = localStorage.getItem("themeMode");
|
|
if (themeMode === null) {
|
|
themeMode = "light";
|
|
}
|
|
|
|
return getStatic(`/img/toggle-${themeMode}.png`);
|
|
}
|
|
|
|
export function isFileUploading(value) {
|
|
return value !== undefined && value.includes("![Uploading file...]()");
|
|
}
|