utils.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import { toast } from 'react-toastify';
  2. import { toastConstants } from '../constants';
  3. import React from 'react';
  4. const HTMLToastContent = ({ htmlContent }) => {
  5. return <div dangerouslySetInnerHTML={{ __html: htmlContent }} />;
  6. };
  7. export default HTMLToastContent;
  8. export function isAdmin() {
  9. let user = localStorage.getItem('user');
  10. if (!user) return false;
  11. user = JSON.parse(user);
  12. return user.role >= 10;
  13. }
  14. export function isRoot() {
  15. let user = localStorage.getItem('user');
  16. if (!user) return false;
  17. user = JSON.parse(user);
  18. return user.role >= 100;
  19. }
  20. export function getSystemName() {
  21. let system_name = localStorage.getItem('system_name');
  22. if (!system_name) return 'One API';
  23. return system_name;
  24. }
  25. export function getLogo() {
  26. let logo = localStorage.getItem('logo');
  27. if (!logo) return '/logo.png';
  28. return logo
  29. }
  30. export function getFooterHTML() {
  31. return localStorage.getItem('footer_html');
  32. }
  33. export async function copy(text) {
  34. let okay = true;
  35. try {
  36. await navigator.clipboard.writeText(text);
  37. } catch (e) {
  38. okay = false;
  39. console.error(e);
  40. }
  41. return okay;
  42. }
  43. export function isMobile() {
  44. return window.innerWidth <= 600;
  45. }
  46. let showErrorOptions = { autoClose: toastConstants.ERROR_TIMEOUT };
  47. let showWarningOptions = { autoClose: toastConstants.WARNING_TIMEOUT };
  48. let showSuccessOptions = { autoClose: toastConstants.SUCCESS_TIMEOUT };
  49. let showInfoOptions = { autoClose: toastConstants.INFO_TIMEOUT };
  50. let showNoticeOptions = { autoClose: false };
  51. if (isMobile()) {
  52. showErrorOptions.position = 'top-center';
  53. // showErrorOptions.transition = 'flip';
  54. showSuccessOptions.position = 'top-center';
  55. // showSuccessOptions.transition = 'flip';
  56. showInfoOptions.position = 'top-center';
  57. // showInfoOptions.transition = 'flip';
  58. showNoticeOptions.position = 'top-center';
  59. // showNoticeOptions.transition = 'flip';
  60. }
  61. export function showError(error) {
  62. console.error(error);
  63. if (error.message) {
  64. if (error.name === 'AxiosError') {
  65. switch (error.response.status) {
  66. case 401:
  67. // toast.error('错误:未登录或登录已过期,请重新登录!', showErrorOptions);
  68. window.location.href = '/login?expired=true';
  69. break;
  70. case 429:
  71. toast.error('错误:请求次数过多,请稍后再试!', showErrorOptions);
  72. break;
  73. case 500:
  74. toast.error('错误:服务器内部错误,请联系管理员!', showErrorOptions);
  75. break;
  76. case 405:
  77. toast.info('本站仅作演示之用,无服务端!');
  78. break;
  79. default:
  80. toast.error('错误:' + error.message, showErrorOptions);
  81. }
  82. return;
  83. }
  84. toast.error('错误:' + error.message, showErrorOptions);
  85. } else {
  86. toast.error('错误:' + error, showErrorOptions);
  87. }
  88. }
  89. export function showWarning(message) {
  90. toast.warn(message, showWarningOptions);
  91. }
  92. export function showSuccess(message) {
  93. toast.success(message, showSuccessOptions);
  94. }
  95. export function showInfo(message) {
  96. toast.info(message, showInfoOptions);
  97. }
  98. export function showNotice(message, isHTML = false) {
  99. if (isHTML) {
  100. toast(<HTMLToastContent htmlContent={message} />, showNoticeOptions);
  101. } else {
  102. toast.info(message, showNoticeOptions);
  103. }
  104. }
  105. export function openPage(url) {
  106. window.open(url);
  107. }
  108. export function removeTrailingSlash(url) {
  109. if (url.endsWith('/')) {
  110. return url.slice(0, -1);
  111. } else {
  112. return url;
  113. }
  114. }
  115. export function timestamp2string(timestamp) {
  116. let date = new Date(timestamp * 1000);
  117. let year = date.getFullYear().toString();
  118. let month = (date.getMonth() + 1).toString();
  119. let day = date.getDate().toString();
  120. let hour = date.getHours().toString();
  121. let minute = date.getMinutes().toString();
  122. let second = date.getSeconds().toString();
  123. if (month.length === 1) {
  124. month = '0' + month;
  125. }
  126. if (day.length === 1) {
  127. day = '0' + day;
  128. }
  129. if (hour.length === 1) {
  130. hour = '0' + hour;
  131. }
  132. if (minute.length === 1) {
  133. minute = '0' + minute;
  134. }
  135. if (second.length === 1) {
  136. second = '0' + second;
  137. }
  138. return (
  139. year +
  140. '-' +
  141. month +
  142. '-' +
  143. day +
  144. ' ' +
  145. hour +
  146. ':' +
  147. minute +
  148. ':' +
  149. second
  150. );
  151. }
  152. export function downloadTextAsFile(text, filename) {
  153. let blob = new Blob([text], { type: 'text/plain;charset=utf-8' });
  154. let url = URL.createObjectURL(blob);
  155. let a = document.createElement('a');
  156. a.href = url;
  157. a.download = filename;
  158. a.click();
  159. }
  160. export const verifyJSON = (str) => {
  161. try {
  162. JSON.parse(str);
  163. } catch (e) {
  164. return false;
  165. }
  166. return true;
  167. };