| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 | /* * << * Davinci * == * Copyright (C) 2016 - 2017 EDP * == * 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 { removeToken } from './request'import {  DEFAULT_FONT_FAMILY,  DEFAULT_FONT_SIZE,  DEFAULT_FONT_WEIGHT} from 'app/globalConstants'import { message } from 'antd'import { OptionProps } from 'antd/lib/select'/** * UUID生成器 * @param len 长度 number * @param radix 随机数基数 number * @returns {string} */export const uuid = (len: number, radix: number = 62) => {  const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(    ''  )  const uuid = []  let i  if (len) {    // Compact form    for (i = 0; i < len; i++) {      uuid[i] = chars[Math.floor(Math.random() * radix)]    }  } else {    // rfc4122, version 4 form    let r    // rfc4122 requires these characters    uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'    uuid[14] = '4'    // Fill in random data.  At i==19 set the high bits of clock sequence as    // per rfc4122, sec. 4.1.5    for (i = 0; i < 36; i++) {      if (!uuid[i]) {        r = Math.floor(Math.random() * 16)        uuid[i] = chars[i === 19 ? ((r % 4) % 8) + 8 : r]      }    }  }  return uuid.join('')}export function safeAddition(num1, num2) {  const decimalDigits = Math.max(    `${num1}`.indexOf('.') >= 0      ? `${num1}`.substr(`${num1}`.indexOf('.') + 1).length      : 0,    `${num2}`.indexOf('.') >= 0      ? `${num2}`.substr(`${num2}`.indexOf('.') + 1).length      : 0  )  if (decimalDigits) {    const times = Math.pow(10, decimalDigits)    return (Math.round(num1 * times) + Math.round(num2 * times)) / times  } else {    return num1 + num2  }}/** * 通用saga异常处理 * @param error 异常内容: Error */export function errorHandler(error) {  if (error.response) {    switch (error.response.status) {      case 403:        message.error('未登录或会话过期,请重新登录', 1)        removeToken()        break      case 401:        message.error('您没有权限访问此数据', 2)        break      default:        message.error(          error.response.data.header            ? error.response.data.header.msg            : error.message,          3        )        break    }  } else if (error.message) {    message.error(error.message, 3)  } else {    throw error  }}export function getErrorMessage(error) {  return error.response    ? error.response.data.header      ? error.response.data.header.msg      : error.message    : error.message}export function getBase64(img, callback) {  const reader = new FileReader()  reader.addEventListener('load', () => callback(reader.result))  reader.readAsDataURL(img)}let utilCanvas = nullexport const getTextWidth = (  text: string,  fontWeight: string = DEFAULT_FONT_WEIGHT,  fontSize: string = DEFAULT_FONT_SIZE,  fontFamily: string = DEFAULT_FONT_FAMILY): number => {  const canvas = utilCanvas || (utilCanvas = document.createElement('canvas'))  const context = canvas.getContext('2d')  context.font = `${fontWeight} ${fontSize} ${fontFamily}`  const metrics = context.measureText(text)  return Math.ceil(metrics.width)}// ref: https://github.com/segmentio/is-url/blob/master/index.jsconst protocolAndDomainReg = /^(?:\w+:)?\/\/(\S+)$/const localhostDomainReg = /^localhost[\:?\d]*(?:[^\:?\d]\S*)?$/const nonLocalhostDomainReg = /^[^\s\.]+\.\S{2,}$/export function isUrl(str: string) {  if (typeof str !== 'string') {    return false  }  const match = str.match(protocolAndDomainReg)  if (!match) {    return false  }  const everythingAfterProtocol = match[1]  if (!everythingAfterProtocol) {    return false  }  if (    localhostDomainReg.test(everythingAfterProtocol) ||    nonLocalhostDomainReg.test(everythingAfterProtocol)  ) {    return true  }  return false}const imageReg = /\.(bmp|png|jpg|jpeg|gif)$/export function isImagePath(pathname: string) {  if (typeof pathname !== 'string') {    return false  }  return imageReg.test(pathname)}export function hasProperty<T extends object, U extends keyof T>(  obj: T,  key: U) {  return obj[key] ? obj[key] : false}export const tuple = <T extends string[]>(...args: T) => argsexport const tupleNum = <T extends number[]>(...args: T) => argsexport function filterSelectOption(  input: string,  option: React.ReactElement<OptionProps>): boolean {  const text = option.props.children as string  return text.toLowerCase().includes(input.toLowerCase())}export function filterTreeSelectOption(  input: string,  treeNode): boolean {  const text = treeNode.props.title  return text.toLowerCase().includes(input.toLowerCase())}
 |