- 响应式项目首页 (Landing, 含 R2 APK 下载) + 路由 /home 调整 - OTA 升级: tauri-plugin-hotswap (lib.rs/main.rs 拆分, 客户端热替换) - OTA 服务端 (check/bundle/manifest-web) + build-ota/genkey/upload 脚本 - 密钥/凭据统一存配置中心 (signing + ota + cloudflare 分组) - Android CI (android-* 分支) + OTA CI (手动触发), 产物上传 R2 - 修复 tsc/构建阻塞问题
122 lines
3.4 KiB
JavaScript
122 lines
3.4 KiB
JavaScript
let currentPage = 'page-home';
|
|
let currentView = 'grid';
|
|
|
|
function showPage(pageId) {
|
|
document.querySelectorAll('.page').forEach(p => p.classList.remove('active'));
|
|
document.getElementById(pageId).classList.add('active');
|
|
currentPage = pageId;
|
|
|
|
// Update nav
|
|
const navMap = {
|
|
'page-home': 0,
|
|
'page-outfit': 1,
|
|
'page-add': 2,
|
|
'page-closet': 3,
|
|
'page-profile': 4,
|
|
'page-detail': -1,
|
|
'page-calendar': -1
|
|
};
|
|
const idx = navMap[pageId];
|
|
if (idx >= 0) {
|
|
document.querySelectorAll('.nav-item').forEach((n, i) => {
|
|
n.classList.toggle('active', i === idx);
|
|
});
|
|
}
|
|
}
|
|
|
|
function navTo(el, pageId) {
|
|
document.querySelectorAll('.nav-item').forEach(n => n.classList.remove('active'));
|
|
el.classList.add('active');
|
|
showPage(pageId);
|
|
}
|
|
|
|
function setView(view) {
|
|
currentView = view;
|
|
const grid = document.getElementById('closet-grid');
|
|
const list = document.getElementById('closet-list');
|
|
const gridBtn = document.getElementById('grid-view-btn');
|
|
const listBtn = document.getElementById('list-view-btn');
|
|
|
|
if (view === 'grid') {
|
|
grid.style.display = 'grid';
|
|
list.classList.add('hidden');
|
|
gridBtn.classList.add('active');
|
|
listBtn.classList.remove('active');
|
|
} else {
|
|
grid.style.display = 'none';
|
|
list.classList.remove('hidden');
|
|
gridBtn.classList.remove('active');
|
|
listBtn.classList.add('active');
|
|
}
|
|
}
|
|
|
|
function filterCloset(btn, cat) {
|
|
document.querySelectorAll('.filter-bar:first-of-type .filter-btn').forEach(b => b.classList.remove('active'));
|
|
btn.classList.add('active');
|
|
|
|
const cards = document.querySelectorAll('.clothing-card');
|
|
cards.forEach(card => {
|
|
if (cat === 'all' || card.dataset.cat === cat) {
|
|
card.style.display = '';
|
|
} else {
|
|
card.style.display = 'none';
|
|
}
|
|
});
|
|
}
|
|
|
|
function selectColor(el) {
|
|
document.querySelectorAll('.color-dot').forEach(d => d.classList.remove('active'));
|
|
el.classList.add('active');
|
|
}
|
|
|
|
function simulateUpload() {
|
|
const placeholder = document.getElementById('upload-placeholder');
|
|
const preview = document.getElementById('upload-preview');
|
|
if (placeholder && preview) {
|
|
placeholder.style.display = 'none';
|
|
preview.classList.remove('hidden');
|
|
}
|
|
}
|
|
|
|
function resetUpload() {
|
|
const placeholder = document.getElementById('upload-placeholder');
|
|
const preview = document.getElementById('upload-preview');
|
|
if (placeholder && preview) {
|
|
placeholder.style.display = '';
|
|
preview.classList.add('hidden');
|
|
}
|
|
}
|
|
|
|
function showToast(msg) {
|
|
const toast = document.getElementById('toast');
|
|
toast.textContent = msg;
|
|
toast.classList.remove('hidden');
|
|
setTimeout(() => toast.classList.add('hidden'), 1500);
|
|
}
|
|
|
|
function confirmDelete() {
|
|
document.getElementById('delete-modal').classList.remove('hidden');
|
|
}
|
|
|
|
function hideModal() {
|
|
document.getElementById('delete-modal').classList.add('hidden');
|
|
}
|
|
|
|
function refreshOutfit() {
|
|
showToast('已刷新推荐搭配');
|
|
}
|
|
|
|
// Tag toggle
|
|
document.addEventListener('click', function(e) {
|
|
if (e.target.classList.contains('selectable-tag')) {
|
|
e.target.classList.toggle('active');
|
|
}
|
|
if (e.target.classList.contains('filter-btn') && !e.target.closest('.filter-bar:first-of-type') && !e.target.closest('.filter-group')) {
|
|
const group = e.target.closest('.filter-btns');
|
|
if (group) {
|
|
group.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active'));
|
|
e.target.classList.add('active');
|
|
}
|
|
}
|
|
});
|