KYI复制Api格式

KYI复制Api格式 by chancoki

// ==UserScript==
// @name       KYI复制Api格式
// @namespace    http://tampermonkey.net/
// @version      0.1
// @license MIT
// @description   KYI复制Api格式 by chancoki
// @author       chancoki
// @match        https://apidoc.kyigd.com:10000/
// @icon         https://apidoc.kyigd.com:10000/favicon.ico
// @grant        none
// ==/UserScript==

(function () {
  'use strict';
  const body = document.body;
  const div = document.createElement('div');

  body.appendChild(div);
  div.className = 'cc-copy el-button el-button--primary el-button--mini el-dropdown-selfdefine';
  div.innerHTML = '复制Api格式';
  div.addEventListener('click', getString);
  div.setAttribute('style','position: fixed;top: 154px;right: 150px;z-index:999909')

  window.onload = () => {
    const title = document.querySelector('.doc-title');

    if(!title){
      return
    }

    title.style.cursor = 'pointer';

    title.addEventListener('click', getString);
  };

  window.onkeydown=function() {
   if(event.ctrlKey && event.keyCode===67){
     getString()
    }
  }


  async function getString() {
    if(!document.querySelector('.doc-id')){
      return
    }

    const id = document.querySelector('.doc-id').innerText.split(':')[1];

    const url = `https://apidoc.kyigd.com:10000/doc/view/detail?id=${id}`;

    const res = await fetch(url, { headers: { Authorization: `Bearer ${localStorage.getItem('torna.token')}` } });

    const data = await res.json();
    try {
      const res = await copyToClip(resultStr(data.data));
      div.innerHTML = res;
    } catch (error) {
      div.innerHTML = error;
    }

    setTimeout(() => {
      div.innerHTML = '复制Api格式';
    }, 2000);
  }

  function resultStr(data) {
    return `
/**
 * ${data.name}
${data.queryParams.map(item => ` * @param {${paramType(item.type)}} data.${item.name} ${item.description}\n`)} */
export function ${data.url.split('/').pop()}(data) {
  return useRequest({ baseUrl, url:'${getUrl(data)}', method:'${data.httpMethod}', data });
}`.replaceAll(', *', ` *`).replaceAll('<br>','');
  }

  function getUrl(data) {
    return `${data.debugEnvs[0].url.split('/').slice(3).length?'/':''}${data.debugEnvs[0].url.split('/').slice(3).join('/')}${data.url}`;
  }

  function paramType(type) {
    if (type === 'int32') {
      return 'Number';
    }

    return type.charAt(0).toUpperCase() + type.slice(1);
  }

  function copyToClip(content) {
    return new Promise((resolve, reject) => {
      navigator.permissions.query({ name: 'clipboard-write' }).then(result => {
        const hasFocus = document.hasFocus(); //这个是重点,可判断是否为当前dom页面
        if (hasFocus && (result.state === 'granted' || result.state === 'prompt')) {
          const clipboard = navigator.clipboard.writeText(content);
          clipboard
            .then(res => {
              resolve('复制成功');
            })
            .catch(error => {
              reject('复制失败');
            });
        }
      });
    });
  }
})();