refactor(ui): useZustandShallowSelector

This commit is contained in:
Fu Diwei
2024-12-24 15:07:39 +08:00
parent 52d24ff2f2
commit 8b1ae309fb
51 changed files with 194 additions and 269 deletions

View File

@@ -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 });
}
},
};

View File

@@ -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 });
}
},
};

View File

@@ -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 });
}
},
};