Skip to content

Commit 3eed51f

Browse files
committed
feat: increase support for multiple time zones
* 优化实现方法
1 parent 4d713db commit 3eed51f

File tree

6 files changed

+28
-19
lines changed

6 files changed

+28
-19
lines changed

apps/backend-mock/api/timezone/getTimezoneOptions.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,9 @@ import { TIME_ZONE_OPTIONS } from '~/utils/mock-data';
33
import { useResponseSuccess } from '~/utils/response';
44

55
export default eventHandler(() => {
6-
return useResponseSuccess(TIME_ZONE_OPTIONS);
6+
const data = TIME_ZONE_OPTIONS.map((o) => ({
7+
label: `${o.timezone} (GMT${o.offset >= 0 ? `+${o.offset}` : o.offset})`,
8+
value: o.timezone,
9+
}));
10+
return useResponseSuccess(data);
711
});
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { eventHandler, readBody } from 'h3';
22
import { verifyAccessToken } from '~/utils/jwt-utils';
3+
import { TIME_ZONE_OPTIONS } from '~/utils/mock-data';
34
import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response';
45
import { setTimezone } from '~/utils/timezone-utils';
56

@@ -8,7 +9,14 @@ export default eventHandler(async (event) => {
89
if (!userinfo) {
910
return unAuthorizedResponse(event);
1011
}
11-
const { timezone } = await readBody(event);
12+
const body = await readBody<{ timezone?: unknown }>(event);
13+
const timezone =
14+
typeof body?.timezone === 'string' ? body.timezone : undefined;
15+
const allowed = TIME_ZONE_OPTIONS.some((o) => o.timezone === timezone);
16+
if (!timezone || !allowed) {
17+
setResponseStatus(event, 400);
18+
return useResponseError('Bad Request', 'Invalid timezone');
19+
}
1220
setTimezone(timezone);
1321
return useResponseSuccess({});
1422
});

apps/backend-mock/utils/mock-data.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export interface UserInfo {
99

1010
export interface TimezoneOption {
1111
offset: number;
12-
timeZone: string;
12+
timezone: string;
1313
}
1414

1515
export const MOCK_USERS: UserInfo[] = [

packages/effects/layouts/src/widgets/timezone/timezone-button.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ const [Modal, modalApi] = useVbenModal({
3030
onConfirm: async () => {
3131
try {
3232
modalApi.setState({ confirmLoading: true });
33-
if (timezoneRef.value) {
34-
await timezoneStore.setTimezone(unref(timezoneRef));
33+
const timezone = unref(timezoneRef);
34+
if (timezone) {
35+
await timezoneStore.setTimezone(timezone);
3536
}
3637
modalApi.close();
3738
} finally {

packages/stores/src/modules/timezone.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ interface TimezoneHandler {
1313
value: string;
1414
}[]
1515
>;
16-
onTimezoneChange?: (timezone: string) => Promise<void>;
16+
setTimezone?: (timezone: string) => Promise<void>;
1717
}
1818

1919
/**
@@ -63,13 +63,12 @@ const useTimezoneStore = defineStore(
6363
getTimezone() || new Intl.DateTimeFormat().resolvedOptions().timeZone,
6464
);
6565

66-
const timezoneHandler = getTimezoneHandler();
67-
6866
/**
6967
* 初始化时区
7068
* Initialize the timezone
7169
*/
7270
async function initTimezone() {
71+
const timezoneHandler = getTimezoneHandler();
7372
const timezone = await timezoneHandler.getTimezone?.();
7473
if (timezone) {
7574
timezoneRef.value = timezone;
@@ -84,7 +83,8 @@ const useTimezoneStore = defineStore(
8483
* @param timezone 时区字符串
8584
*/
8685
async function setTimezone(timezone: string) {
87-
await timezoneHandler.onTimezoneChange?.(timezone);
86+
const timezoneHandler = getTimezoneHandler();
87+
await timezoneHandler.setTimezone?.(timezone);
8888
timezoneRef.value = timezone;
8989
// 设置dayjs默认时区
9090
setDefaultTimezone(timezone);
@@ -95,7 +95,8 @@ const useTimezoneStore = defineStore(
9595
* Get the timezone options
9696
*/
9797
async function getTimezoneOptions() {
98-
return await timezoneHandler.getTimezoneOptions();
98+
const timezoneHandler = getTimezoneHandler();
99+
return (await timezoneHandler.getTimezoneOptions?.()) || [];
99100
}
100101

101102
initTimezone().catch((error) => {

playground/src/api/core/timezone.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,9 @@ import { requestClient } from '#/api/request';
66
* 获取系统支持的时区列表
77
*/
88
export async function getTimezoneOptionsApi() {
9-
const dataList =
10-
(await requestClient.get<TimezoneOption[]>(
11-
'/timezone/getTimezoneOptions',
12-
)) || [];
13-
return dataList.map((item) => ({
14-
label: item.timezone,
15-
value: item.timezone,
16-
}));
9+
return await requestClient.get<TimezoneOption[]>(
10+
'/timezone/getTimezoneOptions',
11+
);
1712
}
1813
/**
1914
* 获取用户时区
@@ -25,6 +20,6 @@ export async function getTimezoneApi(): Promise<null | string | undefined> {
2520
* 设置用户时区
2621
* @param timezone 时区
2722
*/
28-
export async function setTimezoneApi(timezone: string) {
23+
export async function setTimezoneApi(timezone: string): Promise<void> {
2924
return requestClient.post('/timezone/setTimezone', { timezone });
3025
}

0 commit comments

Comments
 (0)