refactor(ui): useZustandShallowSelector
This commit is contained in:
@@ -5,20 +5,23 @@ import { type AccessModel } from "@/domain/access";
|
||||
import { list as listAccess, save as saveAccess, remove as removeAccess } from "@/repository/access";
|
||||
|
||||
export interface AccessState {
|
||||
initialized: boolean;
|
||||
accesses: AccessModel[];
|
||||
createAccess: (access: MaybeModelRecord<AccessModel>) => void;
|
||||
updateAccess: (access: MaybeModelRecordWithId<AccessModel>) => void;
|
||||
deleteAccess: (access: MaybeModelRecordWithId<AccessModel>) => void;
|
||||
loading: boolean;
|
||||
loadedAtOnce: boolean;
|
||||
|
||||
fetchAccesses: () => Promise<void>;
|
||||
createAccess: (access: MaybeModelRecord<AccessModel>) => Promise<void>;
|
||||
updateAccess: (access: MaybeModelRecordWithId<AccessModel>) => Promise<void>;
|
||||
deleteAccess: (access: MaybeModelRecordWithId<AccessModel>) => Promise<void>;
|
||||
}
|
||||
|
||||
export const useAccessStore = create<AccessState>((set) => {
|
||||
let fetcher: Promise<AccessModel[]> | null = null; // 防止多次重复请求
|
||||
|
||||
return {
|
||||
initialized: false,
|
||||
accesses: [],
|
||||
loading: false,
|
||||
loadedAtOnce: false,
|
||||
|
||||
createAccess: async (access) => {
|
||||
const record = await saveAccess(access);
|
||||
@@ -57,10 +60,12 @@ export const useAccessStore = create<AccessState>((set) => {
|
||||
fetcher ??= listAccess();
|
||||
|
||||
try {
|
||||
set({ loading: true });
|
||||
const accesses = await fetcher;
|
||||
set({ accesses: accesses ?? [], initialized: true });
|
||||
set({ accesses: accesses ?? [], loadedAtOnce: true });
|
||||
} finally {
|
||||
fetcher = null;
|
||||
set({ loading: false });
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
@@ -5,10 +5,12 @@ import { SETTINGS_NAMES, type EmailsSettingsContent, type SettingsModel } from "
|
||||
import { get as getSettings, save as saveSettings } from "@/repository/settings";
|
||||
|
||||
export interface ContactState {
|
||||
initialized: boolean;
|
||||
emails: string[];
|
||||
setEmails: (emails: string[]) => void;
|
||||
loading: boolean;
|
||||
loadedAtOnce: boolean;
|
||||
|
||||
fetchEmails: () => Promise<void>;
|
||||
setEmails: (emails: string[]) => Promise<void>;
|
||||
}
|
||||
|
||||
export const useContactStore = create<ContactState>((set) => {
|
||||
@@ -16,8 +18,9 @@ export const useContactStore = create<ContactState>((set) => {
|
||||
let settings: SettingsModel<EmailsSettingsContent>; // 记录当前设置的其他字段,保存回数据库时用
|
||||
|
||||
return {
|
||||
initialized: false,
|
||||
emails: [],
|
||||
loading: false,
|
||||
loadedAtOnce: false,
|
||||
|
||||
setEmails: async (emails) => {
|
||||
settings ??= await getSettings<EmailsSettingsContent>(SETTINGS_NAMES.EMAILS);
|
||||
@@ -32,7 +35,7 @@ export const useContactStore = create<ContactState>((set) => {
|
||||
set(
|
||||
produce((state: ContactState) => {
|
||||
state.emails = settings.content.emails;
|
||||
state.initialized = true;
|
||||
state.loadedAtOnce = true;
|
||||
})
|
||||
);
|
||||
},
|
||||
@@ -41,10 +44,12 @@ export const useContactStore = create<ContactState>((set) => {
|
||||
fetcher ??= getSettings<EmailsSettingsContent>(SETTINGS_NAMES.EMAILS);
|
||||
|
||||
try {
|
||||
set({ loading: true });
|
||||
settings = await fetcher;
|
||||
set({ emails: settings.content.emails?.sort() ?? [], initialized: true });
|
||||
set({ emails: settings.content.emails?.sort() ?? [], loadedAtOnce: true });
|
||||
} finally {
|
||||
fetcher = null;
|
||||
set({ loading: false });
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
@@ -5,11 +5,13 @@ import { SETTINGS_NAMES, type NotifyChannelsSettingsContent, type SettingsModel
|
||||
import { get as getSettings, save as saveSettings } from "@/repository/settings";
|
||||
|
||||
export interface NotifyChannelState {
|
||||
initialized: boolean;
|
||||
channels: NotifyChannelsSettingsContent;
|
||||
setChannel: (channel: keyof NotifyChannelsSettingsContent, config: NotifyChannelsSettingsContent[keyof NotifyChannelsSettingsContent]) => void;
|
||||
setChannels: (channels: NotifyChannelsSettingsContent) => void;
|
||||
loading: boolean;
|
||||
loadedAtOnce: boolean;
|
||||
|
||||
fetchChannels: () => Promise<void>;
|
||||
setChannel: (channel: keyof NotifyChannelsSettingsContent, config: NotifyChannelsSettingsContent[keyof NotifyChannelsSettingsContent]) => Promise<void>;
|
||||
setChannels: (channels: NotifyChannelsSettingsContent) => Promise<void>;
|
||||
}
|
||||
|
||||
export const useNotifyChannelStore = create<NotifyChannelState>((set, get) => {
|
||||
@@ -17,8 +19,9 @@ export const useNotifyChannelStore = create<NotifyChannelState>((set, get) => {
|
||||
let settings: SettingsModel<NotifyChannelsSettingsContent>; // 记录当前设置的其他字段,保存回数据库时用
|
||||
|
||||
return {
|
||||
initialized: false,
|
||||
channels: {},
|
||||
loading: false,
|
||||
loadedAtOnce: false,
|
||||
|
||||
setChannel: async (channel, config) => {
|
||||
settings ??= await getSettings<NotifyChannelsSettingsContent>(SETTINGS_NAMES.NOTIFY_CHANNELS);
|
||||
@@ -40,7 +43,7 @@ export const useNotifyChannelStore = create<NotifyChannelState>((set, get) => {
|
||||
set(
|
||||
produce((state: NotifyChannelState) => {
|
||||
state.channels = settings.content;
|
||||
state.initialized = true;
|
||||
state.loadedAtOnce = true;
|
||||
})
|
||||
);
|
||||
},
|
||||
@@ -49,10 +52,12 @@ export const useNotifyChannelStore = create<NotifyChannelState>((set, get) => {
|
||||
fetcher ??= getSettings<NotifyChannelsSettingsContent>(SETTINGS_NAMES.NOTIFY_CHANNELS);
|
||||
|
||||
try {
|
||||
set({ loading: true });
|
||||
settings = await fetcher;
|
||||
set({ channels: settings.content ?? {}, initialized: true });
|
||||
set({ channels: settings.content ?? {}, loadedAtOnce: true });
|
||||
} finally {
|
||||
fetcher = null;
|
||||
set({ loading: false });
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user