Bắt đầu lại từ đầu - Clean upload
All checks were successful
Deploy to Production / deploy (push) Successful in 10s

This commit is contained in:
Đặng Minh Quang
2026-01-28 19:57:46 +07:00
commit 235caaf2c8
50 changed files with 26482 additions and 0 deletions

View File

@@ -0,0 +1,319 @@
var tdv_sdk = {};
tdv_sdk.list = [
{
id: "gjkmg09",
name: "dog",
image: "https://image.senaai.tech/images/dog7.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_dog_06d80eb0.mp3",
},
{
id: "2byl8ac",
name: "cat",
image: "https://image.senaai.tech/images/Cat.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_cat_d077f244.mp3",
},
{
id: "yb4z60c",
name: "fish",
image: "https://image.senaai.tech/images/Clownfish.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_fish_83e4a96a.mp3",
},
{
id: "7npcqv0",
name: "bird",
image: "https://image.senaai.tech/images/Bird31.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_bird_abaecf8c.mp3",
},
{
id: "pbb8nxj",
name: "mouse",
image: "https://image.senaai.tech/images/Gerbil3.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_mouse_40203abe.mp3",
},
{
id: "pbb8nxj_cow",
name: "cow", // Đã bổ sung con bò theo yêu cầu của bạn
image: "https://image.senaai.tech/images/cow.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_cow_81566e98.mp3",
},
{
id: "2byl8ac",
name: "cat",
image: "https://image.senaai.tech/images/Cat.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_cat_d077f244.mp3",
},
{
id: "yb4z60c",
name: "fish",
image: "https://image.senaai.tech/images/Clownfish.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_fish_83e4a96a.mp3",
},
{
id: "7npcqv0",
name: "bird",
image: "https://image.senaai.tech/images/Bird31.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_bird_abaecf8c.mp3",
},
{
id: "gjkmg09",
name: "dog",
image: "https://image.senaai.tech/images/dog7.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_dog_06d80eb0.mp3",
},
{
id: "7npcqv0",
name: "bird",
image: "https://image.senaai.tech/images/Bird31.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_bird_abaecf8c.mp3",
},
{
id: "gjkmg09",
name: "dog",
image: "https://image.senaai.tech/images/dog7.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_dog_06d80eb0.mp3",
},
{
id: "2byl8ac",
name: "cat",
image: "https://image.senaai.tech/images/Cat.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_cat_d077f244.mp3",
},
{
id: "yb4z60c",
name: "fish",
image: "https://image.senaai.tech/images/Clownfish.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_fish_83e4a96a.mp3",
},
{
id: "7npcqv0",
name: "bird",
image: "https://image.senaai.tech/images/Bird31.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_bird_abaecf8c.mp3",
},
{
id: "pbb8nxj",
name: "mouse",
image: "https://image.senaai.tech/images/Gerbil3.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_mouse_40203abe.mp3",
},
{
id: "pbb8nxj_cow",
name: "cow", // Đã bổ sung con bò theo yêu cầu của bạn
image: "https://image.senaai.tech/images/cow.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_cow_81566e98.mp3",
},
{
id: "2byl8ac",
name: "cat",
image: "https://image.senaai.tech/images/Cat.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_cat_d077f244.mp3",
},
{
id: "yb4z60c",
name: "fish",
image: "https://image.senaai.tech/images/Clownfish.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_fish_83e4a96a.mp3",
},
{
id: "7npcqv0",
name: "bird",
image: "https://image.senaai.tech/images/Bird31.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_bird_abaecf8c.mp3",
},
{
id: "gjkmg09",
name: "dog",
image: "https://image.senaai.tech/images/dog7.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_dog_06d80eb0.mp3",
},
{
id: "7npcqv0",
name: "bird",
image: "https://image.senaai.tech/images/Bird31.png",
audio: "https://audio.senaai.tech/audio/Sena_Voice1_bird_abaecf8c.mp3",
},
];
tdv_sdk.pageCardConfig = [1, 2, 3, 4, 5, 6];
tdv_sdk.getImageStyle = function (name) {
for (let i in tdv_sdk.style) {
if (tdv_sdk.style[i].name == name) {
return tdv_sdk.style[i].image;
}
}
return "";
};
tdv_sdk.pageCurrent = 0;
tdv_sdk.totalPage = 0;
tdv_sdk.currentPageList = [];
tdv_sdk.getTotalPage = function () {
return tdv_sdk.totalPage;
};
tdv_sdk.getCurrentPage = function () {
return tdv_sdk.pageCurrent;
};
tdv_sdk.nextPage = function () {
if (tdv_sdk.pageCurrent < tdv_sdk.totalPage) {
tdv_sdk.pageCurrent++;
tdv_sdk.updateMaxCardByPage();
tdv_sdk.getPostionInPage();
}
};
tdv_sdk.prePage = function () {
if (tdv_sdk.pageCurrent > 0) {
tdv_sdk.pageCurrent--;
tdv_sdk.updateMaxCardByPage();
tdv_sdk.getPostionInPage();
}
};
tdv_sdk.getCurrentPageListInfo_getTotal = function () {
console.log(tdv_sdk.currentPageList.length - 1);
return tdv_sdk.currentPageList.length - 1;
};
tdv_sdk.getCurrentPageListInfo_getByIndex = function (index, attr) {
return tdv_sdk.currentPageList[index][attr];
};
tdv_sdk.start = function () {
tdv_sdk.pageInfo = [];
let list = tdv_sdk.list;
let index = 0;
for (let i = 0; i < tdv_sdk.pageCardConfig.length; i++) {
let count = tdv_sdk.pageCardConfig[i];
let startIdx = index;
let endIdx = Math.min(index + count, list.length);
let cardList = [];
for (let j = startIdx; j < endIdx; j++) {
const _obj = {
id: list[j].id,
name: list[j].name,
image: list[j].image,
audio: list[j].audio,
value: list[j].value,
x: 0,
y: 0,
};
cardList.push(_obj);
}
tdv_sdk.pageInfo.push({
index: i,
totalCardInpage: cardList.length,
cardList: cardList,
});
index = endIdx;
if (endIdx >= list.length) break; // dừng nếu hết dữ liệu
}
tdv_sdk.totalPage = tdv_sdk.pageInfo.length - 1;
tdv_sdk.pageCurrent = 0;
tdv_sdk.updateMaxCardByPage();
tdv_sdk.getPostionInPage();
};
tdv_sdk.getPostionInPage = function () {
const _currentPage = tdv_sdk.pageInfo[tdv_sdk.pageCurrent];
const max_width = 1200,
max_height = 1200,
margin_x = 80,
margin_y = 80,
card_width = 300,
card_height = 300;
const totalCards = _currentPage.totalCardInpage;
// --- ĐIỂM CẦN SỬA ---
// Mặc định là 3 cột (cho trường hợp 3, 5, 6 card)
let max_col = 3;
// Nếu có đúng 4 card -> Ép xuống thành 2 cột để ra dạng Grid 2x2
if (totalCards === 4) {
max_col = 2;
}
// --------------------
const num_rows = Math.ceil(totalCards / max_col);
// Tính chiều cao tổng thể để căn giữa dọc
const total_block_height = num_rows * card_height + (num_rows - 1) * margin_y;
const start_y = (max_height - total_block_height) / 2 + card_height / 2;
_currentPage.cardList.forEach((card, index) => {
const row_idx = Math.floor(index / max_col);
const col_idx = index % max_col;
// Tính số item trong hàng hiện tại để căn giữa ngang
let items_in_current_row;
// Logic xác định số lượng card trong hàng hiện tại
// Nếu là hàng cuối cùng
if (row_idx === num_rows - 1) {
// Lấy số dư. Nếu chia hết (dư 0) thì tức là hàng đó đầy (bằng max_col)
let remainder = totalCards % max_col;
items_in_current_row = remainder === 0 ? max_col : remainder;
} else {
// Các hàng bên trên luôn đầy
items_in_current_row = max_col;
}
const current_row_width =
items_in_current_row * card_width + (items_in_current_row - 1) * margin_x;
const start_x = (max_width - current_row_width) / 2 + card_width / 2;
card.x = start_x + col_idx * (card_width + margin_x);
card.y = start_y + row_idx * (card_height + margin_y);
});
tdv_sdk.currentPageList = _currentPage.cardList;
};
// get card info
tdv_sdk.getTotalCardInpage = function () {
return tdv_sdk.list.length;
};
tdv_sdk.getText = function (index) {
return tdv_sdk.list[index].name;
};
tdv_sdk.getId = function (index) {
return tdv_sdk.list[index].id;
};
tdv_sdk.getAnswers = function (index) {
return tdv_sdk.answers[index];
};
tdv_sdk.playSound = function (index) {
console.log("play sound : ", index);
const _audio = tdv_sdk.currentPageList[index].audio;
console.log("audio : ", _audio);
if (_audio == "") return;
if (window["audioPlayer"]) {
window["audioPlayer"].pause();
window["audioPlayer"].src = _audio;
window["audioPlayer"].play();
} else {
window["audioPlayer"] = new Audio(_audio);
window["audioPlayer"].play();
}
};
tdv_sdk.setMaxCardInPage = function (num) {
tdv_sdk.maxCardInPage = num;
};
tdv_sdk.updateMaxCardByPage = function () {
// Nếu có cấu hình cho trang hiện tại thì lấy, không thì giữ nguyên giá trị trước đó
const index = tdv_sdk.pageCurrent;
if (tdv_sdk.pageCardConfig && tdv_sdk.pageCardConfig[index] !== undefined) {
tdv_sdk.maxCardInPage = tdv_sdk.pageCardConfig[index];
}
};
// Hàm kiểm tra xem có phải trang cuối cùng không
tdv_sdk.isLastPage = function () {
if (tdv_sdk.pageCurrent >= tdv_sdk.totalPage) {
return 1; // Đúng là trang cuối
}
return 0; // Chưa phải trang cuối
};