2
0

SettingItem.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import { Switch, Typography, Radio, RadioChangeEvent, Select } from "antd";
  2. import {
  3. onChange as onSettingChanged,
  4. settingInfo,
  5. ISettingItem,
  6. } from "../../../reducers/setting";
  7. import { useAppSelector } from "../../../hooks";
  8. import store from "../../../store";
  9. import { ISetting } from "./default";
  10. import { useEffect, useState } from "react";
  11. const { Title, Text } = Typography;
  12. interface IWidgetSettingItem {
  13. data?: ISetting;
  14. onChange?: Function;
  15. }
  16. const Widget = ({ data, onChange }: IWidgetSettingItem) => {
  17. const settings: ISettingItem[] | undefined = useAppSelector(settingInfo);
  18. const [value, setValue] = useState(data?.defaultValue);
  19. const title = <Title level={5}>{data?.label}</Title>;
  20. console.log(data);
  21. useEffect(() => {
  22. const currSetting = settings?.find((element) => element.key === data?.key);
  23. if (typeof currSetting !== "undefined") {
  24. setValue(currSetting.value);
  25. }
  26. }, [data?.key, settings]);
  27. let content: JSX.Element = <></>;
  28. if (typeof data === "undefined") {
  29. return content;
  30. } else {
  31. switch (typeof data.defaultValue) {
  32. case "number":
  33. break;
  34. case "string":
  35. switch (data.widget) {
  36. case "radio-button":
  37. if (typeof data.options !== "undefined") {
  38. return (
  39. <>
  40. {title}
  41. <div>
  42. <Text>{data.description}</Text>
  43. </div>
  44. <Radio.Group
  45. value={value}
  46. buttonStyle="solid"
  47. onChange={(e: RadioChangeEvent) => {
  48. setValue(e.target.value);
  49. store.dispatch(
  50. onSettingChanged({
  51. key: data.key,
  52. value: e.target.value,
  53. })
  54. );
  55. }}
  56. >
  57. {data.options.map((item, id) => {
  58. return (
  59. <Radio.Button key={id} value={item.value}>
  60. {item.label}
  61. </Radio.Button>
  62. );
  63. })}
  64. </Radio.Group>
  65. </>
  66. );
  67. }
  68. break;
  69. default:
  70. if (typeof data.options !== "undefined") {
  71. content = (
  72. <div>
  73. <Select
  74. defaultValue={data.defaultValue}
  75. style={{ width: 120 }}
  76. onChange={(value: string) => {
  77. console.log(`selected ${value}`);
  78. store.dispatch(
  79. onSettingChanged({
  80. key: data.key,
  81. value: value,
  82. })
  83. );
  84. }}
  85. options={data.options}
  86. />
  87. </div>
  88. );
  89. } else {
  90. }
  91. break;
  92. }
  93. break;
  94. case "boolean":
  95. content = (
  96. <div>
  97. <Switch
  98. defaultChecked={value as boolean}
  99. onChange={(checked) => {
  100. if (typeof onChange !== "undefined") {
  101. onChange(checked);
  102. }
  103. console.log("setting changed", data.key, checked);
  104. store.dispatch(
  105. onSettingChanged({ key: data.key, value: checked })
  106. );
  107. }}
  108. />
  109. <Text>{data.description}</Text>
  110. </div>
  111. );
  112. break;
  113. default:
  114. break;
  115. }
  116. return (
  117. <div>
  118. <Title level={5}>{data.label}</Title>
  119. {content}
  120. </div>
  121. );
  122. }
  123. };
  124. export default Widget;