| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- import { useIntl } from "react-intl";
- import { useEffect, useState } from "react";
- import {
- Switch,
- Typography,
- Radio,
- type RadioChangeEvent,
- Select,
- Transfer,
- } from "antd";
- import {
- onChange as onSettingChanged,
- settingInfo,
- type ISettingItem,
- } from "../../../reducers/setting";
- import { useAppSelector } from "../../../hooks";
- import store from "../../../store";
- import type { ISetting } from "./default"
- import type { TransferDirection } from "antd/lib/transfer"
- const { Text } = Typography;
- interface IWidgetSettingItem {
- data?: ISetting;
- autoSave?: boolean;
- bordered?: boolean;
- onChange?: Function;
- }
- const SettingItemWidget = ({
- data,
- bordered = true,
- onChange,
- autoSave = true,
- }: IWidgetSettingItem) => {
- const intl = useIntl();
- const settings: ISettingItem[] | undefined = useAppSelector(settingInfo);
- const [value, setValue] = useState(data?.defaultValue);
- const [targetKeys, setTargetKeys] = useState<string[]>([]);
- useEffect(() => {
- if (typeof data?.defaultValue === "object") {
- setTargetKeys(data.defaultValue);
- }
- }, [data?.defaultValue]);
- useEffect(() => {
- setValue(data?.defaultValue);
- }, [data?.defaultValue]);
- useEffect(() => {
- const currSetting = settings?.find((element) => element.key === data?.key);
- if (typeof currSetting !== "undefined") {
- setValue(currSetting.value);
- }
- }, [data?.key, settings]);
- let content: JSX.Element = <></>;
- if (typeof data === "undefined") {
- return content;
- } else {
- const description: string | undefined = data.description
- ? intl.formatMessage({ id: data.description })
- : undefined;
- switch (typeof data.defaultValue) {
- case "number":
- break;
- case "object":
- switch (data.widget) {
- case "transfer":
- if (typeof data.options !== "undefined") {
- content = (
- <Transfer
- dataSource={data.options.map((item) => {
- return {
- key: item.value,
- title: intl.formatMessage({ id: item.label }),
- };
- })}
- titles={[
- "备选",
- intl.formatMessage({ id: "labels.selected" }),
- ]}
- targetKeys={targetKeys}
- onChange={(
- newTargetKeys: string[],
- _direction: TransferDirection,
- _moveKeys: string[]
- ) => {
- setTargetKeys(newTargetKeys);
- store.dispatch(
- onSettingChanged({
- key: data.key,
- value: newTargetKeys,
- })
- );
- if (typeof onChange !== "undefined") {
- onChange(data.key, newTargetKeys);
- }
- }}
- render={(item) => item.title}
- oneWay
- />
- );
- }
- break;
- }
- break;
- case "string":
- switch (data.widget) {
- case "radio-button":
- if (typeof data.options !== "undefined") {
- content = (
- <>
- <Radio.Group
- value={value}
- buttonStyle="solid"
- onChange={(e: RadioChangeEvent) => {
- setValue(e.target.value);
- if (autoSave) {
- store.dispatch(
- onSettingChanged({
- key: data.key,
- value: e.target.value,
- })
- );
- }
- if (typeof onChange !== "undefined") {
- onChange(data.key, e.target.value);
- }
- }}
- >
- {data.options.map((item, id) => {
- return (
- <Radio.Button key={id} value={item.value}>
- {intl.formatMessage({ id: item.label })}
- </Radio.Button>
- );
- })}
- </Radio.Group>
- </>
- );
- }
- break;
- default:
- if (typeof data.options !== "undefined") {
- content = (
- <div>
- <Select
- defaultValue={data.defaultValue}
- style={{ width: 120 }}
- bordered={bordered}
- onChange={(value: string) => {
- console.log(`selected ${value}`);
- if (autoSave) {
- store.dispatch(
- onSettingChanged({
- key: data.key,
- value: value,
- })
- );
- }
- if (typeof onChange !== "undefined") {
- onChange(data.key, value);
- }
- }}
- options={data.options.map((item) => {
- return {
- value: item.value,
- label: intl.formatMessage({ id: item.label }),
- };
- })}
- />
- </div>
- );
- } else {
- }
- break;
- }
- break;
- case "boolean":
- content = (
- <div>
- <Switch
- defaultChecked={value as boolean}
- onChange={(checked) => {
- console.log("setting changed", data.key, checked);
- if (autoSave) {
- store.dispatch(
- onSettingChanged({ key: data.key, value: checked })
- );
- }
- if (typeof onChange !== "undefined") {
- onChange(data.key, checked);
- }
- }}
- />
- </div>
- );
- break;
- default:
- break;
- }
- return (
- <div style={{ marginBottom: 10 }}>
- <div
- style={{
- display: "flex",
- justifyContent: "space-between",
- flexWrap: "wrap",
- }}
- >
- <div>
- <div>
- <Text>{intl.formatMessage({ id: data.label })}</Text>
- </div>
- <Text type="secondary">{description}</Text>
- </div>
- <div style={{ marginLeft: "auto" }}>{content}</div>
- </div>
- </div>
- );
- }
- };
- export default SettingItemWidget;
|