UNPKG

mt-flowbite-react

Version:

Official React components built for Flowbite and Tailwind CSS

165 lines (164 loc) 6.68 kB
'use client'; import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; import { createContext, useContext, useEffect, useRef } from 'react'; import { create, useStore } from 'zustand'; import { persist, subscribeWithSelector } from 'zustand/middleware'; import { mtmClient } from '../mtmapi/mtm.client'; export const createResFormStore = (initProps) => { return create()(persist(subscribeWithSelector((set, get) => ({ isDesignEnabled: true, async handleSubmit(formValues) { const pre = get(); if (!pre.resForm) { console.error('no resForm'); return; } //解释action 配置 const uri = new URL(pre.resForm.action); //值为: api://res.api/resFormField/edit console.log('actionurl: ', pre.resForm.action); //实际输出: actionurl: api://res.api/resFormField/edit const protocol = uri.protocol; if (!protocol) { console.error('action 配置,缺少 protocol 值'); return; } const host = uri.host; console.log('uri', uri, 'protocol', protocol, 'host', host); //注意这里,我获取的host 值是空字符串。 if (host.toLocaleLowerCase() == 'res.api') { console.log('TODO: 将表单值提交到后端:', pre.resForm?.action, pre.values); // const res = pre.resForm?.res const apiPath = uri.pathname; const result = await mtmClient.res.apiPost(apiPath, pre.values); console.info('表单提交响应', result); // set({ ...get(), formResponseData }) return; } else { console.log('似乎没有正确设置 host', host); return; } }, loadFormData() { console.log('TODO: loadFormData'); }, // setDesignEnabled(isDesignEnabled) { set({ ...get(), isDesignEnabled }) }, setValues(values) { set({ ...get, values }); }, setFormValue(name, value) { const oldFormValues = get().values || {}; set({ ...get(), values: { ...oldFormValues, [name]: value } }); }, setFormResponseData(formResponseData) { set({ ...get(), formResponseData }); }, isLoadingFormConfig: false, async setIsLoadingFormConfig(isLoadingFormConfig) { set({ ...get(), isLoadingFormConfig }); }, async setResFormId(resFormId) { console.log('setResFormId called', resFormId); const pre = get(); if (!pre.resForm) { set({ ...get(), isLoadingFormConfig: true }); console.log('加载resform 配置', resFormId); try { const resForm = await mtmClient.refForm.getResFormById(resFormId); console.log('加载 resForm ', resForm); set({ ...get(), isLoadingFormConfig: false, resForm }); } catch (e) { console.error('加载resform 配置出错:', e); set({ ...get(), isLoadingFormConfig: false }); } } }, defaultValues: 0, async setDefaultValues(defaultValues) { const pre = get(); const parentItemId = pre.defaultValues['parentItemId']; if (parentItemId) { //需要异步加载 item detail 的情况。 const res = pre.defaultValues['res']; if (res) { console.log('TODO: defaultValues 满足 需要加载 item detail的条件 res:', res, parentItemId); const item = await mtmClient.res.getItem(res, parentItemId); console.log('res form 获取item 值', item); set({ ...get(), defaultValues: item, values: item }); } } else { //普通情况,直接传入的是 item detail的值 console.log('form store 普通情况,直接传入的是 item detail的值'); set({ ...get(), defaultValues }); } }, })), { name: `mt-form-${initProps?.resFormId}`, version: 1, skipHydration: true, onRehydrateStorage(state) { // state.loadFormData() }, migrate(persistedState, version) { console.log('persistedState', version, persistedState); return persistedState; }, ...initProps, })); }; //-----------context const Context = createContext(null); export function ResFormProvider({ children, ...props }) { const storeRef = useRef(); if (!storeRef.current) { console.log('ResFormProvider 创建state', props); storeRef.current = createResFormStore(props); } useEffect(() => { console.log('ResFormProvider 初始化:', props.resFormId); if (props.resFormId) { storeRef.current?.getState().setResFormId(props.resFormId); } }, [props.resFormId]); useEffect(() => { //当默认值 defaultValues 变化后调用setDefaultValues,触发 detail 数据加载(如果需要) console.log('ResFormProvider defaultValues 变更:', props.resFormId); if (props.resFormId) { storeRef.current?.getState().setDefaultValues(props.defaultValues); } }, [props.defaultValues]); return (_jsxs(Context.Provider, { value: storeRef.current, children: [children, _jsx(SubscriptionSetup, {})] })); } //------------事件订阅 function SubscriptionSetup() { const store = useResFormStore(); useEffect(() => { const unsub2 = store.subscribe((state) => state.defaultValues, (a) => { // console.log("defaultValues 变化事件:", a) }, { fireImmediately: true, }); const unsubResFormId = store.subscribe((state) => state.resFormId, (value) => { // console.log(" resFormId 事件:", value) }, { fireImmediately: true, }); return () => { unsub2(); unsubResFormId(); }; }, []); return _jsx(_Fragment, {}); } export function useResFormStore(selector, equals) { const store = useContext(Context); if (!store) throw new Error('Missing ResFormProvider'); if (selector) { // eslint-disable-next-line return useStore(store, selector, equals); } else { return store; } }