UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

61 lines (49 loc) 1.88 kB
import { geolocation } from '@vercel/functions'; import { getCountry } from 'countries-and-timezones'; import { NextRequest } from 'next/server'; const getLocalTime = (timeZone: string) => { return new Date().toLocaleString('en-US', { hour: 'numeric', hour12: false, timeZone, }); }; const isValidTimeZone = (timeZone: string) => { try { getLocalTime(timeZone); return true; // 如果没抛异常,说明时区有效 } catch (e) { // 捕获到 RangeError,说明时区无效 if (e instanceof RangeError) { return false; } // 如果是其他错误,最好重新抛出 throw e; } }; export const parseDefaultThemeFromCountry = (request: NextRequest) => { // 1. 从请求头中获取国家代码 const geo = geolocation(request); const countryCode = geo?.country || request.headers.get('x-vercel-ip-country') || // Vercel request.headers.get('cf-ipcountry') || // Cloudflare request.headers.get('x-zeabur-ip-country') || // Zeabur request.headers.get('x-country-code'); // Netlify // 如果没有获取到国家代码,直接返回 light 主题 if (!countryCode) return 'light'; // 2. 获取国家的时区信息 const country = getCountry(countryCode); // 如果找不到国家信息或该国家没有时区信息,返回 light 主题 if (!country?.timezones?.length) return 'light'; const timeZone = country.timezones.find((tz) => isValidTimeZone(tz)); if (!timeZone) return 'light'; // 3. 获取该国家的第一个 时区下的当前时间 const localTime = getLocalTime(timeZone); // 4. 解析小时数并确定主题 const localHour = parseInt(localTime); // console.log( // `[theme] Country: ${countryCode}, Timezone: ${country.timezones[0]}, LocalHour: ${localHour}`, // ); return localHour >= 6 && localHour < 18 ? 'light' : 'dark'; };