General.tsx 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /**
  2. * General
  3. * @author: oldj
  4. * @homepage: https://oldj.net
  5. */
  6. import {
  7. Box,
  8. Checkbox,
  9. FormControl,
  10. FormHelperText,
  11. FormLabel,
  12. HStack,
  13. Radio,
  14. RadioGroup,
  15. Select,
  16. Stack,
  17. VStack,
  18. } from '@chakra-ui/react'
  19. import { agent } from '@renderer/core/agent'
  20. import { http_api_port } from '@common/constants'
  21. import { ConfigsType, ThemeType } from '@common/default_configs'
  22. import { LocaleName } from '@common/i18n'
  23. import useI18n from '@renderer/models/useI18n'
  24. import React from 'react'
  25. interface IProps {
  26. data: ConfigsType
  27. onChange: (kv: Partial<ConfigsType>) => void
  28. }
  29. const General = (props: IProps) => {
  30. const { data, onChange } = props
  31. const { i18n, lang } = useI18n()
  32. const { platform } = agent
  33. const label_width = 20
  34. return (
  35. <VStack spacing={4}>
  36. <FormControl>
  37. <HStack>
  38. <FormLabel w={label_width}>{lang.language}</FormLabel>
  39. <Select
  40. w="200px"
  41. value={data.locale}
  42. onChange={(e) => onChange({ locale: e.target.value as LocaleName })}
  43. >
  44. <option value="zh">简体中文</option>
  45. <option value="zh_hant">繁體中文</option>
  46. <option value="en">English</option>
  47. <option value="fr">Français</option>
  48. <option value="de">Deutsch</option>
  49. <option value="ja">日本語</option>
  50. <option value="tr">Türkçe</option>
  51. </Select>
  52. </HStack>
  53. </FormControl>
  54. <FormControl>
  55. <HStack>
  56. <FormLabel w={label_width}>{lang.theme}</FormLabel>
  57. <Select
  58. w="200px"
  59. value={data.theme}
  60. onChange={(e) => onChange({ theme: e.target.value as ThemeType })}
  61. >
  62. <option value="light">{lang.theme_light}</option>
  63. <option value="dark">{lang.theme_dark}</option>
  64. </Select>
  65. </HStack>
  66. </FormControl>
  67. <FormControl>
  68. <HStack alignItems={'flex-start'}>
  69. <FormLabel w={label_width}>{lang.write_mode}</FormLabel>
  70. <VStack align="left">
  71. <RadioGroup
  72. value={data.write_mode || ''}
  73. onChange={(v) =>
  74. onChange({
  75. write_mode: v as ConfigsType['write_mode'],
  76. })
  77. }
  78. >
  79. <HStack spacing={10}>
  80. <Radio value="append">
  81. <Box>{lang.append}</Box>
  82. </Radio>
  83. <Radio value="overwrite">
  84. <Box>{lang.overwrite}</Box>
  85. </Radio>
  86. </HStack>
  87. </RadioGroup>
  88. <FormHelperText maxW={'350px'}>
  89. {data.write_mode === 'append' && lang.write_mode_append_help}
  90. {data.write_mode === 'overwrite' && lang.write_mode_overwrite_help}
  91. </FormHelperText>
  92. </VStack>
  93. </HStack>
  94. </FormControl>
  95. <FormControl pb={6}>
  96. <HStack alignItems={'flex-start'}>
  97. <FormLabel w={label_width}>{lang.choice_mode}</FormLabel>
  98. <VStack align="left">
  99. <RadioGroup
  100. value={data.choice_mode.toString()}
  101. onChange={(v) =>
  102. onChange({
  103. choice_mode: parseInt(v.toString()) as ConfigsType['choice_mode'],
  104. })
  105. }
  106. >
  107. <HStack spacing={10}>
  108. <Radio value="1">
  109. <Box>{lang.choice_mode_single}</Box>
  110. </Radio>
  111. <Radio value="2">
  112. <Box>{lang.choice_mode_multiple}</Box>
  113. </Radio>
  114. </HStack>
  115. </RadioGroup>
  116. <FormHelperText maxW={'350px'}>{lang.choice_mode_desc}</FormHelperText>
  117. </VStack>
  118. </HStack>
  119. </FormControl>
  120. {platform === 'darwin' ? (
  121. <FormControl>
  122. <HStack>
  123. <Checkbox
  124. isChecked={data.show_title_on_tray}
  125. onChange={(e) => onChange({ show_title_on_tray: e.target.checked })}
  126. >
  127. {lang.show_title_on_tray}
  128. </Checkbox>
  129. </HStack>
  130. </FormControl>
  131. ) : null}
  132. <FormControl>
  133. <HStack>
  134. <Checkbox
  135. isChecked={data.hide_at_launch}
  136. onChange={(e) => onChange({ hide_at_launch: e.target.checked })}
  137. >
  138. {lang.hide_at_launch}
  139. </Checkbox>
  140. </HStack>
  141. </FormControl>
  142. {agent.platform === 'linux' ? (
  143. <FormControl>
  144. <HStack>
  145. <Checkbox
  146. isChecked={data.use_system_window_frame}
  147. onChange={(e) => onChange({ use_system_window_frame: e.target.checked })}
  148. >
  149. {lang.use_system_window_frame}
  150. </Checkbox>
  151. </HStack>
  152. </FormControl>
  153. ) : null}
  154. {agent.platform === 'darwin' ? (
  155. <FormControl>
  156. <HStack>
  157. <Checkbox
  158. isChecked={data.hide_dock_icon}
  159. onChange={(e) => onChange({ hide_dock_icon: e.target.checked })}
  160. >
  161. {lang.hide_dock_icon}
  162. </Checkbox>
  163. </HStack>
  164. </FormControl>
  165. ) : null}
  166. <FormControl>
  167. <VStack align="left">
  168. <Checkbox
  169. isChecked={data.remove_duplicate_records}
  170. onChange={(e) => onChange({ remove_duplicate_records: e.target.checked })}
  171. >
  172. {lang.remove_duplicate_records}
  173. </Checkbox>
  174. <FormHelperText pl="20px">{lang.remove_duplicate_records_desc}</FormHelperText>
  175. </VStack>
  176. </FormControl>
  177. <FormControl>
  178. <VStack align="left">
  179. <Checkbox
  180. isChecked={data.tray_mini_window}
  181. onChange={(e) => onChange({ tray_mini_window: e.target.checked })}
  182. >
  183. {lang.tray_mini_window}
  184. </Checkbox>
  185. </VStack>
  186. </FormControl>
  187. <FormControl>
  188. <VStack align="left">
  189. <Checkbox
  190. isChecked={data.multi_chose_folder_switch_all}
  191. onChange={(e) => onChange({ multi_chose_folder_switch_all: e.target.checked })}
  192. >
  193. {lang.multi_chose_folder_switch_all}
  194. </Checkbox>
  195. </VStack>
  196. </FormControl>
  197. <FormControl>
  198. <VStack align="left">
  199. <Checkbox
  200. isChecked={data.http_api_on}
  201. onChange={(e) => onChange({ http_api_on: e.target.checked })}
  202. >
  203. {lang.http_api_on}
  204. </Checkbox>
  205. <FormHelperText pl="20px">
  206. {i18n.trans('http_api_on_desc', [http_api_port.toString()])}
  207. </FormHelperText>
  208. <Stack pl={6} mt={1} spacing={1}>
  209. <Checkbox
  210. isDisabled={!data.http_api_on}
  211. isChecked={data.http_api_only_local}
  212. onChange={(e) => onChange({ http_api_only_local: e.target.checked })}
  213. >
  214. {lang.http_api_only_local}
  215. </Checkbox>
  216. </Stack>
  217. </VStack>
  218. </FormControl>
  219. </VStack>
  220. )
  221. }
  222. export default General