Files
Mycontent/.next/dev/static/chunks/_f06e89f2._.js
2025-12-29 14:01:37 +08:00

1824 lines
96 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(globalThis.TURBOPACK || (globalThis.TURBOPACK = [])).push([typeof document === "object" ? document.currentScript : undefined,
"[project]/lib/book-data.ts [app-client] (ecmascript)", ((__turbopack_context__) => {
"use strict";
__turbopack_context__.s([
"AUTHOR_SHARE",
()=>AUTHOR_SHARE,
"BASE_BOOK_PRICE",
()=>BASE_BOOK_PRICE,
"DISTRIBUTOR_SHARE",
()=>DISTRIBUTOR_SHARE,
"FULL_BOOK_PRICE",
()=>FULL_BOOK_PRICE,
"PRICE_INCREMENT_PER_SECTION",
()=>PRICE_INCREMENT_PER_SECTION,
"SECTION_PRICE",
()=>SECTION_PRICE,
"addCustomSection",
()=>addCustomSection,
"bookData",
()=>bookData,
"getAllSections",
()=>getAllSections,
"getChapterBySection",
()=>getChapterBySection,
"getFullBookPrice",
()=>getFullBookPrice,
"getSectionById",
()=>getSectionById,
"isSectionUnlocked",
()=>isSectionUnlocked,
"specialSections",
()=>specialSections
]);
const BASE_BOOK_PRICE = 9.9;
const PRICE_INCREMENT_PER_SECTION = 1;
const SECTION_PRICE = 1;
const AUTHOR_SHARE = 0.9;
const DISTRIBUTOR_SHARE = 0.1;
function getFullBookPrice(sectionsCount) {
return 9.9;
}
const bookData = [
{
id: "part-1",
number: "01",
title: "真实的人",
subtitle: "人性观察与社交逻辑",
chapters: [
{
id: "chapter-1",
title: "人与人之间的底层逻辑",
sections: [
{
id: "1.1",
title: "自行车荷总:一个行业做到极致是什么样",
price: 1,
isFree: true,
filePath: "book/_第一篇真实的人/第1章人与人之间的底层逻辑/1.1 自行车荷总:一个行业做到极致是什么样.md"
},
{
id: "1.2",
title: "老墨:资源整合高手的社交方法",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/_第一篇真实的人/第1章人与人之间的底层逻辑/1.2 老墨:资源整合高手的社交方法.md"
},
{
id: "1.3",
title: "笑声背后的MBTI:为什么ENTJ适合做资源,INTP适合做系统",
price: 1,
isFree: false,
filePath: "book/_第一篇真实的人/第1章人与人之间的底层逻辑/1.3 笑声背后的MBTI为什么ENTJ适合做资源INTP适合做系统.md"
},
{
id: "1.4",
title: "人性的三角结构:情绪、价值、利益",
price: 1,
isFree: false,
filePath: "book/_第一篇真实的人/第1章人与人之间的底层逻辑/1.4 人性的三角结构:情绪、价值、利益.md"
},
{
id: "1.5",
title: "为什么99%的合作死在沟通差而不是能力差",
price: 1,
isFree: false,
filePath: "book/_第一篇真实的人/第1章人与人之间的底层逻辑/1.5 为什么99%的合作死在沟通差而不是能力差.md"
}
]
},
{
id: "chapter-2",
title: "人性困境案例",
sections: [
{
id: "2.1",
title: "相亲故事:你以为找的是人,实际是在找模式",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/_第一篇真实的人/第2章人性困境案例/2.1 相亲故事:你以为找的是人,实际是在找模式.md"
},
{
id: "2.2",
title: "找工作迷茫者:为什么简历解决不了人生",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/_第一篇真实的人/第2章人性困境案例/2.2 找工作迷茫者:为什么简历解决不了人生.md"
},
{
id: "2.3",
title: "撸运费险:小钱困住大脑的真实心理",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/_第一篇真实的人/第2章人性困境案例/2.3 撸运费险:小钱困住大脑的真实心理.md"
},
{
id: "2.4",
title: "游戏上瘾的年轻人:不是游戏吸引他,是生活没吸引力",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/_第一篇真实的人/第2章人性困境案例/2.4 游戏上瘾的年轻人:不是游戏吸引他,是生活没吸引力.md"
},
{
id: "2.5",
title: "健康焦虑(我的糖尿病经历):疾病是人生的第一次清醒",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/_第一篇真实的人/第2章人性困境案例/2.5 健康焦虑(我的糖尿病经历):疾病是人生的第一次清醒.md"
}
]
}
]
},
{
id: "part-2",
number: "02",
title: "真实的行业",
subtitle: "社会运作的底层规则",
chapters: [
{
id: "chapter-3",
title: "电商篇",
sections: [
{
id: "3.1",
title: "电商财税窗口:我错过的第一桶金",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第3章电商篇/3.1 电商财税窗口:我错过的第一桶金.md"
},
{
id: "3.2",
title: "3000万流水如何跑出来(退税模式解析)",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第3章电商篇/3.2 3000万流水如何跑出来(退税模式解析).md"
},
{
id: "3.3",
title: "供应链之王vs打工人:利润不在前端",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第3章电商篇/3.3 供应链之王 vs 打工人:利润不在前端.md"
},
{
id: "3.4",
title: "社区团购的底层逻辑",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第3章电商篇/3.4 社区团购的底层逻辑.md"
},
{
id: "3.5",
title: "跨境电商与退税套利",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第3章电商篇/3.5 跨境电商与退税套利.md"
}
]
},
{
id: "chapter-4",
title: "内容商业篇",
sections: [
{
id: "4.1",
title: "旅游号:30天10万粉的真实逻辑",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第4章内容商业篇/4.1 旅游号:30天10万粉的真实逻辑.md"
},
{
id: "4.2",
title: "做号工厂:如何让一个号变成一个机器",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第4章内容商业篇/4.2 做号工厂:如何让一个号变成一个机器.md"
},
{
id: "4.3",
title: "情绪内容为什么比专业内容更赚钱",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第4章内容商业篇/4.3 情绪内容为什么比专业内容更赚钱.md"
},
{
id: "4.4",
title: "猫与宠物号:为什么宠物赛道永不过时",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第4章内容商业篇/4.4 猫与宠物号:为什么宠物赛道永不过时.md"
},
{
id: "4.5",
title: "直播间里的三种人:演员、技术工、系统流",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第4章内容商业篇/4.5 直播间里的三种人:演员、技术工、系统流.md"
}
]
},
{
id: "chapter-5",
title: "传统行业篇",
sections: [
{
id: "5.1",
title: "羽毛球馆:为什么体育培训是最稳定的现金流",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第5章传统行业篇/5.1 羽毛球馆:为什么体育培训是最稳定的现金流.md"
},
{
id: "5.2",
title: "旅游供应链:资源越老越值钱",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第5章传统行业篇/5.2 旅游供应链:资源越老越值钱.md"
},
{
id: "5.3",
title: "景区联盟:门票不是目的,是流量入口",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第5章传统行业篇/5.3 景区联盟:门票不是目的,是流量入口.md"
},
{
id: "5.4",
title: "拍卖行抱朴:我人生错过的4件大钱机会(完整版)",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第5章传统行业篇/5.4 拍卖行抱朴:我人生错过的4件大钱机会(完整版).md"
},
{
id: "5.5",
title: "飞机票供应链:为什么越便宜越亏",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第二篇|真实的行业/第5章传统行业篇/5.5 飞机票供应链:为什么越便宜越亏.md"
}
]
}
]
},
{
id: "part-3",
number: "03",
title: "真实的错误",
subtitle: "错过机会比失败更贵",
chapters: [
{
id: "chapter-6",
title: "我人生错过的4件大钱",
sections: [
{
id: "6.1",
title: "错过电商财税(2016-2017)",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第三篇|真实的错误/第6章我人生错过的4件大钱/6.1 错过电商财税(2016-2017).md"
},
{
id: "6.2",
title: "错过供应链(2017-2018)",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第三篇|真实的错误/第6章我人生错过的4件大钱/6.2 错过供应链(2017-2018).md"
},
{
id: "6.3",
title: "错过内容红利(2018-2019)",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第三篇|真实的错误/第6章我人生错过的4件大钱/6.3 错过内容红利(2018-2019).md"
},
{
id: "6.4",
title: "错过资源资产化(2019-2020)",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第三篇|真实的错误/第6章我人生错过的4件大钱/6.4 错过资源资产化(2019-2020).md"
}
]
},
{
id: "chapter-7",
title: "别人犯的错误",
sections: [
{
id: "7.1",
title: "投资房年轻人的迷茫:资金vs能力",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第三篇|真实的错误/第7章别人犯的错误/7.1 投资房年轻人的迷茫:资金 vs 能力.md"
},
{
id: "7.2",
title: "信息差骗局:永远有人靠卖学习赚钱",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第三篇|真实的错误/第7章别人犯的错误/7.2 信息差骗局:永远有人靠卖学习赚钱.md"
},
{
id: "7.3",
title: "在Soul找恋爱但想赚钱的人",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第三篇|真实的错误/第7章别人犯的错误/7.3 在Soul找恋爱但想赚钱的人.md"
},
{
id: "7.4",
title: "创业者的三种死法:冲动、轻信、没结构",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第三篇|真实的错误/第7章别人犯的错误/7.4 创业者的三种死法:冲动、轻信、没结构.md"
},
{
id: "7.5",
title: "人情生意的终点:关系越多亏得越多",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第三篇|真实的错误/第7章别人犯的错误/7.5 人情生意的终点:关系越多亏得越多.md"
}
]
}
]
},
{
id: "part-4",
number: "04",
title: "真实的赚钱",
subtitle: "所有行业的杠杆结构",
chapters: [
{
id: "chapter-8",
title: "底层结构",
sections: [
{
id: "8.1",
title: "流量杠杆:抖音、Soul、飞书",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第四篇|真实的赚钱/第8章底层结构/8.1 流量杠杆:抖音、Soul、飞书.md"
},
{
id: "8.2",
title: "价格杠杆:供应链与信息差",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第四篇|真实的赚钱/第8章底层结构/8.2 价格杠杆:供应链与信息差.md"
},
{
id: "8.3",
title: "时间杠杆:自动化+AI",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第四篇|真实的赚钱/第8章底层结构/8.3 时间杠杆:自动化 + AI.md"
},
{
id: "8.4",
title: "情绪杠杆:咨询、婚恋、生意场",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第四篇|真实的赚钱/第8章底层结构/8.4 情绪杠杆:咨询、婚恋、生意场.md"
},
{
id: "8.5",
title: "社交杠杆:认识谁比你会什么更重要",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第四篇|真实的赚钱/第8章底层结构/8.5 社交杠杆:认识谁比你会什么更重要.md"
},
{
id: "8.6",
title: "云阿米巴:分不属于自己的钱",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第四篇|真实的赚钱/第8章底层结构/8.6 云阿米巴:分不属于自己的钱.md"
}
]
},
{
id: "chapter-9",
title: "我在Soul上亲访的赚钱案例",
sections: [
{
id: "9.1",
title: "游戏账号私域:账号即资产",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.1 游戏账号私域:账号即资产.md"
},
{
id: "9.2",
title: "健康包模式:高复购、高毛利",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.2 健康包模式:高复购、高毛利.md"
},
{
id: "9.3",
title: "药物私域:长期关系赛道",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.3 药物私域:长期关系赛道.md"
},
{
id: "9.4",
title: "残疾机构合作:退税×AI×人力成本",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.4 残疾机构合作:退税 × AI × 人力成本.md"
},
{
id: "9.5",
title: "私域银行:粉丝即小股东",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.5 私域银行:粉丝即小股东.md"
},
{
id: "9.6",
title: "Soul派对房:陌生人成交的最快场景",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.6 Soul派对房:陌生人成交的最快场景.md"
},
{
id: "9.7",
title: "飞书中台:从聊天到成交的流程化体系",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第四篇|真实的赚钱/第9章我在Soul上亲访的赚钱案例/9.7 飞书中台:从聊天到成交的流程化体系.md"
}
]
}
]
},
{
id: "part-5",
number: "05",
title: "真实的未来",
subtitle: "人与系统的关系",
chapters: [
{
id: "chapter-10",
title: "未来职业的变化趋势",
sections: [
{
id: "10.1",
title: "AI代聊与岗位替换",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第五篇|真实的社会/第10章未来职业的变化趋势/10.1 AI代聊与岗位替换.md"
},
{
id: "10.2",
title: "系统化工作vs杂乱工作",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第五篇|真实的社会/第10章未来职业的变化趋势/10.2 系统化工作 vs 杂乱工作.md"
},
{
id: "10.3",
title: "为什么链接能力会成为第一价值",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第五篇|真实的社会/第10章未来职业的变化趋势/10.3 为什么链接能力会成为第一价值.md"
},
{
id: "10.4",
title: "新型公司:Soul-飞书-线下的三位一体",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第五篇|真实的社会/第10章未来职业的变化趋势/10.4 新型公司:Soul-飞书-线下的三位一体.md"
}
]
},
{
id: "chapter-11",
title: "中国社会商业生态的未来",
sections: [
{
id: "11.1",
title: "城市之间的模式差",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第五篇|真实的社会/第11章中国社会商业生态的未来/11.1 城市之间的模式差.md"
},
{
id: "11.2",
title: "厦门样本:低成本高效率经济",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第五篇|真实的社会/第11章中国社会商业生态的未来/11.2 厦门样本:低成本高效率经济.md"
},
{
id: "11.3",
title: "流量红利的终局",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第五篇|真实的社会/第11章中国社会商业生态的未来/11.3 流量红利的终局.md"
},
{
id: "11.4",
title: "大模型+供应链的组合拳",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第五篇|真实的社会/第11章中国社会商业生态的未来/11.4 大模型 + 供应链的组合拳.md"
},
{
id: "11.5",
title: "社会分层的最终逻辑",
price: 1,
isFree: false,
unlockAfterDays: 3,
filePath: "book/第五篇|真实的社会/第11章中国社会商业生态的未来/11.5 社会分层的最终逻辑.md"
}
]
}
]
}
];
const specialSections = {
preface: {
id: "preface",
title: "序言为什么我每天早上6点在Soul开播?",
price: 0,
isFree: true,
filePath: "book/序言为什么我每天早上6点在Soul开播?.md"
},
epilogue: {
id: "epilogue",
title: "尾声|终极答案:努力不是关键,选择才是",
price: 0,
isFree: true,
filePath: "book/尾声|终极答案:努力不是关键,选择才是.md"
}
};
const FULL_BOOK_PRICE = getFullBookPrice();
function getAllSections() {
const sections = [];
if ("TURBOPACK compile-time truthy", 1) {
const customSections = JSON.parse(localStorage.getItem("custom_sections") || "[]");
sections.push(...customSections);
}
bookData.forEach((part)=>{
part.chapters.forEach((chapter)=>{
sections.push(...chapter.sections);
});
});
return sections;
}
function getSectionById(id) {
if ("TURBOPACK compile-time truthy", 1) {
const customSections = JSON.parse(localStorage.getItem("custom_sections") || "[]");
const customSection = customSections.find((s)=>s.id === id);
if (customSection) return customSection;
}
for (const part of bookData){
for (const chapter of part.chapters){
const section = chapter.sections.find((s)=>s.id === id);
if (section) return section;
}
}
return undefined;
}
function getChapterBySection(sectionId) {
for (const part of bookData){
for (const chapter of part.chapters){
if (chapter.sections.some((s)=>s.id === sectionId)) {
return {
part,
chapter
};
}
}
}
return undefined;
}
function isSectionUnlocked(section) {
if (section.isFree) return true;
if (!section.unlockAfterDays || !section.createdAt) return false;
const createdDate = new Date(section.createdAt);
const unlockDate = new Date(createdDate.getTime() + section.unlockAfterDays * 24 * 60 * 60 * 1000);
return new Date() >= unlockDate;
}
function addCustomSection(section) {
const newSection = {
...section,
createdAt: new Date().toISOString()
};
if ("TURBOPACK compile-time truthy", 1) {
const customSections = JSON.parse(localStorage.getItem("custom_sections") || "[]");
customSections.push(newSection);
localStorage.setItem("custom_sections", JSON.stringify(customSections));
}
return newSection;
}
if (typeof globalThis.$RefreshHelpers$ === 'object' && globalThis.$RefreshHelpers !== null) {
__turbopack_context__.k.registerExports(__turbopack_context__.m, globalThis.$RefreshHelpers$);
}
}),
"[project]/lib/store.ts [app-client] (ecmascript)", ((__turbopack_context__) => {
"use strict";
__turbopack_context__.s([
"useStore",
()=>useStore
]);
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$zustand$2f$esm$2f$react$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/zustand/esm/react.mjs [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$zustand$2f$esm$2f$middleware$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/zustand/esm/middleware.mjs [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$book$2d$data$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/lib/book-data.ts [app-client] (ecmascript)");
"use client";
;
;
;
const defaultSettings = {
distributorShare: 90,
authorShare: 10,
paymentMethods: {
wechat: {
enabled: true,
qrCode: "",
account: "",
websiteAppId: "",
websiteAppSecret: "",
serviceAppId: "",
serviceAppSecret: "",
mpVerifyCode: "",
merchantId: "",
apiKey: ""
},
alipay: {
enabled: true,
qrCode: "",
account: "",
partnerId: "",
securityKey: "",
mobilePayEnabled: true,
paymentInterface: "official"
},
usdt: {
enabled: true,
network: "TRC20",
address: "",
exchangeRate: 7.2
},
paypal: {
enabled: false,
email: "",
exchangeRate: 7.2
}
},
sectionPrice: 1,
baseBookPrice: 9.9,
pricePerSection: 1,
qrCodes: [
{
id: "default",
name: "Soul派对群",
url: "https://soul.cn/party",
imageUrl: "/images/image.png",
weight: 1,
enabled: true
}
],
liveQRCodes: [
{
id: "party-group",
name: "派对群活码",
urls: [
"https://soul.cn/party1",
"https://soul.cn/party2",
"https://soul.cn/party3"
],
imageUrl: "/images/image.png",
redirectType: "random",
clickCount: 0,
enabled: true
}
],
feishuSync: {
enabled: false,
docUrl: "",
autoSync: false,
syncInterval: 60
},
authorInfo: {
name: "卡若",
description: "连续创业者,私域运营专家,每天早上6-9点在Soul派对房分享真实商业故事",
liveTime: "06:00-09:00",
platform: "Soul派对房"
}
};
const useStore = (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$zustand$2f$esm$2f$react$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__["create"])()((0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$zustand$2f$esm$2f$middleware$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__["persist"])((set, get)=>({
user: null,
isLoggedIn: false,
purchases: [],
withdrawals: [],
settings: defaultSettings,
login: async (phone, code)=>{
if (code !== "123456") {
return false;
}
const users = JSON.parse(localStorage.getItem("users") || "[]");
const existingUser = users.find((u)=>u.phone === phone);
if (existingUser) {
set({
user: existingUser,
isLoggedIn: true
});
return true;
}
return false;
},
logout: ()=>{
set({
user: null,
isLoggedIn: false
});
},
register: async (phone, nickname, referralCode)=>{
const users = JSON.parse(localStorage.getItem("users") || "[]");
if (users.find((u)=>u.phone === phone)) {
return false;
}
const newUser = {
id: `user_${Date.now()}`,
phone,
nickname,
isAdmin: false,
purchasedSections: [],
hasFullBook: false,
referralCode: `REF${Date.now().toString(36).toUpperCase()}`,
referredBy: referralCode,
earnings: 0,
pendingEarnings: 0,
withdrawnEarnings: 0,
referralCount: 0,
createdAt: new Date().toISOString()
};
if (referralCode) {
const referrer = users.find((u)=>u.referralCode === referralCode);
if (referrer) {
referrer.referralCount = (referrer.referralCount || 0) + 1;
localStorage.setItem("users", JSON.stringify(users));
}
}
users.push(newUser);
localStorage.setItem("users", JSON.stringify(users));
set({
user: newUser,
isLoggedIn: true
});
return true;
},
purchaseSection: async (sectionId, sectionTitle, paymentMethod)=>{
const { user, settings } = get();
if (!user) return false;
const amount = settings.sectionPrice;
const purchase = {
id: `purchase_${Date.now()}`,
userId: user.id,
userPhone: user.phone,
userNickname: user.nickname,
type: "section",
sectionId,
sectionTitle,
amount,
paymentMethod,
referralCode: user.referredBy,
status: "completed",
createdAt: new Date().toISOString()
};
const updatedUser = {
...user,
purchasedSections: [
...user.purchasedSections,
sectionId
]
};
const users = JSON.parse(localStorage.getItem("users") || "[]");
const userIndex = users.findIndex((u)=>u.id === user.id);
if (userIndex !== -1) {
users[userIndex] = updatedUser;
localStorage.setItem("users", JSON.stringify(users));
}
if (user.referredBy) {
const referrer = users.find((u)=>u.referralCode === user.referredBy);
if (referrer) {
const referrerEarnings = amount * (settings.distributorShare / 100);
referrer.earnings += referrerEarnings;
referrer.pendingEarnings = (referrer.pendingEarnings || 0) + referrerEarnings;
purchase.referrerEarnings = referrerEarnings;
localStorage.setItem("users", JSON.stringify(users));
}
}
const purchases = JSON.parse(localStorage.getItem("all_purchases") || "[]");
purchases.push(purchase);
localStorage.setItem("all_purchases", JSON.stringify(purchases));
set({
user: updatedUser,
purchases: [
...get().purchases,
purchase
]
});
return true;
},
purchaseFullBook: async (paymentMethod)=>{
const { user, settings } = get();
if (!user) return false;
const fullBookPrice = (0, __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$book$2d$data$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["getFullBookPrice"])();
const purchase = {
id: `purchase_${Date.now()}`,
userId: user.id,
userPhone: user.phone,
userNickname: user.nickname,
type: "fullbook",
amount: fullBookPrice,
paymentMethod,
referralCode: user.referredBy,
status: "completed",
createdAt: new Date().toISOString()
};
const updatedUser = {
...user,
hasFullBook: true
};
const users = JSON.parse(localStorage.getItem("users") || "[]");
const userIndex = users.findIndex((u)=>u.id === user.id);
if (userIndex !== -1) {
users[userIndex] = updatedUser;
localStorage.setItem("users", JSON.stringify(users));
}
if (user.referredBy) {
const referrer = users.find((u)=>u.referralCode === user.referredBy);
if (referrer) {
const referrerEarnings = fullBookPrice * (settings.distributorShare / 100);
referrer.earnings += referrerEarnings;
referrer.pendingEarnings = (referrer.pendingEarnings || 0) + referrerEarnings;
purchase.referrerEarnings = referrerEarnings;
localStorage.setItem("users", JSON.stringify(users));
}
}
const purchases = JSON.parse(localStorage.getItem("all_purchases") || "[]");
purchases.push(purchase);
localStorage.setItem("all_purchases", JSON.stringify(purchases));
set({
user: updatedUser,
purchases: [
...get().purchases,
purchase
]
});
return true;
},
hasPurchased: (sectionId)=>{
const { user } = get();
if (!user) return false;
if (user.hasFullBook) return true;
return user.purchasedSections.includes(sectionId);
},
adminLogin: (username, password)=>{
if (username.toLowerCase() === "admin" && password === "key123456") {
const adminUser = {
id: "admin",
phone: "admin",
nickname: "管理员",
isAdmin: true,
purchasedSections: [],
hasFullBook: true,
referralCode: "ADMIN",
earnings: 0,
pendingEarnings: 0,
withdrawnEarnings: 0,
referralCount: 0,
createdAt: new Date().toISOString()
};
set({
user: adminUser,
isLoggedIn: true
});
return true;
}
return false;
},
updateSettings: (newSettings)=>{
const { settings } = get();
const updatedSettings = {
...settings,
...newSettings
};
if (newSettings.distributorShare !== undefined) {
updatedSettings.authorShare = 100 - newSettings.distributorShare;
}
set({
settings: updatedSettings
});
if ("TURBOPACK compile-time truthy", 1) {
localStorage.setItem("app_settings", JSON.stringify(updatedSettings));
}
},
getAllUsers: ()=>{
if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable
;
return JSON.parse(localStorage.getItem("users") || "[]");
},
getAllPurchases: ()=>{
if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable
;
return JSON.parse(localStorage.getItem("all_purchases") || "[]");
},
addUser: (userData)=>{
if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable
;
const users = JSON.parse(localStorage.getItem("users") || "[]");
const newUser = {
id: `user_${Date.now()}`,
phone: userData.phone || "",
nickname: userData.nickname || "新用户",
isAdmin: false,
purchasedSections: [],
hasFullBook: false,
referralCode: `REF${Date.now().toString(36).toUpperCase()}`,
earnings: 0,
pendingEarnings: 0,
withdrawnEarnings: 0,
referralCount: 0,
createdAt: new Date().toISOString(),
...userData
};
users.push(newUser);
localStorage.setItem("users", JSON.stringify(users));
return newUser;
},
updateUser: (userId, updates)=>{
if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable
;
const users = JSON.parse(localStorage.getItem("users") || "[]");
const index = users.findIndex((u)=>u.id === userId);
if (index !== -1) {
users[index] = {
...users[index],
...updates
};
localStorage.setItem("users", JSON.stringify(users));
}
},
deleteUser: (userId)=>{
if ("TURBOPACK compile-time falsy", 0) //TURBOPACK unreachable
;
const users = JSON.parse(localStorage.getItem("users") || "[]");
const filtered = users.filter((u)=>u.id !== userId);
localStorage.setItem("users", JSON.stringify(filtered));
},
addPurchase: (purchaseData)=>set((state)=>{
const newPurchase = {
id: Math.random().toString(36).substring(2, 9),
createdAt: new Date().toISOString(),
...purchaseData
};
// 如果是全书购买,更新用户状态
if (state.user && purchaseData.userId === state.user.id) {
const updatedUser = {
...state.user
};
if (purchaseData.type === "fullbook") {
updatedUser.hasFullBook = true;
} else if (purchaseData.sectionId) {
updatedUser.purchasedSections = [
...updatedUser.purchasedSections,
purchaseData.sectionId
];
}
// 更新 users 数组
const updatedUsers = state.users?.map((u)=>u.id === updatedUser.id ? updatedUser : u) || [];
return {
purchases: [
...state.purchases,
newPurchase
],
user: updatedUser
};
}
return {
purchases: [
...state.purchases,
newPurchase
]
};
}),
requestWithdrawal: (amount, method, account, name)=>set((state)=>{
if (!state.user) return {};
if (state.user.earnings < amount) return {};
const newWithdrawal = {
id: Math.random().toString(36).substring(2, 9),
userId: state.user.id,
amount,
method,
account,
name,
status: "pending",
createdAt: new Date().toISOString()
};
// 扣除余额,增加冻结/提现中金额
const updatedUser = {
...state.user,
earnings: state.user.earnings - amount,
pendingEarnings: state.user.pendingEarnings + amount
};
return {
withdrawals: [
...state.withdrawals || [],
newWithdrawal
],
user: updatedUser
};
}),
completeWithdrawal: (id)=>set((state)=>{
const withdrawals = state.withdrawals || [];
const withdrawalIndex = withdrawals.findIndex((w)=>w.id === id);
if (withdrawalIndex === -1) return {};
const withdrawal = withdrawals[withdrawalIndex];
if (withdrawal.status !== "pending") return {};
const updatedWithdrawals = [
...withdrawals
];
updatedWithdrawals[withdrawalIndex] = {
...withdrawal,
status: "completed",
completedAt: new Date().toISOString()
};
// 这里我们只是更新状态,资金已经在申请时扣除了
// 实际场景中可能需要确认转账成功
return {
withdrawals: updatedWithdrawals
};
}),
updateLiveQRCode: (config)=>set((state)=>{
const { settings } = state;
const updatedLiveQRCodes = settings.liveQRCodes.map((qr)=>qr.id === config.id ? {
...qr,
...config
} : qr);
// 如果不存在且有id则添加? 暂时只支持更新
return {
settings: {
...settings,
liveQRCodes: updatedLiveQRCodes
}
};
}),
getRandomQRCode: ()=>{
const { settings } = get();
const enabledQRs = settings.qrCodes.filter((qr)=>qr.enabled);
if (enabledQRs.length === 0) return null;
const totalWeight = enabledQRs.reduce((sum, qr)=>sum + qr.weight, 0);
let random = Math.random() * totalWeight;
for (const qr of enabledQRs){
random -= qr.weight;
if (random <= 0) return qr;
}
return enabledQRs[0];
},
getLiveQRCodeUrl: (qrId)=>{
const { settings } = get();
const liveQR = settings.liveQRCodes.find((qr)=>qr.id === qrId && qr.enabled);
if (!liveQR || liveQR.urls.length === 0) return null;
// 更新点击次数
liveQR.clickCount++;
if (liveQR.redirectType === "random") {
const randomIndex = Math.floor(Math.random() * liveQR.urls.length);
return liveQR.urls[randomIndex];
} else if (liveQR.redirectType === "sequential") {
const index = liveQR.clickCount % liveQR.urls.length;
return liveQR.urls[index];
} else if (liveQR.redirectType === "weighted" && liveQR.weights) {
const totalWeight = liveQR.weights.reduce((sum, w)=>sum + w, 0);
let random = Math.random() * totalWeight;
for(let i = 0; i < liveQR.urls.length; i++){
random -= liveQR.weights[i] || 1;
if (random <= 0) return liveQR.urls[i];
}
}
return liveQR.urls[0];
},
exportData: ()=>{
const { user, purchases, settings } = get();
const data = {
user,
purchases,
settings,
exportDate: new Date().toISOString()
};
return JSON.stringify(data, null, 2);
},
fetchSettings: async ()=>{
try {
const res = await fetch("/api/config");
if (!res.ok) throw new Error("Failed to fetch config");
const data = await res.json();
const { settings } = get();
// Deep merge payment methods to preserve existing defaults if API is partial
const mergedPaymentMethods = {
...settings.paymentMethods,
wechat: {
...settings.paymentMethods.wechat,
...data.paymentMethods?.wechat
},
alipay: {
...settings.paymentMethods.alipay,
...data.paymentMethods?.alipay
},
usdt: {
...settings.paymentMethods.usdt,
...data.paymentMethods?.usdt
},
paypal: {
...settings.paymentMethods.paypal,
...data.paymentMethods?.paypal
}
};
const newSettings = {
paymentMethods: mergedPaymentMethods,
authorInfo: {
...settings.authorInfo,
...data.authorInfo
}
};
set({
settings: {
...settings,
...newSettings
}
});
} catch (error) {
console.error("Failed to sync settings:", error);
}
}
}), {
name: "soul-experiment-storage"
}));
if (typeof globalThis.$RefreshHelpers$ === 'object' && globalThis.$RefreshHelpers !== null) {
__turbopack_context__.k.registerExports(__turbopack_context__.m, globalThis.$RefreshHelpers$);
}
}),
"[project]/lib/utils.ts [app-client] (ecmascript)", ((__turbopack_context__) => {
"use strict";
__turbopack_context__.s([
"cn",
()=>cn
]);
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$clsx$2f$dist$2f$clsx$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/clsx/dist/clsx.mjs [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$tailwind$2d$merge$2f$dist$2f$bundle$2d$mjs$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/tailwind-merge/dist/bundle-mjs.mjs [app-client] (ecmascript)");
;
;
function cn(...inputs) {
return (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$tailwind$2d$merge$2f$dist$2f$bundle$2d$mjs$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__["twMerge"])((0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$clsx$2f$dist$2f$clsx$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__["clsx"])(inputs));
}
if (typeof globalThis.$RefreshHelpers$ === 'object' && globalThis.$RefreshHelpers !== null) {
__turbopack_context__.k.registerExports(__turbopack_context__.m, globalThis.$RefreshHelpers$);
}
}),
"[project]/components/ui/button.tsx [app-client] (ecmascript)", ((__turbopack_context__) => {
"use strict";
__turbopack_context__.s([
"Button",
()=>Button,
"buttonVariants",
()=>buttonVariants
]);
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next/dist/compiled/react/jsx-dev-runtime.js [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f40$radix$2d$ui$2f$react$2d$slot$2f$dist$2f$index$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/@radix-ui/react-slot/dist/index.mjs [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$class$2d$variance$2d$authority$2f$dist$2f$index$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/class-variance-authority/dist/index.mjs [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$utils$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/lib/utils.ts [app-client] (ecmascript)");
;
;
;
;
const buttonVariants = (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$class$2d$variance$2d$authority$2f$dist$2f$index$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__["cva"])("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", {
variants: {
variant: {
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
destructive: 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',
outline: 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',
secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',
link: 'text-primary underline-offset-4 hover:underline'
},
size: {
default: 'h-9 px-4 py-2 has-[>svg]:px-3',
sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',
lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',
icon: 'size-9',
'icon-sm': 'size-8',
'icon-lg': 'size-10'
}
},
defaultVariants: {
variant: 'default',
size: 'default'
}
});
function Button({ className, variant, size, asChild = false, ...props }) {
const Comp = asChild ? __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f40$radix$2d$ui$2f$react$2d$slot$2f$dist$2f$index$2e$mjs__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Slot"] : 'button';
return /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(Comp, {
"data-slot": "button",
className: (0, __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$utils$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["cn"])(buttonVariants({
variant,
size,
className
})),
...props
}, void 0, false, {
fileName: "[project]/components/ui/button.tsx",
lineNumber: 52,
columnNumber: 5
}, this);
}
_c = Button;
;
var _c;
__turbopack_context__.k.register(_c, "Button");
if (typeof globalThis.$RefreshHelpers$ === 'object' && globalThis.$RefreshHelpers !== null) {
__turbopack_context__.k.registerExports(__turbopack_context__.m, globalThis.$RefreshHelpers$);
}
}),
"[project]/components/modules/marketing/qr-code-modal.tsx [app-client] (ecmascript)", ((__turbopack_context__) => {
"use strict";
__turbopack_context__.s([
"QRCodeModal",
()=>QRCodeModal
]);
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next/dist/compiled/react/jsx-dev-runtime.js [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$x$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$export__default__as__X$3e$__ = __turbopack_context__.i("[project]/node_modules/lucide-react/dist/esm/icons/x.js [app-client] (ecmascript) <export default as X>");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$message$2d$circle$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$export__default__as__MessageCircle$3e$__ = __turbopack_context__.i("[project]/node_modules/lucide-react/dist/esm/icons/message-circle.js [app-client] (ecmascript) <export default as MessageCircle>");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$users$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$export__default__as__Users$3e$__ = __turbopack_context__.i("[project]/node_modules/lucide-react/dist/esm/icons/users.js [app-client] (ecmascript) <export default as Users>");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$music$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$export__default__as__Music$3e$__ = __turbopack_context__.i("[project]/node_modules/lucide-react/dist/esm/icons/music.js [app-client] (ecmascript) <export default as Music>");
var __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$store$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/lib/store.ts [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/components/ui/button.tsx [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$image$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next/image.js [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next/dist/compiled/react/index.js [app-client] (ecmascript)");
;
var _s = __turbopack_context__.k.signature();
"use client";
;
;
;
;
;
function QRCodeModal({ isOpen, onClose }) {
_s();
const { settings, getLiveQRCodeUrl } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$store$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useStore"])();
const [isJoining, setIsJoining] = (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useState"])(false);
const [qrCodeUrl, setQrCodeUrl] = (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useState"])("/images/party-group-qr.png") // Default fallback
;
// Fetch config on mount
(0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useEffect"])({
"QRCodeModal.useEffect": ()=>{
const fetchConfig = {
"QRCodeModal.useEffect.fetchConfig": async ()=>{
try {
const res = await fetch('/api/config');
const data = await res.json();
if (data.marketing?.partyGroup?.qrCode) {
setQrCodeUrl(data.marketing.partyGroup.qrCode);
}
} catch (e) {
console.error("Failed to load QR config", e);
}
}
}["QRCodeModal.useEffect.fetchConfig"];
fetchConfig();
}
}["QRCodeModal.useEffect"], []);
if (!isOpen) return null;
const handleJoin = ()=>{
setIsJoining(true);
// 获取活码随机URL
const url = getLiveQRCodeUrl("party-group");
if (url) {
window.open(url, "_blank");
}
setTimeout(()=>setIsJoining(false), 1000);
};
return /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "fixed inset-0 z-50 flex items-center justify-center p-4",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "absolute inset-0 bg-black/80 backdrop-blur-md",
onClick: onClose
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 49,
columnNumber: 7
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "relative w-full max-w-[320px] bg-[#1a1a1a] rounded-3xl border border-white/10 overflow-hidden shadow-2xl animate-in fade-in zoom-in-95 duration-200",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "absolute top-0 left-0 right-0 h-32 bg-gradient-to-b from-[#7000ff]/20 to-transparent pointer-events-none"
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 55,
columnNumber: 9
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("button", {
onClick: onClose,
className: "absolute top-4 right-4 p-2 text-white/50 hover:text-white transition-colors z-10 bg-black/20 rounded-full backdrop-blur-sm",
children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$x$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$export__default__as__X$3e$__["X"], {
className: "w-5 h-5"
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 61,
columnNumber: 11
}, this)
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 57,
columnNumber: 9
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "p-8 flex flex-col items-center text-center relative",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "w-16 h-16 mb-6 rounded-full bg-gradient-to-tr from-[#7000ff] to-[#bd00ff] p-[2px] shadow-lg shadow-purple-500/20",
children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "w-full h-full rounded-full bg-[#1a1a1a] flex items-center justify-center",
children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$music$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$export__default__as__Music$3e$__["Music"], {
className: "w-8 h-8 text-[#bd00ff]"
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 69,
columnNumber: 15
}, this)
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 68,
columnNumber: 13
}, this)
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 67,
columnNumber: 11
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("h3", {
className: "text-xl font-bold text-white mb-2 tracking-tight",
children: "Soul 创业派对"
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 73,
columnNumber: 11
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "flex items-center gap-2 mb-6",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", {
className: "px-2 py-0.5 rounded-full bg-white/10 text-[10px] text-white/70 border border-white/5",
children: "Live"
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 78,
columnNumber: 13
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("p", {
className: "text-white/60 text-xs",
children: [
settings.authorInfo?.liveTime || "06:00-09:00",
" · ",
settings.authorInfo?.name || "卡若"
]
}, void 0, true, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 81,
columnNumber: 13
}, this)
]
}, void 0, true, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 77,
columnNumber: 11
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "bg-white p-3 rounded-2xl shadow-xl mb-6 transform transition-transform hover:scale-105 duration-300",
children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "relative w-48 h-48",
children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$image$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["default"], {
src: qrCodeUrl,
alt: "派对群二维码",
fill: true,
className: "object-contain"
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 89,
columnNumber: 17
}, this)
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 88,
columnNumber: 13
}, this)
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 87,
columnNumber: 11
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("p", {
className: "text-white/40 text-xs mb-6 px-4",
children: [
"扫码加入私域流量实战群",
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("br", {}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 99,
columnNumber: 24
}, this),
"获取《私域运营100问》"
]
}, void 0, true, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 98,
columnNumber: 11
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$components$2f$ui$2f$button$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Button"], {
onClick: handleJoin,
disabled: isJoining,
className: "w-full bg-gradient-to-r from-[#7000ff] to-[#bd00ff] hover:opacity-90 text-white font-medium rounded-xl h-12 shadow-lg shadow-purple-900/20 border-0 transition-all active:scale-95",
children: isJoining ? /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", {
className: "flex items-center gap-2",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$users$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$export__default__as__Users$3e$__["Users"], {
className: "w-4 h-4 animate-pulse"
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 109,
columnNumber: 21
}, this),
"跳转中..."
]
}, void 0, true, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 108,
columnNumber: 17
}, this) : /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", {
className: "flex items-center gap-2",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$message$2d$circle$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$export__default__as__MessageCircle$3e$__["MessageCircle"], {
className: "w-4 h-4"
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 114,
columnNumber: 21
}, this),
"立即加入"
]
}, void 0, true, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 113,
columnNumber: 17
}, this)
}, void 0, false, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 102,
columnNumber: 11
}, this)
]
}, void 0, true, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 64,
columnNumber: 9
}, this)
]
}, void 0, true, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 52,
columnNumber: 7
}, this)
]
}, void 0, true, {
fileName: "[project]/components/modules/marketing/qr-code-modal.tsx",
lineNumber: 48,
columnNumber: 5
}, this);
}
_s(QRCodeModal, "/ucfs1EDP5H72dMCTbj4tEd/43w=", false, function() {
return [
__TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$store$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useStore"]
];
});
_c = QRCodeModal;
var _c;
__turbopack_context__.k.register(_c, "QRCodeModal");
if (typeof globalThis.$RefreshHelpers$ === 'object' && globalThis.$RefreshHelpers !== null) {
__turbopack_context__.k.registerExports(__turbopack_context__.m, globalThis.$RefreshHelpers$);
}
}),
"[project]/components/bottom-nav.tsx [app-client] (ecmascript)", ((__turbopack_context__) => {
"use strict";
__turbopack_context__.s([
"BottomNav",
()=>BottomNav
]);
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next/dist/compiled/react/jsx-dev-runtime.js [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$client$2f$app$2d$dir$2f$link$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next/dist/client/app-dir/link.js [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$navigation$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next/navigation.js [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$house$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$export__default__as__Home$3e$__ = __turbopack_context__.i("[project]/node_modules/lucide-react/dist/esm/icons/house.js [app-client] (ecmascript) <export default as Home>");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$message$2d$circle$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$export__default__as__MessageCircle$3e$__ = __turbopack_context__.i("[project]/node_modules/lucide-react/dist/esm/icons/message-circle.js [app-client] (ecmascript) <export default as MessageCircle>");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$user$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$export__default__as__User$3e$__ = __turbopack_context__.i("[project]/node_modules/lucide-react/dist/esm/icons/user.js [app-client] (ecmascript) <export default as User>");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next/dist/compiled/react/index.js [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$components$2f$modules$2f$marketing$2f$qr$2d$code$2d$modal$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/components/modules/marketing/qr-code-modal.tsx [app-client] (ecmascript)");
;
var _s = __turbopack_context__.k.signature();
"use client";
;
;
;
;
;
function BottomNav() {
_s();
const pathname = (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$navigation$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["usePathname"])();
const [showQRModal, setShowQRModal] = (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useState"])(false);
if (pathname.startsWith("/documentation")) {
return null;
}
const navItems = [
{
href: "/",
icon: __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$house$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$export__default__as__Home$3e$__["Home"],
label: "首页"
},
{
action: ()=>setShowQRModal(true),
icon: __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$message$2d$circle$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$export__default__as__MessageCircle$3e$__["MessageCircle"],
label: "派对群"
},
{
href: "/my",
icon: __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$lucide$2d$react$2f$dist$2f$esm$2f$icons$2f$user$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__$3c$export__default__as__User$3e$__["User"],
label: "我的"
}
];
return /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["Fragment"], {
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("nav", {
className: "fixed bottom-0 left-0 right-0 z-40 bg-[#0f2137]/95 backdrop-blur-md border-t border-gray-700/50",
children: /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "flex items-center justify-around py-3 max-w-lg mx-auto",
children: navItems.map((item, index)=>{
const isActive = item.href ? pathname === item.href : false;
const Icon = item.icon;
if (item.action) {
return /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("button", {
onClick: item.action,
className: "flex flex-col items-center py-2 px-6 text-gray-400 hover:text-[#38bdac] transition-colors",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(Icon, {
className: "w-6 h-6 mb-1"
}, void 0, false, {
fileName: "[project]/components/bottom-nav.tsx",
lineNumber: 38,
columnNumber: 19
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", {
className: "text-xs",
children: item.label
}, void 0, false, {
fileName: "[project]/components/bottom-nav.tsx",
lineNumber: 39,
columnNumber: 19
}, this)
]
}, index, true, {
fileName: "[project]/components/bottom-nav.tsx",
lineNumber: 33,
columnNumber: 17
}, this);
}
return /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$client$2f$app$2d$dir$2f$link$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["default"], {
href: item.href,
className: `flex flex-col items-center py-2 px-6 transition-colors ${isActive ? "text-[#38bdac]" : "text-gray-400 hover:text-white"}`,
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(Icon, {
className: "w-6 h-6 mb-1"
}, void 0, false, {
fileName: "[project]/components/bottom-nav.tsx",
lineNumber: 52,
columnNumber: 17
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("span", {
className: "text-xs",
children: item.label
}, void 0, false, {
fileName: "[project]/components/bottom-nav.tsx",
lineNumber: 53,
columnNumber: 17
}, this)
]
}, index, true, {
fileName: "[project]/components/bottom-nav.tsx",
lineNumber: 45,
columnNumber: 15
}, this);
})
}, void 0, false, {
fileName: "[project]/components/bottom-nav.tsx",
lineNumber: 26,
columnNumber: 9
}, this)
}, void 0, false, {
fileName: "[project]/components/bottom-nav.tsx",
lineNumber: 25,
columnNumber: 7
}, this),
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$components$2f$modules$2f$marketing$2f$qr$2d$code$2d$modal$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["QRCodeModal"], {
isOpen: showQRModal,
onClose: ()=>setShowQRModal(false)
}, void 0, false, {
fileName: "[project]/components/bottom-nav.tsx",
lineNumber: 59,
columnNumber: 7
}, this)
]
}, void 0, true);
}
_s(BottomNav, "muXLHfRZNOyxtkIQkWSm+QpOoV8=", false, function() {
return [
__TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$navigation$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["usePathname"]
];
});
_c = BottomNav;
var _c;
__turbopack_context__.k.register(_c, "BottomNav");
if (typeof globalThis.$RefreshHelpers$ === 'object' && globalThis.$RefreshHelpers !== null) {
__turbopack_context__.k.registerExports(__turbopack_context__.m, globalThis.$RefreshHelpers$);
}
}),
"[project]/components/config-loader.tsx [app-client] (ecmascript)", ((__turbopack_context__) => {
"use strict";
__turbopack_context__.s([
"ConfigLoader",
()=>ConfigLoader
]);
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next/dist/compiled/react/index.js [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$store$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/lib/store.ts [app-client] (ecmascript)");
var _s = __turbopack_context__.k.signature();
"use client";
;
;
function ConfigLoader() {
_s();
const { fetchSettings } = (0, __TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$store$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useStore"])();
(0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$index$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useEffect"])({
"ConfigLoader.useEffect": ()=>{
fetchSettings();
}
}["ConfigLoader.useEffect"], [
fetchSettings
]);
return null;
}
_s(ConfigLoader, "kz/V1F89ERJfgn2lZLGvZAS6fxw=", false, function() {
return [
__TURBOPACK__imported__module__$5b$project$5d2f$lib$2f$store$2e$ts__$5b$app$2d$client$5d$__$28$ecmascript$29$__["useStore"]
];
});
_c = ConfigLoader;
var _c;
__turbopack_context__.k.register(_c, "ConfigLoader");
if (typeof globalThis.$RefreshHelpers$ === 'object' && globalThis.$RefreshHelpers !== null) {
__turbopack_context__.k.registerExports(__turbopack_context__.m, globalThis.$RefreshHelpers$);
}
}),
"[project]/components/layout-wrapper.tsx [app-client] (ecmascript)", ((__turbopack_context__) => {
"use strict";
__turbopack_context__.s([
"LayoutWrapper",
()=>LayoutWrapper
]);
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next/dist/compiled/react/jsx-dev-runtime.js [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$navigation$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/node_modules/next/navigation.js [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$components$2f$bottom$2d$nav$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/components/bottom-nav.tsx [app-client] (ecmascript)");
var __TURBOPACK__imported__module__$5b$project$5d2f$components$2f$config$2d$loader$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/components/config-loader.tsx [app-client] (ecmascript)");
;
var _s = __turbopack_context__.k.signature();
"use client";
;
;
;
function LayoutWrapper({ children }) {
_s();
const pathname = (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$navigation$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["usePathname"])();
const isAdmin = pathname?.startsWith("/admin");
if (isAdmin) {
return /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "min-h-screen bg-gray-100 text-gray-900 font-sans",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$components$2f$config$2d$loader$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["ConfigLoader"], {}, void 0, false, {
fileName: "[project]/components/layout-wrapper.tsx",
lineNumber: 14,
columnNumber: 9
}, this),
children
]
}, void 0, true, {
fileName: "[project]/components/layout-wrapper.tsx",
lineNumber: 13,
columnNumber: 7
}, this);
}
return /*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])("div", {
className: "mx-auto max-w-[430px] min-h-screen bg-[#0a1628] shadow-2xl relative font-sans antialiased",
children: [
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$components$2f$config$2d$loader$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["ConfigLoader"], {}, void 0, false, {
fileName: "[project]/components/layout-wrapper.tsx",
lineNumber: 22,
columnNumber: 7
}, this),
children,
/*#__PURE__*/ (0, __TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$dist$2f$compiled$2f$react$2f$jsx$2d$dev$2d$runtime$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["jsxDEV"])(__TURBOPACK__imported__module__$5b$project$5d2f$components$2f$bottom$2d$nav$2e$tsx__$5b$app$2d$client$5d$__$28$ecmascript$29$__["BottomNav"], {}, void 0, false, {
fileName: "[project]/components/layout-wrapper.tsx",
lineNumber: 24,
columnNumber: 7
}, this)
]
}, void 0, true, {
fileName: "[project]/components/layout-wrapper.tsx",
lineNumber: 21,
columnNumber: 5
}, this);
}
_s(LayoutWrapper, "xbyQPtUVMO7MNj7WjJlpdWqRcTo=", false, function() {
return [
__TURBOPACK__imported__module__$5b$project$5d2f$node_modules$2f$next$2f$navigation$2e$js__$5b$app$2d$client$5d$__$28$ecmascript$29$__["usePathname"]
];
});
_c = LayoutWrapper;
var _c;
__turbopack_context__.k.register(_c, "LayoutWrapper");
if (typeof globalThis.$RefreshHelpers$ === 'object' && globalThis.$RefreshHelpers !== null) {
__turbopack_context__.k.registerExports(__turbopack_context__.m, globalThis.$RefreshHelpers$);
}
}),
]);
//# sourceMappingURL=_f06e89f2._.js.map