다음과 같은 코드가 있습니다:
import Component from "@glimmer/component";
import { apiInitializer } from "discourse/lib/api";
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';
import { inject as service } from "@ember/service";
import { defaultHomepage } from "discourse/lib/utilities";
/*
const xhr = new XMLHttpRequest();
xhr.open("GET", "/cakeday/anniversaries/today.json");
xhr.send();
xhr.responseType = "json";
xhr.onload = () => {
if (xhr.readyState == 4 && xhr.status == 200) {
let resp = xhr.response;
let numberOfAnns = resp['total_rows_anniversaires'];
let allAnns = resp['anniversaries']; // 딕셔너리 목록입니다
console.log(allAnns);
let allAnnsUsernames = [];
for (var annUserdata in allAnns) {
console.log(allAnns[annUserdata]['username']);
allAnnsUsernames.push(allAnns[annUserdata]['username']);
}
var annsOfData = {'num_anns': numberOfAnns, 'anns_users': allAnnsUsernames};
}
};
return annsOfData;
*/
export default apiInitializer("1.14.0", (api) => {
//const banner_location = settings.banner_location
api.renderInOutlet(
settings.banner_location,
class BdaysAnnsBanner extends Component {
@tracked annsDataFinal = null;
@tracked bdaysDataFinal = null;
@tracked areBothBannersVisible = true;
@tracked isAnnsVisible = null;
@tracked isBdaysVisible = null;
@service router;
constructor() {
super(...arguments);
this.fetchAnnsData(); // 초기화 시 자동으로 가져오기
this.fetchBdaysData();
}
// 비동기로 데이터를 가져와서 추적 가능한 속성 업데이트
@action
async fetchAnnsData() {
const response = await fetch("/cakeday/anniversaries/today.json");
const json = await response.json();
let numberOfAnns = parseInt(json['total_rows_anniversaries']);
let allAnns = json['anniversaries']; // 딕셔너리 목록입니다
let allAnnsUsernames = [];
for (let annUserdata of allAnns) {
allAnnsUsernames.push(annUserdata['username']);
}
this.annsDataFinal = {'num_anns': numberOfAnns, 'anns_users': allAnnsUsernames, 'visible': true, 'isFilled': true};
this.updateBothBannersVisibility(this.annsDataFinal);
}
// 비동기로 데이터를 가져와서 추적 가능한 속성 업데이트
@action
async fetchBdaysData() {
// 여기서 bdaysDataFinal 선언
let bdaysDataFinal;
// 생일 데이터 가져오기
const response = await fetch("/cakeday/birthdays/today.json");
const json = await response.json();
// 데이터를 처리하는 로직 실행
let numberOfBdays = parseInt(json['total_rows_birthdays']);
let allBdays = json['birthdays']; // 딕셔너리 목록입니다
let allBdaysUsernames = [];
for (let bdayUserdata of allBdays) {
allBdaysUsernames.push(bdayUserdata['username']);
}
this.bdaysDataFinal = {'num_bdays': numberOfBdays, 'bdays_users': allBdaysUsernames, 'visible': true, 'isFilled': true};
this.updateBothBannersVisibility(this.bdaysDataFinal);
//console.log(annsDataFinal); // 결과 확인용
}
@action
updateBothBannersVisibility(bannerData) {
console.log(bannerData.num_anns);
// anns인지 bdays인지 확인
if (bannerData.num_anns) { // anns인 경우
console.log('Anns:')
console.log(bannerData.num_anns);
if (bannerData.num_anns == 0 && settings.hide_unused_data) {
console.log(`Anns+setting: ${bannerData.num_anns == 0 && settings.hide_unused_data}`);
this.isAnnsVisible = false;
console.log(`isAnnsV: ${this.isAnnsVisible}`);
//console.log(this.isBdaysVisible);
}
} else { // bdays인 경우
console.log(bannerData.num_bdays);
if (bannerData.num_bdays == 0 && settings.hide_unused_data) {
console.log(`Bdays+setting: ${bannerData.num_bdays == 0 && settings.hide_unused_data}`);
this.isBdaysVisible = false;
console.log(`isBdaysV: ${this.isBdaysVisible}`);
//console.log(this.isAnnsVisible);
}
}
console.log(`isAnnsV: ${this.isAnnsVisible}`);
console.log(`isBdaysV: ${this.isBdaysVisible}`);
// 부등호를 사용합니다. 값이 같지 않으면(true) 배너가 표시되고, 같으면 부등호 조건이 충족되지 않아 배너가 숨겨집니다.
this.areBothBannersVisible = !(this.isAnnsVisible === false && this.isBdaysVisible === false); // 또는: this.areBothBannersVisible = this.isAnnsVisible || this.isBdaysVisible;
console.log(this.areBothBannersVisible);
}
// 데이터용 Getter
get annsData() {
//return this.annsDataFinal;
if (this.annsDataFinal !== null) {
if (this.annsDataFinal.num_anns == 0) {
if (settings.hide_unused_data) {
this.annsDataFinal.isFilled = false;
this.annsDataFinal.visible = false;
} else {
this.annsDataFinal.isFilled = false;
}
} else {
this.annsDataFinal.isFilled = true;
this.annsDataFinal.visible = true;
}
//this.updateBothBannersVisibility(this.annsDataFinal);
// 데이터가 아직 로드되지 않았다면 null 또는 기본값을 반환
return this.annsDataFinal;
}
}
// 데이터용 Getter
get bdaysData() {
//return this.bdaysDataFinal;
if (this.bdaysDataFinal !== null) {
if (this.bdaysDataFinal.num_bdays == 0) {
if (settings.hide_unused_data) {
this.bdaysDataFinal.isFilled = false;
this.bdaysDataFinal.visible = false;
} else {
this.bdaysDataFinal.isFilled = false;
this.bdaysDataFinal.visible = true;
}
} else {
this.bdaysDataFinal.isFilled = true;
this.bdaysDataFinal.visible = true;
}
//this.updateBothBannersVisibility(this.bdaysDataFinal);
// 데이터가 아직 로드되지 않았다면 null 또는 기본값을 반환
return this.bdaysDataFinal;
}
}
get isHomepage() {
const { currentRouteName } = this.router;
return currentRouteName === `discovery.${defaultHomepage()}`;
}
//console.log(this.areBothBannersVisible);
<template>
{{#if this.areBothBannersVisible}}
{{#if this.isHomepage}}
<div class='bdaysannsbanner' id='bdaysannsbanner'>
{{#if this.annsData.visible}}
<div class='anns'>
{{#if this.annsData.isFilled}}
<p>{{this.annsData.num_anns}}명의 사용자가 결혼기념일을 축하하고 있습니다!</p>
<!-- 결혼기념일 데이터 표시 -->
{{#each this.annsData.anns_users as |username|}}
<span><a class='mention'>{{username}}</a></span>
{{/each}}
{{else}}
<p>오늘 결혼기념일인 사람은 없습니다!</p>
{{/if}}
</div>
{{/if}}
<br />
{{#if this.bdaysData.visible}}
<div class='bdays'>
{{#if this.bdaysData.isFilled}}
<p>{{this.bdaysData.num_bdays}}명의 사용자가 생일을 축하하고 있습니다!</p>
<!-- 생일 데이터 표시 -->
{{#each this.bdaysData.bdays_users as |username|}}
<span><a class='mention'>{{username}}</a></span>
{{/each}}
{{else}}
<p>오늘 생일인 사람은 없습니다!</p>
{{/if}}
</div>
{{/if}}
</div>
{{/if}}
{{/if}}
</template>
}
);
});
동작하지 않는 부분은 this.isAnnsVisible와 this.isBdaysVisible 변수입니다. 이 변수들이 업데이트되지 않는 것 같아서 배너가 계속 표시되고 있습니다.