해당 문서는 MS Office Plugin에 대한 코드이기 때문에 통상적인 프론트 개발자 또는 백엔드 개발자가 보고 이해하는 데에 상당한 시간이 소요되는 문서입니다. 이 점 참조하여 해당 플러그인을 수정하여 재배포하고자 하는 경우 공수에 대해 적어도 3개월을 잡으실 것을 권장해드립니다.
로그인 페이지입니다. 아래 기재된 펑션은 로그인 펑션으로, 성공시에 ‘sendPostResponse’ 펑션을 호출하여 토큰을 디코드하고 translator.html&js를 오픈합니다.
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'
});
}
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");
}
해당 페이지는 불필요한 페이지이므로 삭제하셔도 됩니다. 원래 문서(파일) 번역기를 포함한 기능이 담겨있습니다.
유저의 구독 정보, 사용량 등을 확인할 수 있는 설정 페이지 입니다. 페이지 로드시 토큰을 디코드 하여 유저 정보를 확인한 후 서브스크립션과 컨트랙트를 확인합니다.
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~로 시작하는 페이지들은 전부 불필요합니다. 프롬프트 엔지니어링을 통해 구글 특허 검색을 수행하거나 하는 기능들입니다. 해당 내용 참조하시어 제거 부탁드립니다.