BeringAI for Word

각 페이지별 기능 설명

해당 문서는 MS Office Plugin에 대한 코드이기 때문에 통상적인 프론트 개발자 또는 백엔드 개발자가 보고 이해하는 데에 상당한 시간이 소요되는 문서입니다. 이 점 참조하여 해당 플러그인을 수정하여 재배포하고자 하는 경우 공수에 대해 적어도 3개월을 잡으실 것을 권장해드립니다.

firstExperinece.html&js

마이크로소프트의 심사 기준을 통과하기 위해서 존재하는 페이지 입니다.
해당 플러그인의 기능을 소개하는 문구를 기재해야하는 것이 심사의 주요 항목입니다.

auth.html&js

로그인 페이지입니다. 아래 기재된 펑션은 로그인 펑션으로, 성공시에 ‘sendPostResponse’ 펑션을 호출하여 토큰을 디코드하고 translator.html&js를 오픈합니다.

sendPostRequestSignIn()

				
					function sendPostRequestSignIn() {
    // 요청할 엔드포인트 URL
        var url = 'https://dev.api-v2.beringlab.com/task-management/api/v1/external/auth/login';
    
    // POST 요청에 필요한 데이터
        var data = {
            id: Login_Form_Email.value,
            password: Login_Form_Password.value
        };
        // fetch를 사용하여 POST 요청 보내기
        fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                // 여기에 필요하다면 다른 헤더도 추가할 수 있습니다.
            },
            body: JSON.stringify(data) // 데이터를 JSON 형태로 변환하여 전송
        })
        .then(response => response.json()) // 응답을 JSON 형태로 파싱
        .then(data => {
            console.log('Response:', data);
            
            if (data.error) {
                console.error('Error:', data.error);
                console.log('login failed');
                var signInFailed = document.getElementById('sign_in_failed');
                signInFailed.style.display = 'flex';
            } else {
                // 받아온 access token을 처리하는 함수 호출
                sendPostResponse(data);
            }
        })
        .catch(error => {
            // 요청에 실패한 경우 처리
            console.error('Error:', error);
            console.log('login failed');
            var signInFailed = document.getElementById('sign_in_failed')
            signInFailed.style.display = 'flex'
        });
    }
				
			

sendPostResponse()

				
					function sendPostResponse(responseData) {
    // responseData에서 access token과 refresh token을 추출하거나 다른 방식으로 토큰을 획득합니다.
    // 예시: responseData에서 토큰 추출
    const { access_token, refresh_token } = responseData;

    // 추출된 토큰을 로컬 스토리지에 저장
    createTokens(access_token, refresh_token);
    
    // 예시: 다른 작업 수행
    console.log('Access Token:', access_token);
    console.log('Refresh Token:', refresh_token);
    var token = getAccessToken();
    var decoded = jwtDecode(token);
    console.log('Decoded:', decoded);
    loadPage("translator.html", "translator.js");
}
				
			

legacy_document.html&js

해당 페이지는 불필요한 페이지이므로 삭제하셔도 됩니다. 원래 문서(파일) 번역기를 포함한 기능이 담겨있습니다.

login.html&js

해당 페이지는 불필요한 페이지이므로 삭제하셔도 됩니다.
auth.html&js 와 다른 점은, 해당 페이지는 SSO를 위해 작업하던 페이지라는 것이고 지금의 구조는 SSO가 불필요하기 때문에 login.html&js는 사용되지 않습니다.

setting.html&js

유저의 구독 정보, 사용량 등을 확인할 수 있는 설정 페이지 입니다. 페이지 로드시 토큰을 디코드 하여 유저 정보를 확인한 후 서브스크립션과 컨트랙트를 확인합니다.

