tachybase_todo/packages/plugins/@nocobase/plugin-map/src/client/block/MapBlockProvider.tsx

62 lines
1.8 KiB
TypeScript
Raw Normal View History

import { useField, useFieldSchema } from '@formily/react';
import { BlockProvider, FixedBlockWrapper, SchemaComponentOptions, useBlockRequestContext } from '@nocobase/client';
import React, { createContext, useContext, useState } from 'react';
export const MapBlockContext = createContext<any>({});
const InternalMapBlockProvider = (props) => {
const { fieldNames } = props;
const fieldSchema = useFieldSchema();
const field = useField();
const { resource, service } = useBlockRequestContext();
const [selectedRecordKeys, setSelectedRecordKeys] = useState([]);
return (
<FixedBlockWrapper>
<SchemaComponentOptions scope={{ selectedRecordKeys }}>
<MapBlockContext.Provider
value={{
field,
service,
resource,
fieldNames,
fixedBlock: fieldSchema?.['x-decorator-props']?.fixedBlock,
selectedRecordKeys,
setSelectedRecordKeys,
}}
>
{props.children}
</MapBlockContext.Provider>
</SchemaComponentOptions>
</FixedBlockWrapper>
);
};
export const MapBlockProvider = (props) => {
const { params, fieldNames } = props;
const appends = params.appends || [];
const { field } = fieldNames || {};
if (Array.isArray(field) && field.length > 1) {
appends.push(field[0]);
}
return (
<BlockProvider name="map" {...props} params={{ ...params, appends, paginate: false }}>
<InternalMapBlockProvider {...props} />
</BlockProvider>
);
};
export const useMapBlockContext = () => {
return useContext(MapBlockContext);
};
export const useMapBlockProps = () => {
const ctx = useMapBlockContext();
return {
...ctx,
dataSource: ctx?.service?.data?.data,
zoom: ctx?.field?.componentProps?.zoom || 13,
};
};