setting.js 중 Office.onReady 파트

				
					Office.onReady((info) => {
    if (info.host === Office.HostType.Word) {
        const removeTokens = function() {
        localStorage.removeItem(TOKEN_KEY);
        localStorage.removeItem(REFRESH_TOKEN_KEY);
        };
        function logOut(){
          removeTokens();
          console.log('Token Removed')
          loadPage("auth.html", "auth.js");
        };
        const { jwtDecode } = require('jwt-decode');
        const TOKEN_KEY = "accessToken";
        const REFRESH_TOKEN_KEY = "refreshToken"; 
        const getAccessToken = function() {
        return localStorage.getItem(TOKEN_KEY) || "";
        };

        var token = getAccessToken();          
        if (!token) {
          console.log('토큰이 없습니다.');
          logOut();
        } else {
          try {
              var decoded = jwtDecode(token);
              console.log('Decoded:', decoded);
              // 이메일
              const usageDiv = document.getElementById("usage");
              const quotaDiv = document.getElementById("quota");
              const slashDiv = document.getElementById("slash");
              const tierDiv = document.getElementById("plan");
              const current_usage = document.getElementById("current_usage");
              const emailDiv = document.querySelector('.Setting-User-Info-Email-Value');
              if (emailDiv) {
                  emailDiv.textContent = decoded.user_name;
              } else {
                  console.error('이메일 정보를 표시할 div 요소를 찾을 수 없습니다.');
              }

              checkContract(token)
                .then(data => {
                  console.log('then!');
                  checkUsage(token)
                  .then(usage => {
                    var quota = Math.floor(data.quota);
                    var bar_width_value = usage/quota*100;
                    usageDiv.textContent = usage;
                    quotaDiv.textContent = quota;
                    console.log('before if: ', data);
                    console.log('usage: ', usage);
                    console.log('quota: ', quota);
                    console.log('width: ', bar_width_value);
                    
                    if(data.subscription_id == null){
                      tierDiv.textContent = 'Enterprise';
                      document.getElementById("setting_div_contact_sales").style.display = 'block';
                      
                      if(data.is_limited == true){
                        console.log('test');
                      } else {
                        quotaDiv.textContent = 'Unlimited';
                        current_usage.style.width = '100%';
                        current_usage.style.background = "linear-gradient(to right, #C513C8, #380373)"
                      }
                    }
                    else{
                      quotaDiv.textContent = quota;
                      if(bar_width_value > 100){
                        current_usage.style.width = '100%';
                        current_usage.style.background = "#F0504F"
                        quotaDiv.style.color = "#F0504F"
                        usageDiv.style.color = "#F0504F"
                        slashDiv.style.color = "#F0504F";
                      }else{
                        current_usage.style.width = `${bar_width_value}%`
                      }
                      if(quota == 10000) {
                          tierDiv.textContent = 'Starter';
                      } else if(quota == 35000) {
                          tierDiv.textContent = 'Advanced';
                      } else if(quota == 80000) {
                          tierDiv.textContent = 'Ultimate';
                      } else {
                          console.error('구독 티어 정보를 표시할 div 요소를 찾을 수 없습니다.');
                      }
                    }
                    undoCancellationButton.addEventListener('click', function() {
                      undoCancellation(token, data.subscription_id);
                    });
            
                    undoDowngradeButton.addEventListener('click', function() {
                      undoDowngrade(token, data.subscription_id);
                    });
                  }); 
                })
                .catch(error => {
                  console.log('work!:', error);
                  checkUsage(token)
                  .then(usage => {
                    var quota = 5000;
                    var bar_width_value = usage/quota*100;
                    usageDiv.textContent = usage;
                    quotaDiv.textContent = quota;
                    if(bar_width_value > 100){
                      current_usage.style.width = '100%';
                      current_usage.style.background = "#F0504F"
                      quotaDiv.style.color = "#F0504F"
                      usageDiv.style.color = "#F0504F"
                      slashDiv.style.color = "#F0504F";
                    }else{
                      current_usage.style.width = `${bar_width_value}%`
                    };
                    document.getElementById("state_free").style.display = 'block';
                    document.getElementById("setting_div_upgrade_plan").style.display = 'block';
                  });
                });
          } catch (error) {
              console.error('유효하지 않은 토큰입니다:', error.message);
              logOut();
          }
        }
        document.getElementById("back_to_translator").onclick = () => tryCatch(backToTranslator);
        document.getElementById("setting_button_upgrade_plan").onclick = () => tryCatch(openPlanPage);
        document.getElementById("setting_button_contact_sales").onclick = () => tryCatch(openContactSalesPage);


        

        const undoCancellationButton = document.getElementById("setting_button_undo_terminate");
        const undoDowngradeButton = document.getElementById("setting_button_undo_downgrade");
        



        document.getElementById("Sign_out").onclick = () => tryCatch(logOut);}

});

				
			

gpt*.html&js

gpt~로 시작하는 페이지들은 전부 불필요합니다. 프롬프트 엔지니어링을 통해 구글 특허 검색을 수행하거나 하는 기능들입니다. 해당 내용 참조하시어 제거 부탁드립니다.

Published